AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TTreeView nach TVirtualStringTree umsetzen - Hilfe !!!
Thema durchsuchen
Ansicht
Themen-Optionen

TTreeView nach TVirtualStringTree umsetzen - Hilfe !!!

Ein Thema von karl der große · begonnen am 13. Mär 2005 · letzter Beitrag vom 17. Mär 2005
Antwort Antwort
Seite 2 von 2     12   
karl der große

Registriert seit: 4. Mär 2005
40 Beiträge
 
#11

Re: TTreeView nach TVirtualStringTree umsetzen - Hilfe !!!

  Alt 15. Mär 2005, 22:44
Vielen Dank!

Lern mit jedem Fehler mehr dazu.


Gruß Karl
  Mit Zitat antworten Zitat
karl der große

Registriert seit: 4. Mär 2005
40 Beiträge
 
#12

Re: TTreeView nach TVirtualStringTree umsetzen - Hilfe !!!

  Alt 15. Mär 2005, 23:18
So hab jetzt alles bei den entsprechenden Events eingetragen, aber kann mir einer sagen wo ich den Buildtree hinstelle.
Der steht bei mir noch irgenwo im Raum, dadurch dürfte es auch geschehen, dass ich nur ein weisses Viereck bekomme.

Danke für Eure Hilfe

Karl
  Mit Zitat antworten Zitat
karl der große

Registriert seit: 4. Mär 2005
40 Beiträge
 
#13

Re: TTreeView nach TVirtualStringTree umsetzen - Hilfe !!!

  Alt 15. Mär 2005, 23:49
Bin wieder einen Schritt weiter - hab das Buildtree in den Create des Formulars geändert, jetzt zeigt er mir immerhin schon was an,
leider das falsche. Er zeigt keine Daten, sondern nur bei jedem Eintrag das Wort Node an.

Wenn ich einen Knoten öffne, geht nichts mehr und wenn ich das Formular schliesse, das einzige was noch funktioniert, bringt er folgende Meldung:

Delphi-Quellcode:
Exception EAccessViolation in Modul Kalkulation.exe bei FFFFF008.
Zugriffsverletzung bei Adresse 00000008. Lesen von Adresse 00000008.
Bin ratlos, hat jemand eine Idee

Danke Karl
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#14

Re: TTreeView nach TVirtualStringTree umsetzen - Hilfe !!!

  Alt 15. Mär 2005, 23:52
Tutorial durchgucken. Wenn du das Prinzip nicht verstanden hast, helfen dir einzelne Problemlösungen nur soweit, bis du auf das nächste Problem stößt.
  Mit Zitat antworten Zitat
karl der große

Registriert seit: 4. Mär 2005
40 Beiträge
 
#15

Re: TTreeView nach TVirtualStringTree umsetzen - Hilfe !!!

  Alt 16. Mär 2005, 21:33
Es ist zum verzweifeln - hab jetzt alles durchgesehen, einen Tag Tutorial studiert, aber ich komm nicht drauf.

VST funktioniert eigentlich, nur zeigt er nicht die Daten an, sondern schlicht an jeder Stelle nur das Word Node. Die Struktur würde passen, d.h. die Anzahl der 'Nodes', die Knoten und die Anzahl der Childs je Knoten passt exakt zur Datenbank, nur hab ich folgendes Problem: Anstatt Anzeige der Daten das Wort 'Node' und wenn ich einen Knoten öffne, dann hängt sich das Prog auf.

Nochmals der akutelle Source

Delphi-Quellcode:
unit Hauptkalkulation;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, DB, ADODB, BetterADODataSet, jpeg, ExtCtrls, StdCtrls,
  Mask, DBCtrls, Grids, DBGrids, VirtualTrees;

