Решение 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 begin DataBaseName := 'dbdemos'; TableName := 'biolife'; OnFilterRecord := MyTable.fakeFilterRecord; Filtered := true; active := true; end; {проверка получением неких данных...} showmessage(MyTable.fields[1].asstring); Finalization {Важно! MyTable не имеет родителя, - уничтожаем объект сами, иначе память не высвобождается...} MyTable.free; end. |