Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variablen Interpolation in Delphi (https://www.delphipraxis.net/13020-variablen-interpolation-delphi.html)

choose 9. Dez 2003 15:50


Variablen Interpolation in Delphi
 
Gibt es neben Format und FormatDateTime in Delphi noch andere Möglichkeiten, Platzhalter in Strings (ggf mit Formatierung) durch den Wert von Variablen zu ersetzen?

Zwar bietet Format mithilfe von Indizes die Möglichkeit, gezielt einen Wert aus dem übergebenen Array anzusprechen, ich suche hingegen nach einer Möglichkeit, die Variablen namentlich zu referenzieren, ähnlich, wie es in diversen Skriptsprachen möglich ist:
Code:
foo= 6;
bar= 9;
myString= "What do you get if you multiply $foo by $bar?";
Idealerweise sollten die Platzhalter ein Typangabe sowie einen Defaultwert (und ggf eine Formatierungsbeschreibung) aufnehmen können, vielleicht etwas in der Art
Delphi-Quellcode:
myString:= AFunc('My number %ANumber:.6d|23 says %AString:s', SomeParams);
oder auch die vollständige Auswertung von Teilausdrücken
Delphi-Quellcode:
myString:= AFunc('The anwswer ist $(6*9+ANumber:Integer|23)', SomeParams);
Ich bin auf der Suche nach einer fertigen und praxiserprobten Lösung. Bittet postet deshalb keinen Vorschlag der Art "nutze Pos und Copy" oder "nutze reguläre Ausdrücke". Im Zweifelsfall werde ich letztere verwenden, um etwas ähnliches auf der Basis eines assozativen Arrays von Varianten umzusetzen...

Ich bin gespannt ;)

sakura 9. Dez 2003 20:47

Re: Variablen Interpolation in Delphi
 
Ich muss mal so doof fragen, aber was ist an Format nicht gut? Die macht eigentlich recht genau das ;-)

...:cat:...

jbg 9. Dez 2003 20:50

Re: Variablen Interpolation in Delphi
 
Zitat:

Zitat von choose
ich suche hingegen nach einer Möglichkeit, die Variablen namentlich zu referenzieren, ähnlich, wie es in diversen Skriptsprachen möglich ist:

Nur ist Delphi dummerweise ein Compiler und kein Interpreter. Das einzige was dir der Compiler für die Variablen geben kann ist deren Adresse im Arbeitsspeicher.

choose 9. Dez 2003 21:23

Re: Variablen Interpolation in Delphi
 
Zitat:

Zitat von jbg
Das einzige was dir der Compiler für die Variablen geben kann ist deren Adresse im Arbeitsspeicher.

Das ist mir bekannt. Obwohl man mithilfe der RTTI in der Lage wäre, zumindest die published Eigenschaften oder die Rückgabewerte von Methoden namentlich zu referenzieren, ist das in der Tat nicht praxistauglich. Aus diesem Grund muss diese Information vom Entwickler (zB beim Aufruf) hinzugefügt werden.


Zitat:

Zitat von sakura
Ich muss mal so doof fragen, aber was ist an Format nicht gut?

Format ist leider "nur" in der Lage, die in einem Array übergebenen Variablen mithilfe deren jeweiliger Position zu referenzieren, also etwa in der Art
Delphi-Quellcode:
myString:= Format('A String: %2:s', [6, 9, '42']);
Wie ich benötige ist aber etwas in der Art
Delphi-Quellcode:
myString:= AFunc('A String: %AString:s',
  [Value('Num1', 6), Value('Num2', 9), Value('AString', 42)]);

Aus dem Aufruf kann man schon entnehmen, dass ich mir ungefähr soetwas vorstelle:
Delphi-Quellcode:
type
  TMyValueTupel = record
    Ident: string;
    Value: Variant;
  end;

function AFunc(const AMessage: string;
  const AValues: array of TMyValueType): string;
Tatsächlich würde ich Value und AFunc wahrscheinlich als Klassenmethoden einer Klasse implementieren, die in der Lage ist, benannte Werte-Mengen (assoziatives Array) und neben einfachen Tupeln auch Arrays aus Werten zu speichernn, so dass eine erweiterte Format-Syntax der Art
Code:
'An array entry: $AnArray[2]:s'
oder gar
Code:
'An array entry: $AnArray[$Num1]:s'
denkbar ist.
Im Wesentlichen entspricht dies etwas der Collection TParams aus der Unit DB mit den zugehörigen Items TParam, allerdings ist mir das zu SQL-spezifisch, bietet nicht ausreichend Funktionalität (zB Default-Values) und ist zu kompliziert in der Handhabe...

Trotzdem möchte ich die Mühe ungern investieren, falls es eine entsprechende Lösung bereits gibt ;)

Robert_G 9. Dez 2003 22:59

