Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 531

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, эксперты!
Вопрос о корректности работы с множествами. В случае если работаешь с прямым указанием на тип данных (например, TAlign), то все элементы выводятся корректно вызовом функцией GetEnumName(TypeInfo(TAlign), i). Но, если будешь работать из класса, то появляются какие-то дополнительные элементы. Как же определить все элементы (имена) множества из класса???

Приложение:
  1. unit main;
  2.  
  3. {$M+}
  4.  
  5. interface
  6.  
  7. uses
  8. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  9. Dialogs, TypInfo, StdCtrls;
  10.  
  11. type
  12. TForm1 = class(TForm)
  13. Button1: TButton;
  14. Memo1: TMemo;
  15. private
  16. { Private declarations }
  17. public
  18. { Public declarations }
  19. end;
  20.  
  21. var
  22. Form1: TForm1;
  23.  
  24. implementation
  25.  
  26. {$R *.dfm}
  27.  
  28. procedure TForm1.Button1Click(Sender: TObject);
  29. var
  30. APropData: PTypeData;
  31. APropList: PPropList;
  32. i,n: integer;
  33. begin
  34. APropData := GetTypeData(TMemo.ClassInfo);
  35.  
  36. if APropData.PropCount > 0 then
  37. begin
  38. GetMem(APropList, SizeOf(APropList) * APropData.PropCount);
  39.  
  40. try
  41. GetPropInfos(TMemo.ClassInfo, APropList);
  42.  
  43. for i := 0 to APropData.PropCount - 1 do
  44. begin
  45. case APropList[i].PropType^.Kind of
  46. tkEnumeration:
  47. if APropList[i].Name = 'Align' then
  48. begin
  49. ShowMessage(IntToStr(Ord(High(APropList[i]^.PropType^.Kind))));
  50. for n := Ord(Low(APropList[i].PropType^.Kind)) to Ord(High(APropList[i].PropType^.Kind)) do
  51. ShowMessage(GetEnumName(APropList[i].PropType^, n));
  52. end;
  53. end;
  54. end;
  55. finally
  56. FreeMem(APropList, SizeOf(APropList) * APropData.PropCount);
  57. end;
  58. end;
  59. end;
  60.  
  61. end.


richman78 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: richman78 (статус: Посетитель)
Вопрос отправлен: 16 марта 2009, 11:27
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 16 марта 2009, 16:44; участников в обсуждении: 1.
richman78

richman78 (статус: Посетитель), 16 марта 2009, 16:41 [#1]:

Спасибо! Разобрался!!!
richman78

richman78 (статус: Посетитель), 16 марта 2009, 16:44 [#2]:

Процедура должна быть такого плана:

procedure TForm1.Button1Click(Sender: TObject);
var
APropData: PTypeData;
APropList: PPropList;
ATypeInfo: PTypeInfo;
AEnumData: PTypeData;
i,n: integer;
begin
APropData := GetTypeData(Memo1.ClassInfo);

if APropData.PropCount > 0 then
begin
GetMem(APropList, SizeOf(APropList) * APropData.PropCount);

try
GetPropInfos(Memo1.ClassInfo, APropList);

for i := 0 to APropData.PropCount - 1 do
begin
case APropList[i].PropType^.Kind of
tkEnumeration:
if APropList[i].Name = 'Align' then
begin
ATypeInfo := APropList[i].PropType^;
AEnumData := GetTypeData(ATypeInfo);

ShowMessage(IntToStr(AEnumData^.MinValue) + 'x' + IntToStr(AEnumData^.MaxValue));
for n := AEnumData.MinValue to AEnumData.MaxValue do ShowMessage(GetEnumName(ATypeInfo, n));
end;
end;
end;
finally
FreeMem(APropList, SizeOf(APropList) * APropData.PropCount);
end;
end;
end;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:27
Выполнено за 0.02 сек.