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

Вниз

объект в property   Найти похожие ветки 

 
.code   (2011-04-25 12:25) [0]

Есть класс TMyClass, есть форма у которой есть проперти типа TMyClass. Вопрос как правильно написать метод SetValue:


property MyClass: TMyClass read FMyClass write SetMyClass;



TMyForm.SetMyClass(Value: TMyClass);
begin
 FMyClass.Assign(Value);  
end;


или


TMyForm.SetMyClass(Value: TMyClass);
begin
 FMyClass := Value;  
end;


 
Ega23 ©   (2011-04-25 12:29) [1]


>  Вопрос как правильно написать метод SetValue:


Оба варианта правильны. А какое поведение ты хочешь - зависит от тебя.


 
Юрий Зотов ©   (2011-04-25 13:35) [2]

> .code   (25.04.11 12:25)  

В первом случае копируется "начинка" объекта - то есть, имеем два экземпляра объекта: источник и приемник.

Во втором случае копируется ссылка на объект - то есть, имеем один экземпляр объекта.

Какой вариант выбрать - тот, который в данном случае нужен.


 
KSergey ©   (2011-04-25 15:50) [3]

Как-то я не вижу применения для второго варианта, если честно. Особенно, если в деструкторе TMyForm написано FMyClass.Free


 
Юрий Зотов ©   (2011-04-25 16:01) [4]


> KSergey ©   (25.04.11 15:50) [3]
> Как-то я не вижу применения для второго варианта, если честно.

Например, любая ссылка на внешний компонент (PopupMenu и пр.)


 
Ega23 ©   (2011-04-25 16:16) [5]


> Как-то я не вижу применения для второго варианта, если честно.

Да сплошь и рядом. Самое первое, что в голову пришло - передать в форму коннект к БД.


 
Ega23 ©   (2011-04-25 16:21) [6]

По-идее, совсем по-православному нужно событие генерить, типа OnGetADOConnection, но на практике я напрямую в форму/фрейм объект передавал.


 
.code   (2011-04-25 18:17) [7]

почему срабатывает эксепшн.


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TMyClass = class(TPersistent)
 public
   constructor Create(AOwner: TComponent);
 end;

 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TMyClass }

constructor TMyClass.Create(AOwner: TComponent);
begin

end;

{ TForm }

procedure TForm1.FormCreate(Sender: TObject);
var
A, B: TMyClass;
begin
 A := TMyClass.Create(nil);
 B := TMyClass.Create(nil);

 B.Assign(A); //<-EXCEPTION CANNOT ASSIGN ...

end;

end.


 
MBo ©   (2011-04-25 18:46) [8]

>почему срабатывает эксепшн.
Так и положено делать неперекрытому TPersistent.AssignTo


 
Юрий Зотов ©   (2011-04-25 19:14) [9]

> почему срабатывает эксепшн

Перекройте метод AssignTo. Иначе откуда будет известно, как Вы хотите копировать начинку объекта?


 
Amoeba_   (2011-04-25 22:51) [10]


> почему срабатывает эксепшн.

Как раз прямо по сабжу и с подробностями:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=79517


 
Германн ©   (2011-04-26 02:26) [11]


> Amoeba_   (25.04.11 22:51) [10]
>
>
> > почему срабатывает эксепшн.
>
> Как раз прямо по сабжу и с подробностями

Как раз не прямо, хоть и с подробностями. Чем вынудили ЮЗ на необдуманный топик.
Тут на ДМ вопрос о самописном наследнике TPersistent. Там на королевстве вопрос о компоненте из палитры Дельфи.



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

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

Наверх




Память: 0.49 MB
Время: 0.013 c
2-1302768161
DelphiN!
2011-04-14 12:02
2011.07.31
TSQL вычитание NULLa


2-1303458227
ldv
2011-04-22 11:43
2011.07.31
try..except


15-1302247492
И. Павел
2011-04-08 11:24
2011.07.31
Как узнать, какие Band-ы напечатались?


15-1302588303
OW
2011-04-12 10:05
2011.07.31
Задача определения региона по номеру позвонившего


3-1262005058
Вадим Хижинский
2009-12-28 15:57
2011.07.31
Изменения SQL запроса в FastReport