![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение компонентов в файл и чтение из него [D7]
DmitryNekl © (2004-07-19 18:07:00)Добрый день. Не знаю, может, мне в БД надо... В общем, вопрос такой:
Создаю форму:
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOConnection1:=TADOConnection.Create(self);
ADOConnection1.Name:='ADOConnection1';
ADOConnection1.LoginPrompt:=False;
ADOConnection1.ConnectionString:='...';
ADOConnection1.GetTableNames(Combobox1.Items, False);
ADOQuery1:=TADOQuery.Create(self);
ADOQuery1.Connection:=ADOConnection1;
DataSource1:=TDataSource.Create(self);
DataSource1.Name:='DataSource1';
DataSource1.DataSet:=ADOQuery1;
DBGrid1:=TDBGrid.Create(Form1);
DBGrid1.Name:='DBGrid1';
DBGrid1.Parent:=Form1;
DBGrid1.DataSource:=DataSource1;
end;
Потом что-то делаю с ней, и в гриде отображаются какие-то данные. После этого сохраняю компоненты в файл:
procedure TForm1.Button6Click(Sender: TObject); // сохраняем табличку в файл
begin
ADOConnection1.Name:='';
WriteComponentResFile('ADOConnection1.dfm', ADOConnection1);
ADOConnection1.Name:='ADOConnection1';
ADOQuery1.Name:='';
WriteComponentResFile('ADOQuery1.dfm', ADOQuery1);
ADOQuery1.Name:='ADOQuery1';
DataSource1.Name:='';
WriteComponentResFile('DataSource1', DataSource1);
DataSource1.Name:='DataSource1';
DBGrid1.Name:='';
WriteComponentResFile('DBGrid1.dfm', DBGrid1);
DBGrid1.Name:='DBGrid1';
end;
А потом пытаюсь прочесть из файла (в другую форму, чистую):
procedure TForm1.Button7Click(Sender: TObject);
var F: TForm;
begin
F:=TForm4.Create(Form1);
end;
constructor TForm4.Create(AOwner: TComponent); // override;
var
fname: String;
begin
RegisterClasses([TADOQuery, TADOConnection, TDBGrid, TDataSource, TForm4, TButton]);
CreateNew(AOwner);
ReadComponentResFile('ADOConnection1.dfm', Self);
ReadComponentResFile('ADOQuery1.dfm', Self);
ReadComponentResFile('ADODataSource1.dfm', Self);
ReadComponentResFile('DBGrid1.dfm', Self);
Self.Name:='';
Self.Caption:='...';
Self.Show;
end;
и получаю ошибку "Property Connected does not exist"...
Как бороться? Заранее спасибо!
DmitryNekl (2004-07-21 10:17:00) [21]Хрень какая-то... Не работает. Т.е.:
procedure TForm1.FormCreate(Sender: TObject);
begin
Panel1:=TPanel.Create(Form1);
Panel1.Parent:=Form1;
ADOConnection1:=TADOConnection.Create(Panel1);
ADOConnection1.Name:='ADOConnection1';
ADOConnection1.LoginPrompt:=False;
ADOConnection1.ConnectionString:='...';
...
ADOQuery1:=TADOQuery.Create(Panel1);
ADOQuery1.Connection:=ADOConnection1;
DataSource1:=TDataSource.Create(Panel1);
DataSource1.Name:='DataSource1';
DataSource1.DataSet:=ADOQuery1;
DBGrid1:=TDBGrid.Create(Panel1);
DBGrid1.Name:='DBGrid1';
DBGrid1.Align:=alClient;
DBGrid1.DataSource:=DataSource1;
DBGrid1.Parent:=Panel1;
end;
Потом выбираю таблицу БД, грид загружается данными... Сохраняю:
procedure TForm1.Button6Click(Sender: TObject);
var f: TFileStream;
begin
f := TFileStream.Create('c:\stream1.vcl', fmCreate);
f.WriteComponent(Panel1);
f.Free;
end;
Потом читаю в другой форме:
constructor TForm4.Create(AOwner: TComponent);
var
fname: String;
FS: TFileStream;
a1, a2, a3, a4: TComponent;
begin
RegisterClasses([TPanel, TADOQuery, TADOConnection, TDBGrid, TDataSource, TForm4, TButton]);
CreateNew(AOwner);
FS := TFileStream.Create('c:\stream1.vcl', fmOpenRead or fmShareDenyRead);
try
A4 := FS.ReadComponent(nil);
if A4 is TControl then
begin
TControl(A4).Parent := Self;
TControl(A4).Align :=alClient;
end;
finally
FS.Free;
end;
end;
Форма появляется, на ней - панелька, на панельке - грид, но грид к таблице не подключен, а пустой :(
Почему? Что делать?
DmitryNekl (2004-07-20 18:04:00) [22]О, классная мысль (про панельку)! :)
Непременно попробую, спасибо огромное! :)
Sun bittern (2004-07-20 16:59:00) [23]>> А в первой всяких "лишних" наворотов до дури...
1. Дурь можно вынести на отдельную форму - яля панель инструментов
2. Или. Кинуть нужные компоненты на отдельный TWinControl (например TPanel). Тоесть точто нужно сохранить просаем на эту панельку. Но чтобы вместе с этой панелькой сохранились и компоненты наней, лежащие на ней компоненты должны пренадлежать ей т.е. она должна являться хозяином для них (Owner). Далее сохранить панель в файл (указать только панель, раз для компонентов хозяином является панель, то то что на ней автоматически сохранится в файл)
3. Ну можно еще чего насоченять ;)
DmitryNekl (2004-07-20 14:15:00) [24]Не совсем... но стало близко к нему :)
Изначально я делал приложение для работы с БД, но структура БД стала меняться слишком часто... в общем, я решил, что это оптимально :). И в принципе, сделал... осталось тока научиться сохранять/загружать...
А по существу есть мысли?
Sun bittern (2004-07-20 14:10:00) [25]Ты свой мини дизайнер создаешь чтоли :)
DmitryNekl (2004-07-20 14:07:00) [26]Да, это я умею... но тут прикол в том, что редактирую я все это дело в одной форме, а открываю настроенный грид - в другой. А в первой всяких "лишних" наворотов до дури...
Sun bittern (2004-07-20 13:29:00) [27]Может тебе не кусками сохранять, а всю форму в поток слхранить? Как этот вариант?
DmitryNekl (2004-07-20 13:10:00) [28]Нашел еще неприятную особенность... в качестве всяких ADOQuery, ADOConnection при загрузке формы используются те, которые находятся на форме, с которой происходит сохранение грида.
Как бы мне вместе с гридом сохранять и компоненты ADOQuery, ADOConnection, DataSource, а при загрузке грида загружать и их и подключать к гриду?
Sun bittern (2004-07-20 12:14:00) [29]>> Хотя я и не понимаю, почему :).
FS.ReadComponent( nil);
А гдето в инете давно данный пример откопал. Возможно на королевстве дельфи.
Кстати
DBGrid1.Align:=alClient;
DBGrid1.Parent:=Self;
DBGrid1.Visible:=True;
Данные Published свойства (те что видны в инспекторе объектво) сохраняются WriteComponent (кроме, как я описал выше линек на внешние компоненты) и изменять необязательно. В данном случае Parent не Published свойство, вот и портебовалось указать ему родителя.
DmitryNekl (2004-07-20 11:53:00) [30]Спасибо, все заработало! :)
Хотя я и не понимаю, почему :).
Можно ссылочку на какую-нить статью на эту тему?
Sun bittern (2004-07-20 11:37:00) [31]var
FS: TFileStream;
A: TComponent;
begin
FS := TFileStream.Create('Nova.dfa', fmOpenRead or fmShareDenyRead);
try
A := FS.ReadComponent(nil);
if A is TControl then
TControl(A).Parent := Form2;
finally
FS.Free;
end;
end;
DmitryNekl (2004-07-20 11:16:00) [32]А почему так? Я код не полностью привел, на самом деле в конструкторе второй формы делаю так:
RegisterClasses([TADOQuery, TADOConnection, TDBGrid, TDataSource, TForm4, TButton]);
CreateNew(AOwner);
f:=TFileStream.Create('c:\stream.vcl', fmOpenRead);
f.ReadComponent(DBGrid1);
f.Free;
DBGrid1.Align:=alClient;
DBGrid1.Parent:=Self;
DBGrid1.Visible:=True;
У меня вопрос, в общем-то - почему исчезает грид с первой формы???
Sun bittern (2004-07-20 11:08:00) [33]>> f.ReadComponent(DBGrid1);
Form2 := TForm(f.ReadComponent(DBGrid1));
Может так?
DmitryNekl (2004-07-20 10:28:00) [34]В общем, научился я сохранять и загружать:
Сохранение:
f := TFileStream.Create('c:\stream.vcl', fmCreate);
f.WriteComponent(DBGrid1);
f.Free;
Загрузка:
f := TFileStream.Create('c:\stream.vcl', fmOpenRead);
f.ReadComponent(DBGrid1);
f.Free;
Все работает, но интересный глюк (или я чего не понимаю):
Есть исходная форма, на которой расположен этот самый грид. Я его сохраняю в файл и потом загружаю на другую форму. В момент загрузки этот грид с первой формы исчезает :(.
С чем это может быть связано и как, собственно, бороться?
Sun bittern (2004-07-20 09:23:00) [35]А, ветку на пенсию уже отправели. Ищи сайт TDElphi (адрес непомню) и на этом сайте ищи компоненты LMDTools (там говорят дезайнер есть, но еще не смотрел, можещь тпм реализацию глянуть). Ну или этот же пакет ищи гденибудь в другом месте.
DmitryNekl (2004-07-20 09:17:00) [36]А как это можно реализовать?
Sun bittern (2004-07-20 09:09:00) [37]WriteComponent не сохраняет указатели на внешние компоненты.
DmitryNekl (2004-07-20 09:09:00) [38]Исходно задача такая. Пишу приложение для работы с БД. Хочу сделать максимально гибко настраиваемым.
В частности, можно сделать так: настроить все поля в редакторе полей, визуально сформировать соответствующий грид (чтобы названия колонок по-русски отображались и т.д.). Но тогда мы жестко привязываемся к структуре таблиц базы.
А можно на этапе выполнения подключаться к таблице и все вышеперечисленные вещи настраивать. А чтобы не делать это каждый раз, хочется сохранять настроенные компоненты (настроенные - значит с сохранением инфы о таблице, полях и т.д.) в файл и загружать их по мере необходимости.
Вот, собственно, и пытаюсь сначала сохранить, а потом - восстановить...
Defunct (2004-07-20 03:29:00) [39]Что-то я вопрос не понял...
что надо сохранить?