Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Внизcase не работает со строками Найти похожие ветки
← →
dj kondakov (2010-04-13 10:26) [0]Хотел сделать в своей программе обработчик параметров командной строки, но обнаружилась проблема: Дельфи никак не хочет работать с оператором case, параметры которого типа string. При компиляции кода типа
case ParamStr(1) of
"param1": Action1;
"param2": Action2;
end;
лог компиляции выглядит так:
[Error]Unit1.pas(28): Ordinal type required
[Error]Unit1.pas(29): Incompatible types: "Integer" and "String"
[Error]Unit1.pas(30): Incompatible types: "Integer" and "String"
[Fatal Error]Project1.dpr(5): Could not compile used unit "Unit1.pas"
← →
Демо © (2010-04-13 10:51) [1]http://www.delphimaster.ru/cgi-bin/forum.pl?n=18&search=case+of
← →
Amoeba_ (2010-04-13 10:54) [2]
> Дельфи никак не хочет работать с оператором case, параметры
> которого типа string.
Если бы заглянули в справку, то сразу было стало ясно, что так и должно быть.
← →
Плохиш © (2010-04-13 11:38) [3]
> Amoeba_ (13.04.10 10:54) [2]
> Если бы заглянули в справку
Фигню советуешь, аднака...
← →
Leonid Troyanovsky © (2010-04-13 11:52) [4]
> Плохиш © (13.04.10 11:38) [3]
IMHO, чтение справки весьма полезно.
--
Regards, LVT.
← →
12 © (2010-04-13 11:57) [5]Если кнопкой ты на форму,
Пусть попал, хоть и не сразу,
Знай что ты почти профессор,
Все задачи по плечу.
F1, MSDN"ы, VCL тебе не нужно,
Все равно там не по-русски,
Лучше в форуме спросить.
http://www.podgoretsky.com/OtherParts/DM/BadWill.aspx
← →
Anatoly Podgoretsky © (2010-04-13 12:01) [6]Фигня советовать.
← →
Плохиш © (2010-04-13 12:44) [7]
> Leonid Troyanovsky © (13.04.10 11:52) [4]
И всё-равно смайлик ставить не буду.
← →
Leonid Troyanovsky © (2010-04-13 12:57) [8]
> Плохиш © (13.04.10 12:44) [7]
> И всё-равно смайлик ставить не буду.
Смайлик - фигня.
Вот оптимизм и вера в людей - это хорошо.
--
Regards, LVT.
← →
Плохиш © (2010-04-13 13:05) [9]пессимист: Хуже не будет.
оптимист: Будет, будет.
← →
dj kondakov (2010-04-13 13:29) [10]Не понимаю,почему начались нападки в мою сторону. Насколько я помню из Паскаля, case работает с константами строкового типа. Справедливо полагая, что Дельфи, построенный целиком и полностью на Паскале, унаследовал эту возможность, пишу программу, которая в итоге не хочет компилироваться. Как верно заметили выше, я не стал заглядывать в справку, именно потому, что там "все по-английски", а написал сюда, в надежде на то, что люди поумнее меня уже давно разобрались с этой проблемой. Увидев, что предложенное решение проблемы мне не подходит, решил все сделать самым логичным образом - через кучу if"ов.
Только что все же залез в справку. Фраза "(string types are invalid)" мне все объяснила. Всем спасибо за советы.
← →
12 © (2010-04-13 13:38) [11]
> помню из Паскаля, case работает с константами строкового
> типа
мда?
← →
Сергей М. © (2010-04-13 13:40) [12]> я помню из Паскаля, case работает с константами строкового типа
Это ты, батенька, Паскаль с каким-то васикообразным языком попутал)
← →
Плохиш © (2010-04-13 14:02) [13]
> Насколько я помню из Паскаля, case работает с константами
> строкового типа.
no comment
← →
Anatoly Podgoretsky © (2010-04-13 14:42) [14]> dj kondakov (13.04.2010 13:29:10) [10]
Твоя фамилия не Андерсен?
← →
dj kondakov (2010-04-13 14:51) [15]Да, скорее всего, Андерсен...
В Паскале case, действительно, не работает со строками... Он работает с char. Именно поэтому я так жестко ошибся, ибо Паскалем занимался последний раз в школе...
← →
Anatoly Podgoretsky © (2010-04-13 14:59) [16]> dj kondakov (13.04.2010 14:51:15) [15]
char можешь и здесь использовать, поскольку это перечислимый тип.
← →
Putnik © (2010-04-13 23:41) [17]>>case не работает со строками - спасибо, буду знать...)
← →
Германн © (2010-04-14 00:57) [18]
> case не работает со строками
Некие извращенные решения приведены в обсуждении по ссылке в [1].
← →
Leonid Troyanovsky © (2010-04-14 05:46) [19]
> Германн © (14.04.10 00:57) [18]
> Некие извращенные решения
Изощренные.
--
Regards, LVT.
← →
Anatoly Podgoretsky © (2010-04-14 08:39) [20]> Leonid Troyanovsky (14.04.2010 05:46:19) [19]
Мальчик Василий нашел пулемет
Больше в деревне никто не живет.
← →
oxffff © (2010-04-14 09:19) [21]Есть продолжение от меня.
Для поддержки
a:=TForm.create...
case a.classtype of
Tobject: ...
TComponent: ...
TForm: ... <-Valid option
TCustomForm: ..
end;
https://forums.codegear.com/thread.jspa?threadID=35447&tstart=15
TPAIRTYPE<T>=record
Value:T;
Proc:TProc;
end;
class procedure CaseAnyTypeClassSupport<T>.MyCase(const Value:T;const Pairs:array of TPAIRTYPE<T>;ElseProc:TProc=nil);
var Pair:TPAIRTYPE<T>;
Comparer:IComparer<T>;
TypeInfo:PTypeInfo;
Selector:TClass;
OrderedList:TList<TClass>;
begin
TypeInfo:=GetTypeInfo;
if TypeInfo.Kind=tkClassRef then
begin
Selector:=TClass((@value)^);
OrderedList:=TList[TClass].create;
for Pair in Pairs do if Selector.InheritsFrom(TClass((@Pair.Value)^)) then OrderedList.Add(TClass((@Pair.Value)^));
if OrderedList.Count>0 then
begin
OrderedList.Sort(UtilStuff);
for pair in Pairs do
if TClass((@Pair.Value)^)=OrderedList.Items[0] then
begin
Pair.Proc();
exit;
end;
endelse
if Assigned(ElseProc) then ElseProc();
OrderedList.free;
end
else
begin
Comparer:=TComparer<T>.Default;
for Pair in Pairs do
if Comparer.Compare(Value,Pair.Value)=0 then
begin
Pair.Proc();
exit;
end;
if Assigned(ElseProc) then ElseProc();
end;
end;
function TUtilStuff.Compare(const Left, Right: TClass): Integer;
begin
if left=Right then result:=0
else
if left.InheritsFrom(Right) then result:=-1
else result:=1;
//
end;
← →
Leonid Troyanovsky © (2010-04-14 09:57) [22]
> Anatoly Podgoretsky © (14.04.10 08:39) [20]
> oxffff © (14.04.10 09:19) [21]
Дети в подвале играли в гестапо.
Зверски замучан сантехник Потапов.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.063 c