Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Strings nur einmalig im Code verwenden - Zugriff (https://www.delphipraxis.net/189956-strings-nur-einmalig-im-code-verwenden-zugriff.html)

RandomDD 12. Aug 2016 14:33

Strings nur einmalig im Code verwenden - Zugriff
 
Erster Post: sorry, bin kein Pro und kein Programmierer, daher verzeiht mir dumme Fragen!

Ich benutze in einem Testprojekt ein paar Strings gefühlte 100 Mal an verschiedenen Stellen.
Das find ich etwas suboptimal.

Meine 0815-Lösung war jetzt, dass ich eine Konstante definiere die so aussehen kann
Delphi-Quellcode:
StringListe: array [0 .. 1] of String = ('String 1', 'String 2');


Etwas weiter unten ein Type
Delphi-Quellcode:
type TStringListe = (sString1, sString2);


Jetzt kann ich ungefähr so auf die Strings zugreifen
Delphi-Quellcode:
showmessage(StringListe[Ord(TStringListe.sString2)]);
Das gibt dann 'String 2' aus.

Ich könnte auch einfach das Array benutzen
Delphi-Quellcode:
showmessage(StringListe[1]);
Aber wenn sich dann mal der Index von String 2 ändert, müsste ich überall alles abändern.

Gibt es eine bessere Methode als meine? Die gibt es doch sicher!

Neutral General 12. Aug 2016 14:36

AW: Strings nur einmalig im Code verwenden - Zugriff
 
Öhm du könntest direkt Konstanten anlegen:
Delphi-Quellcode:
const
  sString1 = 'String 1';
  sString2 = 'String 2';

showmessage(sString1);
showmessage(sString2);

RandomDD 12. Aug 2016 14:36

AW: Strings nur einmalig im Code verwenden - Zugriff
 
Oder so.

Aber geht das nicht schöner und kompakter? Eventuell sogar noch über einen Type?

Neutral General 12. Aug 2016 14:39

AW: Strings nur einmalig im Code verwenden - Zugriff
 
Wie viel kompakter als
Delphi-Quellcode:
Konstantenname = Wert
willst du es denn noch haben? :mrgreen:
Du kannst optional für deine Konstanten einen Typ angeben:

Delphi-Quellcode:
const
  sString1: String = 'String 1';
  sString2: String = 'String 2';

RandomDD 12. Aug 2016 14:40

AW: Strings nur einmalig im Code verwenden - Zugriff
 
Also ungefähr so? :-D

Delphi-Quellcode:
type
 TStringListe = record
 
 const
  sString1 = 'String 1';
  sString2 = 'String 2';
end;

var
 MeineStrings: TStringListe;

showmessage(MeineStrings.sString1);

Sherlock 12. Aug 2016 14:40

AW: Strings nur einmalig im Code verwenden - Zugriff
 
Es gibt da verschiedene Möglichkeiten. Eine prominente dürfte die Verwendung von resourcestring sein.
Beispiel:
Delphi-Quellcode:
resourcestring
  rsInvalidIP = 'Ungültige IP';
  rsGeraetVon = 'Geraet von: %s';
  rsGeraetBis = '%0:s bis: %1:s';
  rsListeBearbeiten = 'Liste Bearbeiten';
  rsFertig = 'Fertig';
  rsZuordnen = 'Zuordnen';
Das hat den Vorteil, daß sie von den gängigen Übersetzungsprogrammen auch gleich erkannt werden.

Sherlock

DeddyH 12. Aug 2016 14:44

AW: Strings nur einmalig im Code verwenden - Zugriff
 
Oder vielleicht so etwas?
Delphi-Quellcode:
type
  TSomeType = (stOK, stError, stBananenSindKrumm);

const
  SOMESTRINGS: array[TSomeType] of string = ('Alles in Butter', 'Oops', 'Is mir völlig Banane');

...

ShowMessage(SOMESTRINGS[TSomeType.stBananenSindKrumm]);

Neutral General 12. Aug 2016 14:45

AW: Strings nur einmalig im Code verwenden - Zugriff
 
Zitat:

Zitat von http://edn.embarcadero.com/article/34324
Classes can now have class constants -- a constant value associated with the class itself and not an instance of the class.
Delphi-Quellcode:
type
  TClassWithConstant = class
    public
      const SomeConst = 'This is a class constant';
  end;
         

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage(TClassWithConstant.SomeConst);
end;

In nicht ganz so alten Delphi Versionen sollte das da gehen. Wobei es bei meinem Delphi 7 nicht geht obwohl auf der Seite steht dass es ab Delphi 7 geht (oder hab ich was falsch verstanden?)

RandomDD 12. Aug 2016 14:49

AW: Strings nur einmalig im Code verwenden - Zugriff
 
So viele verschiedene Lösungen hier :shock: :stupid:

p80286 12. Aug 2016 15:02

AW: Strings nur einmalig im Code verwenden - Zugriff
 
Na meist passiert irgendetwas und wir brachen einen String der angezeigt werden soll.
Delphi-Quellcode:
if state<>ErrorOK then
   DisplayMessage(FEHLER_DATEI_NICHT_GEFUNDEN);
Warum sollte ich mir so etwas antun:
Delphi-Quellcode:
if state <>ErrorOK then
  DisplayMessage(StringListe[machwasdraus(state)]);
vielleicht wäre es gut uns zu erzählen warum Du es so machen willst.

Gruß
K-H

Sherlock 12. Aug 2016 15:12

AW: Strings nur einmalig im Code verwenden - Zugriff
 
Ich lehne mich mal ganz weit aus dem Fenster und behaupte, daß der TE betriebsblind war, und nicht auf simple Konstanten oder auch resourcestrings gekommen ist. Denn diese Listen bzw. deren Handhabung dürften bei Leuten, die Delphi für eine "viel zu wortreiche" Sprache halten zu Schreikrämpfen führen.

Sherlock

RandomDD 12. Aug 2016 15:17

AW: Strings nur einmalig im Code verwenden - Zugriff
 
Ich war nicht betriebsblind sondern nur leer im Kopf :lol:

Deswegen frage ich ja hier nach, um diese Leere zu füllen :P

Das hier gefällt mir am besten

Delphi-Quellcode:
  type
   TStrings = record

   const
    sString = 'String 1';
    // usw
   end;

   var
    MeineStrings: TStrings;

   showmessage(MeineStrings.sString1);

DeddyH 12. Aug 2016 15:24

AW: Strings nur einmalig im Code verwenden - Zugriff
 
TStrings ist ein schlecht gewählter Name, da es auch eine gleichnamige Klasse in System.Classes gibt.

Sherlock 12. Aug 2016 15:29

AW: Strings nur einmalig im Code verwenden - Zugriff
 
Warum? Wenn ich das mehr als fünf mal verwenden müsste, würde ich verzweifeln. Aus mehreren Gründen: String1 ist nicht selbsterklärend und ich müsste beim Codelesen immer zur Deklaration springen. Dann ist MeineStrings.sString1 gemessen an der geringen Aussagekraft mächtig lang. Wozu die Stringaufzählung noch mit einem Record umwickeln? TStrings ist übrigens ein Typ, den es bereits gibt... Detlef hats vor mir gesehen.

Es wäre also hilfreich, die Anforderungen genauer zu beschreiben, sollen zB die Strings per Index zur Laufzeit "durchlaufen" werden können?

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 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 by Thomas Breitkreuz