Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.011 c
14-50481
SH
2003-05-29 14:05
2003.06.16
Delfi и локальная сеть


1-50394
child_sun
2003-06-04 13:35
2003.06.16
Скринсейвер


1-50286
alik_os
2003-06-04 14:31
2003.06.16
Запись CD-R более 700 метров


1-50352
Voyager
2003-06-02 20:57
2003.06.16
Помогит пожалуйста сделать блокератор экрана для игрового клуба!


3-50262
Rocker
2003-05-25 03:45
2003.06.16
Независимость от регистра




   Наверх