Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TreeView - Archiv erstellen (https://www.delphipraxis.net/98757-treeview-archiv-erstellen.html)

atgis 31. Aug 2007 19:44


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...
http://img251.imageshack.us/img251/5...tmapzs6.th.jpg

Delphi-Quellcode:
//Hauptpunkt erstellen
procedure TForm1.NeuerNode1Click(Sender: TObject);
begin
 TreeView1.Items.Add(NIL,('Neuer Hauptpunk'));

 //Ordner erstellen
 MkDir(ExtractFilePath(ParamStr(0))+'name');
end;
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...

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:
//Neuen Inhalt Speichern
procedure TForm1.Speichern1Click(Sender: TObject);
begin
   Memo.Lines.SaveToFile(ExtractFilePath(ParamStr(0))+'name');
end;
EDIT:
Delphi-Quellcode:
Memo.Lines.SaveToFile(ExtractFilePath(ParamStr(0))+'name');
Stimmt natürlich nicht! Ich will ja den Pfad von den erstellten Ordner haben...

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:
//Klicken auf Unterpunkt:
Memo.Lines.LoadFromFile(*****)
Kann mir Bitte jemand helfen?

IceTube 31. Aug 2007 20:21

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

atgis 31. Aug 2007 22:26

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:
//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;
Unterpunkte machen funktioniert auch so. Allerdings sollen hier keine Ordner, sondern eine TXT-Datei mit den Unterordnernamen erstellt werden...Das funktioniert noch nicht...

Delphi-Quellcode:
//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;
Bsp:
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:
//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;
So öffnet sich aber immer logischerweise ../Stamm/Vergaser/Vergaser.txt oder ../Stamm/Einstellungen1/Einstellungen1.txt oder ../Stamm/Zylinder/Zylinder.txt :(

Speichern des z.b. frisch bearbeiteten Memo-Feldes:

Delphi-Quellcode:
//Neuen Inhalt Speichern
procedure TForm1.Speichern1Click(Sender: TObject);
begin
   Memo.Lines.SaveToFile(ExtractFilePath(ParamStr(0)) + TreeView1.Selected.Text+'\'+TreeView1.Selected.Text+'.txt');
end;
Funktioniert bei den Hauptpunkten...da der Pfad vorhanden ist ../Stamm/Vergaser/Vergaser.txt
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!

bitsetter 31. Aug 2007 23:27

Re: TreeView - Archiv erstellen
 
Zitat:

Zitat von atgis

EDIT: Wie lösche ich ein Einzelnen Node? Ich kann nur mit TreeView.Items.Clear; alle löschen!

Hi,
Delphi-Quellcode:
TreeView.Selected.Delete
wäre eine andere Möglichkeit.
Oder anders gesagt, ein TTreeNode eines TTreeView besitzt die Eigenschaft Delete.

atgis 1. Sep 2007 12:21

Re: TreeView - Archiv erstellen
 
Ok Danke! Kann man den die Klicks auf Node und SubNode nicht irgendwie unterscheiden?

marabu 1. Sep 2007 12:43

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:
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;
Grüße vom marabu

atgis 1. Sep 2007 13:20

Re: TreeView - Archiv erstellen
 
Mh Ok Danke...hat mich auch scon weitergebracht...

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('Pfad nicht gefunden');
   1: Memo.Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) + TreeView1.Selected.Level[0]+'\'+TreeView1.Selected.Text+'.txt');
  end;
end;
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...

Wie geht das? :|

atgis 1. Sep 2007 14:14

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:
//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;
So nun kann ich den SubNode im jeweiligen Ordner als TXT anlegen:

Delphi-Quellcode:
//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;
Änderungen des Memo speichern funktioniert auch so:

Delphi-Quellcode:
//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;
Und das Laden der TXT beim Klick auf den jeweiligen SubNode:

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?

marabu 1. Sep 2007 15:00

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:
//Unterpunkt erstellen
procedure TForm1.Unterpunkt1Click(Sender: TObject);
begin
  //Maske für SubNodeNamen
  if Form3.ShowModal = mrOK then
  begin
    { ... }
  end;
end;
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.

Freundliche Grüße

atgis 1. Sep 2007 15:08

Re: TreeView - Archiv erstellen
 
Zitat:

Zitat von marabu
Und denke daran, dass du das Einfügen von Knoten auf Level 2ff unterbinden musst.

Ja genau richtig! Ich dachte es langt wenn ich es so mache:

Delphi-Quellcode:
//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;
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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:30 Uhr.
Seite 1 von 2  1 2      

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