Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2007, 12:10   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,281
Восклицание Получение информации о классе

Вопрос-продолжение темы "Как найти размер объекта". Но он видоизменился.
Подскажите, есть ли хоть какая-то возможность на этапе выполнения получить информацию о колличестве полей класса и их типе.
Очень нужно.
Sibedir вне форума Ответить с цитированием
Старый 20.11.2007, 12:20   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Вот глянь на пример может надыбаешь идейку:

Код:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure ListComponentProperties(Component: TComponent; Strings: TStrings);
 var
   Count, Size, I: Integer;
   List: PPropList;
   PropInfo: PPropInfo;
   PropOrEvent, PropValue: string;
 begin
   Count := GetPropList(Component.ClassInfo, tkAny, nil);
   Size  := Count * SizeOf(Pointer);
   GetMem(List, Size);
   try
     Count := GetPropList(Component.ClassInfo, tkAny, List);
     for I := 0 to Count - 1 do
     begin
       PropInfo := List^[I];
       if PropInfo^.PropType^.Kind in tkMethods then
         PropOrEvent := 'Event'
       else
         PropOrEvent := 'Property';
       PropValue := VarToStr(GetPropValue(Component, PropInfo^.Name));
       Strings.Add(Format('[%s] %s: %s = %s', [PropOrEvent, PropInfo^.Name,
         PropInfo^.PropType^.Name, PropValue]));
     end;
   finally
     FreeMem(List);
   end;
 end;


procedure TForm1.FormCreate(Sender: TObject);

begin
ListComponentProperties(form1, ListBox1.Items);

end;

end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2007, 12:44   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,281
По умолчанию

И на этом спасибо Stilet. Но работает почему-то только с компонентами и со свойствами. А мне нужны именно поля любого класса.
Sibedir вне форума Ответить с цитированием
Старый 20.11.2007, 13:14   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну тут уж не вникал в кишки...
Как надыбаеш отпишись сюды, тож интересно
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.12.2007, 09:24   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,281
По умолчанию

По ходу дела труба.
Нет, ну это конечто возможно на Asm. Там по ходу дела какое-то смещения от указателя на тип дает ссылку на структуру полей в котором хранятся ссылки на тип. Смещение от этих типов дает информацию о них и т.д. В общем полная и жирная ... Когда, куда, сколько - кто знает скажите , кто нет - застрелите . Определить методом тыка? Cами понимаете - проще сразу в окно, всеравно через месяц с ума сойдешь и сиганешь от безисходности.
Sibedir вне форума Ответить с цитированием
Старый 07.12.2007, 10:26   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А зачем тебе такие мучения??

Я к тому что может есть другие способы решения твоей задачи...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.12.2007, 14:09   #7
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,281
По умолчанию

Конечно есть, я всего лишь хочу сохранить объект в файл. Но я хочу написать супер-функцию, которой было бы параллельно, что сохранять. Если бы я знал список всех полей и их типы, я бы легко это сделал.
Там еще одна проблемка есть, в том, что мои (да и не мои) обекты хранят ссылки на другие объекты, так вот мне надо чтобы и те объекты тоже сохранялись.
Sibedir вне форума Ответить с цитированием
Старый 07.12.2007, 14:37   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ясно. WriteComponent не подойдет конечно? ну по его образу и подобию...

Кста для этого совсем не обязательна суперфункция...
ИМХО, оно того не стоит...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
константность в классе softrix Общие вопросы C/C++ 1 17.06.2008 00:21
Экзамен в 9 классе по ИВТ NecRoMat Свободное общение 6 11.06.2008 11:56
Контроль ввода данных в классе oleg kutkov Общие вопросы C/C++ 1 14.04.2008 22:19
Получение информации из мр3 GAGARIN-NEW Мультимедиа в Delphi 2 24.03.2008 15:19
обновление в блоге - Получение информации о загрузке системы. Pblog Обсуждение статей 0 08.01.2008 18:30