Re: Variablen Interpolation in Delphi
 
Wenn ich dich richtig verstanden habe, willst du Variablen in einem String anhand ihres Namen finden und ersetzen???
Also wie bei SQL-Variablen " SQL := 'SELECT X FROM Y WHERE Z = :VAR;'"...

Ein Lösungsweg dafür wäre eine kontextfreie Grammatik wie BNF.
Schau mal auf die Seite und saug' dir die Compos (Freeware).
Mit dem TParserAll bastel ich rum, falls ich endlich mal Zeit dazu finde.

Die Grammatik würde so aussehen (BNF-Property des TParserAll):
Delphi-Quellcode:
<letter>     ::= a..z<letter>|a..z
<digit>      ::= 0..9
<underline>  ::= '_'<underline>|'_'
<dollar>     ::= '$'<dollar>|'$'
<number>     ::= <digit><number>|<digit>
<spec>       ::= <number><spec>|<underline><spec>|<dollar><spec>|
                  <number>|<underline>|<dollar>
<id_body>    ::= <letter><spec><id_body>|<letter><id_body>|
                  <letter><spec>|<letter>
<identifier> ::= ':'<id_body><identifier> |':'<id_body>
Damit findest du alle Variablen, die mit einem ":" beginnen incl. Start- & Endposition.


Ich hoffe ich konnte dir damit weiterhelfen.

choose 10. Dez 2003 09:56

Re: Variablen Interpolation in Delphi
 
Hallo GeorgeWNewbie,

der Einsatz einer kontextfreien Grammatik scheint mir für das blose Auffinden der Textpassagen etwas übertrieben, der reguläre Ausdruck für die von mir oben beschriebene Syntax inkl Arrays mit Zahlen als Indizes lautet schlicht
Code:
\$(\w+)(\[(\d+)\])?
und kann dank eines Wrappers mit Referenzzählung in einer einfachen Schleife der Form
Delphi-Quellcode:
with RegExp('\$(\w+)(\[(\d+)\])?') do
  if Execute(AnInput) do
  repeat
    DoSthWidth(AnInput, MatchPos[0], MatchLen[0]);
  until not ExecuteNext;
angewendet werden...

Das Problem mit den benannten Identifiern ist damit aber nach wie vor nicht gelöst. Ich müsste einen entsprechenden Container selbst verwalten (zuvor jedoch eine geeignete Lösung zur Erzeugung dieser Information erarbeiten), die Bezeichnungen parsen...

Trotzdem, Danke! Wenn Du Dich für Grammatiken und Parsern für Delphi interssierst, ist vielleicht der GOLD parser eine gute Lösung...

choose 20. Dez 2004 12:42

Re: Variablen Interpolation in Delphi
 
Gibt es hier seit D2005 eine Veränderung oder steht lediglich System.String.Format als zusätzliche Möglichkeit der Stringformatierung zur Verfügung?

Sprint 20. Dez 2004 13:01

Re: Variablen Interpolation in Delphi
 
Zitat:

Zitat von choose
Gibt es hier seit D2005 eine Veränderung oder steht lediglich System.String.Format als zusätzliche Möglichkeit der Stringformatierung zur Verfügung?

Ich verstehe dein Problem nicht. Du weißt doch wie das Ergebnis aussehen soll. Also machst du das, was ein Programmierer so macht... Und schreibst dir selber eine Funktion.

choose 20. Dez 2004 15:27

Re: Variablen Interpolation in Delphi
 
Hallo Sprint,

Zitat:

Zitat von Sprint
[..]schreib[st] dir selber eine Funktion

Das ist mit Sicherheit möglich, aber ich befürchte, dass ich bei meinem Entwurf Fehler wiederholen würde, die bei über Jahren etablierten Systemen bereits der Vergangenheit angehören. Abgesehen von einfachen Implementierungsfehlern mute ich mir hier Designschwächen in puncto Robustheit, Vorhersagbarkeit des Parsingergebnisses, Erweiterbarkeit und nicht zu letzt Probleme in der Akzeptanz anderer Entwickler mit anderen Anforderungen, zu.
Zieht man darüber hinaus den zeitlichen Aufwand in Betracht, lässt sich meine Präferenz einer ausgereiften vorhanden Lösung verstehen, nicht wahr ;)

Sprint 20. Dez 2004 19:48

Re: Variablen Interpolation in Delphi
 
Zitat:

Zitat von choose
Zieht man darüber hinaus den zeitlichen Aufwand in Betracht [...]

Am 09.12. hast du diesen Thread gestartet. Hätte ich jeden Tag nur zwei Stunden Zeit um zu programmieren, dann wäre es schon fertig.

Liegt vielleicht daran, das ich ein praktisch denkender Mensch bin.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:24 Uhr.
Seite 1 von 2  1 2      

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