Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Название:Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание
…начиная с 1001. Смотрите другие файлы…
Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
inheritedMouseUp(Button, Shift, X, Y);
ifFResizeFlag then begin
FResizeFlag := false;
UpdateTitlesHeight;
end;
end;
procedureTBitDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
var
Indicator : TBitmap;
TitleText : string;
Al : TAlignment;
begin
if not((gdFixed inAState) and((ARow = 0) and(dgTitles inOptions) and(ACol <> 0))) then
inheritedDrawCell(ACol, ARow, ARect, AState)
else begin
ifDefaultDrawing then begin
DrawEdge(Canvas.Handle, ARect, BDR_RAISEDINNER, BF_BOTTOMLEFT);
DrawEdge(Canvas.Handle, ARect, BDR_RAISEDINNER, BF_TOPRIGHT);
InflateRect(ARect, -1, -1);
Canvas.Brush.Color := FixedColor;
Canvas.FillRect(ARect);
end;
TitleText := Columns[ACol - 1].Title.Caption;
ifAssigned(OnDrawTitle) thenOnDrawTitle(ACol, ARect, TitleText);
ifDefaultDrawing and(TitleText <> '') then begin
Canvas.Brush.Style := bsClear;
Canvas.Font := RealTitleFont;
ifACol > 0 thenAl := Columns[ACol - 1].Title.Alignment
elseAl := Columns[0].Title.DefaultAlignment;
WriteText(Canvas, ARect, 2, 2, TitleText, Al);
end;
end;
end;
procedureTBitDBGrid.SetRealTitleFont(Value : TFont);
begin
FRealTitleFont.Assign(Value);
Repaint;
end;
procedure Register;
begin
RegisterComponents('Andre VCL', [TBitDBGrid]);
end;
initialization
DrawBitmap := TBitmap.Create;
finalization
DrawBitmap.Free;
end.
Несколько таблиц в одном TDBGrid
Delphi 1
Насколько я знаю, единственное легкое решение заключается в использовании вычисляемых полей.
Для того, чтобы поместить данные из нескольких таблиц в один DBGrid, нужно воспользоваться объектом TQuery. На заметку: используйте TQuery в режиме только для чтения, если вы не можете обеспечить гарантию выполнения некоторых из его руководящих принципов, один из которых – данные могут быть получены только от одной таблицы.
Как сделать так, чтобы в DBGrid напротив некоторых строк можно было бы галочку поставить?
Nomadicсоветует:
Ну примерно так (лишнее мало-мало порезал, больно много его, но идея видна :) на сервере — тaблицa Advertis.DB, первичный ключ ID — autoincrement. На локальном диске — тaблицa Founds.DB, с полем Advertis: integer, по которому есть индекс, и tblFounds.IndexFieldNames = 'Advertis'.
На гриде:
=== cut ===
procedureTMainForm.dbgWorkDblClick(Sender: TObject);
begin
TriggerRowSelection;
end;
procedureTMainForm.TriggerRowSelection;
begin
ifdmFile.AdvertisCount <> 0 then begin
with dmFile do if nottblFounds.FindKey([tblAdvertisID.Value]) then begin
tblFounds.AppendRecord([tblAdvertisID.Value]);
end else begin
tblFounds.Delete;
end;
dbgWork.Refresh;
end;
end;
procedureTMainForm.dbgWorkDrawColumnCell(Sender: TObject; constRect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
ifDataCol = 0 then withdmFile, dbgWork.Canvas do begin
FillRect(Rect); {clear the cell}
iftblFounds.FindKey([tblAdvertisID.Value]) then begin
TextOut(Rect.Left, Rect.Top, '?');
end else begin
TextOut(Rect.Left, Rect.Top, 'o');
end;
end;
end;
=== cut ===
Оказывается, я переопределял рисование гридa, а не вычислял поле. Не помню точно, но кажется, чтобы не перечитывать таблицу на каждый даблклик, а только перерисовать грид.
А колонка для галки в гриде определялась так:
=== cut ===
withdmFile, dbgWork.Columns do begin
BeginUpdate;
Clear;
{check mark}
nc := Add;
nc.Width := 14;
nc.Font.Name := 'Wingdings';
nc.Font.Size := 11;
nc.Alignment := taRightJustify;
nc.Title.Caption := 'y';
nc.Title.Font.Name := 'Wingdings';
nc.Title.Font.Size := 10;
nc.Title.Alignment := taCenter;
[skip определения остaльных колонок]
EndUpdate;
end;
=== cut ===
Вроде всё.
Ну, как напечатать/обработать только помеченное, сам разберёшься. У меня там накручено чего-то с фильтрами, думаю, можно проще.
Что касается других способов – можно вместо временной тaблицы попользовать список, массив или in-memory table.
Как в TDBGrid разрешить только операции UPDATE записей и запретить INSERT/DELETE?
Nomadicсоветует:
А я делаю так.
На DataSource, к которому прицеплен Grid, вешаю обработчик на событие OnStateChange.
Ниже текст типичного обработчика –
ifDBGrid1.DataSource.DataSet.State in[dsEdit, dsInsert] then
DBGrid1.Options := DBGrid1.Options + goRowSelect
elseDBGrid1.Options := DBGrid1.Options – goRowSelect;
Дело в том, что если у Grid'а стоит опция goRowSelect, то из Grid'а невозможно добавить запись. Ну а когда програмно вызываешь редактирование или вставку, то курсор принимает обычный вид и все Ok.
Лучше использовать конструкцию «State in dsEditModes».
Обновление TDBGrid после редактирования отдельной записи на отдельной форме
Delphi 1
А вы постите запись, прежде чем закрыть форму? При закрытии, форма самостоятельно данных не постит. Вы должны постить изменения или с помощью компонента dbnavigator, или c помощью кода, который при закрытии формы постит данные в основную таблицу.
На странице 95 Database Application Developers Guide (руководство разработчиков приложений баз данных), поставляемое с Delphi, приведен демонстрационный проект с двумя формами, демонстрирующий хорошую технику при использовании ttable на мастер-форме в качестве набора данных для детали.
Одним из решений вашей проблемы может служить связывание компонента DataSource на Form2 с набором данных DataSet на Form1. Это может быть достигнуто путем добавления следующей строки в обработчик события OnActivate для Form2:
MyDataSource.DataSet := Form1.MyTable;
Данный метод имеет 3 преимущества:
1. сделанные вами изменения немедленно отображаются, поскольку вы используете одну и ту же логическую таблицу;
2. если вам нужно определить установки для ваших полей таблицы, например, DisplayFormat или EditMask, вам нужно сделать это только один раз в таблице на Form1, вам не нужно это делать на каждой форме, которая использует таблицу;
3. это сохраняет ресурсы и повышает производительность, поскольку ваше приложение при работе с таблицей использует только одну сессию. Тем не менее, в проектном времени вам нужно иметь TTable на вашей Form2 для того, чтобы вы могли выбрать поля для БД-контролов, после чего вы можете удалить TTable.
Пересортица в коде полей TDBGrid во время вополнения программы
Одной строкой
используйте <���имя поля>.index := <���желаемый номер поля>
В Delphi 3 и выше ползунок TDBGrid иногда может находится не только в трех фиксированных позициях. Что для этого нужно?
Интервал:
Закладка: