Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2008, 20:25   #1
devi409
Пользователь
 
Регистрация: 28.12.2006
Сообщений: 75
По умолчанию редактор компонентов

хочу сделать редактор компонентов. Возможно эта тема уже ранее поднималась. Заранее прошу прощения.
Создавать удалять перемещать изменять размеры компонентов я умею.
А вот вопрос как сохранить и загрузить те компоненты которые я создал на форме?
Знаю функции
WriteComponent и ReadComponent
впринципе можно былобы через них все сделать но вот только как...
подскажите пожалуйста.
devi409 вне форума Ответить с цитированием
Старый 18.12.2008, 22:06   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Посмотрите статью по теме:

Сериализация объектов стандартными средствами Delphi

Надеюсь, поможет...
alexBlack вне форума Ответить с цитированием
Старый 19.12.2008, 07:24   #3
devi409
Пользователь
 
Регистрация: 28.12.2006
Сообщений: 75
По умолчанию

Спасибо за статейку. Полезная весчь, однако мало понятная
я так и не разобрался как де сохранить и загрузить компоненты.
Знаю что можно воспользоваться такой вот процедуркой
WriteComponent(form1)
тем самым я помещу все данные о компонентах к примеру в поток.
а вот из потока как и выдрать? Если воспользоваться процедуркой
ReadComponent
то возникает исключительная ситуация при которой говорится что как минимум элемент Form1 уже существует и снова создать его никак незя. Тоже самое относится и к компонентам расположенным на форме. Хотелось бы их заменить.
Можно создать новую форму и загрузить поток в нее то да все отлично работает Но мне новая не нужна, нужна старая...
Как поступить в этом случае?
devi409 вне форума Ответить с цитированием
Старый 19.12.2008, 08:38   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от devi409 Посмотреть сообщение
...то возникает исключительная ситуация при которой говорится что как минимум элемент Form1 уже существует и снова создать его никак незя. Тоже самое относится и к компонентам расположенным на форме. Хотелось бы их заменить....
С Form1 проблем быть не должно. С компонентами - да, но их можно удалить и создать заново. Вот пример:

Код:
const FileName : String = 'test.dat';
procedure TForm2.FormCreate(Sender: TObject);
var F: TFileStream;
begin
   F := TFileStream.Create(FileName, fmCreate);
   try
     F.WriteComponent(Self);
   finally
     F.Free;
   end;
end;

procedure TForm2.Button1Click(Sender: TObject);
var F: TFileStream;
begin
   While ComponentCount > 0 do begin
      Components[0].Free;
   end; 

   F := TFileStream.Create(FileName, fmOpenRead);
   try
     F.ReadComponent(Self);
   finally
     F.Free;
   end;
end;
alexBlack вне форума Ответить с цитированием
Старый 19.12.2008, 16:21   #5
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Цитата:
Сообщение от devi409 Посмотреть сообщение
хочу сделать редактор компонентов. Возможно эта тема уже ранее поднималась. Заранее прошу прощения.
Создавать удалять перемещать изменять размеры компонентов я умею.
А вот вопрос как сохранить и загрузить те компоненты которые я создал на форме?
Знаю функции
WriteComponent и ReadComponent
впринципе можно былобы через них все сделать но вот только как...
подскажите пожалуйста.
Готовое решение: http://visualtech.townnet.ru , исходники платные. Есть всё: дизайнер форм, инспектор, редактор кода...
Rik вне форума Ответить с цитированием
Старый 19.12.2008, 16:27   #6
devi409
Пользователь
 
Регистрация: 28.12.2006
Сообщений: 75
По умолчанию

да я так именно и пробовал сохранить. Но у меня на форме прописан новый класс TMyPanel и при загрузке соответственно он ругается "Class TMyPanel not found"
как быть?

Последний раз редактировалось devi409; 19.12.2008 в 18:10.
devi409 вне форума Ответить с цитированием
Старый 19.12.2008, 18:57   #7
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Цитата:
Сообщение от devi409 Посмотреть сообщение
да я так именно и пробовал сохранить. Но у меня на форме прописан новый класс TMyPanel и при загрузке соответственно он ругается "Class TMyPanel not found"
как быть?
При старте программы, для того чтобы TReader нормально могли создавать классы из потока, клаcсы должны быть зарегистрированы в системе с помощью RegisterClass(TMyPanel) или RegisterClasses([TmyPanel, TPanel, TButton]). По окончании работы с системой классы должны быть дерегистрированы UnRegisterClass(TMyPanel) или UnRegisterClasses([TMyPanel, .....])
Регистрацию можно вложить в OnCreate главной формы приложения или в секцию инициализации модуля
Дерегистрацию можно вложить в OnDestroy главной формы или в секцию fianlization.

Последний раз редактировалось Rik; 19.12.2008 в 19:00.
Rik вне форума Ответить с цитированием
Старый 19.12.2008, 19:03   #8
devi409
Пользователь
 
Регистрация: 28.12.2006
Сообщений: 75
По умолчанию

Большое спасибо Rik!!! помогло.
А где лучше всего их регестрировать и дерегистрировать
я сделал в событии создании формы и в событии загрытии формы

Да и в примере alexBlack для уничтожения компонентов используется метод Free. Чем он отличается от Destroy?
devi409 вне форума Ответить с цитированием
Старый 19.12.2008, 20:07   #9
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от devi409 Посмотреть сообщение
Большое спасибо Rik!!! помогло.
А где лучше всего их регестрировать и дерегистрировать
я сделал в событии создании формы и в событии загрытии формы
Как Вам удобнее. Если форма создается один раз, то нормально. Если нет, то лучше перенести в секцию инициализации модуля.

Цитата:
Да и в примере alexBlack для уничтожения компонентов используется метод Free. Чем он отличается от Destroy?
В принципе ничем. Из VCL:
Код:
procedure TObject.Free;
begin
  if Self <> nil then Destroy;
end;
Из справки: <Use Free to destroy an object....>
alexBlack вне форума Ответить с цитированием
Старый 19.12.2008, 20:29   #10
devi409
Пользователь
 
Регистрация: 28.12.2006
Сообщений: 75
По умолчанию

Уважаемые, вот я имею компонент TMyPanel. Можно какнить настроить для него что бы его свойство Caption имело свойство Visible.
Что для этого нужно сделать?

Последний раз редактировалось devi409; 20.12.2008 в 08:49.
devi409 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пропадание компонентов Terran Компоненты Delphi 2 03.11.2008 18:07
События компонентов Hottabych Работа с сетью в Delphi 1 13.09.2008 00:10
Удаление компонентов SanekIrk Общие вопросы Delphi 8 16.08.2008 09:26
Размер компонентов Witaliy Общие вопросы Delphi 0 06.06.2008 16:28
редактор форм и компонентов Witaliy Общие вопросы Delphi 6 27.04.2008 16:23