Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизCase of для строк Найти похожие ветки
← →
oxffff © (2010-04-02 15:35) [40]Ну и естественно обобщенная версия
TPAIRTYPE<T>=record
Value:T;
Proc:TProc;
end;
CaseAnyTypeClassSupport<T>=class
private
class function GetCaseOption(Value:T;Action:TProc):TPAIRTYPE<T>;static;
public
class procedure MyCase(const Value:T;const Pairs:array of TPAIRTYPE<T>;ElseProc:TProc=nil);static;
class property CaseOption[Value:T;Action:TProc]:TPAIRTYPE<T> read GetCaseOption;default;
end;
uses generics.defaults;
class procedure CaseAnyTypeClassSupport<T>.MyCase(const Value:T;const Pairs:array of TPAIRTYPE<T>;ElseProc:TProc=nil);
var Pair:TPAIRTYPE<T>;
Comparer:IComparer<T>;
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;
class function CaseAnyTypeClassSupport<T>.GetCaseOption(Value:T;Action:TProc):TPAIRTYPE<T>;
begin
Result.Value:=Value;
Result.Proc:=action;
end;
procedure TForm2.FormCreate(Sender: TObject);
var Stuff:CaseAnyTypeClassSupport<string>;
begin
Stuff.MyCase("2",
[
Stuff["4",procedure
begin
showmessage("Option 1");
end],
Stuff["2",procedure
begin
showmessage("Option 2");
end]
],procedure
begin
showmessage("Else option");
end);
end;
← →
oxffff © (2010-04-02 15:38) [41]Повторюсь.
Если у delphi компилятор чуть лучше. то можно было написать так.
with Stuff do
MyCase("2",
[
["4",procedure
begin
showmessage("Option 1");
end],
["2",procedure
begin
showmessage("Option 2");
end]
],procedure
begin
showmessage("Else option");
end);
← →
Игорь Шевченко © (2010-04-02 15:42) [42]oxffff © (02.04.10 15:35) [40]
if SameText(foo,"FOO") then
ShowMessage("FOO")
else if SameText(foo,"BAR") then
ShowMessage("BAR")
else
ShowMessage("Not FOO nor BAR")
Чутка короче получилось ;)
← →
oxffff © (2010-04-02 16:19) [43]
> Игорь Шевченко © (02.04.10 15:42) [42]
> oxffff © (02.04.10 15:35) [40]
>
> if SameText(foo,"FOO") then
> ShowMessage("FOO")
> else if SameText(foo,"BAR") then
> ShowMessage("BAR")
> else
> ShowMessage("Not FOO nor BAR")
>
> Чутка короче получилось ;)
Только с подтипами у Вас дополнительные раздумья будут.
Например Mycase можно написать, чтобы обрабатывал конструкции вида
var a:Tobject;
a:=Tform.create;
case a.classtype of
Tobject: ...
TComponent: ...
TCustomForm: ..
TForm: ... <-выполняется это.
end;
А с if выстраивать порядок сравнения придется программисту. ;)
← →
Игорь Шевченко © (2010-04-02 16:45) [44]oxffff © (02.04.10 16:19) [43]
так вопрос был про строки...
вот в oracle есть case по строкам ;)
← →
имя (2010-04-02 17:07) [45]Удалено модератором
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.065 c