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 user profile iconNarses: 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 Suche in der Entwickler-Ecke 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: stringconst 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)); // The number is: 5
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']);