Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   String Formatierung (https://www.delphipraxis.net/115374-string-formatierung.html)

Wishmaster 11. Jun 2008 10:03


String Formatierung
 
Hi

brauche mal wieder eure Hilfe bei einem kleinem Problem. Ich habe mir en CD-Ripper/Converter geschrieben.

das Problem ist ich komme bei der File Formatierung nicht weiter!

Hier ein kleines Beispiel wie ich es mir Vorstelle.

Delphi-Quellcode:
{
%1 = Artist
%2 = Title
%3 = Album
%4 = Year
%5 = Track
%6 = -

 fTag =    'Sylver,The End,Crossroads,12,2006,Pop';
 fFormat = '%1%6%2';
}

Function Get_Filename(fFormat, fTag) : String;
begin
  // ?

         // %1%6%2;
  result:= 'Sylver - The End'
 or     // %5%6%1%6%2
  result:= '12 - Sylver - The End';
end;

für das Separieren des (fTag) habe ich schon ne lösung.


Delphi-Quellcode:
type
  {$IFNDEF COMPILER4_UP}
  TSysCharSet = set of Char;
  {$ENDIF}
  TCharSet = TsysCharSet;


function ExtractDelimited(N: Integer; const S: string;        
  const Delims: TCharSet): string;
var
  CurWord: Integer;
  I, Len, SLen: Integer;
begin
  CurWord := 0;
  I := 1;
  Len := 0;
  SLen := Length(S);
  SetLength(Result, 0);
  while (I <= SLen) and (CurWord <> N) do
  begin
    if S[I] in Delims then
      Inc(CurWord)
    else
    begin
      if CurWord = N - 1 then
      begin
        Inc(Len);
        SetLength(Result, Len);
        Result[Len] := S[I];
      end;
    end;
    Inc(I);
  end;
end;



var c : TCharSet;
begin
   c:= [','];
  result:= ExtractDelimited(1, fTag, c)

thx

taaktaak 11. Jun 2008 11:00

Re: String Formatierung
 
Moin, Moin,

unter der Voraussetzung, dass die Reihenfolge der Einträge in FTag immer gleich ist und du die Benennung deiner Formatangabe %1..%x an die Reihenfolge der Einträge in FTag anpasst, sollte folgendes funktionieren ...

Delphi-Quellcode:
function Get_Filename(fFormat,fTag:String):String;
var SL : TStringList;
    i : Integer;
begin
  SL:=TStringList.Create;
 
  try
    SL.SetText(pchar(StringReplace(fTag,',',#13,[frReplaceAll]);

    i:=0;
    repeat
      Result:=Result+SL[pred(StrToInt(copy(fFormat,i+2,1)))];
      inc(i,2)
      until i=length(fTag)

  finally
    SL.Free
    end

end;
// edit: Na, ich sehe gerade den %6 für den Bindestrich, das muss natürlich noch eingebaut werden. Sollte aber kein Problem darstellen ...

Wishmaster 11. Jun 2008 20:10

Re: String Formatierung
 
Hi

Danke für die Antwort!

Theoretisch funzt das so, frReplaceAll muss rfReplaceAll sein
ich muss daran nur noch ein wenig arbeitn, ich bekomme ne Error Msg.
('' Is not a valid integer value)

mkinzler 11. Jun 2008 20:17

Re: String Formatierung
 
Dann scheint es nicht als ein solcher erknnt zu werden. Verwende besser TryStrToInt() oder StrToIntDef()

Wishmaster 14. Jun 2008 11:52

Re: String Formatierung
 
Hi

ich habe es zum laufen gekriegt.

Hier ist meine Lösung

Delphi-Quellcode:

function StringToFilename(fFormat, fTag : String): String;
var SL : TStringList;
    i : Integer;
    s : String;
begin
  SL:= TStringList.Create;
  try
    SL.SetText(pchar(StringReplace(fTag, ',', #13, [rfReplaceAll])));  

  for I := 1 to Length(fTag) do           { TODO : Length bug }
   begin
    if Copy(fFormat, i, 2) = '%1' then
     s:= s + SL[pred(StrToInt(copy(fFormat, i + 1, 1)))];    // Artist

    if Copy(fFormat, i, 2) = '%2' then
     s:= s + SL[pred(StrToInt(copy(fFormat, i + 1, 1)))];    // Title

    if Copy(fFormat, i, 2) = '%3' then
     s:= s + SL[pred(StrToInt(copy(fFormat, i + 1, 1)))];    // Album

    if Copy(fFormat, i, 2) = '%4' then
     s:= s + SL[pred(StrToInt(copy(fFormat, i + 1, 1)))];    // Year

    if Copy(fFormat, i, 2) = '%5' then
     s:= s + SL[pred(StrToInt(copy(fFormat, i + 1, 1)))];    // Track

    if Copy(fFormat, i, 2) = '%6' then
     s:= s + SL[pred(StrToInt(copy(fFormat, i + 1, 1)))];    // Genre

    if Copy(fFormat, i, 2) = '%7' then
     s:= s + SL[pred(StrToInt(copy(fFormat, i + 1, 1)))];    // ' - '
   // or s:= s + ' - '
   end;
  finally
    Result:= s;
    SL.Free;
   end
end;


Thx

marabu 14. Jun 2008 13:02

Re: String Formatierung
 
Hallo,

das geht auch mit benannten Variablen:

Delphi-Quellcode:
function Substitute(const template: string; info: TStrings): string;
var
  iNext, iPos, iLen: Integer;
  bName: Boolean;
  s: string;
begin
  Result := '';
  iPos := 1;
  bName := False;
  while iPos <= Length(template) do
  begin
    iNext := {StrUtils.}PosEx('%', template, iPos);
    iLen := {Math.}IfThen(iNext = 0, Succ(Length(template)) - iPos, iNext - iPos);
    s := Copy(template, iPos, iLen);
    iPos := IfThen(iNext = 0, Succ(Length(template)) {0}, Succ(iNext)); // EDIT
    if bName then
      if s = ''
        then Result := Result + '%'
        else Result := Result + info.values[s]
      else Result := Result + s;
    bName := not bName;
  end;
end;

// Test
procedure TDemoForm.ButtonClick(Sender: TObject);
var
  info: TStrings;
begin
  info := TStringList.Create;
  info.Values['artist'] := 'Don Robertson';
  info.Values['title'] := 'The Happy Whistler';
  Edit.Text := Substitute('%artist% - %title%', info);
  info.Free;
end;
Grüße vom marabu

Wishmaster 15. Jun 2008 10:30

Re: String Formatierung
 
Hi

die Lösung ist auch nicht schlecht, allerdings ich möchte dem Benutzer die Möglichkeit geben die Parameter selbst einzutragen (tippen). Mit deiner Lösung wen du dich vertippst oder absichtlich etwas falsches einträgst (Beispiel: '%artist% - %title' oder '%artist% -' oder einfach irgendein Text ) stürzt das Programm ab.

Ich sehe nur eine einzige Lösung für deinen Code, ich muss dem Benutzer ne liste mit fertigen tags
%title% Zurverfügungstellen die er dann per Knopfdruck in eine liste einträgt/löscht und ich dann daraus einen fertigen string mache. Das oder dein Code muss verbessert werden, er miss den string nach Gültigkeit prüfen.


thx

marabu 15. Jun 2008 10:53

Re: String Formatierung
 
Hallo,

Zitat:

Zitat von Wishmaster
... die Lösung ist auch nicht schlecht ...

danke für dein freundliches Urteil.

Zitat:

Zitat von Wishmaster
... allerdings ich möchte dem Benutzer die Möglichkeit geben die Parameter selbst einzutragen (tippen). ...

Gerade deshalb dachte ich sofort an Namen statt Nummern - man tippt etwas mehr, aber muss nicht ständig überlegen, ob %3 Artist, Album oder Konfession des Produzenten ist.

Zitat:

Zitat von Wishmaster
... Mit deiner Lösung wen du dich vertippst oder absichtlich etwas falsches einträgst (Beispiel: '%artist% - %title' oder '%artist% -' oder einfach irgendein Text ) stürzt das Programm ab. ...

Da hast du recht, da habe ich geschludert. Ich verbessere das einfach mal im Beitrag #6.

Freundliche Grüße

Wishmaster 15. Jun 2008 13:30

Re: String Formatierung
 
Hi

Besser! wie es aussieht funzt es jetzt.

Besten dank für deine Hilfe!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 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