![]() |
Delphi-Version: 1
MyFormat
Hallo,
ich habe heute eine (fast) eigene Format-Beispiel-Funktion geschrieben. Anregungen hatte ich aus der Lazarus-Format Funktion. Ich habe daraus folgende Funktion erstellen können:
Delphi-Quellcode:
Sie Läuft Fehler frei unter Lazarus, theoretisch sollte sie auch so in Delphi ab Version 1 laufen. Im Prinzip ab Windows 95.
function myFormat(const Fmt : string; const args : array of const):string;
var x,c,p1,p2,i:Integer; ch:Char; str1, str2, str3:String; begin c:=Length(args)-1; p1:=Pos('%',fmt); x:=p1+1; i:=0; str1:=Copy(Fmt, 1, p1-1); str2:=str1; while i <= c do begin ch:=Fmt[x]; case ch of 'V', 'N': begin str2:=str2+String(args[i].VAnsiString); inc(i); end; 'A': begin str2:=str2+IntTostr(args[i].VInteger); inc(i); end; end; // case // inc(i); p2:=PosEx('%',FMT, x)+1; str1:=Copy(Fmt, x+1, abs(p2-x)-2); x:=p2; str2:=str2+str1; end; // while x result:=str2; end; // myFormat // Beispiel Aufruf procedure TForm1.BitBtn1Click(Sender: TObject); begin ShowMessage(myFormat('Mein Vornamename ist %V, Mein Nachname ist: %N, Ich bin %A Jahre alt ',[Edit2.Text, Edit3.Text, SpinEdit1.Value])); end; Probleme könnte es geben, wegen dem Dynamischen Array, daher könnte es auch sein, dass es erst ab Delphi 3 bzw. Delphi 4 Läuft, da bin ich mir jetzt nicht sicher. Die Variablen richtig zu nennen, Fällt mir immer schwer, an dieses Format habe ich mich gewöhnt. Wenn ihr andere Namen habt, werde ich sie natürlich übernehmen. |
Re: MyFormat
Delphi-Quellcode:
Warum nicht gleich das Copy-Result an str2 übergeben?
str1:=Copy(Fmt, 1, p1-1); str2:=str1;
%V oder %N kann ich nicht mit einem String in Verbindung setzen (assoziieren), bzw. warum sollte man für jeden Parameter andere Kennungen nutzen? Denn so ist diese Funktion absolut nicht wiederverwendbar. Kommt kein % im Fmt-String vor, dann ist Result leer. Ohne Argumente ist Result leer. Kommt ein % ohne passende Kennung vor, dann wird es gelöscht. z.B. '%A %' für "x %" und selbst '%A %%' geht nicht Wenn man für %N einen Integer <> 0 übergibt, dann knallt es mit großer Sicherheit. > keinerlei Typenprüfung Ab Delphi 2009 ist String kein AnsiString mehr, darum gibt es ab da vermutlich einige Probleme. Was anderes außer AnsiString und Integer ist auch nicht nutzbar. Und zu guter letzt, außer für "NonVCL", wofür soll sowas nützlich sein? Abgesehn davon, daß es bessere/andere Möglichkeiten gibt. Mein Fazit: Für die CodeLib leider absolut nicht geeignet. |
Re: MyFormat
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Das Stammt aus einer fpc-unit: objpash.inc
TVarRec = record
case VType : Ptrint of {$ifdef ENDIAN_BIG} vtInteger : ({$IFDEF CPU64}integerdummy1 : Longint;{$ENDIF CPU64}VInteger: Longint); vtBoolean : ({$IFDEF CPU64}booldummy : Longint;{$ENDIF CPU64}booldummy1,booldummy2,booldummy3: byte; VBoolean: Boolean); vtChar : ({$IFDEF CPU64}chardummy : Longint;{$ENDIF CPU64}chardummy1,chardummy2,chardummy3: byte; VChar: Char); vtWideChar : ({$IFDEF CPU64}widechardummy : Longint;{$ENDIF CPU64}wchardummy1,VWideChar: WideChar); {$else ENDIAN_BIG} vtInteger : (VInteger: Longint); vtBoolean : (VBoolean: Boolean); vtChar : (VChar: Char); vtWideChar : (VWideChar: WideChar); {$endif ENDIAN_BIG} vtExtended : (VExtended: PExtended); vtString : (VString: PShortString); vtPointer : (VPointer: Pointer); vtPChar : (VPChar: PChar); vtObject : (VObject: TObject); vtClass : (VClass: TClass); vtPWideChar : (VPWideChar: PWideChar); vtAnsiString : (VAnsiString: Pointer); vtCurrency : (VCurrency: PCurrency); vtVariant : (VVariant: PVariant); vtInterface : (VInterface: Pointer); vtWideString : (VWideString: Pointer); vtInt64 : (VInt64: PInt64); vtQWord : (VQWord: PQWord); end; So sollte es leicht sein, diese Funktion für jeden Zweck anzupassen. Zitat:
![]() Die letzten Beiträge betrifft dieses Thema. Zitat:
Zitat:
Zitat:
fmt ist ein einfacher String. Siehe Beispiel. PS: Dies ist jetzt mein Zweiter Versuch eine Funktion in die CodeLib zu bekommen. So wie es aussieht wird der auch Scheitern. Mein erster Versuch wurde "einfach" gelöscht. Ohne weitere Begründung. Jedenfalls habe ich ihn bisher noch nicht gefunden in der Codelib. Bin mal gespannt, ob ich diesen "da" rein bekomme. Vorallem weil diese Funktion auch unter Lazarus / Linux nutzbar ist und es hier sogar ein Lazarus-Forum gibt. Das ich nicht jede Delphi Version berücksichtigen kann dürfte wohl auch auf der Hand Liegen. Lazarus ist "nur" bis zu Delphi 7 Kompatibel. Da ich nur "Standard" Anweisungen hier nutze, könnte es auch bei höheren Delphi Version klappen. Wie schon gesagt: Vielleicht sollte ich den Titel Ändern: "Array of Const nutzen ?", wäre das Sinnvoller ? Dann wäre das "nur" eine Beispiel Funktion. |
DP-Maintenance
Dieses Thema wurde von "TBx" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Object-Pascal / Delphi-Language" verschoben.
Das paßt so nicht in die CL, ist aber dennoch durchaus diskussionswürdig, denke ich |
Re: MyFormat
Ohne jetzt Rücksicht den bisherigen Threadverlauf zu nehmen,
will ich mal eine Idee für ein nettes Feature für eine Formatfunktion nennen. Wäre es nicht nützlich, wenn man die Parameter im Formatstring adressieren könnte, um im String eine andere Reihenfolge haben zu können als in dem Parameter-Array? Beispiel:
Delphi-Quellcode:
Das Ergebnis wäre:
txt := myFormat('Hallo, ich heiße &1s, &0s &1s und bin &2d Jahre alt.', ['James', 'Blond', 160]);
Hallo, ich heiße Blond, James Blond und bin 160 Jahre alt. Die Syntax könnte man natürlich noch anpassen. Wäre auf jeden Fall ein Mehrwert. |
Re: MyFormat
Kann die normale Format-Funktion von Delphi auch ;-)
|
Re: MyFormat
Zitat:
|
Re: MyFormat
Ich werde wie schon angekündigt die Funktion "noch" überarbeiten. Es wird verschiedene Varianten geben. Das wird aber nicht vor Morgen Passieren. Mein Ziel wäre es auch Irgendwie den User bestimmen zu lassen was genau %s bedeuten soll. Ob es z.b. ein Datei Name sein soll oder was auch immer. Eine Variante wird diese Funktion habe. Zum Diskutieren:
01: Ein einfaches Beispiel, wie mein erstes. 02: Ein erweiterst Beispiel, um Eigenschaften von einer Datei zu Formatieren. 03: Eine Erweiterung von 02 *G* 04: Mal sehen was mir / uns noch so einfällt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 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-2025 by Thomas Breitkreuz