Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variablen in Stringliteral inlinen (https://www.delphipraxis.net/203319-variablen-stringliteral-inlinen.html)

TurboMagic 7. Feb 2020 18:24

AW: Variablen in Stringliteral inlinen
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1456825)
Nun Ich generiere delphi code für eine include datei...jetzt mit format('Bla%d blabla%s '[x,y]) :(
Glaube mir die Ausgabe mit string interpolation hätte den Quellcode in den strings sicher leichter manipulierbar und umstellbar gemacht.
Ich sage ja nicht das es der Heilige Gral ist, frei von jedwedem Nachteil.

Dennoch hätte Stringinterpolation mir bei der Aufgabe echt was gebracht(leichte Umstellbarkeit des Codes in den Strings)
Das andere Übel ist die häßliche art und weise wie Einzelhochkomma escaped werden....
Sowohl QuotedString('TADA') als auch ''''''''''''''''''' sind keine sehr befriedigende Art sowas zu machen.
Auch ein Multiline String literal wäre schon schön für diese Aufgabe gewesen.

Schon mal was davon gehört, dass du deinen Platzhaltern in den Formatstrings Indexe verpassen kannst?

Format('Mein Name ist %0:s und ich stamme aus %1:s', ['Max', 'Musterhausen']);
Format('Ich stamme aus %1:s und mein Name ist %0:s', ['Max', 'Musterhausen']);

Grüße

TurboMagic

TurboMagic 7. Feb 2020 18:28

AW: Variablen in Stringliteral inlinen
 
Zitat:

Zitat von Stevie (Beitrag 1456944)
Übrigens solltet ihr nicht Write und Format verwechseln, die funktionieren unterschiedlich.

Jaaa...
Write nutzt Compiler Magic.
Das war zu Turbo Pascal Zeiten eine der häufigsten Fragen in den Newsgroups:
"Wie kann ich eine Funktion oder Prozedure schreiben die wie Write eine variable ANzahl Parameter übergeben bekommt?"

Antwort:
"Geht nicht. Write ist Compiler Magic" ;-)

Grüße

TurboMagic

himitsu 7. Feb 2020 18:31

AW: Variablen in Stringliteral inlinen
 
Jo, leider nicht genug Infos, aber mehr, als man bei sowas wie printf rein bekommt (dort garkeine Typ-Info, außer dem Wert oder einen Zeiger auf die Variable) und noch nichtmal die Anzahl der Parameter ist bekannt.

Hatte mal versucht ein Format zu basteln, wo die Daten wie bei printf übergeben werden.

In Delphi kann man sowas leider auch nicht nativ schreiben, aber jedenfalls man eine Funktion ohne die Parameter schreiben, die als Export deklarieren und in der selben Datei wieder einen Import auf sich selber, der dann in der Definition diese offenen Parameter hat.
Aber leider bekommt man eben keinerlei Infos die übergebenen Werte.
Darum muß man dort auch selber im String das "genaue" Format angeben (nicht nur %d sondern auch ob Byte, Word, LongWord, ShortInt, SmallInt, LongInt usw.)

Also in der Hinsicht ist Format doch recht einfach, auch wenn teilweise echt blöd ist.
Ich kann nicht %p nehmen und dann ein Objekt oder Integer reingeben, der in der aktuellen Pointergröße (32 oder 64) ausgegeben wird.
Oder einen Integer mit Tausenderpunkten, den muß man erst in einen Fließkomma umwandeln (x/1) und kann dann %.0n verwenden. (k.A. warum man nicht direkt einen Integer als Float darstellen darf usw.)


Zitat:

Wie kann ich eine Funktion oder Prozedure schreiben die wie Write eine variable ANzahl Parameter übergeben bekommt
Wie gesagt, man kann soeine Funktion schreiben (besser in eine DLL legen, denn innerhalb einer EXE schreiben und benutzen ist ein grauß), aber die Funktion weiß nicht was ihr übergeben wurde und das müsste man dann zusätzlich noch als Info mit reingeben.

Über die RTTI kann man ansonsten nur noch nativ "beliebige" Funktionen aufrufen. (siehe Invoke in System.RTTI.pas)

Dennis07 9. Feb 2020 21:35

AW: Variablen in Stringliteral inlinen
 
Oder man nimmt offene variante Array-Parameter:

Delphi-Quellcode:
procedure WriteValues(Values: array of const);
begin
  Write(String.Join(String.Empty, Values));
end;

WriteValues(['hallo', 123]);

QuickAndDirty 10. Feb 2020 11:46

AW: Variablen in Stringliteral inlinen
 
Zitat:

Zitat von TurboMagic (Beitrag 1456953)
Schon mal was davon gehört, dass du deinen Platzhaltern in den Formatstrings Indexe verpassen kannst?
Format('Mein Name ist %0:s und ich stamme aus %1:s', ['Max', 'Musterhausen']);
Format('Ich stamme aus %1:s und mein Name ist %0:s', ['Max', 'Musterhausen']);

Nein, bisher nicht. OK das ist schon mal ne gute Sache, ein bisschen TurboMagic quasi!
Ich denke ich werde das in meine Arbeitsweise aufnehmen.

Uwe Raabe 10. Feb 2020 12:07

AW: Variablen in Stringliteral inlinen
 
Zitat:

Zitat von TurboMagic (Beitrag 1456953)
Schon mal was davon gehört, dass du deinen Platzhaltern in den Formatstrings Indexe verpassen kannst?

#23

dummzeuch 10. Feb 2020 13:10

AW: Variablen in Stringliteral inlinen
 
Zitat:

Zitat von Luckie (Beitrag 1456939)
Und woher soll write wissen, wie viele Nachkommastellen du willst? Wie viele führende Nullen?

Wenn man das explizit braucht, verwendet man halt %f statt %g. Und ansonsten funktionert %g bei Floats halt wie %f, auch da nimmt Format ja defaults.

dummzeuch 10. Feb 2020 13:13

AW: Variablen in Stringliteral inlinen
 
Zitat:

Zitat von Stevie (Beitrag 1456944)
Zitat:

Zitat von dummzeuch (Beitrag 1456938)
Die Format-Funktion weiss ja, welcher Datentyp übergeben wurde, denn eigentlich ist das ja ein Variant mit entsprechenden Informationen.

Falsch! Es ist ein TVarRec - und die haben ebend nicht genügend Informationen über den Typen.

Doch, zumindest zu den Variablen, die Format standardmäßig unterstützt. Bei anderen hat man sowieso ein Problem.

Stevie 10. Feb 2020 23:13

AW: Variablen in Stringliteral inlinen
 
Zitat:

Zitat von dummzeuch (Beitrag 1457048)
Doch, zumindest zu den Variablen, die Format standardmäßig unterstützt. Bei anderen hat man sowieso ein Problem.

TVarRec kennt nur 32 und 64bit Integer mit Vorzeichen und kennt kein TDateTime - Float nur als Extended oder Currency (da wär ja sogar Variant besser -.-)

himitsu 11. Feb 2020 10:38

AW: Variablen in Stringliteral inlinen
 
Und Variant kann man sogar nativ um neue Typen erweitern. (Delphi hat z.B. seine AnsiString und UnicodeString dort reingepackt)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 Uhr.
Seite 4 von 4   « Erste     234   

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