![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
объект в property
.code © (2011-04-25 12:25:00)Есть класс 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;
Германн (2011-04-26 02:26:00) [1]
> Amoeba_ (25.04.11 22:51) [10]
>
>
> > почему срабатывает эксепшн.
>
> Как раз прямо по сабжу и с подробностями
Как раз не прямо, хоть и с подробностями. Чем вынудили ЮЗ на необдуманный топик.
Тут на ДМ вопрос о самописном наследнике TPersistent. Там на королевстве вопрос о компоненте из палитры Дельфи.
Amoeba_ (2011-04-25 22:51:00) [2]
> почему срабатывает эксепшн.
Как раз прямо по сабжу и с подробностями:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=79517
Юрий Зотов (2011-04-25 19:14:00) [3]> почему срабатывает эксепшн
Перекройте метод AssignTo. Иначе откуда будет известно, как Вы хотите копировать начинку объекта?
MBo (2011-04-25 18:46:00) [4]>почему срабатывает эксепшн.
Так и положено делать неперекрытомуTPersistent.AssignTo
.code (2011-04-25 18:17:00) [5]почему срабатывает эксепшн.
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.
Ega23 (2011-04-25 16:21:00) [6]По-идее, совсем по-православному нужно событие генерить, типа OnGetADOConnection, но на практике я напрямую в форму/фрейм объект передавал.
Ega23 (2011-04-25 16:16:00) [7]
> Как-то я не вижу применения для второго варианта, если честно.
Да сплошь и рядом. Самое первое, что в голову пришло - передать в форму коннект к БД.
Юрий Зотов (2011-04-25 16:01:00) [8]
> KSergey © (25.04.11 15:50) [3]
> Как-то я не вижу применения для второго варианта, если честно.
Например, любая ссылка на внешний компонент (PopupMenu и пр.)
KSergey (2011-04-25 15:50:00) [9]Как-то я не вижу применения для второго варианта, если честно. Особенно, если в деструкторе TMyForm написано FMyClass.Free
Юрий Зотов (2011-04-25 13:35:00) [10]> .code (25.04.11 12:25)
В первом случае копируется "начинка" объекта - то есть, имеем два экземпляра объекта: источник и приемник.
Во втором случае копируется ссылка на объект - то есть, имеем один экземпляр объекта.
Какой вариант выбрать - тот, который в данном случае нужен.
Ega23 (2011-04-25 12:29:00) [11]
> Вопрос как правильно написать метод SetValue:
Оба варианта правильны. А какое поведение ты хочешь - зависит от тебя.