AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TTreeView - Knoten umbenennen

Ein Thema von regiontop · begonnen am 6. Jun 2006 · letzter Beitrag vom 7. Jun 2006
Antwort Antwort
regiontop

Registriert seit: 6. Jun 2006
8 Beiträge
 
#1

TTreeView - Knoten umbenennen

  Alt 6. Jun 2006, 16:45
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:
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');
...
Gibt es einen Weg?

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
...
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: TTreeView - Knoten umbenennen

  Alt 6. Jun 2006, 17:32
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
  Mit Zitat antworten Zitat
regiontop

Registriert seit: 6. Jun 2006
8 Beiträge
 
#3

Re: TTreeView - Knoten umbenennen

  Alt 7. Jun 2006, 08:16
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:
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 <> 'Strassenthen
   node.DeleteChildren;
   if node.parent.Text = 'Strassenthen
   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;
Funktionen meiner Zweitunit
Delphi-Quellcode:
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;
In den ADOQuery's steht folgendes:

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
Miniaturansicht angehängter Grafiken
screen_196.jpg  
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: TTreeView - Knoten umbenennen

  Alt 7. Jun 2006, 09:00
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 Demo im thread TreeView aus DB füllen an. Da zeige ich, wie du hierarchisch verknüpfte Daten in eine TreeView übernehmen kannst. Es sollten auch für dich ein paar Anregungen enthalten sein.

Grüße vom marabu
  Mit Zitat antworten Zitat
regiontop

Registriert seit: 6. Jun 2006
8 Beiträge
 
#5

Re: TTreeView - Knoten umbenennen

  Alt 7. Jun 2006, 10:58
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: TTreeView - Knoten umbenennen

  Alt 7. Jun 2006, 12:02
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
  Mit Zitat antworten Zitat
regiontop

Registriert seit: 6. Jun 2006
8 Beiträge
 
#7

Re: TTreeView - Knoten umbenennen

  Alt 7. Jun 2006, 14:00
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...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:32 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