Главная страница
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.014 c
3-50228
I_C_E_
2003-05-24 14:54
2003.06.16
Вопрос по QReport


3-50234
Basic
2003-05-24 02:38
2003.06.16
Delete не любит длинное условие


1-50396
Петр
2003-06-03 13:06
2003.06.16
Обработка исключений в DLL


14-50496
Leather
2003-05-30 22:51
2003.06.16
Оцените работы


1-50368
Инга
2003-06-04 02:23
2003.06.16
как реализовать цикл for..next с шагом отличным от 1?