type

  PTreeData = ^TTreeData;
  TTreeData = record
     FObject : TObject;
  end;

  TTreeDataClass = class
     private
        FKunde: string;
        FObjektnummer: string;
        FObjektbeschreibung: string;
     published
        property Kunde: string read FKunde write Fkunde;
        property Objektnummer: string read FObjektnummer write FObjektnummer;
        property Objektbeschreibung: string read FObjektbeschreibung write FObjektbeschreibung;
  end;

  TKalk = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Image1: TImage;
    ADO_kunden: TADOConnection;
    db_kunden: TBetterADODataSet;
    db_kundenNummer: TWideStringField;
    db_kundenUIDNummer: TWideStringField;
    db_kundenAnrede: TWideStringField;
    db_kundenAnrede2: TWideStringField;
    db_kundenGrad: TWideStringField;
    db_kundenVorname: TWideStringField;
    db_kundenNachname: TWideStringField;
    db_kundenName: TWideStringField;
    db_kundenBranche: TWideStringField;
    db_kundenBranche2: TWideStringField;
    db_kundenStrasse: TWideStringField;
    db_kundenLKZ: TWideStringField;
    db_kundenPLZ: TWideStringField;
    db_kundenOrt: TWideStringField;
    db_kundenTelefon: TWideStringField;
    db_kundenTelefon2: TWideStringField;
    db_kundenTelefax: TWideStringField;
    Kunden: TDataSource;
    Seitenwahl: TPageControl;
    Objektauswahl: TTabSheet;
    Kundendaten: TTabSheet;
    ADO_objektkunde: TADOConnection;
    ADO_objektarchitekt: TADOConnection;
    ADO_objektparameter: TADOConnection;
    ADO_Objektbetrag: TADOConnection;
    ADO_Objektverlauf: TADOConnection;
    db_objektkunde: TBetterADODataSet;
    db_objektarchitekt: TBetterADODataSet;
    db_objektparameter: TBetterADODataSet;
    db_objektbetrag: TBetterADODataSet;
    db_objektverlauf: TBetterADODataSet;
    Objektkunde: TDataSource;
    objektarchitekt: TDataSource;
    Objektparameter: TDataSource;
    Objektbetrag: TDataSource;
    Objektverlauf: TDataSource;
    db_objektkundeObjektnummer: TWideStringField;
    db_objektkundeKundennummer: TWideStringField;
    db_objektkundeObjektbeschreibung: TWideStringField;
    db_objektkundeAnrede: TWideStringField;
    db_objektkundeKunde: TWideStringField;
    db_objektkundeSuchname: TWideStringField;
    db_objektkundeBranche: TWideStringField;
    db_objektkundeBranche2: TWideStringField;
    db_objektkundeStrasse: TWideStringField;
    db_objektkundeOrt: TWideStringField;
    db_objektkundeTelefonnummer: TWideStringField;
    db_objektkundeTelefonnummer2: TWideStringField;
    db_objektkundeTelefaxnummer: TWideStringField;
    db_objektkundeHandynummer: TWideStringField;
    db_objektverlaufObjektnummer: TWideStringField;
    db_objektverlaufKundennummer: TWideStringField;
    db_objektverlaufArtdesObjektes: TWideStringField;
    db_objektverlaufArtdesObjektesNummer: TWideStringField;
    db_objektverlaufBezeichnung: TWideStringField;
    db_objektverlaufDatum: TDateTimeField;
    db_objektverlaufDateiablage: TWideStringField;
    db_objektkundeNummerbeschreibung: TWideStringField;
    db_kundenSuchname: TWideStringField;
    vst: TVirtualStringTree;
    function AddVSTObject(avst: TCustomVirtualStringTree; aNode: PVirtualNode;
       aObject: TObject): PVirtualNode;
    procedure vstFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
    procedure vstCompareNodes(Sender: TBaseVirtualTree; Node1,
      Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
    procedure vstHeaderClick(Sender: TVTHeader; Column: TColumnIndex;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex; TextType: TVSTTextType;
      var CellText: WideString);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }

end;

var
  Kalk: TKalk;

implementation

{$R *.dfm}

function Tkalk.AddVSTObject(avst: TCustomVirtualStringTree; aNode: PVirtualNode;
   aObject: TObject): PVirtualNode;
var
   Data: PTreeData;
begin
   Result := avst.Addchild(aNode);
   data := avst.GetNodeData(Result);
   avst.ValidateNode(Result, False);
   data^.FObject := aObject;
end;

procedure Tkalk.vstFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
   Data: PTreeData;
