![]() |
TreeView - Archiv erstellen
Hi,
Ich möchte gerne ein kleines Archiv anlegen. Dazu habe ich ein kleines Programm angefangen, was ein TreeView und eine Memo-Feld enthält. Ich möchte nun, wenn ich im TreeView einen neuen Hauptpunkt (Node) erstelle - automatisch einen neuen Ordner mit den Namen des Nodes (im Stammordner des Progs) haben... ![]() ![]()
Delphi-Quellcode:
Bloß wie lese ich aus, damit der Node-Name als Ordnername gespeichert wird? Im Bsp würden alle Ordner "name" heißen! Wie auf dem Bild soll es mir einen Ordner Vergaser und Zylinder anlegen...
//Hauptpunkt erstellen
procedure TForm1.NeuerNode1Click(Sender: TObject); begin TreeView1.Items.Add(NIL,('Neuer Hauptpunk')); //Ordner erstellen MkDir(ExtractFilePath(ParamStr(0))+'name'); end; Jetzt möchte ich eine Unterpunkt erstellen. Ein paar Eintragungen im Memo-Feld machen...und es soll nun eine TXT-Datei angelegt werden! Die soll den Namen des Unterpunktes haben und im jeweiligen Ordner gespeichert werden...
Delphi-Quellcode:
//Unterpunkt erstellen
procedure TForm1.Unterpunkt1Click(Sender: TObject); begin TreeView1.Items.AddChild(TreeView1.Selected,('Neuer Unterpunkt')); end;
Delphi-Quellcode:
EDIT:
//Neuen Inhalt Speichern
procedure TForm1.Speichern1Click(Sender: TObject); begin Memo.Lines.SaveToFile(ExtractFilePath(ParamStr(0))+'name'); end;
Delphi-Quellcode:
Stimmt natürlich nicht! Ich will ja den Pfad von den erstellten Ordner haben...
Memo.Lines.SaveToFile(ExtractFilePath(ParamStr(0))+'name');
Also z.B. Ich lege "Vergaser" an...automatisch wir im Stammordner ein Ordner namens "Vergaser" angelegt... Nun lege ich einen Unterpunkt "Einstellungen" an...mache meine Eintragung im Memo-Feld...dies soll nun als Einstellung.txt im Ordner Vergaser abgelegt werden! EDIT2: Beim navigieren durch das TreeView soll bei einen Klick auf einen Unterpunkt - der jeweilige Inhalt der TXT-Datei im Memo Feld geladen werden...da fehlt mir auch wieder der Pfad zur Datei :wall:
Delphi-Quellcode:
Kann mir Bitte jemand helfen?
//Klicken auf Unterpunkt:
Memo.Lines.LoadFromFile(*****) |
Re: TreeView - Archiv erstellen
Hallo,
falls ich dich richtig verstanden habe müsste es so gehen:
Delphi-Quellcode:
//Hauptpunkt erstellen procedure TForm1.NeuerNode1Click(Sender: TObject); begin TreeView1.Items.Add(NIL,('Neuer Hauptpunkt')); //Das "T" vergessen ;) //Ordner erstellen MkDir(ExtractFilePath(ParamStr(0))+'name'); end; // So wird der Ordner erstellt! //Procedur vom Treeview --> NodeEdited var S:Text Node : TTreeNode; begin //Erstelle Ordner try if DirectoryExists(S) = false then MkDir(ExtractFilePath(ParamStr(0))+'\'+S); except Node.Delete; exit; end; end; //Unterpunkt erstellen procedure TForm1.Unterpunkt1Click(Sender: TObject); begin TreeView1.Items.AddChild(TreeView1.Selected,('Neuer Unterpunkt')); end; //Willst du die Memo mit einem Button speichern.... procedure Button1.onClick....(etc..) begin //Irgend ein Name vom Memo1 tXt try Memo1.Lines.SaveToFile(ExtractFilePath(ParamStr(0)) +'\'+ TreeView1.Seleted.Tex +'\'+'Memo1.TxT'); except //Existiert nicht exit; //Vom Unterpunkt - ich glaub das heißt TreeView.Selected.Item[0]....vielleicht aber auch //...Selected.Value[0]....musst probieren.... try Memo1.Lines.SaveToFile(ExtractFilePath(ParamStr(0)) +'\'+ TreeView1.Seleted.Text +'\'+TreeView1.Selected.Item[0].Text); except //Existiert nicht exit; end; end; //laden wenn man auf eine Node klickt procedure TreeView.onClick //etc begin try Memo1.Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) + TreeView1.Seleted.Text+'Memo1.TxT'); except //Nicht gefunden exit; end; end; So...ich hoffe ich hab dir geholfen! lg |
Re: TreeView - Archiv erstellen
Hi,
Ja Danke! Hat schon geholfen...Ich habs allerdings etwas anders gemacht. Das Hauptpunkt (und automatisch Ordner im Stamm) erstellen, hab ich mit einer neuen Form und einen Edit-Feld gelöst. Da gibt man dann einfach den Ordnernamen ein:
Delphi-Quellcode:
Unterpunkte machen funktioniert auch so. Allerdings sollen hier keine Ordner, sondern eine TXT-Datei mit den Unterordnernamen erstellt werden...Das funktioniert noch nicht...
//Hauptpunkt erstellen
procedure TForm1.NeuerNode1Click(Sender: TObject); begin //Maske für Ordnernamen Form3.showmodal; //Hauptpunkt erstellen TreeView1.Items.Add(NIL,Form3.edOrdnername.text); //Ordner erstellen MkDir(ExtractFilePath(ParamStr(0))+Form3.edOrdnername.text); end;
Delphi-Quellcode:
Bsp:
//Unterpunkt erstellen
procedure TForm1.Unterpunkt1Click(Sender: TObject); begin //Maske für Unterpunktnamen Form3.ShowModal; //Unterpunkt erstellen TreeView1.Items.AddChild(TreeView1.Selected,Form3.edOrdnername.text); //--->HIER *Form3.edOrdnername.text*+'.txt' im Hauptordner erstellen :stupid: end; Vergaser (Hauptpunkt und gleichzeitig Ordner) Einstellungen1 (soll automatisch als Einstellungen1.TXT im Ordner Vergaser angelegt werden) Einstellungen2 ( - || - ) Einstellungen3 ( - || - ) Zylinder Kolben ... Wenn ich jetzt auf Vergaser Klick soll sich am besten im Memo-Feld nichts tun. Erst wenn ich auf einen Sub-Node klicke soll sich das Memo-Feld mit ../Stamm/Vergaser/Einstellung1.txt u.s.w füllen. Bei Klick auf Kolben soll sich ../Stamm/Zylinder/Kolben.txt öffnen...
Delphi-Quellcode:
So öffnet sich aber immer logischerweise ../Stamm/Vergaser/Vergaser.txt oder ../Stamm/Einstellungen1/Einstellungen1.txt oder ../Stamm/Zylinder/Zylinder.txt :(
//Inhalt von TXT's in Memo Laden
procedure TForm1.TreeView1Click(Sender: TObject); begin Memo.Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) + TreeView1.Selected.Text+'\'+TreeView1.Selected.Text+'.txt'); end; Speichern des z.b. frisch bearbeiteten Memo-Feldes:
Delphi-Quellcode:
Funktioniert bei den Hauptpunkten...da der Pfad vorhanden ist ../Stamm/Vergaser/Vergaser.txt
//Neuen Inhalt Speichern
procedure TForm1.Speichern1Click(Sender: TObject); begin Memo.Lines.SaveToFile(ExtractFilePath(ParamStr(0)) + TreeView1.Selected.Text+'\'+TreeView1.Selected.Text+'.txt'); end; bei den Unterpunkt Einstellungen ->Eception^^<- da es den Pfad ../Stamm/Einstellungen1/Einstellungen1.txt benutzt, der aber nicht vorhanden ist... Er sollte eben ../Stamm/Vergaser/Einstellungen1.txt heißen...dann würde alles funzen EDIT: Wie lösche ich ein Einzelnen Node? Ich kann nur mit TreeView.Items.Clear; alle löschen! |
Re: TreeView - Archiv erstellen
Zitat:
Delphi-Quellcode:
wäre eine andere Möglichkeit.
TreeView.Selected.Delete
Oder anders gesagt, ein TTreeNode eines TTreeView besitzt die Eigenschaft Delete. |
Re: TreeView - Archiv erstellen
Ok Danke! Kann man den die Klicks auf Node und SubNode nicht irgendwie unterscheiden?
|
Re: TreeView - Archiv erstellen
Hallo,
wenn du dir in der Delphi Online Hilfe die Klasse TTreeNode anschaust, dann findest du die Eigenschaft "Level". Die solltest du für deine Zwecke nutzen können.
Delphi-Quellcode:
Grüße vom marabu
procedure TDemoForm.TreeViewClick(Sender: TObject);
begin with Sender as TTreeView do case Selected.Level of 0: ChangeFolder(Selected.Text); 1: ChangeDocument(Selected.Text); end; end; |
Re: TreeView - Archiv erstellen
Mh Ok Danke...hat mich auch scon weitergebracht...
Delphi-Quellcode:
Doch hier "TreeView1.Selected.Level[0]" ... das funktioniert so nicht...ich brauch aber genau an der Stelle im Pfad den Namen vom Übergeordneten Node...also quasie Level 0...
//Inhalt von TXT's in Memo Laden
procedure TForm1.TreeView1Click(Sender: TObject); begin with Sender as TTreeView do case Selected.Level of 0: ShowMessage('Pfad nicht gefunden'); 1: Memo.Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) + TreeView1.Selected.Level[0]+'\'+TreeView1.Selected.Text+'.txt'); end; end; Wie geht das? :| |
Re: TreeView - Archiv erstellen
Ok Danke Leute ich habs :-D....Hab eine Funktion hier im Board gefunden...die den Namen des Nodes aussließt:
Delphi-Quellcode:
So nun kann ich den SubNode im jeweiligen Ordner als TXT anlegen:
//Funktion gibt bei Klick auf einen SubNode,
//den Namen des darüberliegenden Hauptpunktes aus function NodeText(node: TTreeNode; startLevel: integer; delimiter: char): string; begin if not Assigned(node) then Result := '' else if node.Level > startLevel then Result := NodeText(node.Parent, startLevel, delimiter) + delimiter + node.Text else if node.Level = startLevel then Result := node.Text else Result := '' end;
Delphi-Quellcode:
Änderungen des Memo speichern funktioniert auch so:
//Unterpunkt erstellen
procedure TForm1.Unterpunkt1Click(Sender: TObject); begin //Maske für SubNodeNamen Form3.ShowModal; //SubNode erstellen TreeView1.Items.AddChild(TreeView1.Selected,Form3.edOrdnername.text); try Memo.Lines.SaveToFile(ExtractFilePath(ParamStr(0))+NodeText(TreeView1.Selected, 0, '\')+'\'+Form3.edOrdnername.text+'.txt'); except ShowMessage('Weitere Verzweigung nicht möglich!'); end; end;
Delphi-Quellcode:
Und das Laden der TXT beim Klick auf den jeweiligen SubNode:
//Neuen Inhalt Speichern
procedure TForm1.Speichern1Click(Sender: TObject); begin try Memo.Lines.SaveToFile(ExtractFilePath(ParamStr(0)) +NodeText(TreeView1.Selected, 0, '\')+'.txt'); except ShowMessage('Pfad nicht gefunden'); end; end;
Delphi-Quellcode:
//Inhalt von TXT's in Memo Laden
procedure TForm1.TreeView1Click(Sender: TObject); begin with Sender as TTreeView do case Selected.Level of 0: ShowMessage(NodeText(TreeView1.Selected, 0, '\')+': Einstellung, Bedüsung,... etc'); 1: Memo.Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) +NodeText(TreeView1.Selected, 0, '\')+'.txt'); end; end; Ist es möglich beim umbenennen eines Nodes/SubNodes den Ordner/TXT-Datei auch gleichzeitig mit umzubenennen? |
Re: TreeView - Archiv erstellen
Hallo,
im Prinzip ja, das Ereignis OnEdited() von TTreeView gibt dir die nötigen Informationen. Der Knoten Node hat beim Eintritt in deine Eregnisbehandlung noch den alten Wert und in S wird dir der neue Text angeboten. Die Prozedur zum Umbenennen von Dateien und Verzeichnissen heißt RenameFile(). Übrigens solltest du bei ShowModal immer auch eine Abbruchmöglichkeit vorsehen:
Delphi-Quellcode:
Für deine Zwecke würde vielleicht auch InputQuery() oder InputBox() ausreichen. Und denke daran, dass du das Einfügen von Knoten auf Level 2ff unterbinden musst.
//Unterpunkt erstellen
procedure TForm1.Unterpunkt1Click(Sender: TObject); begin //Maske für SubNodeNamen if Form3.ShowModal = mrOK then begin { ... } end; end; Freundliche Grüße |
Re: TreeView - Archiv erstellen
Zitat:
Delphi-Quellcode:
Aber der Punkt wird ja trotzdem erstellt...dann kommt erst die Meldung...Wie unterbinde ich das am besten? Man müsste quasi, wenn man in einem Unterpunkt ist das Level[1] nicht zulassen...Oder?
//Unterpunkt erstellen
procedure TForm1.Unterpunkt1Click(Sender: TObject); begin //Maske für SubNodeNamen Form3.ShowModal; //SubNode erstellen TreeView1.Items.AddChild(TreeView1.Selected,Form3.edOrdnername.text); try Memo.Lines.SaveToFile(ExtractFilePath(ParamStr(0))+NodeText(TreeView1.Selected, 0, '\')+'\'+Form3.edOrdnername.text+'.txt'); except ShowMessage('Weitere Verzweigung nicht möglich!'); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 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