AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi String Entscheidungen mit case treffen!!!
Thema durchsuchen
Ansicht
Themen-Optionen

String Entscheidungen mit case treffen!!!

Ein Thema von Christian18 · begonnen am 5. Apr 2006 · letzter Beitrag vom 6. Apr 2006
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#1

String Entscheidungen mit case treffen!!!

  Alt 5. Apr 2006, 09:35
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
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: String Entscheidungen mit case treffen!!!

  Alt 5. Apr 2006, 09:39
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!
Da sprach der Stumme zum Blinden: "Du wirst sehen ..."
oder
Wer lesen kann, ist klar im Vorteil!
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#3

Re: String Entscheidungen mit case treffen!!!

  Alt 5. Apr 2006, 09:49
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 = 'Übersichtthen
    begin
      ...
    end;

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

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

  if TLabel(Sender).Caption = 'Impressumthen
    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;
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: String Entscheidungen mit case treffen!!!

  Alt 5. Apr 2006, 09:51
Delphi erlaubt nun mal in der Case-Anweisung keine Strings sondern nur ordinale Typen!
Da sprach der Stumme zum Blinden: "Du wirst sehen ..."
oder
Wer lesen kann, ist klar im Vorteil!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: String Entscheidungen mit case treffen!!!

  Alt 5. Apr 2006, 10:00
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
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#6

Re: String Entscheidungen mit case treffen!!!

  Alt 5. Apr 2006, 10:08
Hallo,

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

MFG Christian18
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#7

Re: String Entscheidungen mit case treffen!!!

  Alt 5. Apr 2006, 10:43
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 = 'string1then
  begin

  end
  else if s = 'string2then
  begin

  end
  else if ...
mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#8

Re: String Entscheidungen mit case treffen!!!

  Alt 5. Apr 2006, 10:59
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: String Entscheidungen mit case treffen!!!

  Alt 5. Apr 2006, 11:01
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: String Entscheidungen mit case treffen!!!

  Alt 5. Apr 2006, 11:18
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 Uhr.
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