begin
   Data := vst.GetNodeData(Node);
   if not Assigned(Data) then
      exit;
   Data.FObject.Free;
end;


procedure TKalk.vstCompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
   Data1, Data2: PTreeData;
begin
   Data1 := Sender.GetNodeData(Node1);
   Data2 := Sender.GetNodeData(Node2);
   case Column of
      0:
         Result := CompareText(TtreeDataClass(Data1.FObject).FKunde,
            TtreeDataClass(Data2.FObject).FKunde);
      1:
         Result := CompareText(TTreeDataClass(Data1.FObject).FObjektnummer,
            TtreeDataClass(Data2.FObject).FObjektnummer);
      2:
         Result := CompareText(TTreeDataClass(Data1.FObject).FObjektbeschreibung,
            TtreeDataClass(Data2.FObject).FObjektbeschreibung);
   end;
end;

procedure TKalk.vstHeaderClick(Sender: TVTHeader; Column: TColumnIndex;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
   if Button = mbLeft then
   begin
      with Sender, TreeView do
      begin
         if SortColumn > NoColumn then
            Columns[SortColumn].Options := Columns[SortColumn].Options + [coParentColor];
         if Column = 0 then
            SortColumn := NoColumn
         else
         begin
            if (SortColumn = NoColumn) or (SortColumn <> Column) then
            begin
               SortColumn := Column;
               SortDirection := sdAscending;
            end
            else
               if SortDirection = sdAscending then
                  SortDirection := sdDescending
               else
                  SortDirection := sdAscending;
            Columns[SortColumn].Color := $F7F7F7;
            SortTree(SortColumn, SortDirection, False);
         end;
      end;
   end;
end;

procedure TKalk.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
   Data: PTreeData;
begin
   Data := Sender.GetNodeData(Node);
   if data.FObject <> nil then
   begin
      case Column of
         0:
            begin
               if Node.Parent = Sender.RootNode then
                  celltext := TTreeDataClass(Data.FObject).FKunde
               else
                  celltext := TTreeDataClass(Data.FObject).FKunde
            end;
         1:
            if Node.Parent = Sender.RootNode then
               celltext := ''
            else
               celltext := TTreeDataClass(Data.FObject).FObjektnummer;
         2:
            if Node.Parent = Sender.RootNode then
               celltext := ''
            else
               celltext := TTreeDataClass(Data.FObject).FObjektbeschreibung;
      end;
   end;
end;






procedure TKalk.FormCreate(Sender: TObject);
var
   TreeObject: TTreeDataClass;
   Wurzel: PVirtualNode;
   begin
      vst.BeginUpdate;
      vst.NodeDataSize := SizeOf(TTreeData);
      vst.DeleteChildren(vst.RootNode, true);
      TreeObject := TTreeDataClass.Create;
      while not db_kunden.Eof do
      begin
         TreeObject.Kunde := db_kunden.fieldByName('Name').AsString;
         Wurzel := AddVSTObject(VST, Nil, TreeObject);
         while not db_objektkunde.eof do
         begin
            TreeObject.Objektnummer := db_objektkunde.fieldbyName('Objektnummer').AsString;
            TreeObject.Objektbeschreibung := db_objektkunde.fieldbyName('Objektbeschreibung').AsString;
            addvstObject(vst, Wurzel, TreeObject);
            db_objektkunde.next;
         end;
         db_kunden.next;
      end;
end;

end.
Hoffentlich findet sich eine gute Seele, die sich meinem Problem annimmt und mir den entscheidenden Tip gibt.

Vielen, vielen Dank.

LG Karl
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#16

Re: TTreeView nach TVirtualStringTree umsetzen - Hilfe !!!

  Alt 17. Mär 2005, 02:38
Hast du das Tutorial auch nachgemacht?

Das Ereignis scheint auch korrekt vergeben zu sein. Hm. Probier mal, in der Ereignis-Prozedur für OnGetText lediglich
Delphi-Quellcode:
procedure TKalk.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
   Data: PTreeData;
begin
  CellText := 'Test';
{

  ... Restlichen Code auskommentieren

}

end;
Funktioniert das? Wenn ja, stimmt etwas mit dem Aufbau deiner Verzweigungen nicht (habs mir nicht genau durchgeschaut).

Grüße,
Mario
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#17

Re: TTreeView nach TVirtualStringTree umsetzen - Hilfe !!!

  Alt 17. Mär 2005, 07:40
Hallo,

versuche mal folgendes
Zitat von karl der große:
Code:
procedure TKalk.FormCreate(Sender: TObject);
var
   TreeObject: TTreeDataClass;
   Wurzel: PVirtualNode;
   begin
   ....  
     begin
       TreeObject.Objektnummer := db_objektkunde.fieldbyName('Objektnummer').AsString;
       TreeObject.Objektbeschreibung := db_objektkunde.fieldbyName('Objektbeschreibung').AsString;
       addvstObject(vst, Wurzel, TreeObject);
       db_objektkunde.next;
     end;
  db_kunden.next;
  end;
  vst.endupdate; /*hier dies hast Du vergessen*/
end;
Somit sollte es gehen, ansonsten sieht der Code auf den ersten Blick ganz gut aus. Ohne diese Zeile kommst Du bei OnGetText niemals an, somit erklärt sich auch warum da nur Node steht.
Gruß

Albi
  Mit Zitat antworten Zitat
karl der große

Registriert seit: 4. Mär 2005
40 Beiträge
 
#18

Re: TTreeView nach TVirtualStringTree umsetzen - Hilfe !!!

  Alt 17. Mär 2005, 18:52
Erst mal vielen Dank an Alle für Eure Mühen.

Also ich hab

vst.endupdate; eingefügt. Der Effekt ist, dass er sich im Prog nicht mehr aufhängt. Aber wenn ich das Programm schliesse kommt nach wie vor die Meldung:

Delphi-Quellcode:
Exception EAccessViolation in Modul Kalkulation.exe bei FFFFF008.
Zugriffsverletzung bei Adresse 00000008. Lesen von Adresse 00000008.
Ansonsten kann ich die Knoten öffnen, schliessen, nur als Bezeichnung ist immer noch Node da.

Hab dann versucht, den celltext auf

celltext := 'Test1' umzuändern.

Effekt keiner, das Wort Node ist nach wie vor an allen Knotenpunkten da.

Gruss Karl
  Mit Zitat antworten Zitat
karl der große

Registriert seit: 4. Mär 2005
40 Beiträge
 
#19

Re: TTreeView nach TVirtualStringTree umsetzen - Hilfe !!!

  Alt 17. Mär 2005, 21:34


Ich hab's.

Danke für Eure Hilfe!!!!!

Für alle die ein ähnliches Problem haben. Hier das, was ich falsch gemacht habe.

Also ich hab vergessen unter Header-Columns die Colums anzulegen.

Und das mit dem Fehler - hier der Code der funktioniert:

Delphi-Quellcode:
procedure TKalk.FormCreate(Sender: TObject);
var
   TreeObject: TTreeDataClass;
   Wurzel: PVirtualNode;
   begin
      vst.BeginUpdate;
      vst.NodeDataSize := SizeOf(TTreeData);
      vst.DeleteChildren(vst.RootNode, true);
      while not db_kunden.Eof do
      begin
         TreeObject := TTreeDataClass.Create;
         TreeObject.Kunde := db_kunden.fieldByName('Name').AsString;
         Wurzel := AddVSTObject(VST, Nil, TreeObject);
         while not db_objektkunde.eof do
         begin
            TreeObject := TTreeDataClass.Create;
            TreeObject.Objektnummer := db_objektkunde.fieldbyName('Objektnummer').AsString;
            TreeObject.Objektbeschreibung := db_objektkunde.fieldbyName('Objektbeschreibung').AsString;
            addvstObject(vst, Wurzel, TreeObject);
            db_objektkunde.next;
         end;
         db_kunden.next;
      end;
   vst.EndUpdate;
   end;

Vielen Dank für Eure Mühen - bis zum nächsten Problem.

Werde jetzt weitertüfteln.
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#20

Re: TTreeView nach TVirtualStringTree umsetzen - Hilfe !!!

  Alt 17. Mär 2005, 21:38
Tjaja, die Freuden und Leiden des Programmierers

  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 01:00 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