![]() |
Re: Strings und Case of
Natürlich lassen sich Pascal-Mengen nur mit Ordinaltypen bilden, aber das ist ja keine Erklärung dafür, dass auch einzelne Nihct-Ordinal-Typen nicht funktionieren.
Das eigentliche Problem ist gleichzeitig der Vorteil von Case: es wird eine effiziente Sprungtabelle erstellt. ![]() |
Re: Strings und Case of
Danke, genau das wollte ich wissen!
|
Re: Strings und Case of
Ist nicht im Gespräch case of für Strings in einer der nächsten Delphi-Versionen zu ergänzen :gruebel:
Irgendwo (Borland-Community, Borland-Blogs, EKON, ...) hab ich das gehört das man hier nicht hinter C# und konsorten hinterherhinken will. Evtl. auch nur für .NET angedacht. |
Re: Strings und Case of
Zitat:
Beispiel: Filetypen
Delphi-Quellcode:
FileExt : array [0 ..10] of string = ('.mp3','.wav','.wma','.aiff','.aif','.ogg',
'.wmv','.mpeg','.mpg','.dat','.avi');
Delphi-Quellcode:
Anstelle der extensions kannst du xbeliebige strings eingeben.
var
FileType : string; playindex : integer; ArrayIndex : integer; begin PlaylistIndex := Playlist.ItemIndex; // Aktiven PlaylistIndex zuweisen FileType := Trim(ExtractFileExt(fFiles[playindex].Dateiname)); // FileType = Extension ermitteln for ArrayIndex := 0 to 10 do // Schleife durchlaufen bis übereinstimmendes ArrayIndex gefunden if FileExt[ArrayIndex] = FileType then // FileType mit FileExt(ArrayIndex) vergleichen // und gefundenen ArrayIndex zuweisen break; // Raus hier wenn gefunden! if FileType <> '' then // Übereinstimmenden FileType gefunden // dann weiter.. begin case ArrayIndex of // Audio // unten stehenden ArrayIndex gefunden dann DateiTyp = Audio 0, 1, 2, 3, 4, 5: begin //.... end; // Video // unten stehenden ArrayIndex gefunden dann DateiTyp = Video 6, 7, 8, 9, 10: begin // .... end; end; end; end; gruß |
Re: Strings und Case of
Der Code wird so vollkommen unleserlich. Grundsätzlich ist so eine Vorgehensweise sicherlich ok, aber das muss man -finde ich- etwas genauer bertrachten.
Für Deinen Code ist ein String ein unglaublich umständlich zu behandelndes Ding. Code will einfache Datentypen (Word, Integer, Zeichen, Pointer, Double). Ich würde einen String sofort nachdem er aufgetaucht ist, in eine Zahl umwandeln, oder hier, in eine Aufzählung (enum), also z.B. (natürlich mit einem Array, das dient hier nur zur Anschauung):
Delphi-Quellcode:
Nun kannst Du erstmal deinen String in ein (T)Tier verwandeln und dann ordendlich und effizient damit arbeiten. Wenn Du es darstellen (anzeigen) willst, verwendest Du die Umkehrfunktion.
Type
TTier = (trUnbekannt, trHund, trKatze, trPferd); Function StringToTier (Const aTierName : String) : TTier; Begin If atierName = 'Hund' Then Result := trHund Else if aTierName ='Katze' Then Result := trKatze Else if aTierName = 'Pferd' Then Result := trPferd Else Result := trUnbekannt End;
Delphi-Quellcode:
So ist das doch viel Übersichtlicher.
Var
myTier : TTier; Begin ... myTier := StringToTier (Edit1.Text); Case myTier Of trHund : ... trKatze : ... trPferd : ... trUnbekannt : ... End; |
Re: Strings und Case of
Oder ne theoretische andere Methode wäre auch
Delphi-Quellcode:
Nur müssen die Strings dann auch eindeutig zuortenbar (<-- das is nie im Leben richtig geschrieben aber ich steh auf der Leitung-.-^^) sein ;)
Case Length(String) of
... end; |
Re: Strings und Case of
Hallo,
genau das, was in den Beiträgen #14 und #15 passiert, macht die von mir schon angegebene Funktion AnsiIndexStr. Gruß xaromz |
Re: Strings und Case of
Völlig richtig. Ich schrieb auch, das das soweit korrkt ist, man sich aber eben noch ein paar Gedanken mehr drüber machen sollte, so von wegen Trennung von Darstellung und Ausführung.
Leider liefert AnsiIndexStr nur eine Zahl, und da steckt keine Semantik hinter. Ich will doch lesbaren Code, der auch später noch verstanden wird. Da hilft mir ein
Delphi-Quellcode:
Nix..
Case AnsiIndexStr(Edit1.Text, Animals) Of
0 : ... 1 : ... End; Aber verwenden(!) würde ich die Funktion auf alle Fälle... |
Re: Strings und Case of
Hallo,
Zitat:
Zitat:
Gruß xaromz |
Re: Strings und Case of
Zitat:
Stell dir vor du hast 2000 Tiere die überprüft werden müssen, dein Tier ist das 2000 dann muss jede IF abfrage überprüft werden bis du zum ziel kommst. Das geht mit einer For und Case Anweisung allemal schneller. gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz