Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Чародей Ученика
Guest |
Доброй ночи! Подскажите пожалуйста, а как отладчик получает текстовое представление элементов множества? Я объявил перечисление и множество: type EMyEnum = ( MyEnumA, MyEnumB, MyEnumC ); TMyEnum = EMyEnum; TMySet = Set Of TMyEnum; Я могу получить текстовое представление run-time при помощи RTTI примерно так: function MySetToText(MySet: TMySet): String; var MyEnum: TMyEnum; begin Result:='['; for MyEnum in MySet do begin if (Result.Length>1) then Result:=Result+', '; Result:=Result+GetEnumName(TypeInfo(TMyEnum), Ord(MyEnum)); end; Result:=Result+']'; end; procedure TForm1.Button1Click(Sender: TObject); var S: TMySet; begin S:=[MyEnumA, MyEnumC]; ShowMessage(MySetToText(S)); end; Но если я сделаю так: EMyEnum = ( MyEnumA = 0, MyEnumB = 15, MyEnumC = 30 ); То код перестаёт компилироваться с ошибкой:
И так же GetTypeData(TypeInfo(TMySet)).TypeData.CompType тоже равно nil. Но при этом отладчик всё равно в Watches показывает переменные типа TMyEnum и TMySet в виде имён. Как именно он это делает? Могу ли я делать так же run-time? Хотя тут мне больше любопытно, чем для практики... |
||
11 июл 18, 23:59 [21564490] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 46944 |
Через отладочную информацию в DCU файлах. Posted via ActualForum NNTP Server 1.5 |
||
12 июл 18, 00:13 [21564522] Ответить | Цитировать Сообщить модератору |
Чародей Ученика
Guest |
Инспектор объектов получает через RTTI. А через что получает отладчик я как-то просто не задумывался. Столкнувшись с фактом что инспектор навернулся, а отладчик как ни в чём не бывало получает, стало очевидно что последний - не из RTTI. Собственно я и предпологал что возможно в отладочной информации что-то могло остаться, только думал что берёт из exe. Точно из DCU? Ну а допустим у меня всё ещё имеются DCU, я их не удалял - могу ли в теории сделать run-time так же как отладчик? |
12 июл 18, 00:24 [21564554] Ответить | Цитировать Сообщить модератору |
defecator Member Откуда: Сообщений: 39122 |
элементарно function EMyEnum _Name(Value : EMyEnum ) : String ; begin Result := GetEnumName(TypeInfo(TSymbolType),Integer(Value)); end ; |
||
12 июл 18, 06:09 [21564674] Ответить | Цитировать Сообщить модератору |
Cobalt747 Member Откуда: Сообщений: 2047 |
C'est la vie. уверен, ты бы тоже не стал заморачиваться с такими клиентами, которые используют вместо приличного перечисления банальный набор констант. |
12 июл 18, 09:52 [21564932] Ответить | Цитировать Сообщить модератору |
white_nigger Member Откуда: Тула Сообщений: 2005 |
|
||
12 июл 18, 12:07 [21565610] Ответить | Цитировать Сообщить модератору |
Чародей Ученика
Guest |
type
EMyEnum = (
MyEnumA = 3,
MyEnumB = 4,
MyEnumC = 5
);
И всё равно
Но вопрос-то данной темы как бы не в этом... |
||||||
13 июл 18, 11:19 [21568142] Ответить | Цитировать Сообщить модератору |
defecator Member Откуда: Сообщений: 39122 |
замени на EMyEnum |
||||
13 июл 18, 11:27 [21568170] Ответить | Цитировать Сообщить модератору |
Чародей Ученика
Guest |
Так об чём и речь в первом посте:
И вопрос-то - а возможно run-time повторить способность отладчика? Ему type info видимо не нужен. |
||||
13 июл 18, 11:37 [21568219] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 46944 |
Можно: сделай ассоциативный массив имён своих констант. Posted via ActualForum NNTP Server 1.5 |
||
13 июл 18, 12:59 [21568580] Ответить | Цитировать Сообщить модератору |
Чародей Ученика
Guest |
При возможности/необходимости я бы мог это сделать. Это элементарно. Мне интересно как именно делает отладчик. Компилятор создаёт ассоциативный массив имён перечисления и прячет в отладочной информации, а отладчик как-то его находит и берёт из него? Если так, то как он его находит? |
13 июл 18, 13:20 [21568696] Ответить | Цитировать Сообщить модератору |
Cobalt747 Member Откуда: Сообщений: 2047 |
Чародей Ученика, В exe-нике точно есть. Видимо, только ДСП :-( |
13 июл 18, 13:29 [21568770] Ответить | Цитировать Сообщить модератору |
зонд
Guest |
|
|
13 июл 18, 13:45 [21568879] Ответить | Цитировать Сообщить модератору |
schi Member Откуда: Москва Сообщений: 2601 |
Очевидно, знает, где искать. Поищи описание отладочной информации, тоже будешь знать. |
||
13 июл 18, 14:09 [21569007] Ответить | Цитировать Сообщить модератору |
Dimonka Member Откуда: Сообщений: 1132 |
Попахивает скерее дырявым TypeInfo и не полным RTTI. |
||||
13 июл 18, 19:24 [21569828] Ответить | Цитировать Сообщить модератору |
Cobalt747 Member Откуда: Сообщений: 2047 |
Dimonka, интересно, а как оно в других языках, например C#? Там есть TypeInfo, и такие "дырявые" множества? |
16 июл 18, 10:43 [21573475] Ответить | Цитировать Сообщить модератору |
Василий 2 Member Откуда: Сообщений: 411 |
Мне кажется, это чисто паскалевская упрощалка-удобняшка типа массивов с регулируемым началом диапазона индекса, из-за которой в итоге больше проблем, нежели пользы |
16 июл 18, 14:29 [21574774] Ответить | Цитировать Сообщить модератору |
Гирлионайльдо Member Откуда: Сообщений: 427 |
enum Suit { Diamonds = 5, Hearts, Clubs = 4, Spades }; Да.. Какая дикость |
16 июл 18, 15:53 [21575145] Ответить | Цитировать Сообщить модератору |
Все форумы / Delphi | ![]() |