AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Fehler beim Programm beenden
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler beim Programm beenden

Ein Thema von Jens Hartmann · begonnen am 19. Okt 2015 · letzter Beitrag vom 15. Nov 2015
 
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#33

AW: Fehler beim Programm beenden

  Alt 6. Nov 2015, 20:35
So, nicht das noch einer glaubt, der Beitrag interresiert mich nicht mehr. Ich bin schon die ganze Woche dabei, das VST mit verschiedenen Tutorials mir in den Kopf zu arbeiten.

Das ganze ist auch mittlerweile Verständlicher für mich. Ich mache das ganze aktuell mit einem Record und auch ohne Fehlermeldung. Mein Verständnisproblem liegt allerdings aktuell trotzallem noch in der Datenhaltung.

Folgenden Aufbau möchte ich kurz darstellen:

Delphi-Quellcode:
//So sieht jetzt mein neuer Datenrecord aus
  type
    pVSTNodeData = ^rVSTNodeData;
    rVSTNodeData = record
      KundenName, ObjektName, AnlagenTyp, AnlagenBezeichnung : WideString;
      KundenNr, ObjektNr, AnlagenNr : Integer;
    end;

//Über folgende Funktion lade ich jetzt mein VST (Allerdings nur den ersten Root mit Daten und diesen setze ich im OnInit auf vsHASChildren)

procedure TfReportClient.LoadVST;
var
  pNode : PVirtualNode;
  i : Integer;
begin
  try
    try
      vstKunden.BeginUpdate;
      vstKunden.Clear;
      //Datenpfad Knoten erstellen
      pNode := vstKunden.AddChild(nil);
      //Kundendaten laden und zugehörige Knoten erstellen
      LoadCustomersData(pNode);
      //vst Fertigstellen
      vstKunden.EndUpdate;
      ExpandedRootNodes(vstKunden);
      vstKunden.SortTree(0,sdAscending,True);
    except
      //...
    end;
  finally
    //...
  end;
end;

procedure TfReportClient.LoadCustomersData(ANode : PVirtualNode);
var
  pNode : PVirtualNode;
  Daten : pVSTNodeData;
  i : Integer;
begin
  try
    try
      //Kundentabelle öffnen
      if DMMasterData.OpenCustomerQuery then
      begin
        //Ersten Datensatz wählen
        DMMasterData.qryCustomerData.First;
        //Schleife um alle Kunden zu durchlaufen und die Knoten für die Kunden zu erstellen.
        for i := 0 to DMMasterData.qryCustomerData.RecordCount -1 do
          begin

            //Kunden Knoten erstellen
            pNode := vstKunden.AddChild(ANode);

            //Daten zuweisen
            Daten := vstKunden.GetNodeData(pNode);
            Daten^.KundenName := DMMasterData.qryCustomerData.FieldByName('Kunden_Kundenname').AsString;
            Daten^.KundenNr := DMMasterData.qryCustomerData.FieldByName('Kunden_Kundennummer').AsInteger;

            //Nächsten Datensatz anwählen
            DMMasterData.qryCustomerData.Next;
          end;
      end;
    except

    end;
  finally
    //Datenbank wieder schliessen
  end;
end;

//Die einzelnen Nodes darauf vorbereiten, das Sie Childs haben
procedure TfReportClient.vstKundenInitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin
  case vstKunden.GetNodeLevel(Node) of
    1:
     begin
       vstKunden.CheckType[Node] := ctCheckBox;
       vstKunden.CheckState[Node] := csCheckedNormal;
       vstKunden.HasChildren[Node] := True;
     end;
    2:
     begin
       vstKunden.HasChildren[Node] := True;
     end;
    3:
     begin
       vstKunden.HasChildren[Node] := True;
     end;
  end;
end;

//Den Node für das Objekt und die zugehörigen Daten erstelle ich erst mit dem aufklappen (OnExpanding) des jeweiligen Node

procedure TfReportClient.vstKundenExpanding(Sender: TBaseVirtualTree;
  Node: PVirtualNode; var Allowed: Boolean);
var
  Daten : pVSTNodeData;
begin
  case vstKunden.GetNodeLevel(Node) of
    1:
     begin
       if Node.ChildCount = 0 then
         begin
           //Objektdaten laden und zugehörige Knoten erstellen
           Daten := vstKunden.GetNodeData(Node);
           LoadObjektData(Node, Daten^.KundenNr);
         end;
        //...
     end;
  end;
end;

//Objektnode erstellen und Daten laden
procedure TfReportClient.LoadObjektData(ANode : PVirtualNode; AInt : integer);
var
  i : Integer;
  pNode : PVirtualNode;
  Daten : pVSTNodeData;
begin
  try
    try
      //Objektedaten laden aus Objektdatenbank
      DMMasterData.qryObjectData.Parameters.ParamByName('Kundennummer').Value := AInt;
      if DMMasterData.OpenObjectQuery then
        begin
          //Ersten Datensatz wählen
          DMMasterData.qryObjectData.First;
          //Schleife um alle Objekte zu durchlaufen und die Knoten für die Objekte zu erstellen.
          for i := 0 to DMMasterData.qryObjectData.RecordCount -1 do
            begin
              //Objekt Knoten erstellen
              pNode := vstKunden.AddChild(ANode);
              //Daten zuweisen
              Daten := vstKunden.GetNodeData(pNode);
              Daten^.ObjektName := DMMasterData.qryObjectData.FieldByName('Objekt_Objektname').AsString;
              Daten^.ObjektNr := DMMasterData.qryObjectData.FieldByName('Objekt_Objektnummer').AsInteger;
              //Nächsten Datensatz anwählen
              DMMasterData.qryObjectData.Next;
            end;
        end;
    except

    end;
  finally
    DMMasterData.CloseObjectQuery;
  end;
end;
So, und jetzt stell ich mir die Frage. Das ganze funktioniert auch, allerdings, wenn ich ja die Daten des Objekts zuweisen, dann mache ich das ja wie folgt..

Delphi-Quellcode:
   Daten := vstKunden.GetNodeData(pNode);
   Daten^.ObjektName := DMMasterData.qryObjectData.FieldByName('Objekt_Objektname').AsString;
Würde ich jetzt diesen Record zu diesem Node abfragen...

Delphi-Quellcode:
  Daten := vstKunden.GetNodeData(pNode);
  ShowMessage(Daten^.Kundenname);
  ShowMeddage(Daten^.Objektname);
wird das Ergebniss immer

Kundenname = '';
Objektname = 'Ich bin der Objektname von pNode'

sein. Ist ja auch klar, weil der zeiger zum Kundennamen bzw. zum Datenrecord nicht vorhanden ist. Wie löst man sowas. Ist das so vorgesehen. Müsste ich hier wirklich mit...

Delphi-Quellcode:
  Daten := vstKunden.GetNodeData(pNode.Parent);
  ShowMessage(Daten^.Kundenname);
arbeiten?
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
 


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 14:08 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