Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

 …………

 { Определение изменения месторасположения колонок }

 …………

 with dbgrid1.datasource.dataset as ttable do

for i := 0 to indexdefs.count – 1 do begin

fName := DBGrid1.Fields[0].FieldName;

if copy(indexdefs[i].fields, 1, length(fname)) = fname then IndexName := IndexDefs[i].Name

 end;

Решение

проблемы передачи фокуса TDBGrid

В данном документе содержится решение проблемы невозможности получения DBGrid-ом фокуса после щелчка на каком-либо элементе управления родительской формы, в то время, как DBGrid находится на ее дочерней MDI-форме.

Относится ко всем версиям Delphi.

Очевидно, DBGrid имеет некоторые проблемы с управлением фокусом, если он находится на дочерней MDI-форме. Эта проблема решена в приведенном ниже наследнике TDBGrid, в котором обрабатываются мышиные сообщения и выясняется когда фокус должен быть передан сетке. Наследник создан в виде компонента, который легко устанавливается в Палитру Компонентов. Примечание: код адаптирован для всех версий Delphi. Проблемы могут быть в Delphi 2 и 3, если вы забудете заменить устаревшие в этих версиях модули "winprocs" и "wintypes" на "windows."

unit FixedDBGrid;

interface

uses Winprocs,wintypes, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids;

type TFixedDBGrid = class(TDBGrid)

private

 { Private declarations }

protected

 { Protected declarations }

public

 { Public declarations }

 procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;

 procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;

published

 { Published declarations }

end;

procedure Register;

implementation

procedure TFixedDBGrid.WMRButtonDown(var Message: TWMRButtonDown);

begin

 winprocs.SetFocus(handle); {помните, что winprocs относится только к Delphi 1!}

 inherited;

end;

procedure TFixedDBGrid.WMLButtonDown(var Message: TWMLButtonDown);

begin

 winprocs.SetFocus(handle); {помните, что winprocs относится только к Delphi 1!}

 inherited;

end;

procedure tfixeddbgrid.wmlbuttondown(var Message: twmlbuttondown);

begin

 winprocs.SetFocus(handle); {помните,
что winprocs относится только к Delphi 1!}

 inherited;

end;

procedure Register;

begin

 RegisterComponents('Samples', [TFixedDBGrid]);

end;

end.
 

Как отучить TDBGrid от автодобавления новой записи?

Добавьте в обработчик события вашего TTable «BeforeInsert» следующую строку:

procedure TForm1.Tbable1BeforeInsert(DataSet: TDataset);

begin

 Abort; ←эту строчку

end;

Осуществляем перехват нажатия клавиши и проверку на конец файла (end-of-file):

procedure TForm8.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

 if (Key = VK_DOWN) then begin

TTable1.DisableControls;

TTable1Next;

if TTable1.EOF then Key := 0

else TTable1.Prior;

TTable1.EnableControls;

 end;

end;
 

Две таблицы в одном TDBGrid

Delphi 2 

Если у вас D2, вы можете воспользоваться свойством Lookup. Для этого выберите в контекстном меню объекта table редактор полей (fields editor). Затем для добавления нового поля нажмите <Ctrl>+N. Просто раскройте combobox и выберите lookup-поле. TDBGrid автоматически создаст выпадающий список, в котором пользователь сможет выбрать нужный элемент. 

Добавление к TDBGrid события OnClick

Delphi 1

TGroothuisGrid = class {!}

published

 property OnClick;

end;

Это все! OnClick уже объявлен в TControl как защищенное свойство. Все, что вы должны сделать, это опубликовать это свойство в компоненте-наследнике, зарегистрировать его (смотри гл. 8 Руководства по созданию компонентов, Component Writer's Guide) и использовать взамен TDBGrid.

Позиция ячейки в TDBGrid

Delphi 1

В TCustomGrid определен метод CellRect, который, к сожалению, защищен. Это означает, что даный метод доступен только для TCustomGrid и его наследников. Но все-таки существует немного мудреное решение вызова данного метода:

type TMyDBGrid = class(TDBGrid)

public

 function CellRect(ACol, ARow: Longint): TRect;

Поделиться с друзьями: