AGB  ·  Datenschutz  ·  Impressum  







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

MyFormat

Ein Thema von mimi · begonnen am 27. Mär 2010 · letzter Beitrag vom 31. Mär 2010
Antwort Antwort
mimi

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

MyFormat

  Alt 27. Mär 2010, 20:11
Delphi-Version: 1
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:
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;
Sie Läuft Fehler frei unter Lazarus, theoretisch sollte sie auch so in Delphi ab Version 1 laufen. Im Prinzip ab Windows 95.
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.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: MyFormat

  Alt 27. Mär 2010, 20:41
str1:=Copy(Fmt, 1, p1-1); str2:=str1; Warum nicht gleich das Copy-Result an str2 übergeben?

%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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mimi

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

Re: MyFormat

  Alt 27. Mär 2010, 21: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
30. Mär 2010, 23:34
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
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#5

Re: MyFormat

  Alt 31. Mär 2010, 10:43
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:txt := myFormat('Hallo, ich heiße &1s, &0s &1s und bin &2d Jahre alt.', ['James', 'Blond', 160]); Das Ergebnis wäre:
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.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#6

Re: MyFormat

  Alt 31. Mär 2010, 11:04
Kann die normale Format-Funktion von Delphi auch
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#7

Re: MyFormat

  Alt 31. Mär 2010, 14:33
Zitat von Die Muhkuh:
Kann die normale Format-Funktion von Delphi auch
Tatsächlich, wenigsten scheinen es auch andere nützlich zu finden
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
mimi

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

Re: MyFormat

  Alt 31. Mär 2010, 20:23
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.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:05 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