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

Тема в разделе "Delphi - FAQ", создана пользователем sn@ke, 9 ноя 2006.

  1. sn@ke

    sn@ke Member

    Регистрация:
    8 окт 2006
    Сообщения:
    21
    Симпатии:
    0
    Нужно сделать функцию function StrToObj(S:String):TObject;
    Кто может помогите. :)
     
  2. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    обьясни что тебе надо, в твоей постановке вопрос лишен смысла
     
  3. sn@ke

    sn@ke Member

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

    Выполняется эта функция следующим образом:
    Код (Text):
      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;
     
  4. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    нада исчо радителя передавать.... хотя можно и не передавать

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

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

    ....
    end;
     
  5. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    Это форум программистов, а не телепатов.

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

    DIR3ct0r Гость

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

    Код (Text):
    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;
     
  7. zubr

    zubr Гость

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

Поделиться этой страницей