Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.015 c
3-50205
alextov
2003-05-26 10:26
2003.06.16
Запросом выбрать клиентов с днем рожд. в ближайшие 10 дн.


14-50516
lameridze
2003-05-31 20:28
2003.06.16
procedure


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


1-50351
Zigs
2003-06-03 19:33
2003.06.16
Подскажите, плз, как прижатии кнопки (TButton) вписать символ


1-50312
Maks Realov
2003-06-03 11:34
2003.06.16
Inside COM.