Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String Entscheidungen mit case treffen!!! (https://www.delphipraxis.net/66843-string-entscheidungen-mit-case-treffen.html)

Christian18 5. Apr 2006 09:35


String Entscheidungen mit case treffen!!!
 
Hallo,

ich habe mal eine kurze Frage zu case! Ich will Entscheidungen mit case treffen.

Hier mein Code den ich bis jetzt habe:
Delphi-Quellcode:
procedure TMain.Menu(Sender: TObject);
  var s : String;
begin
  s:=TLabel(Sender).Caption;
  case s of
    'Übersicht' : begin
                    f.Close;
                  end;
  end;
end;
Diese Procedure wird immer dann ausgelöst, wenn ein Label auf meiner Form geclickt wird. Der Compiler sagt mit aber einen Fehler mit den ich nichts anfangen kann.

Hier der Fehler:

[Fehler] UMain.pas(136): Ordinaltyp erforderlich
[Fehler] UMain.pas(137): Inkompatible Typen: 'Integer' und 'String'

Kann man mit case nur Integer Werte Entscheiden lassen???

Mit freundlichen Grüßen

Christian18

Kroko1999 5. Apr 2006 09:39

Re: String Entscheidungen mit case treffen!!!
 
Delphi-Quellcode:
procedure TMain.Menu(Sender: TObject);
  var s : String;
begin
  s:=TLabel(Sender).Caption;
  case Pos (S,'ÜbersichtTeil2Teil3') of
    1 : begin
                    f.Close;
                  end;
    10: ; //teil2
    16: ; //Teil3
  end;
end;
ich würde aber lieber dier Tag-Eigenschaft von TLabel mißbrauchen und die in der case-Anweisung nehmen!

Christian18 5. Apr 2006 09:49

Re: String Entscheidungen mit case treffen!!!
 
Hallo,

warum kann ich nicht auch einen String Entscheiden lassen??? Mit if funktioniert es doch auch!

ich soll diesen Entscheidungsbau, der eigentlich gar keiner ist, mit case machen. Kein Entscheidungsbau, weil die If Anweidungen nicht ineinander verzweigt sind. Wie kann ich das mit case machen???

Delphi-Quellcode:
procedure TMain.FormShow(Sender: TObject);
begin
  if TLabel(Sender).Caption = 'Übersicht' then
    begin
      ...
    end;

  if TLabel(Sender).Caption = 'Kunden' then
    begin
      ...
    end;

  if TLabel(Sender).Caption = 'Einstellungen' then
    begin
      ...
    end;

  if TLabel(Sender).Caption = 'Impressum' then
    begin
      ...
    end;

  ...

end;
Mein vorschlag wäre dieser gewesen, der funktioniert aber leider nicht!!!

Delphi-Quellcode:
procedure TMain.FormShow(Sender: TObject);
begin

  case TLabel(Sender).Caption of
    'Übersicht' : begin
                    ...
                  end;

    'Kunden' : begin
                 ...
               end;

    'Übersicht' : begin
                    ...
                  end;

    'Einstellungen' : begin
                        ...
                      end;

    'Impressum' : begin
                    ...
                  end;
  end;

Kroko1999 5. Apr 2006 09:51

Re: String Entscheidungen mit case treffen!!!
 
Delphi erlaubt nun mal in der Case-Anweisung keine Strings sondern nur ordinale Typen! :gruebel:

marabu 5. Apr 2006 10:00

Re: String Entscheidungen mit case treffen!!!
 
Hallo.

Den "Ordinalen Typen" ist ein Kapitel in der Delphi Online-Hilfe gewidmet. Das sind alle Typen die sich mit der Funktion Ord() vertragen. Ein String ist intern ein Record und deshalb kein ordinaler Typ. Man kann zwar für jeden String in einer abzählbaren Menge eine Ordnungsnummer angeben, aber bei einem offenen Wertebereich eben nicht mehr.

Grüße vom marabu

Christian18 5. Apr 2006 10:08

Re: String Entscheidungen mit case treffen!!!
 
Hallo,

und was wäre jetzt die eleganteste Variante dieses Problem zu lösen??? Über eine Verschachtelte If Anweisung???

MFG Christian18

r2c2 5. Apr 2006 10:43

Re: String Entscheidungen mit case treffen!!!
 
Zitat:

Zitat von Christian18
und was wäre jetzt die eleganteste Variante dieses Problem zu lösen??? Über eine Verschachtelte If Anweisung???

Jo:
Delphi-Quellcode:
  if s = 'string1' then
  begin

  end
  else if s = 'string2' then
  begin

  end
  else if ...
mfg

Christian

himitsu 5. Apr 2006 10:59

Re: String Entscheidungen mit case treffen!!!
 
Das Eleganteste hat Kroko1999 schon gesagt ... einfach TLabel(Sender).Tag nutzen
Delphi-Quellcode:
Case TLabel(Sender).Tag of
  0{Übersicht}: Begin
    ...
  End;
  1{Kunden}: Begin
    ...
  End;
  2{Einstellungen}: Begin
    ...
  End;
  3{Impressum}: Begin
    ...
  End;
  ...
End;
Dazu muß natürlich noch den TAG's der Labels der entsprechende Wert zugewiesen werden ;)



Ein Pointer sollte ja auch einen ordinalen Typ darstellen, demnach müßte es doch auch möglich sein diese zu vergleichen?
Delphi-Quellcode:
Case TLabel(Sender) of
  Label1{Übersicht}: Begin
    ...
  End;
  Label2{Kunden}: Begin
    ...
  End;
  ...
End;

Case TLabel(Sender) of
  UebersichtLabel: Begin
    ...
  End;
  KundenLabel: Begin
    ...
  End;
  ...
End;

//halt die definierten Namen der Labels

Hawkeye219 5. Apr 2006 11:01

Re: String Entscheidungen mit case treffen!!!
 
Die Unit StrUtils enthält die Funktion AnsiIndexText, mit der das Problem auch lösbar ist:

Delphi-Quellcode:
case AnsiIndexText(Caption, ['Übersicht', 'Kunden', 'Einstellungen', 'Impressum']) of
  0 :; // Übersicht
  1 :; // Kunden
  :
end;
Lesbarer dürfte allerdings das Mehrfach-IF sein...

Gruß Hawkeye

alzaimar 5. Apr 2006 11:18

Re: String Entscheidungen mit case treffen!!!
 
Zuallererst würde ich den Label1, Label2 etc. Komponenten etwas bessere Namen geben, zumal Du von Übersichtlichkeit und Lesbarkeit redest.
Anschließend würde ich statt der '0','1' etc. im CASE Konstanten definieren:
Delphi-Quellcode:
Const
  liUebersicht = 0; // li = Label Index
  liKunden = 1;
...
Dann würde ich im FormCreate-Ereignis den Tag-Eigenschaften der Label-Komponenten diese Konstanten zuweisen:
Delphi-Quellcode:
Procedure TMyForm.FormCreate (Sender : TObject);
Begin
  lbKunden.Tag := liKunden;
  lbUebersicht.Tag := liUebersicht;
...
End;
Und dann über die Tag-Eigenschaft der Komponente das Case realisieren.
Delphi-Quellcode:
Case TLabel(Sender).Tag Of
  liKunden : Begin
    ...
    End;
  liUebersicht : Begin
    ...
    End;
End;
Übersichtlicher (und vor allen Dingen: Nachvollziehbarer) würde ich das nicht hinbekommen.
Der Nachteil der Stringvergleiche ist ganz klar, das dein Programm wegschmiert, sobald jemandem die Beschriftung nicht passt und er die SW patcht. So, wie das lokalisierende Programme machen. Die Captions stehen in den Resourcen, werden also übersetzt. Die Stringkonstanten stehen aber im Code und werden deshalb ignoriert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:30 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz