KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Валентин Озеров, "Советы по Delphi. Версия 1.4.3 от 1.1.2001" бесплатно, без регистрации.
Перейти на страницу:

DBGrid1.Options := DBGrid1.Options + goRowSelect

else DBGrid1.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 иногда может находится не только в трех фиксированных позициях. Что для этого нужно?


Nomadic отвечает:

Здесь отрывки из исходников VCL —

unit DBGrids;


procedure TCustomDBGrid.UpdateScrollBar;

var

 SIOld, SINew: TScrollInfo;

begin

 [skipped]

 if IsSequenced then begin

  SINew.nMin := 1;

  SINew.nPage := Self.VisibleRowCount;

  SINew.nMax := RecordCount + SINew.nPage -1;

  if State in [dsInactive, dsBrowse, dsEdit] then SINew.nPos := RecNo; // else keep old pos

 end else begin

  SINew.nMin := 0;

  SINew.nPage := 0;

  SINew.nMax := 4;

  if BOF then SINew.nPos := 0

  else if EOF then SINew.nPos := 4

  else SINew.nPos := 2;

 end;

 [skipped]


unit dbtables;


function TBDEDataSet.IsSequenced: Boolean;

begin

 Result := (FRecNoStatus = rnParadox) and (not Filtered);

end;

То есть, к примеру, все будет работать «красиво» на таблицах BDE, если они:

• таблицы Paradox;

• на них не установлен фильтр.

TClientDataSet в режиме single-tier (briefcase) также работает «красиво». 

Изменение месторасположение колонок в TDBGrid

Delphi 1

Var

 i: Integer;

 fName: string;

 …………

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

 …………

 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;

end;


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

begin

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*