Рейтинговые книги
Читем онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 70 71 72 73 74 75 76 77 78 ... 123

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

1 ... 70 71 72 73 74 75 76 77 78 ... 123
На этой странице вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров бесплатно.

Оставить комментарий