Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1271079259
noob_one
2010-04-12 17:34
2010.08.27
Можно ли в delphi2007 объявить функцию в одном файле (модуле)


15-1272486602
Юрий
2010-04-29 00:30
2010.08.27
С днем рождения ! 29 апреля 2010 четверг


15-1265651858
OneYoungMan
2010-02-08 20:57
2010.08.27
Речевое общение


15-1271160223
Медвежонок Пятачок
2010-04-13 16:03
2010.08.27
нас ждет еще один капец


2-1271084793
JohnKorsh
2010-04-12 19:06
2010.08.27
Многострочные надписи на кнопках.





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