![]() |
TTreeView - Knoten umbenennen
Hallo,
ich habe folgendes kleines Problemchen: Ich habe aus einer Datenbank Adresse, Gebäude und Wohnung in eine TTreeView eingeladen. Das funktioniert auch ganz gut, doch ich würde gern die Unterknoten umbenennen. Da aber die Unterknoten auf die oberen Knoten aufbauen, erscheint immer eine EOLEException. Gibt es einen anderen Weg? Vorab schon mal Danke für alle Antworten!
Delphi-Quellcode:
var
aktGeb: Tgeb; aktNode: TTreeNode; ... aktNode:=TreeView1.items.addchild(node, inttostr(aktGeb.HNR)); TreeView1.items.addchild(aktNode, 'Dummy'); ...
Delphi-Quellcode:
Gibt es einen Weg?
var
aktGeb: Tgeb; aktNode: TTreeNode; ... aktNode:=TreeView1.items.addchild(node, 'Hausnummer: '+inttostr(aktGeb.HNR)); //schlägt fehl --> EOLEException: Datentypen in Kriterienausdruck unverträglich TreeView1.items.addchild(aktNode, 'Dummy'); ... Bisher sieht der Baum so aus (direkt mit Feldern der DB gefüllt): Strassen -ABC Straße --23 --25 ---eins ---zwei --27 -DEF Straße ... Optimal wäre folgendes Bild: Strassen -ABC Straße --Hausnummer 23 --Hausnummer 25 ---Wohnung eins ---Wohnung zwei ... |
Re: TTreeView - Knoten umbenennen
Herzlich willkommen in der Delphi-PRAXiS, regiontop.
Grundsätzlich ist es kein Problem einen Baumknoten umzubennen. Ich kann mir sehr gut vorstellen, dass die Fehlermeldung woanders produziert wird, auch wenn der Fehler scheinbar an der von dir angegebenen Stelle auftritt. Wichtig ist wo dein Code ausgeführt wird - in welchem event handler. Bei deinen Beispieldaten würde ich auf die redundanten Literale "Hausnummer" und "Wohnung" verzichten und entprechende Icons verwenden. Ist es von dir gewollt, dass keinerlei (sichtbare) Beziehung zwischen dem Knoten und dem zugehörigen Tabelleneintrag in der Datenbank besteht? Üblicherweise wird der Primärschlüssel in der Eigenschaft Data eines TreeNode mitgeführt. Freundliche Grüße vom marabu |
Re: TTreeView - Knoten umbenennen
Liste der Anhänge anzeigen (Anzahl: 1)
Also erstmal vielen Dank für die Antwort, ich werde mal den Quellcode posten, vielleicht läßt sich der Fehler so erkennen.
Wichtige Procedures meiner Hauptunit
Delphi-Quellcode:
Funktionen meiner Zweitunit
procedure TForm1.InitListView;
var AktStrasse : Tstrasse; AktNode: TTreeNode; begin TreeView1.Items.Clear; TreeView1.Items.Add(NIL,'Strassen'); while DataModule1.GetAdresse(AktStrasse) = TRUE do begin AktNode:= TreeView1.Items.AddChild(TreeView1.Items[0], AktStrasse.strassen); TreeView1.Items.AddChild(AktNode,'Dummy'); end; TreeView1.Items[0].Expand(False); end; procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean); var AktGeb: Tgeb; AktWoh: Twoh; AktNode: TTreeNode; begin if node.Parent <> nil then begin statusbar1.SimpleText:=node.Parent.Text; if node.Text <> 'Strassen' then node.DeleteChildren; if node.parent.Text = 'Strassen' then begin while DataModule1.GetGebaude(node.Text,AktGeb) = true do begin aktnode:=Treeview1.Items.AddChild(node , inttostr(aktgeb.HNR)); treeview1.items.AddChild(aktnode, 'Dummy'); end; end else begin aktgeb.GName:=node.Text; aktgeb.str.strassen:=node.Parent.Text; while datamodule1.GetWohnung(node.Text, aktwoh) = true do begin Treeview1.Items.AddChild(node, inttostr(aktwoh.ZI)); end; end; end; end;
Delphi-Quellcode:
In den ADOQuery's steht folgendes:
function TDataModule1.GetAdressePK (strasse: string): integer;
begin GetAdressePK:=-1; ADOQuery3.Parameters.ParamByName('Int').Value:=strasse; ADOQuery3.Open; if ADOQuery3.RecordCount <> 0 then GetAdressePK := ADOQuery3.FieldByName('EADR').AsInteger; ADOQuery3.Close; end; function TDataModule1.GetGebaudePK(HNR: string): integer; begin GetGebaudePK:=-1; ADOQuery6.Parameters.ParamByName('Ext').Value:=HNR; ADOQuery6.Open; if ADOQuery6.RecordCount <> 0 then GetGebaudePK:= ADOQuery6.FieldByName('EGID').AsInteger; ADOQuery6.Close; end; function TDataModule1.GetAdresse (var strasse: Tstrasse): Boolean; begin GetAdresse := TRUE; if ADOQuery1.Active = FALSE then ADOQuery1.Open; if ADOQuery1.Eof =false then begin with strasse do begin strassen:= ADOQuery1.FieldByName( 'strasse').AsString; end; ADOQuery1.Next; end else begin GetAdresse:= False; ADOQuery1.Close; end; end; function TDataModule1.GetGebaude (Strasse: String; var Geb: Tgeb): Boolean; var AdressePK: integer; begin GetGebaude:= true; AdressePK:= GetAdressePK(strasse); if AdressePK <> -1 then begin if ADOQuery2.Active = false then begin ADOQuery2.Parameters.ParamByName('GebPK').Value:= AdressePK; ADOQuery2.Open; end; if ADOQuery2.Eof = false then begin with Geb do begin EGID:=ADOQuery2.FieldByName( 'EGID').Asinteger; san:= ADOQuery2.FieldByName( 'san').AsString; HNR:= ADOQuery2.FieldByName( 'HNR').AsInteger; GName:=ADOQuery2.FieldByName( 'GName').AsString; HNRZ:= ADOQuery2.FieldByName( 'HNRZ').AsString; end; ADOQuery2.Next; end else begin GetGebaude:= false; ADOQuery2.Close; end; end else GetGebaude :=false; end; function TDataModule1.GetWohnung (HNR: string; var Woh: Twoh): Boolean; var GebaudePK: integer; begin GetWohnung:= true; GebaudePK:=GetGebaudePK(HNR); if GebaudePK <> -1 then begin if ADOQuery5.Active = false then begin ADOQuery5.Parameters.ParamByName('WohPK').Value:= GebaudePK; ADOQuery5.Open; end; if ADOQuery5.Eof = false then begin with Woh do begin EGID:=ADOQuery5.FieldByName( 'EGID').Asinteger; ZI:= ADOQuery5.FieldByName( 'Zimmerzahl').AsInteger; NA:= ADOQuery5.FieldByName( 'Nutzungsart').AsString; WName:= ADOQuery5.FieldByName( 'WName').AsString; end; ADOQuery5.Next; end else begin GetWohnung:= false; ADOQuery5.Close; end; end else GetWohnung:=false; end; ADOQuery1: Select * from Adresse order by strasse ADOQuery2: Select * from Gebaeude where EADR=: GebPK ADOQuery3: Select * from Adresse where strasse=: int ADOquery5: Select * from Wohnung where EGID=: WohPK ADOQuery6: Select * from Gebaeude where HNR=: ext |
Re: TTreeView - Knoten umbenennen
Hallo Andreas,
erst war es zuwenig Code, jetzt ist es zu viel für mich. Das meiste ist nicht relevant. Ich vermute den Fehler auch eher bei deinen Datenbank-Routinen. Vielleicht schaust du dir mal meine ![]() ![]() Grüße vom marabu |
Re: TTreeView - Knoten umbenennen
Das Beispiel hat mir schon viel geholfen.
Es tritt jedoch folgende Problem beim Ausführen der Anwendung auf: "Cannot perform this operation on a closed dataset" Dann springt Delphi im Quelltext zu "First;" Irgend ein Hinweis dazu? |
Re: TTreeView - Knoten umbenennen
Die Fehlermeldung ist ja unmissverständlich. Du kannst die Stelle im Quellcode lokalisieren indem du bei den Debugger-Optionen unter Sprach-Exceptions angibst, dass Delphi bei Fehlern anhalten soll. Wenn du dann deine Anwendung in der IDE startest, dann wirst du bei einer Exception an die relevante Stelle im Code geführt.
marabu |
Re: TTreeView - Knoten umbenennen
Vielen herzlichen Dank für die Hilfe.
Ich habe den Fehler gefunden: jede Query erst einmal auf "active" setzen und schon geht es. Sorry für meine nervigen Fragen... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 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 by Thomas Breitkreuz