![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Case label outside of rang [WinXP]
no © (2008-02-23 00:19:00)delphi 2007 выдает такое предупреждение:
[Pascal Warning] Unit1.pas(149): W1018 Case label outside of range of case expression
на коде:
procedure TForm2.forumbrowserCommandStateChange(ASender: TObject; Command: Integer; Enable: WordBool);
begin
case Command of
CSC_NAVIGATEBACK: BackBtn.Enabled := Enable;
CSC_NAVIGATEFORWARD: forwBtn.Enabled := Enable;
CSC_UPDATECOMMANDS: stopBtn.Enabled := Enable; // <<---
end;
end;
как будет правильно?
Anatoly Podgoretsky (2008-02-24 13:03:00) [1]> Германн (24.02.2008 01:11:27) [27]
Или не приходит, по приведеному коду, или потом где то кнопке присваивается другое значение, по не приведеному.
Я бы сделал отладочный вывод куда ни будь на форму.
А для проверки второй теории - присвоил бы значение Command перед case.
Германн (2008-02-24 01:11:00) [2]
> no (24.02.08 01:02) [25]
>
>
> > case DWord(Command) of
>
>
> да, warnings нет, но кнопка Стоп по прежнему недоступна
> в рантайм
>
Проверяй отладчиком. Приходит ли CSC_UPDATECOMMANDS и если приходит, то какое значение у праметра Enable.
Anatoly Podgoretsky (2008-02-24 01:06:00) [3]> no (24.02.2008 01:02:25) [25]
Я тебе уже написал, что у тебя параметр принимает только два значения.
no (2008-02-24 01:02:00) [4]
> case DWord(Command) of
да, warnings нет, но кнопка Стоппо прежнему недоступна в рантайм
Anatoly Podgoretsky (2008-02-24 00:54:00) [5]Про приведение уже написали, или к Integer или к dWord
А второй вариант наверно потому не работае, что у тебя поступают только CSC_NAVIGATEBACK и CSC_NAVIGATEFORWARD
Поскольку нет причин не работать.
Это проблема смешивания знаковых и беззнаковых операндов.
Германн (2008-02-24 00:36:00) [6]
> guav © (24.02.08 00:32) [21
Опередил про явный cast. Только я хотел предложить:
case DWord(Command) of
guav (2008-02-24 00:33:00) [7]> [13] Германн © (23.02.08 03:39)
Компилятор от VS2005.
guav (2008-02-24 00:32:00) [8]> [13] Германн © (23.02.08 03:39)
Нет. И не работал.
> [14] no (23.02.08 09:30)
Явный cas спасёт
Integer(CSC_UPDATECOMMANDS): stopBtn.Enabled := Enable;
no (2008-02-24 00:13:00) [9]
> И которая строка 248
эта:
else if Command = CSC_UPDATECOMMANDS then stopBtn.Enabled := Enable;
а с этой конструкцией предупреждений нет, но в рантайм кнопка "стоп" всегда недоступна...
case Command of
CSC_NAVIGATEBACK: BackBtn.Enabled := Enable;
CSC_NAVIGATEFORWARD: forwBtn.Enabled := Enable;
else stopBtn.Enabled := Enable;
end;
:(
Anatoly Podgoretsky (2008-02-23 19:41:00) [10]И которая строка 248
no (2008-02-23 19:37:00) [11]
>
> Правильно будет так:
>
> if Command = CSC_NAVIGATEBACK then BackBtn.Enabled := Enable
> else if Command = CSC_NAVIGATEFORWARD then forwBtn.Enabled := Enable
> else if Command = CSC_UPDATECOMMANDS then stopBtn.Enabled := Enable;
>
>
два новых предупреждения:
[Pascal Warning] Unit1.pas(248): W1021 Comparison always evaluates to False
[Pascal Warning] Unit1.pas(248): W1023 Comparing signed and unsigned types - widened both operands
Anatoly Podgoretsky (2008-02-23 11:30:00) [12]
> Это что компилятор такой глупый
Это не компилятор глупый, он как раз очень умный, в отличии от программиста.
Anatoly Podgoretsky (2008-02-23 11:28:00) [13]
> как будет правильно?
Правильно будет так:
if Command = CSC_NAVIGATEBACK then BackBtn.Enabled := Enable
else if CSC_NAVIGATEFORWARD then forwBtn.Enabled := Enable
else if CSC_UPDATECOMMANDS then stopBtn.Enabled := Enable;
или
case Command of
CSC_NAVIGATEBACK: BackBtn.Enabled := Enable;
CSC_NAVIGATEFORWARD: forwBtn.Enabled := Enable;
else stopBtn.Enabled := Enable;
end;
Anatoly Podgoretsky (2008-02-23 11:24:00) [14]
> Но почему значение $FFFFFFFF не вписывается в Integer всё
> равно не понял.
Потому что MaxInt = $7FFFFFFF
no (2008-02-23 09:30:00) [15]так, а по сути вопроса кто скажет чего?
я ведь не могу менять данные типы :
(ASender: TObject; Command: Integer; Enable: WordBool);
Германн (2008-02-23 03:39:00) [16]
> guav © (23.02.08 03:13) [12]
>
> Я вот в С попробовал, результат ещё интереснее
А какой компилятор С ты пользовал?
Если мне не изменяет мой склероз, ты тоже работаешь (работал) с контроллерами.
guav (2008-02-23 03:13:00) [17]Я вот в С попробовал, результат ещё интереснее
#include <stdio.h>
int main()
{
signed char i = -1;
switch (i)
{
case 0xff:
puts("not printed");
break;
case 0xffffffff:
puts("printed");
break;
}
return 0;
}
Компилится без ворнингов, пишется второе, char 1 байт. если char unsigned, писаться будет первое.
Германн (2008-02-23 03:02:00) [18]
> Riply © (23.02.08 02:48) [10]
Не. Я просто не сразу заметил, что тут выдается Warning, а не Error. Ну и плюс то, что я в основном работаю на ассемблере. Там для компилятора всегда без разницы в какой системе счисления писать константы. А тут теперь стало понятно, что компилятор предупреждает не слишком грамотных програмеров, что они может быть "скопипастили" то, в чём они не разбираются :)
Riply (2008-02-23 02:48:00) [19]> [7] Германн © (23.02.08 02:40)
> Просмотрел хэлпы от Д6 и BDS2006. Нигде не говорится что компилятор может
> трактовать Case label по-своему. Вне зависимости от типа case expression.
А ты поробуй заменить в
forumbrowserCommandStateChange(ASender: TObject; Command: Integer;Enable: WordBool);
integer на DWord :)
Германн (2008-02-23 02:48:00) [20]Блин. Наверно я предъявляю слишком большие требования к компилятору Дельфи. АСМ всё-таки проще.