AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Variablen in Stringliteral inlinen

Ein Thema von QuickAndDirty · begonnen am 5. Feb 2020 · letzter Beitrag vom 11. Feb 2020
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.623 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#21

AW: Variablen in Stringliteral inlinen

  Alt 7. Feb 2020, 14:55
Hm, mir kommt gerade eh der Gedanke, dass Texte eigentlich gar nicht in Code gehören.
Umgekehrt gehört Code (hier Variablennamen) auch nicht in String-Literale.
+1

Wobei das eigentlich auch für die Platzhalter in Format-Strings gilt. Wenn der Übersetzer dabei einen Fehler macht, stürzt das Programm ab:

 s := Format(_('Result is %d'), [Res]);
Und der Übersetzer vertippt sich:
'Ergebnis ist %f'

Bumm!
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#22

AW: Variablen in Stringliteral inlinen

  Alt 7. Feb 2020, 15:21
Und der Übersetzer vertippt sich:
'Ergebnis ist %f'
Bumm!
Texte mit Formatierungen aus anderen Quellen sind immer nett, wenn das Programm plötzlich verreckt.
(Übersetzung/Datenbank wo Texte durch user bearbeitet oder über eine Synchronisierung/Update nachgeladen werden)

Drum hab ich bei uns das Format überschrieben/überdeckt.
Der Code muß nur in eine Unit die immer nach den SysUtils eingebunden wird.

Wenigstens "etwas" anzeigen und das Programm nicht abkratzen lassen.
Delphi-Quellcode:
function Format(const FormatStr: string; const Args: array of const): string;
begin
  try
    Result := SysUtils.Format(FormatStr, Args);
  except
    {Meldung ins Log, wenn sowas vorhanden}
    Result := FormatStr; // oder Result := '[ERR] ' + FormatStr;
  end;
end;
Oder zumindestens dem Entwickler etwas helfen, damit man gleich sieht bei welchem "kompletten" String es knallt.
Delphi-Quellcode:
function Format(const FormatStr: string; const Args: array of const): string;
begin
  try
    Result := SysUtils.Format(FormatStr, Args);
  except
    on E: Exception do begin
      E.Message := 'Fehler in Format-String >>' + FormatStr + '<<' + sLineBreak + sLineBreak + E.Message;
      raise;
    end;
  end;
end;
Und das Gleiche für die Variante mit den FormatSettings.

Alternativ verwendet man niemals Format, sondern ruft eine eigene MyFormat auf.
$2B or not $2B

Geändert von himitsu ( 7. Feb 2020 um 15:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#23

AW: Variablen in Stringliteral inlinen

  Alt 7. Feb 2020, 15:35
Wenn der Übersetzer dabei einen Fehler macht, stürzt das Programm ab
Da braucht er nicht mal einen Fehler machen. Es genügt, wenn er den Satzbau umstellt und sich dadurch die Reihenfolge der Parameter ändert. Deswegen sollte man in solchen Fällen auf die Index-Funktionalität in Format zurückgreifen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#24

AW: Variablen in Stringliteral inlinen

  Alt 7. Feb 2020, 15:41
Joar, oder automatische Übersetzer, die z.B. ein "%s" trennen.
In "% s" oder die beiden wild verteilen, bzw. Teile weglassen.

Hatte mal mit Poedit gespielt und dort eine automatische Google-Translate-Übersetzung reingeladen.
Da kamen die wildesten Ergebnisse bei raus.

Oder bei einigen Online-Spielen gibt es z.B. im Chat/Mails eine automatische Üersetzung, wo bei Systemnachrichten die Platzhalter gern mal zerstört werden.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.623 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#25

AW: Variablen in Stringliteral inlinen

  Alt 7. Feb 2020, 16:30
Texte mit Formatierungen aus anderen Quellen sind immer nett, wenn das Programm plötzlich verreckt.
(Übersetzung/Datenbank wo Texte durch user bearbeitet oder über eine Synchronisierung/Update nachgeladen werden)

Drum hab ich bei uns das Format überschrieben/überdeckt.
Der Code muß nur in eine Unit die immer nach den SysUtils eingebunden wird.

Wenigstens "etwas" anzeigen und das Programm nicht abkratzen lassen.
Wir gehen bei unseren Programmen noch einen Schritt weiter und installieren einen Hook für die Format-Funktion. Das passiert in einer Unit, die automatisch in allen unseren Programmen eingebunden wir. Dann wird sowas auch für fremden Code abgefangen. Und man kann man muss auch nicht daran denken, überall eine solche Unit einzubinden.

Am meisten nervt mich aber, dass man den Datentyp überhaupt angeben muss. Write kann den ja auch automatisch erkennen, warum gibt es bei Format nicht sowas wie einen generischen Platzhalter:

Format('Der Wert ist %g', [IrgendeineVariable]);

Die Format-Funktion weiss ja, welcher Datentyp übergeben wurde, denn eigentlich ist das ja ein Variant mit entsprechenden Informationen. Den kann man dann halt nach String konvertieren. Für viele Anwendungen würde das ausreichen.

Aber das Thema war ja ein anderes ...
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#26

AW: Variablen in Stringliteral inlinen

  Alt 7. Feb 2020, 16:44
Und woher soll write wissen, wie viele Nachkommastellen du willst? Wie viele führende Nullen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Poelser

Registriert seit: 21. Apr 2008
Ort: Europa
145 Beiträge
 
Delphi 10.4 Sydney
 
#27

AbarW: Variablen in Stringliteral inlinen

  Alt 7. Feb 2020, 17:07
Moin,

da wäre so etwas wie die Systemeinstellungen für das Datumsformat denkbar. Wenn der Entwickler das anders haben will, dann könnte er die Formatanweisungen wie bisher benutzen.

Bis denne,
Edmund
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#28

AW: Variablen in Stringliteral inlinen

  Alt 7. Feb 2020, 17:39
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.

Hab erst gestern geschaut, ob man Format so umbauen könnte wie string.Format in .NET, die dort übergebenen Parameter sind alle object und haben somit die exakten Typeninformationen dabei.
Mit SysUtils.Format kann ich nichtmal Datum oder Zeit allein über den Formatstring ausgeben

Und woher soll write wissen, wie viele Nachkommastellen du willst? Wie viele führende Nullen?
Indem man es angibt - das erfordert aber nicht die grundsätzliche Angabe des Typens - siehe string.Format

Übrigens solltet ihr nicht Write und Format verwechseln, die funktionieren unterschiedlich.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 7. Feb 2020 um 17:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#29

AW: Variablen in Stringliteral inlinen

  Alt 7. Feb 2020, 18:20
Ich meine natürlich Format. Sorry.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#30

AW: Variablen in Stringliteral inlinen

  Alt 7. Feb 2020, 19:16
Wir gehen bei unseren Programmen noch einen Schritt weiter und installieren einen Hook für die Format-Funktion.
Wir arbeiten viel mit Packages und DLLs.
Eine große Hook-Engine wollte/konnte ich für die paar Kleinigkeiten nicht so einfach integrieren. (die das dann je nach Ziel richtig erledigt)
Und beim selbst hooken (JMP+Adresse in Prozeduranfang schreiben oder bei Packages/DLL in "allen" Libraries die Referenz überschreiben) muß man da bissl aufpassen, dass man den hook nicht nur im aktuellen Package/DLL macht (war mir einmal passiert (vorsicht vor Copy&Paste aus Hook-Tutorials, denn die sind fast immer nur für Ein-EXE-Anwendungen) und ob man dann die originale Funktion auch noch verwenden möchte und demnach eben nicht den Prozeduranfang überschreiben kann.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 Uhr.
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