Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-91808
AlexGreG
2003-07-09 05:48
2003.07.28
... Ох уж эти программисты ...


1-91753
Yurko
2003-07-15 16:19
2003.07.28
Формат даты


1-91708
Joker
2003-07-14 19:31
2003.07.28
Как вывести рисунок на екран?


3-91629
DBDev
2003-07-04 10:27
2003.07.28
Кто-нибудь юзал TADOQuery::OnFetchProgress??? Поделитесь ...


3-91669
Крот
2003-07-07 10:13
2003.07.28
Группы в TQickRep





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский