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

ЖАНРЫ

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

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

Шрифт:

А колонка для галки в гриде определялась так:

=== cut ===

with dmFile, 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.

Ниже текст типичного обработчика –

if DBGrid1.DataSource.DataSet.State in [dsEdit, dsInsert] then

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;

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