![]() |
Warum String-Ausgaben mit format?
Moin DP'ler!
Ich habe hier jetzt schon oft gesehen, dass Meldungen für showMessage und ähnliches mit format zusammengesetzt werden, also zB wie ![]()
Delphi-Quellcode:
Und ich frage mich jedes Mal: "Warum?". Gibt es einen Geschwindigkeitsvorteil gegenüber folgender Variante?
E.Message := format('Fehler beim Öffnen der Playlist-Datei <%s>'#13#10, [JvOpenDialog1.Filename]) + E.Message;
Delphi-Quellcode:
Oder gab es das einfach zusammenfügen von Strings per + unter Turbo/Borland Pascal ursprünglich nicht und es ist einfach eine Angewohnheit?
E.Message := 'Fehler beim Öffnen der Playlist-Datei <%s>' + #13#10 + JvOpenDialog1.Filename + E.Message;
|
Re: Warum String-Ausgaben mit format?
Es gibt halt oftmals mehre Wege nach Rom.
|
Re: Warum String-Ausgaben mit format?
Hi,
der zweite Code macht etwas anderes. format ersetzt alle %s sukkzesive mit den Parametern, die folgen. Ich finde es oft übersichtlicher mit format und daher leichter wartbar. |
Re: Warum String-Ausgaben mit format?
Wenn man Format benutzt, ist es einfacher, Meldungen in Konstanten, Ressourcenstrings oder Sprachdateien auszulagern. Ansonsten müsstest du den String zerstückelt auslagern.
|
Re: Warum String-Ausgaben mit format?
Ich setze schon bei den simpelsten Gelegenheiten Format ein, weil es einfach auch schon dort die Lesbarkeit erhöht. Die paar Zeichen Schreibaufwand mehr sind mir relativ dazu ziemlich Wurscht ;) .
|
Re: Warum String-Ausgaben mit format?
Zitat:
Zitat:
|
Re: Warum String-Ausgaben mit format?
Hallo,
Zitat:
Gruß Jörg |
Re: Warum String-Ausgaben mit format?
Ist es nicht egal was man benutzt? Jeder wie er es möchte. ;)
|
Re: Warum String-Ausgaben mit format?
Zitat:
Ansonsten müsstest du, falls zB. ein Wort mitten im Satz einzusetzen ist, 2 Strings speichern. Bei 2 einzusetzenden Worten könnten es dann schon 3 sein usw. ;) |
Re: Warum String-Ausgaben mit format?
und man kennt es halt aus anderen programmiersprachen, siehe z.bsp. in C der befehlt printf(...) :-)
|
Re: Warum String-Ausgaben mit format?
Es ist auch für i18n (hey, endlich hab ich das mal angebracht :mrgreen:) praktisch unschlagbar. Denn dort speicherst du für deutsch "%1s wurde von %2s gebaut", im englischen willst/musst du aber vielleicht den satz komplett umdrehen: "%2s built %1s". Mit deiner string-aneinanderhäng-methode wird das schwierig.
|
Re: Warum String-Ausgaben mit format?
Zitat:
stell dir vor du willst solch einen String als Resourcestring speichern um ihn hinterher einem Übersetzer zu geben der die Oberfläche deines Programmes übesetzt: "Sie haben %d Dateien zum löschen ausgewählt. %d von diesen %d Dateien konnten nicht gelöscht werden da sie %s" Diesen String wir der Übersetzer verstehen und ohne Probleme verstehen und übersetzen können. Anders, mit den Einzelstrings, würden diese so aussehen und für den Übersetzer fast unmöglich zu überseten sein, da sie vollkommen aus dem Zusammenhang gerissen wären: "Sie haben" "Dateien zum löschen ausgewählt." "von diesen" "Dateien konnten nicht gelöscht werden da sie" Solche Satzfragmente wird kein Übersetzer übersetzen können. Ciao, Ralf |
Re: Warum String-Ausgaben mit format?
Format() ist
1.) sauber lesbar 2.) dadurch wird bei konsequenter Anwendung der komplette Source lesbarer 3.) was uns ein routiniertes Arbeiten ermöglicht und Routine in der Arbeit ist Professionalität da man Regeln aufstellt und diese einhält 4.) sehr effizient weil sehr universell benutzbar, zb. eben keine zerstückelten Strings ergo Resourcestring sind machbar, Parameter mit Formatierungsanweisungen und Inidizierten Parameterzugriffen ermöglicht
Delphi-Quellcode:
fazit: wer behauptet das die Anwendung von Format(), auf Grund dessen das man auch einen String aus Teilstrings zusammenbauen kann, der ist ignorant. Denn der würde auch behaupten das Wasserrohre im Haushalt unsinnig sind denn man könnte auch dieses Wasser aus dem Brunnen holen und per Eimern schleppen.
Format('Test %1d, %2s, %1d', [12345, 'String']);
Die Frage "Warum ist Format immer noch zu unflexibel, zb. im Vergleich zu printf() ?" wäre degegen viel cleverer gewesen ;) Gruß Hagen |
Re: Warum String-Ausgaben mit format?
Zitat:
Was mich an "Format" immer schon gestört hat ist die Tatsache, daß man keine Formatierungszeichen wie in prinf() verwenden kann: \t für Tab, \n für Newline usw. Ciao, Ralf |
Re: Warum String-Ausgaben mit format?
Code:
Ich glaube Chars kann man direkt in %s einsetzen, kann aber auch n gesondertes Zeichen gewesen sein, müsste ich mal nachsehen...
Format('blah%sblubb', [#13]);
Is zwar nich ganz so schön, wie \n oder \r oder so, aber es geht auch :) |
Re: Warum String-Ausgaben mit format?
Zitat:
Nützlich sind sie natürlich trotzdem, auch wenn ich \n zuliebe der Plattformunabhängigkeit nicht benutze. |
Re: Warum String-Ausgaben mit format?
:gruebel: 'string'#9#13#10'string' sollte äquivalent zu "string\t\nstring" sein....
|
Re: Warum String-Ausgaben mit format?
Übrigens spricht aus Nichts dagegen, Format zu erweitern bzw. neu zu implementieren. Der Code ist denkbar einfach:
Delphi-Quellcode:
NB: Eventuell fehlt etwas, und nicht 100% kompatibel, da die Argumente als 'Variant Array' und nicht als 'Array Of Const' übergeben werdem. Ist aber leicht anzupassen, nur sind die 'Array Of Const' etwas umständlicher zu handhaben.
// Hingehackt von Alzaimar irgendwann 2003
Function csFormat(aFormatStr: String; Arg: Array Of Variant): String; Var i, p: Integer; Procedure _Format; Var j, n: Integer; r, fmt: String; Begin Inc(i); If aFormatStr[i] = '%' Then Begin Result := Result + aFormatStr[i]; Inc(i) End Else Begin If aFormatStr[i] In ['0'..'9'] Then Begin j := i; While aFormatStr[i] In ['0'..'9', '*'] Do Inc(i); N := StrToIntDef(Copy(aFormatStr, j, i - j), -1); If aFormatStr[i] = ':' Then // Index specifier p := N Else i := j; End; j := i; If aFormatStr[i] = '-' Then Inc(i); While aFormatStr[i] In ['0'..'9', '*'] Do Inc(i); If aFormatStr[i] = '.' Then Inc(i); While aFormatStr[i] In ['0'..'9', '*'] Do Inc(i); Inc(i); fmt := '%' + Copy(aFormatStr, j, i - j); Case upcase(aFormatStr[i - 1]) Of 'D', 'U', 'X': r := Format(fmt, [integer(Arg[p])]); 'F', 'E', 'G', 'N', 'M': r := Format(fmt, [Double(Arg[p])]); Else r := Format(fmt, [Arg[p]]); End; Result := Result + r; Inc(p); End End; Begin i := 1; p := Low(Arg); Result := ''; While i <= Length(aFormatStr) Do If aFormatStr[i] = '%' Then _Format Else {Hier käme der Code für \n \t etc. rein else } Begin Result := Result + aFormatStr[i]; Inc(i) End; End; |
Re: Warum String-Ausgaben mit format?
Erst mal Danke für alle Antworten :) Die DP ist halt doch mehr als ein Forum zum Lösen von Problemen, hier lässt es sich auch trefflich diskutieren :thumb:
Zitat:
Zitat:
|
Re: Warum String-Ausgaben mit format?
Zitat:
Delphi-Quellcode:
Format('Huhu%s', [ExclamationMark])
Delphi-Quellcode:
String.Format('Huhu{0}', exclamationMark);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz