Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Format Anweisung für Strings
martin300 - Fr 03.04.09 14:50
Titel: Format Anweisung für Strings
Hallo,
ich möchte einen Text möglichst flexibel gestalten. Dazu soll der erste Teil der Formatanweisung geändert werden. Da es nur ein String ist, sind Änderungen kein Problem. Die übergebenen Argumente sind in einem Konstanten Array. Und da ist mein Problem. Wie übergebe ich das Array möglichst flexibel. (dh. Änderung der Anzahl u. Werte der Parameter).
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var x,y: String; begin x:= 'Text'; y:= 'länger'; label1.Caption:= format('Hier steht ein %s der auch %s sein kann.',[x,y]); end; |
Moderiert von
Narses: Topic aus Open Source Projekte verschoben am Fr 03.04.2009 um 15:33
BenBE - Fr 03.04.09 15:02
Der Trick besteht bei Formatstrings darin, nicht die Parameter-Reihenfolge zu ändern, sondern dem Format-String zu sagen, dass die Argumente in einer anderen Reihenfolge wie übergeben genutzt werden müssen.
Siehe dazu auch die Beschreibung von Formatstrings und den zusätzlichen Modifiern. '%1:s' dürfte für dich interessant sein ....
martin300 - Fr 03.04.09 15:19
Das war schon hilfreich. Somit ändert sich die Reihenfolge der Parameter. Und wie definiere ich dazu ein variables Konstanten Array? (Das ist eigentlich schon ein Widerspruch) um die Anzahl der Parameter zu ändern? Bzw. gibt es eine bessere Lösung?
Ich könnte natürlich auch Variable und Konstante umdrehen.....
Yogu - Fr 03.04.09 15:28
Du kannst
Format ein
DYNAMISCHES ARRAY übergeben:
Delphi-Quelltext
1:
| var DynamnicArray: array of String; |
Und mit
SetLength kannst du die Länge des Strings setzen. :idea:
delfiphan - Fr 03.04.09 15:42
Du kannst dem Format ein array of const (= array of TVarRec) übergeben, dieses Array kannst du dynamisch zur Laufzeit zusammensetzen wie du willst.
martin300 - Fr 03.04.09 15:43
Ein dynamisches Array kann aber nur als erster Parameter übergeben werden. Oder?
delfiphan - Fr 03.04.09 15:44
Nein, der zweite Parameter ist ein Array. Der erste ist ein String.
Delphi-Quelltext
1:
| function Format(const Format: string; const Args: array of const): string; |
Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var Args: array of TVarRec; S: string; begin SetLength(Args, 1); Args[0].VType := vtInteger; Args[0].VInteger := 5; S := 'The number is: %d'; ShowMessage(Format(S,Args)); end; |
martin300 - Fr 03.04.09 15:58
Danke. Mit dem Code müsste es funktionieren.
BenBE - Fr 03.04.09 17:30
Was ich meinte, und was häufig auch in Lokalisierungsengines verwendet wird, ist das Index-Feature:
Vergleiche:
Delphi-Quelltext
1:
| Caption := Format('And %1:s said "%0:s"', ['Hello World!', 'HAL 9000']); |
Delphi-Quelltext
1:
| Caption := Format('"%0:s" sagte %1:s', ['Hello World!', 'HAL 9000']); |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!