Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

record как published свойство   Найти похожие ветки 

 
han   (2004-06-24 16:37) [0]

Есть тип

Taaa = record
i: Integer;
a: String
end;

Есть класс у которого есть published свойство этого типа. Но в object инспекторе ничего не видно на счет этого св-ва. Неужели надо писать свой редактор свойств?????


 
Юрий Зотов ©   (2004-06-24 16:50) [1]

Для record - да. Но если преобразовать в объект (потомок TPersistent), то сработает стандартный редактор.


 
han   (2004-06-24 17:25) [2]

Свойство оно мне написало в object inspector, а вот при нажатии на "+" ничего не разворачивает...

TIniSettings = class(TPersistent)
public
 АileName: String;
 Section : String;
end;

че не так?


 
VMcL ©   (2004-06-24 17:40) [3]

>>han  (24.06.04 17:25) [2]

TIniSettings = class(TPersistent)
published
property АileName: String read ...;
property Section: String read ...;
end;


?


 
han   (2004-06-24 17:49) [4]

не помогает


 
DrPass ©   (2004-06-24 22:52) [5]

А инициализация в конструкторе?» Юрий Зотов:» Вероятно, инициализация свойства в конструкторе на работу редактора этого свойства все же не повлияет?


 
Юрий Зотов ©   (2004-06-25 13:29) [6]

> han (24.06.04 17:49) [4]

Так не бывает. Не сработать [3] просто не может. Значит, что-то Вы делаете не так, как показано в [3].


 
malkolinge ©   (2004-06-25 15:08) [7]


> Юрий Зотов ©   (25.06.04 13:29) [6]
> > han (24.06.04 17:49) [4]
>
> Так не бывает. Не сработать [3] просто не может. Значит,
> что-то Вы делаете не так, как показано в [3].


Ну причинЫ может быть две :
1. само свойство надо вынести в паблишед секцию :)
2. Екземпляр объекта создать ( хотя в этом случае, редактор свойств подниметься, но будет АВ)


 
Igorek ©   (2004-06-25 15:41) [8]


> 1. само свойство надо вынести в паблишед секцию :)

Так свойство у него видно в єдиторе. Не видны его подсвойства.


 
DrPass ©   (2004-06-27 15:57) [9]


> » Юрий Зотов:
> » Вероятно, инициализация свойства в конструкторе на работу
> редактора этого свойства все же не повлияет?

Очевидно, что очень даже повлияет - если свойство представляет собой экземпляр класса. Что будет, если вы опустите в конструкторе компоненты строку FIniSettings:=TIniSettings.Create?


 
Юрий Зотов ©   (2004-06-28 12:12) [10]

> DrPass ©   (27.06.04 15:57) [9]

Если в [5] под словом "инициализация" имелось в виду создание экземпляра класса (а не инициализация его свойств), то Вы, безусловно, правы. Если так, то я Вас просто не понял (был сбит с толку самим термином) и приношу свои извинения.

Но надо полагать, что объект все же создается. Ведь иначе первое, что автор вопроса сразу увидел бы в design-time, было всеми нами любимое AV, о котором он ничего не упоминает - и значит, проблема не в этом.

Как говорилось в [2] и [4], проблема в том, что не разворачивается список подсвойств - а это может быть по двум причинам: либо вместо свойств использованы поля, либо свойства не вынесены в published. То есть, не соблюдено все то, что было показано в [3].


 
DrPass ©   (2004-06-28 13:41) [11]


> Ведь иначе первое, что автор вопроса сразу увидел бы в design-time,
> было всеми нами любимое AV, о котором он ничего не упоминает
> - и значит, проблема не в этом

Только что специально проверил - если объявить свойство-объект как published, но не создать его экземпляр, Delphi отображает его в Инспекторе, но не позволяет с ним работать (это естественно). AV при этом не возникает. Впрочем, это может зависеть от версии Delphi. Я пробовал на седьмой


 
Юрий Зотов ©   (2004-06-28 17:35) [12]

> DrPass ©   (28.06.04 13:41) [11]

Да, все так и есть (по крайней мере, в семерке).

> han

В общем, вот полный код:

type
 TMyObject = class(TPersistent)
 private
   FStr: string;
   FInt: Integer;
 protected
   procedure AssignTo(Target: TPersistent); override;
 published
   property Str: string read FStr write FStr;
   property Int: Integer read FInt write FInt;
 end;

 TMyComponent = class(TComponent)
 private
   FMyObj: TMyObject;
   procedure SetMyObj(const Value: TMyObject);
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 published
   property MyObj: TMyObject read FMyObj write SetMyObj;
 end;

{ TMyObject }

procedure TMyObject.AssignTo(Target: TPersistent);
begin
 if Target is TMyObject then
   with TMyObject(Target) do
   begin
     Str := Self.Str;
     Int := Self.Int
   end
 else
   inherited
end;

{ TMyComponent }

constructor TMyComponent.Create(AOwner: TComponent);
begin
 inherited;
 FMyObj := TMyObject.Create
end;

destructor TMyComponent.Destroy;
begin
 FMyObj.Free;
 inherited
end;

procedure TMyComponent.SetMyObj(const Value: TMyObject);
begin
 FMyObj.Assign(Value)
end;



Страницы: 1 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.029 c
1-1117779723
Хочу все знать
2005-06-03 10:22
2005.06.29
Взаимодействие приложения и нескольких dll


14-1117957406
lookin
2005-06-05 11:43
2005.06.29
Новые поступления от OKA-tuning


5-1088065170
nejest
2004-06-24 12:19
2005.06.29
Проблема с переменными в классе.


1-1118325601
lehich
2005-06-09 18:00
2005.06.29
фоновой рисунок на Form


14-1117211002
Гаврила
2005-05-27 20:23
2005.06.29
Просто реплика