Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Text aus Memo parsen (https://www.delphipraxis.net/170266-text-aus-memo-parsen.html)

Adrenalin 8. Sep 2012 06:34

Text aus Memo parsen
 
Guten Morgen :)
Ich hab vorhin im Netz eine Frage gelesen die ich recht interessant finde, bin jetzt auch nicht der Delphiprogrammierer muss ich dazu sagen, aber das ganze hat mich auf eine Idee gebracht die ich selber nutzen bzw. gebrauchen könnte.

Es geht dabei grob gesagt um folgendes:

Man hat ein Memo in dem man eine Art Ordner und Dateistruktur eingibt, welche dann per klick auf einen Button erstellt wird.

Erstmal nichts wildes dachte ich soweit, dann hab ich es mal selber probiert aber dabei kam eine ganze Menge murks raus.

Ich zeig mal welche Struktur das haben könnte:

Basis Pfad z.B. C:\users\Adrenalin\Desktop\Test

config.xml:enc
/skins
/data/defines.dat:blub
/temp
/app/styles/style.def:df

:enc ist ein Inhalt der aus z.B. einen anderen Memo auf der Form kommt und in die Datei config.xml geschrieben wird bei dessen Erstellung.
Das gleiche gilt für die Datei style.def

Nun sollte man nachdem man einen Button auf der Form geklickt hat folgende Struktur auf dem Desktop vorhanden sein:

[Inhalt Ordner Test]
config.xml
skins
data
|
=>defines.dat
temp
app
|
|=>styles
|====>style.def

Also was mir erheblich Kopfschmerzen bereitet ist das die Struktur ja beliebig anlegbar ist von den Ordnern her sowie welche Datei in welchen Ordner muss.

Da ich nicht viel mit Delphi mache hab ich mir dazu die Hilfe durchgelesen, mir vielen dann Sachen wie Pos, ForceDirectories und der gleiche ins Auge... Aber damit kam ich auch nicht wirklich weiter...

Dann hat jemand noch ein Beispiel dazu gepostet wie man es machen kann. Das Problem dabei ist das es wohl fehlerhaft war, da nur Dateien (mit viel Glück) aber keine Ordner erstellt werden, Jetzt sitz ich hier seit Stunden rum um bekomme einfach nicht heraus wie man das richtig machen kann, dass eben genau das was man im Memo definiert hat, auch so auf der Festplatte landet...

Hier mal der Code vom Posting vielleicht hat jemand Lust mal drüber zu sehen und findet ggf. den Fehler darin:

Delphi-Quellcode:
procedure ProcessLine(const BasePath : string; line: string);
var
   path, filename, data: string;
   colonPos: integer;
begin
   colonPos := pos(':', line);
   if colonPos > 0 then
   begin
      data := copy(line, colonPos + 1);
      delete(line, colonPos, MAXINT);
   end;
   line := TPath.Combine(BasePath, normalizePath(line));
   if ExtractFileExt(line) = '' then
      path := line
   else begin
      path := ExtractFilePath(line);
      filename := line;
   end;
   ForceDirectories(path); //ensure that the folder exists
   if filename <> '' then
      TFile.WriteAllText(filename, data);
end;
Wenn man obigen Code auf einen Button legt kommt folgendes dabei heraus was nicht wirklich richtig ist:

Basis Pfad enspricht: C:\Users\Adrenalin\Desktop\test
Ordner test wird erstellt.
Darin befindet sich die Datei config.xml

Das wars auch schon :roll:

Aufgerufen wurde das ganze über:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to Memo1.Lines.Count -1 do
  begin
    ProcessLine(Edit1.Text, Memo1.Lines.Strings[I]);
  end;
end;
Was ich jetzt daran nicht verstehe ist:
Wieso werden keine Ordner erstellt?
Woher oder wie programmiert man das ganze so, das auch die richtige Datei im richtigen Ordner landet?

Warum überhaupt so eine Struktur im Memo liegt hat der andere (finde Posting leider grad nicht)
gut erklart wenn jemand gar keine Ahnung hat wie CSV Dateien oder vergleichbares aufgebaut werden müssen, ist die Eingabe der Ordnerstruktur so wie sie da jetzt im Memo vorliegt relativ einfach zu verstehen, den Grund fand ich plausibel.

Viele Grüsse

Bummi 8. Sep 2012 07:40

AW: Text aus Memo parsen
 
Wenn Du mit dem Debugger durchsteppst siehst Du was in Line entsteht ...

So funktioniert es ...

Delphi-Quellcode:

Function LegalPath(const s:String):String;
begin
  Result := StringReplace(StringReplace(s,'/','\',[rfReplaceAll]),'\\','\',[rfReplaceAll]);
end;

procedure ProcessLine(const BasePath : string; line: string);
var
   path, filename, data: string;
   colonPos: integer;
begin
   colonPos := pos(':', line);
   if colonPos > 0 then
   begin
      data := copy(line, colonPos + 1);
      delete(line, colonPos, MAXINT);
   end;
   line := LegalPath(IncludeTrailingBackSlash(BasePath) + line);
   if ExtractFileExt(line) = '' then
      path := line
   else begin
      path := ExtractFilePath(line);
      filename := line;
   end;
   ForceDirectories(path); //ensure that the folder exists
   if filename <> '' then
      TFile.WriteAllText(filename, data);
end;

Adrenalin 8. Sep 2012 07:51

AW: Text aus Memo parsen
 
Zitat:

Zitat von Bummi (Beitrag 1182067)
Wenn Du mit dem Debugger durchsteppst siehst Du was in Line entsteht ...

So funktioniert es ...

Der Wahnsinn! Vielen Vielen Dank!!
Aber verstanden hab ich den Fehler immer noch nicht so ganz, in welcher Zeile war der denn versteckt?

Viele Grüsse

Bummi 8. Sep 2012 08:43

AW: Text aus Memo parsen
 
Delphi-Quellcode:
line := TPath.Combine(BasePath, normalizePath(line));
einfach mal mit den Debugger durchsteppen und Dir die Inhalte anzeigen lassen ...

Adrenalin 8. Sep 2012 08:46

AW: Text aus Memo parsen
 
Zitat:

Zitat von Bummi (Beitrag 1182072)
Delphi-Quellcode:
line := TPath.Combine(BasePath, normalizePath(line));
einfach mal mit den Debugger durchsteppen und Dir die Inhalte anzeigen lassen ...

Grad gemacht! Kein Wunder wieso das nicht klappte, dass sieht ja mal völlig entgegengesetzt zu dem aus was bei Dir nun drin steht...:oops:

Nochmals vielen Dank!


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