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 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]

Что-то я вопрос не понял...

что надо сохранить?


Страницы:   1 2

Наверх

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