Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.031 c
3-1106838076
}|{yk
2005-01-27 18:01
2005.02.27
SQLite. Никто не пробовал?


14-1107258608
Луарвик
2005-02-01 14:50
2005.02.27
Плиз, помогите решить пример с модулями...


4-1105601902
Ilya___
2005-01-13 10:38
2005.02.27
Как можно узнать значение горизонтального и вертикального разреше


14-1108031038
Cosinus
2005-02-10 13:23
2005.02.27
Ха! Как сделать ScreenShot экрана? Не смейтесь, прочитайте вопрос


1-1108016916
Apostol
2005-02-10 09:28
2005.02.27
Не распознает запятую в качестве системного разделителя...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский