• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Конвертация String -> Object

  • Автор темы sn@ke
  • Дата начала
S

sn@ke

Нужно сделать функцию function StrToObj(S:String):TObject;
Кто может помогите. :)
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
обьясни что тебе надо, в твоей постановке вопрос лишен смысла
 
S

sn@ke

Мне нужно это для создания компонентов, получается из плагина передается функция в ядро AddMenuItem(Owner,Caption,Name:string; Proc:TNotifyEvent);

Выполняется эта функция следующим образом:
Код:
  procedure TMyPlugClass.AddMenuItem(Owner,Caption,Name:string;Proc:TNotifyEvent);
var NewItem:TMenuItem;
Own:TObject;
begin
Own:=StrToObj(Owner);
NewItem:=TMenuItem.Create(Own as TMainMenu);
NewItem.Caption:=MenuItemCaption;
NewItem.OnClick:=Proc;
(Own as TMainMenu).Items.Add(NewItem);
end;
 
M

morpheus

нада исчо радителя передавать.... хотя можно и не передавать

чтото типа такого(может что то не точно - писал прямо на странице,а не в делфи)

Код:
function StrToObj(sObj : string): tObject
begin
If sObj = "TmainMenu" then begin
StrToObj:=TMenuMenu.Create(nil);
end;

....
end;
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Это форум программистов, а не телепатов.

Owner -это что за сторока? она каким то образом индентифицирует объек? или это сериализация объетка? В общем случае такое преобразование совершить нельзя.
 
D

DIR3ct0r

взял из справочной информации Delphi по TMemoryStream:

Код:
function ComponentToString(Component: TComponent): string;
var
BinStream:TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFromBeginning);
Result:= StrStream.DataString;
finally
StrStream.Free;

end;
finally
BinStream.Free
end;
end;

function StringToComponent(Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result := BinStream.ReadComponent(nil);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;
 
Z

zubr

Для: sn@ke
В любом случае, для твоей задачи, в твоем классе надо иметь ссылку на компонент-родитель меню (TForm) или на само меню (TMainMenu). То есть что то типа параметра в конструкторе класса:
Код:
TMyPlugClass.Create(MainForm:TForm);
begin
m_MainForm:=MainForm;//здесь m_MainForm-приватный член класса TMyPlugClass
end;
В самой функции StrToObj, используя m_MainForm.FindComponent, если есть компонент с таким именем, возвращать указатель на искомый компонент.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!