Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.28;
Скачать: CL | DM;

Вниз

Трабла с 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.013 c
3-91666
Солер
2003-07-05 10:39
2003.07.28
Как посчитать сумму в столбце?


6-91800
prihod
2003-05-20 17:09
2003.07.28
Как отправить письмо ???


14-91871
panov
2003-07-10 12:47
2003.07.28
test


11-91696
lomman
2002-11-23 00:25
2003.07.28
Опять все тот-же ListView


7-91935
3S
2003-05-17 20:12
2003.07.28
Как отключить служебные клавиши (win, alt+tab и др) в WinNT/2K/XP