Советы по Delphi

       

Создание компонента TTable без формы I


Решение 1

Действительно, любой компонент можно создать и без (вне) формы или любого другого дочернего компонента. Для этого я использую параметр nil:

FSession := TSession.Create(nil);
FDatabase := TDatabase.Create(nil);FSession.SessionName := 'DBSession'FDatabase.Connected := False;FDatabase.AliasName := Database;FDatabase.DatabaseName := USER_DATABASE;FDatabase.SessionName := FSession.SessionName;
FUserTBL := TTable.Create(nil);FUserTBL.DatabaseName := FDatabase.DatabaseName;FUserTBL.SessionName := FSession.SessionName;FUserTBL.TableName := USERTBL;FUserTBL.IndexName := USERSpIndex;
FUserSource := TDataSource.Create(nil);FUserSource.DataSet := FUserTBL;

Решение 2

Я привожу некоторый код, касающийся описываемой проблемы: он работал, когда я использовал его в большом приложении. Я не знаю специфического метода создания компонента TTable вне родителей, поэтому я пошел путем создания своего класса от TTable во время инициализации модуля. Удобство такого подхода объясняется наличием под рукой всегда готового к работе экземпляра класса, стоит всего-лишь добавить модуль к вашему приложению. Конечно, новый класс не должен иметь одиноко выглядящую процедуру со странной технологией фильтрации данных :=))), да и не помешала бы публикация нескольких событий, но этот пример призван все-го лишь продемонстрировать иной подход к решаемой задаче.



unit Unit2;

interface
uses db, DBTables, dialogs;

type fake = class(Ttable)
procedure fakeFilterRecord(DataSet: TDataSet; var Accept: Boolean);end;

var
MyTable : fake;
implementation

procedure
fake.fakeFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
showmessage('Здравствуй, Вася');end;

Initialization
MyTable := fake.create(nil);With Mytable do beginDataBaseName := 'dbdemos';TableName := 'biolife';OnFilterRecord := MyTable.fakeFilterRecord;Filtered := true;active := true;end;
{проверка получением неких данных...}showmessage(MyTable.fields[1].asstring);
Finalization
{Важно! MyTable не имеет родителя, - уничтожаем объект сами, иначе память не высвобождается...}
MyTable.free;

end.
[000053]
Вы можете использовать TTable, не размещая компонент на форме:

procedure TForm1.TotalPopulation:double;varTbl:TTable;beginResult := 0;Tbl := TTable.Create(nil);trytbl.DatabaseName := 'DBDEMOS';tbl.TableName := 'COUNTRY';Tbl.Open;tbl.First;while not Tbl.EOF do beginResult := Result+Tbl.FieldByName('Population').AsFloat;Tbl.Next;end;Tbl.Close;finallyTbl.Free;end;end;

[000359]




Для создания таблицы программным способом вы должны сделать приблизительно следующее:

with Table1 do begin
Close;TableName := 'test.db';TableType := ttParadox;DatabaseName := 'Sample';FieldDefs.Clear;FieldDefs.Add('Field1',ftString,10,false); {FldName,FldType,FldLength,Required}...IndexDefs.Add('','Field1',[ixPrimary]); { Создание первичного индекса }CreateTable;end;

[000375]



Содержание раздела