-
Здравствуйте.
Пишу компонент. Но никак не могу наладить правильную работу редактора свойств для типа 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 ) ); -
Dlg.Lines := TStrings( GetOrdValue ); // здесь старое значение передается в окно
if Dlg.ShowModal = mrOK then
SetOrdValue( Longint( Dlg.Lines ) ); // а вот здесь при нажатии на Ok - access violation
так например не работает -
а вот так работает.
Насколько такая форма записи корректна?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 -
> а вот так работает.
> Насколько такая форма записи корректна?
>
> 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 - теряются -
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; -
> 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]Удалено модератором