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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.046 c
15-1267122258
Fenik
2010-02-25 21:24
2010.08.27
YAML под Delphi


2-1272448331
Sergey2
2010-04-28 13:52
2010.08.27
MultiSelect в ComboBox


2-1274423388
pro_xaoc
2010-05-21 10:29
2010.08.27
Какой код лучше?


15-1263970917
Дмитрий С
2010-01-20 10:01
2010.08.27
Программа такая как IBExpert, только для Mysql?


2-1269935209
TKN
2010-03-30 11:46
2010.08.27
Имя компьютера