Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

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

Код:

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.

Stilet вне форума   Ответить с цитированием
Старый 20.11.2007, 13:44   #3
Sibedir
Тот ещё
Профессионал
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Адрес: г. Барнаул
Сообщений: 2,262
Репутация: 931
По умолчанию

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

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

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

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

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

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
константность в классе 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 16:19
обновление в блоге - Получение информации о загрузке системы. Pblog Обсуждение статей 0 08.01.2008 19:30


18:19.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru