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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2013, 16:19   #1
egorka2134
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 40
По умолчанию Как в ходе пограммы создать компонент чтобы он остался в памяти после ее закрытия.

Здравствуйте, есть вопрос:
возможно ли в ходе программы создать компонент, допустим ИМИДЖ, но создать так, чтобы при закрытии программы, и открытии её снова он остался, и если такое возможно то как.
Заранее спасибо.
Р.С.
знаю про динамические компоненты, но они исчезают после перезапуска проги, может можно их както оставить.
Буду рад примеру с кодом!
egorka2134 вне форума Ответить с цитированием
Старый 20.08.2013, 16:30   #2
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

Можно сохранить, но только в файл. Вот пример, но есть и другие ищите.
Код:
var f: TFileStream;
begin
  f := TFileStream.Create('c:\stream.vcl', fmcreate);
  f.WriteComponent(lb);
  f.Free;
end;

...

var
  f: TFileStream;
begin
  f := TFileStream.Create('c:\stream.vcl', fmOpenRead);
  f.ReadComponent(lvFiles);
  f.Free;
Код:
procedure WriteComponent(Stream:TStream;Component:TComponent);
var M:TMemoryStream;
    Size:integer;
begin
 M:=TMemoryStream.Create;
 M.WriteComponent(Component);
 Size:=M.Size;
 Stream.WriteBuffer(Size,SizeOf(Size));
 M.Seek(0,soFromBeginning);
 Stream.CopyFrom(M,M.Size);
 M.Free;
end;

procedure ReadComponent(Stream:TStream;Component:TComponent);
var M:TMemoryStream;
    Size:integer;
begin
 M:=TMemoryStream.Create;
 Stream.ReadBuffer(Size,4);
 M.CopyFrom(Stream,Size);
 M.Seek(0,soFromBeginning);
 M.ReadComponent(Component);
 M.Free;
end;
Код:
procedure TForm1.SaveComponentToFile(T:TComponent; FileName:String);
var//63216
  Writer:TWriter;
  MemoryStream,S2:TStream;
begin
  MemoryStream:=TMemoryStream.Create;
  try
    Writer:=TWriter.Create(MemoryStream, 8192);
    try
      Writer.OnFindAncestor :=  FindAncestorEvent;
 
      Writer.Root := Self;  // чьи методы будут использоваться
      Writer.WriteSignature; 
      Writer.WriteComponent(T);
    finally
      Writer.Free;
    end;
 
    // копируем MemoryStream на файл
    MemoryStream.Position:=0;
 
    S2:=TFileStream.Create(FileName,fmCreate);
    try
      S2.CopyFrom(MemoryStream,0);
    finally
      S2.Free;
    end;
 
    ShowBinaryStream(MemoryStream,Memo_Show_Writer.Lines);
 
    FreeAndNil(T); // уничтожаем компонент, что бы потом проверить
 
  finally
    MemoryStream.Free;
  end;
end;
 
/// читает компонент из файла
procedure TForm1.RestoreComponentFromFile(ComponentName:String; FileName:String);
var
  Reader:TReader;
  S1:TStream;
  T,T1:TComponent;
begin
 
  S1:=TFileStream.Create(FileName,fmOpenRead);
  try
    ShowBinaryStream(S1, Memo_Show_Reader.Lines );
 
    S1.Position:=0;
 
    Table1.Free;
 
    Reader:=TReader.Create(S1,8192);
    try
      Reader.BeginReferences;
 
      Reader.Owner  :=Self; // !!
      Reader.Root   :=Self; // чьи методы будут использоваться
 
      Reader.ReadSignature;
      T:=Reader.ReadComponent(Nil);
      T1:=FindComponent(ComponentName);
      if T = Nil then
        Memo_Log.Lines.Add('Компонент не прочитался')
      else
      if T1 = Nil then
        Memo_Log.Lines.Add('Компонент не находится')
      else
      if T1<>T then
        Memo_Log.Lines.Add('Компоненты не совпадают')
      else
        Memo_Log.Lines.Add('Компонент прочитался');
 
      Reader.EndReferences;
    finally
      Reader.Free;
    end;
 
    if T Is TControl then TControl(T).Parent:=Self;  // это тоже может быть важно
 
  finally
    S1.Free;
  end;
 
end;

Последний раз редактировалось Кольша; 20.08.2013 в 16:32.
Кольша вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зацикливание открытия, после закрытия GWolf Microsoft Office Excel 6 09.11.2012 11:45
Как сделать чтобы при открывании второй формы и закрытия основной не пропадал значок на таскбаре? TwiX Общие вопросы Delphi 2 10.09.2009 20:57
Как сохранить значение Edit после закрытия tarakan1983 Помощь студентам 14 11.09.2008 08:25
Как сделать чтобы динамически созданные объекты оставались после закрытия формы? AHAPXUCT2007 Общие вопросы Delphi 7 28.09.2007 08:46