Конференция "Компоненты" » Редатор свойств для типа TStrings [D7, WinXP]
 
  • Arm79 © (27.09.06 15:01) [0]
    Здравствуйте.

    Пишу компонент. Но никак не могу наладить правильную работу редактора свойств для типа TStrings

    Как можно передать из свойства TStrings текст в окно редактирования и наоборот?
    У меня не получилось, хотя старался делать по примеру

    Модуль, в котором реализован компонент

    type
     TSimple = class(TComponent)
     private
    ...
       FCategories: TStringList;
    ...
     public
       { Public declarations }
       constructor Create(AOwner: TComponent); override;
       destructor Destroy; override;
    ...
     published
       { Published declarations }
    ...
       property Categories  : TStringList read FCategories;
    ...
     end;
     
    constructor TSimple.Create(AOwner: TComponent);
    begin
     inherited;
    ....
     FCategories := TStringList.Create;
     FCategories.Text := 'TStringList';
    end;



    модуль в котором происходит регистрация компонента

    unit SimpleReg;

    interface

    uses
     SimpleUnit,
     SysUtils, Classes, DesignIntf, DesignEditors, StringsEdit, Controls;

    type
     TCatProperty = class(TStringProperty)
     protected
     public
       function GetValue: string; override;
       function GetAttributes: TPropertyAttributes; override;
       procedure Edit; override;
     end;

    procedure Register;

    implementation

    procedure Register;
    begin
     RegisterComponents('Test', [TSimple]);
     RegisterPropertyEditor(TypeInfo(TStrings), TSimple, 'Categories', TCatProperty);
    end;

    { TCatProperty }

    procedure TCatProperty.Edit;
     var
       Dlg : TStringsEditDlg;
    begin
     Dlg := TStringsEditDlg.Create(nil);
     try
       Dlg.Lines.Text := Value;
       if Dlg.ShowModal= mrOk then
         Value := Copy(Dlg.Lines.Text, 1, Length(Dlg.Lines.Text)-2);
     finally
       Dlg.Free;
     end;
    end;

    function TCatProperty.GetAttributes: TPropertyAttributes;
    begin
     Result := inherited GetAttributes;

     if GetName = 'Categories'
     then Result := Result + [paDialog];
    end;

    end.

  • DimaBr (27.09.06 15:43) [1]
    Вырезка из Raize


    Dialog := TRzStringListEditDlg.Create( Application );
     try
       if ( PropCount = 1 ) and ( GetComponent( 0 ) is TComponent ) then
       begin
         Component := TComponent( GetComponent( 0 ) );

         if Component.Owner <> nil then
           OwnerName := Component.Owner.Name + '.'
         else
           OwnerName := '';
         Dialog.FPropName := Format( '%s%s.%s', [ OwnerName, Component.Name, GetName ] );
         Dialog.Caption :=  Dialog.FPropName + ' - ' + Dialog.Caption;
       end;

       { Copy string list of property into the memo field of the dialog }
       Dialog.EdtStrings.Lines := TStrings( GetOrdValue );
       Dialog.UpdateLineColStatus;      { Update initial cursor position status }

       if Dialog.ShowModal = mrOK then
         SetOrdValue( Longint( Dialog.EdtStrings.Lines ) );

  • Arm79 © (27.09.06 16:02) [2]

      Dlg.Lines := TStrings( GetOrdValue );  // здесь старое значение передается в окно

      if Dlg.ShowModal = mrOK then
        SetOrdValue( Longint( Dlg.Lines ) );  // а вот здесь при нажатии на Ok - access violation



    так например не работает
  • Arm79 © (27.09.06 16:10) [3]
    а вот так работает.
    Насколько такая форма записи корректна?

    procedure TCatProperty.Edit;
     var
       Dlg : TStringsEditDlg;
       slT : TStringList;
    begin
     Dlg := TStringsEditDlg.Create(nil);
     try
       slT := TStringList(GetOrdValue);

       Dlg.Lines.Text := slT.Text;

       if Dlg.ShowModal = mrOk
       then slT.Text := Copy(Dlg.Lines.Text, 1, Length(Dlg.Lines.Text)-2);
     finally
       Dlg.Free;
     end;
    end;

  • DimaBr (27.09.06 16:17) [4]
    Странно, тогда

    TMyComponent(GetComponent(0)).MyStrindListProperty

  • Arm79 © (27.09.06 16:29) [5]

    > а вот так работает.
    > Насколько такая форма записи корректна?
    >
    > procedure TCatProperty.Edit;
    >  var
    >    Dlg : TStringsEditDlg;
    >    slT : TStringList;
    > begin
    >  Dlg := TStringsEditDlg.Create(nil);
    >  try
    >    slT := TStringList(GetOrdValue);
    >
    >    Dlg.Lines.Text := slT.Text;
    >
    >    if Dlg.ShowModal = mrOk
    >    then slT.Text := Copy(Dlg.Lines.Text, 1, Length(Dlg.Lines.
    > Text)-2);
    >  finally
    >    Dlg.Free;
    >  end;
    > end;


    при такой форме записи в DesignTime введенные значения сохраняются, но в runtime - теряются
  • Arm79 © (27.09.06 16:48) [6]
    procedure TCatProperty.Edit;
     var
       Dlg : TStringsEditDlg;
       slT : TStringList;
    begin
     Dlg := TStringsEditDlg.Create(nil);
     try
       slT := TStringList(GetOrdValue);

       Dlg.Lines.Text := slT.Text;

       if Dlg.ShowModal = mrOk
       then
         slT.Text := Copy(Dlg.Lines.Text, 1, Length(Dlg.Lines.Text)-2);
         //TLogWriter(GetComponent(0)).Categories.Text := Copy(Dlg.Lines.Text, 1, Length(Dlg.Lines.Text)-2);

     finally
       Dlg.Free;
     end;
    end;



    в рантайм все попадает при обоих формах записи, но только если
    property Categories  : TStringList read FCategories write FCategories;

  • Arm79 © (27.09.06 16:57) [7]

    > DimaBr


    Большое спасибо. Дал нужное направление поиска :)
  • DimaBr (28.09.06 09:13) [8]

    > в рантайм все попадает при обоих формах записи

    Нужно давать команду дизайнеру. что произошли изменения
    Designer.Modified;

  • имя (21.03.07 21:27) [9]
    Удалено модератором
  • имя (21.03.07 21:33) [10]
    Удалено модератором
  • Юрий Зотов © (21.03.07 23:26) [11]
    type
     TSimple = class(TComponent)
     private
       FCategories: TStrings;
       procedure SetCategories(const Value: TStrings);
     public
       constructor Create(AOwner: TComponent); override;
       destructor Destroy; override;
     published
       property Categories: TStrings read FCategories write SetCategories;
     end;

    constructor TSimple.Create(AOwner: TComponent);
    begin
     inherited;
     FCategories := TStringList.Create
    end;

    destructor Destroy; override;
    begin
     FCategories.Free;
     inherited
    end;

    procedure SetCategories(const Value: TStrings);
    begin
     FCategories.Assign(Value)
    end;


    А все остальное - выкидываем. И будет работать.
  • DimaBr (22.03.07 08:52) [12]
    Само собой, но
    > Как можно передать из свойства TStrings текст в окно редактирования и наоборот?

    он пишет свой редактор....
  • Юрий Зотов © (22.03.07 09:59) [13]
    > DimaBr   (22.03.07 08:52) [12]

    Это понятно. Непонятно другое - зачем?
  • DimaBr (22.03.07 11:00) [14]
    Может как в Raize, с кучей кнопочек (Save, Print, Font, Undo .....)
  • имя (22.03.07 14:49) [15]
    Удалено модератором
  • имя (22.03.07 15:10) [16]
    Удалено модератором
  • имя (23.03.07 07:14) [17]
    Удалено модератором
  • имя (23.03.07 07:19) [18]
    Удалено модератором
  • имя (23.03.07 23:43) [19]
    Удалено модератором
 
Конференция "Компоненты" » Редатор свойств для типа TStrings [D7, WinXP]
Есть новые Нет новых   [134428   +39][b:0][p:0.003]