Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранение компонентов в файл и чтение из него [D7]


Страницы:   1 2

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/раздел компоненты


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо