![]() |
| ||
|
|
Новости |
Поиск |
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 17:34:00) [1]Извращенный вариант не пройдет: смысл именно в том, чтобы сохранять все изменения в составе и описаниях полей и т.д.
А насчет поможет ли - посмотрим... Боюсь, кода профи я не пойму... не настолько глубоко все знаю. :(
Будем учиться :)
Sun bittern (2004-07-21 16:49:00) [2]Не знаю поможет ли
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1089284149&n=12
Как второй извращщенный вариант :(
Поместить не визуальные компоненты в DataModule (для удобства)
Визуальным компонентам назначить уникальный Tag. Полсле загрузки панельки перебрать на ней контролы и проверять Tag. Например если 1, то ага, значит у тебя есть проперти DataSource и назначить ему соотвествующий DataSource из DataModule.
Но это все изврат и неудобно в дальнейшем расширять функциональность. Лучше скачать пакет компонент Sun bittern © (20.07.04 09:23) [5] и посомтреть как это профи сделали. Или создавать парсер строк (по типу *.dfm файла) с помощью RTTI.
DmitryNekl (2004-07-21 16:33:00) [3]И что теперь делать? Что ли, сохранять каждый компонент по отдельности и загружать на форму, а потом настраивать связи?
Sun bittern (2004-07-21 16:30:00) [4]Блин. Выходит, что сохраняются только TControl :^( Щас сам проверил.
DmitryNekl (2004-07-21 15:45:00) [5]Пробовал... однако торможу.
Смотри, фигня какая. Привожу еще раз код:
Создание компонентов на первой форме:
procedure TForm1.FormCreate(Sender: TObject);
begin
Panel1:=TPanel.Create(Form1);
Panel1.Name:='Panel1';
Panel1.Left:=20;
Panel1.Width:=Form1.Width-40;
Panel1.Top:=320;
Panel1.Height:=Form1.Height div 4;
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;
Код создания второй формы:
constructor TForm4.Create(AOwner: TComponent); // override;
var
i: integer;
fname: String;
FS: TFileStream;
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;
ShowMessage(Panel1.Parent.ClassName);
(Panel1.Components[1] as TADOQuery).Connection:=(Panel1.Components[0] as TADOConnection);
(Panel1.Components[2] as TDataSource).DataSet:=(Panel1.Components[1] as TADOQuery);
(Panel1.Components[3] as TDBGrid).DataSource:=(Panel1.Components[2] as TDataSource);
Self.Name:='';
Self.Caption:='Редактирование содержимого таблицы';
Self.Show;
end;
То, что жирным выделено, до меня дошло вставить туда только что... Выводит Form1, т.е. я играю не с тем объектом.
А оператор
for i:=0 to TControl(A4).ComponentCount-1 do ShowMessage (TControl(A4).Components[i].ClassName);
вставленный вместо жирного, выводит только TDBGrid... и больше нифига. Это получается, что остальные три объекта не сохраняются вместе с панелькой?
Sun bittern (2004-07-21 15:41:00) [6]DmitryNekl (21.07.04 15:27) [32]
после загрузки проверь открыты ли у тебя источники данных (Active = True)
Sun bittern (2004-07-21 15:36:00) [7]DmitryNekl (21.07.04 15:27) [32]
Может компонентам адошным и таблицам надо в проперти Active в True принудительно указать?
DmitryNekl (2004-07-21 15:27:00) [8]С одной стороны, могу, а с другой - это бесполезно, ибо к базе я подключаюсь в инете (MySQL), и тебе придется настроить источники данных и т.д.
Уверенность - я проверил один раз... если бы что-то изменилось, была бы ошибка приведения типов, а ее не происходит.
Sun bittern (2004-07-21 15:13:00) [9]>> Panel1.Components[2] as TDataSource
От куда такая уверенность? Индексы могут ведь и поменяться со временем.
P.S. Можешь свой проект на мыло мне кинуть. Только без *.dcu, *.exe, *.~* и другого мусора.
DmitryNekl (2004-07-21 14:17:00) [10]Ничего не понимаю... в конструктор добавил:
(Panel1.Components[1] as TADOQuery).Connection:=(Panel1.Components[0] as TADOConnection);
(Panel1.Components[2] as TDataSource).DataSet:=(Panel1.Components[1] as TADOQuery);
(Panel1.Components[3] as TDBGrid).DataSource:=(Panel1.Components[2] as TDataSource);
Все работает (сообщений об ошибках нет), но грид выводится пустой...
Sun bittern (2004-07-21 12:24:00) [11]Дык. Чей Owner у компонент, у того вроде и надо спрашивать. А у кого? Можешь узнать например так, псоле загрузки: DataSource1.Owner.Name
DmitryNekl (2004-07-21 12:16:00) [12]Да, в конструкторе формы Self - это форма. Для компонент Owner - действительно панелька. НО! КАК МНЕ ДОБРАТЬСЯ ДО КОМПОНЕНТОВ, чтобы настроить их свойства?
Sun bittern (2004-07-21 12:15:00) [13]>> 4 компонента вместе с панелью сохранились
Если Owner у них панелька, то должны вместе сней в файл слиться.
Sun bittern (2004-07-21 12:10:00) [14]Self это форма? Если для компонент Owner панелька, то это действительно должно быть так.
DmitryNekl (2004-07-21 12:03:00) [15]Sun bittern © (21.07.04 11:52) [23]
Точнее наверно будет сказать так:
В свойстве DataSourece компонента TDBGrid не сохранится указатель на компонент MyDataSource.
Я правильно понимаю, что все 4 компонента вместе с панелью сохранились, и достаточно настроить их взаимные связи? Тока вот добраться бы до них :)
DmitryNekl (2004-07-21 12:00:00) [16]А еще интересный вопрос. После выхода из конструктора как мне до мой панельки или до грида добраться? Self.ComponentCount выдает 0 (последним оператором в конструкторе)...
Sun bittern (2004-07-21 11:52:00) [17]Точнее наверно будет сказать так:
В свойстве DataSourece компонента TDBGrid не сохранится указатель на компонент MyDataSource.
Sun bittern (2004-07-21 11:33:00) [18]TDBGrid.DataSourece := MyDataSource
Вот MyDataSource и не сохранится в свойстве DataSourece компонента TDBGrid. Также как к примеру и TPopupMenu в свойстве PopupMenu компонента TPanel.
DmitryNekl (2004-07-21 11:13:00) [19]Что-то я не пойму. Я сохраняю панель, которая является owner-ом для:
1. DBGrid
2. ADOConnection
3. ADOQuery
4. DataSource
Вместе с панелью сохраняется грид... почему же не сохраняется все остальное? Где тут внешние компоненты?
Sun bittern (2004-07-21 10:59:00) [20]Я же тебе писал WriteComponent не сохраняет указатели на внешние компоненты и методы (события). Ковыряйся в компонентах с исходниками может там нароешь.
Sun bittern © (20.07.04 09:23) [5]
Я начинал делать парсер строк для определения ссылки на компоненты и методы используя RTTI но до конца пока не доделал.
Сайт http://www.tdelphi.spb.ru/раздел компоненты