Текущий архив: 2003.06.16;
Скачать: CL | DM;
ВнизСоздание копии объекта, созданного в приложении, в DLL. Найти похожие ветки
← →
АлексейК (2003-06-02 13:23) [0]Хотелось бы услышать мнения по этому поводу. Как создать в DLL копию обеткта существующего в приложении.
← →
Palladin (2003-06-02 13:25) [1]это как? зачем тебе копия?
← →
АлексейК (2003-06-02 14:44) [2]Допустим в приложении есть объект Edit.
В DLL создаю
DllEdit:=Tedit.Create(....);
Теперь нужно что бы свойтва DllEdit"a послностью совпадали с Edit"oм приложения. Оговорюсь сразу, объект класса TEdit взят лишь в качетсве примера.
← →
Skier (2003-06-02 14:46) [3]>АлексейК (02.06.03 14:44)
Объект умеет копировать (и читать) себя в(из) поток(а) (TStream)
← →
Palladin (2003-06-02 14:47) [4]А на второй вопрос не ответил...
← →
Green (2003-06-02 16:39) [5]>>DllEdit:=Tedit.Create(....);
DllEdit.Assign(EXEedit);
DLLEdit должен иметь в предках класс TPersistent.
свойства DllEdit которые объявлены в published секции будут как у ExeEdit.
← →
Skier (2003-06-02 16:41) [6]>Green (02.06.03 16:39)
Сам пробовал ?
← →
jack128 (2003-06-02 17:17) [7]
> Сам пробовал ?
При компиляции с ран тайм пакетами должно работать...
← →
Skier (2003-06-02 17:20) [8]>jack128 © (02.06.03 17:17)
А разве про run-time пакеты что-нибудь было сказано ?
← →
АлексейК (2003-06-03 04:57) [9]Да вот с потоками надо попробовать.
← →
Green (2003-06-03 10:35) [10]>Green (02.06.03 16:39)
Да уж, ошибочка вышла :).
Можно так.
в exe для нужного компонента сохранить его свойства в строке:
S:=TMemoryStream.Create;
S.WriteComponent(Edit1);
StrStream := TStringStream.Create(st);
S.Seek(0, soFromBeginning);
ObjectBinaryToText(S, StrStream);
st:=StrStream.DataString;
StrStream.Free;
S.Free;
передать строку параметров в dll, а там
S:=TMemoryStream.Create;
StrStream := TStringStream.Create(st);
ObjectTextToBinary(StrStream, S);
StrStream.Free;
S.Seek(0, soFromBeginning);
C:=S.ReadComponent(nil);
(C as TEdit).Parent:=DLLForm;
(C as TEdit).Top:=10;
где C это твой новый компонент.
Не забудь добавить в Dll
initialization
RegisterClasses([TEdit]);
Но так обработчики событий не передаются.
← →
Green (2003-06-03 10:38) [11]initialization
RegisterClasses([TEdit]);
будет работать только для bpl, для dll ты должен явно вызывать функцию dll которая будет делать RegisterClasses([TEdit]);
← →
Green (2003-06-03 11:19) [12]А все обработчики событий можно загрузить
var PropList: PPropList;
NumProps: Integer;
InC - компонент из exe
...
GetMem(PropList, SizeOf(PPropInfo) * GetTypeData(InC.ClassInfo).PropCount);
NumProps := GetPropList(InC.ClassInfo, [tkMethod], PropList);
for i := 0 to NumProps - 1 do
SetMethodPropertyIfExists(C, PropList[i]^.Name, GetMethodProp(InC, PropList[i]^.Name));
...
end;
procedure SetMethodPropertyIfExists(AComp: TComponent; APropName: String;
AMethod: TMethod);
var
PropInfo: PPropInfo;
begin
PropInfo := GetPropInfo(AComp.ClassInfo, APropName);
if PropInfo <> nil then
begin
if PropInfo^.PropType^.Kind = tkMethod then
SetMethodProp(AComp, PropInfo, AMethod);
end;
end;
Страницы: 1 вся ветка
Текущий архив: 2003.06.16;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.006 c