Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 35

стр.

>{ CDS = TClientDataSet }

>{ Table1 = TTable }

>CDS.Provider := Table1.Provider;

>CDS.Open;

Также Вы должны включить модуль BDEProv в предложение uses. 

Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что `WIN1251 undefined`

Nomadic отвечает:

A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3).

Создание 

Функции редактора полей во время выполнения программы

Возможен ли вызов функций редактора полей (Fields Editor) во время выполнения программы?

Да. Если вы определили поля во время разработки приложения, то во время выполнения можно менять их свойства (например, Size).

Например, следующий код изменяет каждый размер поля TField.Size так, чтобы соответствовать фактическому размеру поля открываемого набора данных:

>procedure SetupFieldsAndOpenDataset(DataSet: TDataSet);

>var FieldNum, DefNum: Integer;

>begin

> with DataSet do

> begin

>  if Active then Close;

>  FieldDefs.Update;

>  {набор данных должен быть закрыт}

>  {ищем каждое предопределенное TField в DataSet.FieldDefs:}

for FieldNum := FieldCount - 1 downto 0 do with Fields[FieldNum] do

>  begin

>DefNum := FieldDefs.IndexOf(FieldName);

>   if DefNum < 0 then raise Exception.CreateFmt('Поле "%s" не найдено в наборе данных "%s"',[FieldName, Dataset.Name]);

>   {устанавливаем свойство size:}

>   Size := FieldDefs[DefNum].Size;

end;

>  Open;

end;

>end;

– Lindsay Reichmann

Производная TIntegerField


Я думал о производной, новом варианте компонента TIntegerfield, но я не могу понять как мне его получить во время разработки, ведь он не устанавливается в палитру компонентов.

Это то, что вы хотите. Создайте следующий молуль:

MICRON.PAS:

>unit micron;

>interface

>uses DB, DBTables, Classes;


>type

> TMicronField = class(TIntegerField)

public

>  function IsValidChar(Ch: Char): Boolean; override;

end;


>procedure Register;


>implementation



>function TMicronField.IsValidChar(Ch: Char): Boolean;

>begin

> Result := Ch in ['+', '-', '0'..'9','.'];

>end;


>procedure Register;

>begin

> RegisterFields([TMicronField]);

>end;


>end.

Поместите данный модуль в ваш каталог lib и добавьте это поле, используя диалог установки компонент. Затем, используя «DataSet designer», свяжите TMicronField с нужными вам полями, после чего вы увидите, что список типов полей включает теперь «Micron». (для отображения полей на новый тип поля, сначала вам необходимо удалить все TIntegerFields).

Другое решение, более простое (но так-же работающее), заключается в изменении исходного кода DBTables и простой замене существующей функции IsValidChar на TIntegerField.

– Mark Edington

Создание новой таблицы на основе структуры другой таблицы

Delphi 1

На ум сразу приходит операция присваивания значения свойству (стоящему с левой стороны от ':='), при которой Delphi в своих недрах вызывает метод 'write' и передает ему в виде единственного параметра все то, что находится в правой части выражения. Если свойство не имеет метода write, оно предназначено только для чтения. Вот определение свойства FieldDefs объекта TDataSet в файле DB.PAS:

>property FieldDefs: TFieldDefs read FFieldDefs write SetFieldDefs

Как вы можете видеть, у него есть метод write. Следовательно, код:

>Destination.FieldDefs := Source.FieldDefs;

в действительности делает такую операцию:

>Destination.SetFieldDefs(Source.FieldDefs);

(за исключением того, что вы не можете использовать эту строку, поскольку SetFieldDefs определен в секции Private.)

Вот определение свойства IndexDefs объекта TTable в файле DBTABLES.PAS file:

>property IndexDefs: TIndexDefs read FIndexDefs;

В этом случае метод write отсутствует, поэтому свойство имеет атрибут только для чтения. Тем не менее, для самого объекта TIndexDefs существует метод Assign. Следовательно, следующий код должен работать:

>Source.IndexDefs.Update;

>Destination.IndexDefs.Assign(Source.IndexDefs);

Перед вызовом Assign для Source.IndexDefs вызывайте метод Update, чтобы быть уверенным в том, что вы получите то, что хотите.

Метод SetFieldDefs является процедурой с одной строкой кода, в которой вызывается метод FieldDefs Assign.

Также можно проверить, определен ли реально индекс, и, если нет, то при вызове IndexDefs.Assign вы можете получить исключение типа «List Index Out Of Bounds» (или что-то типа этого). Например, так: