Главная страница
    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.52 MB
Время: 0.063 c
3-1221825053
Антон
2008-09-19 15:50
2010.08.27
Настройка доступа из Delphi к Access через ADO


15-1271968202
Юрий
2010-04-23 00:30
2010.08.27
С днем рождения ! 23 апреля 2010 пятница


2-1266408421
Den
2010-02-17 15:07
2010.08.27
Через какие порты работает FIBPlus?


15-1268773367
Nic
2010-03-17 00:02
2010.08.27
НДС - непонятно немного


15-1272037786
TUser
2010-04-23 19:49
2010.08.27
Празднование 50-го Дня матмеха





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский