Re: Сериализация объектов
От: Verder  
Дата: 09.11.05 14:22
Оценка:
Что у меня получилось. Есть главная формочка, она умеет создавать форму, DFM-ка которой лежит в ресурсах DLL-ки:

Главная формочка
procedure TmForm.Button4Click(Sender: TObject);
var
   ResForm: TsForm;
   rs: TResourceStream;
   ms: TMemoryStream;
   rd: TReader;
   tm: TMethod;
begin
   rs := TResourceStream.Create( h, ResName, RT_RCDATA );
   try
      ms := TMemoryStream.Create;
      try
         ObjectTextToBinary( rs, ms );
         ms.Seek( 0, soFromBeginning );
         ResForm := TsForm.CreateNew( Self );
         try
            rd := TReader.Create( ms, 4096 );
            try
               RegisterClass( TsForm );
               tm.Code := @SubForm.FindMethod;
               tm.Data := ResForm;
               rd.OnFindMethod := TFindMethodEvent( tm );
               ResForm := TsForm( rd.ReadRootComponent( ResForm ) );
               ResForm.ShowModal;
            finally
               rd.Free;
            end;
         finally
            ResForm.Free;
         end;
      finally
         ms.Free;
      end;
   finally
      rs.Free;
   end;
end;
Модуль с утилитами:
procedure FindMethod(Obj: TObject; Reader: TReader; const MethodName: string;
  var Address: Pointer; var Error: Boolean);
begin
   Address := Obj.MethodAddress( MethodName );
   Error := false;
end;
Получаю формочку из DLL-ки с работающим обработчиком на кнопке.
Недостаток данного подхода следующий. Если разместить в DLL-ке как форму предка, так и пронаследованного от него потомка и попытаться получить пронаследованную форму, то форма будет пустой, без компонентов от предка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.