Thema: MyFormat

Einzelnen Beitrag anzeigen

mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#3

Re: MyFormat

  Alt 27. Mär 2010, 22:23
Zitat:
Warum nicht gleich das Copy-Result an str2 übergeben?
Du meinst dadurch könnte ich eine Variable Sparen ? Ich habe mit der direkten Benutzung von result immer Probleme bekommen. Daher habe ich es so gelöst.

Zitat:
%V oder %N kann ich nicht mit einem String in Verbindung setzt,
bzw. warum sollte man für jeden Parameter andere Kennungen nutzen?
Denn so ist diese Funktion absolut nicht wiederverwendbar.
Das ist "nur", ein Beispiel, eine Vorlage. Jeder der möchte kann das natürlich anpassen für seinen Zweck, daher wollte ich das so einfach wie nur möglich machen und für meine Zwecke reicht es so aus.

Zitat:
Kommt kein % im Fmt-String vor, dann ist Result leer.
Ohne Argumente ist Result leer.
Stimmt, dass müsste ich noch Abfangen.

Zitat:
Kommt ein % ohne passende Kennung vor, dann wird es gelöscht.
z.B. '%A %' für "x %" und selbst '%A %%' geht nicht
Das könnte könnte abgefangen werden z.b. in dem einfach das der Abstand zwischen dem % und dem Buchstaben ermittelt wird, jedoch kann ich nicht alles Abfangen, es sollte ein einfaches Beispiel sein / werden.

Zitat:
Wenn man für %N einen Integer <> 0 übergibt, dann knallt es mit großer Sicherheit.
> keinerlei Typenprüfung
In der Normalen Format Funktion gibt es auch eine Fehler Meldung, wenn der Falsche Datentyp übergeben wird. Stimmt, in meinem ersten Test hatte ich eine eingebaut. Es gibt die Variable VType, die abgefangen werden kann.

Zitat:
Ab Delphi 2009 ist String kein AnsiString mehr, drum geht sowas nicht mehr:
S := myFormat('%N', ['test']);
Was gibt es Stattdessen ? WideString ? UTF8String ? Das könnte Abgefangen werden mit Compiler Schalter.

Zitat:
Was anderes außer AnsiString und Integer ist auch nicht nutzbar.
Wie schon gesagt, es ist nur ein Beispiel. Es gibt noch viel Mehr Möglichkeiten:
Delphi-Quellcode:
  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;
Das Stammt aus einer fpc-unit: objpash.inc
So sollte es leicht sein, diese Funktion für jeden Zweck anzupassen.

Zitat:
Und zu guter letzt, außer für "NonVCL", wofür soll sowas nützlich sein?
Ich wollte sie in meiner plXINE Klasse verwenden. Du kannst das hier nach lesen:
http://www.lazarusforum.de/viewtopic...p=37016#p37016
Die letzten Beiträge betrifft dieses Thema.

Zitat:
Mein Fazit: Für die CodeLib leider absolut nicht geeignet.
Bitte. Deine Entscheidung. Ich halte es als Beispiel für Wertvoll. Ich kann die Funktion ja noch einmal Überarbeiten. Jedoch nicht vor Morgen. Deine Hinweise werde ich teilweise Einbauen.

Zitat:
Abgesehn davon, daß es bessere/andere Möglichkeiten gibt.
Es führen Viele Wege nach ROM. Der Standard Format Befehl ist auch nicht Sinnlos. Immerhin kann bei diesem Beispiel gesehen werden wie mit einem Array ohne Typ bzw. mit dem Typ: TVarRec bzw. mit array of Const gearbeitet werden kann. Alleine das sollte schon zählen. Meiner Meinung.

Zitat:
- Fmt : string;
- args : array of const

Deiner Funktion?
Ich habe wie schon gesagt die Lazarus-Format Anweisung als "Vorlage" genutzt.
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.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat