Форум: "Основная";
Текущий архив: 2003.07.28;
Скачать: [xml.tar.bz2];
ВнизТрабла с ObjectPascal. const mbNew = Succ ( High (TMsgDlgBtn) ); Найти похожие ветки
← →
yaJohn (2003-07-15 15:12) [0]Понадобилась мне константа, на 1 большая чем максимальный TMsgDlgBtn. Написал, соответственно:
const mbNew = Succ ( High (TMsgDlgBtn) );
Понятно, что не очень корректно. Но результат меня просто убил... Такого от Дельфи я не ожидал... ;(
Как создать константу, совместимую с TMsgDlgBtn, но не совпадающую ни с одним из имеющихся значений?
Или этот код только у меня Дельфу на колени ставит?
← →
Skier (2003-07-15 15:15) [1]>yaJohn
> Как создать константу, совместимую с TMsgDlgBtn, но не совпадающую
> ни с одним из имеющихся значений?
Никак
← →
yaJohn (2003-07-15 15:38) [2]2 Skier ©
>Никак
Ну так с плеча я бы не стал рубить...
const
cMax = High (TMsgDlgBtn) ; //==10 == mbHelp
ciNext = TMsgDlgBtn (integer(cMax) + 1); //==11 == ???
Тут сам разобрался, но почему простенькая конструкция компилятор на колени ставит - интересно...
← →
Skier (2003-07-15 15:42) [3]>yaJohn © (15.07.03 15:38)
> ciNext = TMsgDlgBtn (integer(cMax) + 1);
Бред !
← →
yaJohn (2003-07-15 15:59) [4]Милейший, если Вам нечего сказать - лучше промолчать. Если очень хочется сказать - попробуйте предварительно запустить компилятор и проверить насколько ваше мнение соответствует истине.
← →
Skier (2003-07-15 16:05) [5]>yaJohn © (15.07.03 15:59)
Ну-ну...
← →
Anatoly Podgoretsky (2003-07-15 16:15) [6]yaJohn © (15.07.03 15:38)
о тому что бред и кроме того ты абсолютно не конкретен, ни разу не сказал, что тебе говорит компилятор и наверно и не прочитал это.
← →
Юрий Зотов (2003-07-15 16:32) [7]> yaJohn © (15.07.03 15:59)
> ciNext = TMsgDlgBtn(integer(cMax) + 1);
Здесь Вы пытаетесь привести к типу TMsgDlgBtn константу, выходящую за его пределы. Что является некорректным.
← →
yaJohn (2003-07-15 16:33) [8]Компилятор сообщает "Internal error URW533. В конечном итоге ИДЕ просто падает.
Код
const
cMax = High (TMsgDlgBtn) ;
ciNext = TMsgDlgBtn (integer(cMax) + 1);
......................
procedure TForm1.Button1Click(Sender: TObject);
var btn: TMsgDlgBtn;
begin
caption := inttostr (ord(ciNext));
btn := ciNext;
MessageDlg("Hallo", mtWarning, [btn], 0);
end;
прекрасно работает, и это не больший бред чем любое прямое приведение типов.
В любом случае - ветку желательно снести. Желаемого эфекта я добился, странность в поведении компилятора - не главный вопрос моей жизни.
← →
Skier (2003-07-15 16:35) [9]
> Желаемого эфекта я добился, странность в поведении компилятора
> - не главный вопрос моей жизни.
Мда. Странные программисты в Германии...
← →
Толик (2003-07-15 16:40) [10]Того же эфекта (диалог без кнопки) можно было добиться и более человеческими способами:
MessageDlg("Hallo", mtWarning, [], 0);
← →
Юрий Зотов (2003-07-15 16:42) [11]> и это не больший бред чем любое прямое приведение типов.
Если хотите убедиться в обратном, включите Range checking и сделайте Build. Как Вы понимаете, на коректное приведение типов это не повлияет никак. А вот как оно повлияет на Ваш способ - сразу и увидите.
← →
Anatoly Podgoretsky (2003-07-15 16:42) [12]yaJohn © (15.07.03 16:33)
Предупреди, что за продукт вы выпускаете.
← →
Skier (2003-07-15 16:43) [13]>Anatoly Podgoretsky © (15.07.03 16:42)
LOL ! :)))
← →
yaJohn (2003-07-15 16:46) [14]Убедительная просьба к модератору убить ветку или перенести ее в соответствующий раздел, дабы я мог обьяснить г-ну Skier-у некоторые териториально-зависимые особенности процесса создания ПО.
← →
Skier (2003-07-15 16:47) [15]>yaJohn © (15.07.03 16:46)
> некоторые териториально-зависимые особенности процесса создания
> ПО.
Oops! А я-то думал что это процесс мозго-зависимый.
Пора на пенсию...
← →
Юрий Зотов (2003-07-15 16:52) [16]> yaJohn © (15.07.03 16:46)
И все же Вы неправы. С точки зрения самого языка Паскаль, константа не имеет права выходить за диапазон типа, к которому она принадлежит. А Ваш способ проходит лишь потому, что отключена опция проверки диапазона. Что, кстати, вполне может способствовать тому, что в программе останутся невыловленными какие-то куда более серьезные баги.
← →
yaJohn (2003-07-15 17:05) [17]2 Юрий Зотов
>включите Range checking и сделайте Build
Мда, действительно. Однако второй вариант не вызывает подобного эффекта...
2 Толик
Как создать диалог без кнопки я после некоторых раздумий сам сообразил, но все равно спасибо.
2 Anatoly Podgoretsky © (15.07.03 16:42)
>Предупреди, что за продукт вы выпускаете
Есть такая штука, "сопровождение проекта" называется. Есть готовый проект. Большой. В нем есть функция почти аналогичная MessageDlg, но с кучей дополнительных наворотов. Ну, например, поддержка китайского языка. Мне необходимо было расширить функциональность модуля, оставаясь при этом в рамках имеющегося интерфейса и сохраняя совместимость с имеющимся кодом.
Понадобилась еще одна кнопка, будучи конкретным "IgnoreAll". Весь имеющийся диапазон TMsgDlgBtn оказался, к сожалению, занят. Набор видимых кнопок передается через TMsgDlgButtons.
Ввести TМойНовыйMsgDlgButtons, конечно, можно, но из соображений совместимости и экономии трудозатрат не хочется.
Доходчиво обьяснил?
2 Skier
В жизни есть вещи, которые меня интересуют, а есть - которые нет.
К первым я отношу, в частности, Delphi, а ко вторым, в частности, мнения некоторых личностей.
2 All
Всем спасибо, вопрос исчерпан. Ну или в "потрепатся".
← →
Skier (2003-07-15 17:10) [18]>yaJohn © (15.07.03 17:05)
http://ln.com.ua/~openxs/articles/smart-questions-ru.html
← →
Anatoly Podgoretsky (2003-07-15 17:11) [19]yaJohn © (15.07.03 17:05)
Доходчиво, но не по вопросу.
← →
yaJohn (2003-07-15 17:33) [20]Позвольте с Вами не согласится. Через параметр TMsgDlgButtons можно передать только элементы TMsgDlgBtn, остальное не пропустит компилятор. Конструкции в стиле
var
Buttons: TMsgDlgButtons;
b: byte absolute Buttons;
тоже не слишком коректны. Но иногда приходится идти и на такие меры.
Вариант с константой ИМХО лучше. И с точки зрения читаемсти и с точки зрения близости к паскалю.
← →
Skier (2003-07-15 17:38) [21]>yaJohn © (15.07.03 17:33)
На будущее :
Если планируется расширять набор кнопок, то лучше пользоваться
не множеством, а просто числом, скажем Word, а дальше устанавливать и проверять биты. И остаётся только добавлять константы:
MB_OK = 0
MB_CANCEL = 1 и т.д.
Кстати именно так огранизованы сообщения на уровне API
← →
yaJohn (2003-07-15 18:10) [22]Уважаемый господин... Видимо в посте об интересующих меня вещах я недостаточно ясно выразил свою мысль, извините. Попробую исправить это упущение.
Среди людей принимавших участие в обсуждении вопроса меня заинтересовали мнения Анатолия Подгоретского, Юрия Зотова и Толика. Документ, по приведенной Вами ссылке я внимательно изучил, спасибо.
Не будучи ни крутым хацкером, ни немерянным гуру в ВинАпи я не берусь судить о прелестях передачи кнопок как набора бит в виде Word, и надеюсь, что Вы осветите эту темную сторону программирования в среде Windows в серии статей, которая, несомненно, найдет широчайший отклик в широких народных массах и навеки запечатлит Ваше имя на всех скрижалях истории нашего ремесла. К сожалению, в силу некоторых психо-географических особенностей я не смогу влиться в стройные ряды Ваших почитетелей и потому я заранее желаю Вам больших творческих успехов на этом нелегком пути, на чем и позвольте с Вами попрощаться.
← →
Skier (2003-07-15 18:12) [23]>yaJohn © (15.07.03 18:10)
Груш поешь, говорят крепит...
← →
yaJohn (2003-07-15 18:20) [24]Широта Ваших познаний, сударь, меня просто поражает. Я, вот, по простоте душевной, всю жизнь ел груши и не задумывался, для каких целей их применяют настоящие программисты...
2 Модератор.
А он забавный, давайте в потрепатся ;)
← →
Юрий Зотов (2003-07-15 18:34) [25]> yaJohn © (15.07.03 17:05)
> В нем есть функция почти аналогичная MessageDlg, но с кучей
> дополнительных наворотов. Ну, например, поддержка китайского
> языка.
Посмотрите MessageBoxEx - не будет ли оно лучше?
← →
yaJohn (2003-07-15 18:47) [26]2 Юрий Зотов
Смотрел... Но опять таки, придется перепахивать весь проект :(
Проект (от первого релиза) живет и активно развивается уже _5_ лет...
← →
yaJohn (2003-07-15 18:49) [27]Да вопрос, собственно, уже решился. Все работает с новой константой как часы. Всем принявшим участие - спасибо.
← →
Толик (2003-07-15 18:55) [28]Если я правильно понял, то идея заключается в том, что интерфейс вызова д.б. сохранён (backward capability), а функциональность изменена? Если так, то лучше воспользоваться перегрузкой функций?
procedure MessageDlg(TMsgDlgButtons);
procedure MessageDlg(TМойНовыйDlgButtons);
старые вызовы будут использовать вариант 1, а новые 2.
← →
Serginio (2003-07-15 19:04) [29]Я извиняюсь а не проще TMsgDlgBtn переопределить в Dialogs. Или как правильно говорит Толик перегрузить функцию.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.07.28;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.006 c