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

Вниз

RTTI   Найти похожие ветки 

 
han-bratan   (2005-02-15 20:31) [0]

Слабо надеюсь что здесь ответят на мой вопрос но!
Есть класс, у него есть какоето свойство-класс
TMyClass.Property = TSomeClass

Создаем динамичестки экземпляр типа TMyClass, но! мы оперируем не экземпляром класса а указателем на него. Внимание, вопрос?! Как сделать так что б свойство TMyClass.Property указывало на новый динамически созданный объект? Функция которая это будет делать должна оперировать только RTTI


 
default ©   (2005-02-15 20:48) [1]


 TMyClass = class
 private
   FThis: TMyClass;
 public
   constructor Create;
   procedure PutHelloWorld;
   property This: TMyClass read FThis;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

constructor TMyClass.Create;
begin
 FThis := Self
end;

procedure TMyClass.PutHelloWorld;
begin
 ShowMessage("Hello world!")
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 O: TMyClass;
begin
 O := TMyClass.Create;
 O.This.PutHelloWorld
end;

не вдаваясь в подробности зачем это надо:)


 
TUser ©   (2005-02-15 21:37) [2]

Вопрос-загадка.

> но! мы оперируем не экземпляром класса а указателем на него.
> Внимание, вопрос?! Как сделать так что б свойство TMyClass.Property
> указывало на новый динамически созданный объект? Функция
> которая это будет делать должна оперировать только RTTI

Мы всегда оперируем указателем на экземпляр, таков Delphi.
Чтобы св-во указывало надо в конструкторе создать этот новый объект.
При чем тут RTTI - я не понял.

[1] в отличие от [0] оперирует свойством, которое указывает на объект того же класса, что и Self, или его потомка, а в задаче ничего об этом не сказано - TMyClass, TSomeClass.


 
han-bratan   (2005-02-16 12:14) [3]

Есть класс со свойствами, есть форма с контролами имена которых совпадают с именами свойств, нужно написать механизм который будет заполнять контролы на форме и соотв. код, который будет брать значения из контролов и заганять в класс


 
TUser ©   (2005-02-16 13:35) [4]

Перебери все компоненты
for i:=0 to Form.ComponentCount-1 do
begin
 {тут пишем ловим св-во и присваиваем ему значение}
end;

Функции RTTI для того, чтобы вытащить нужное св-во можно посмотреть в модуле TypInfo, что-нибудь типа GetWideStrProp, и другие GetXXXProp.

Возможно также, что все можно сделать и без всяких RTTI"ев - просто переписав все значения в массив вот таких записей
record
 ComponentName,
 TextValue: string;
end;
или что-то вроде этого. Если контролы принадлежат ограниченному набору классов - то их будет просто перебрать. Я бы даже считал, что такое решение лучше, т.к. сохраняет возможность добавить на форму и другие контролы тоже, а в твоем варианте придется при этом добавлять еще одно св-во. Хотя это вопрос вкуса.

Кстати, очень может быть, что поможет тебе TJvFormStorage - позволяет сохранять св-ва контролов на форме в реестр или в ини файлы. В любом случае, если будешь копать RTTI, то полезно изучить исходники этого компонента.


 
han-bratan   (2005-02-16 13:44) [5]

не, реестр не канает, суть в том чтоб вместо того чтоб писать Edit.Text := MyClass.SomeString
написать MyEditForm.EditedObject := MyObject; и оно все заполнит на форме. Короче я уже почти все сделал

Всем спасибо за внимание :)



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

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

Наверх




Память: 0.48 MB
Время: 0.038 c
1-1108460961
Gost
2005-02-15 12:49
2005.02.27
Как сделать форму для ввода пароля?


14-1107718995
Hypercube
2005-02-06 22:43
2005.02.27
Уравнение n-степени


1-1107936565
buka-p
2005-02-09 11:09
2005.02.27
неверная сортировка строк в компоненте tlistbox


6-1102978825
Muhan
2004-12-14 02:00
2005.02.27
Нужен код интернет-страницы задавая ссылку этой страницы


1-1108537923
rezo
2005-02-16 10:12
2005.02.27
стои сервис