AGB  ·  Datenschutz  ·  Impressum  







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

VirtualTreeView: Es klappt nicht ganz

Ein Thema von JPSelter · begonnen am 31. Mai 2006 · letzter Beitrag vom 14. Jun 2006
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von JPSelter
JPSelter

Registriert seit: 24. Jan 2005
Ort: Attendorn/Sauerland
235 Beiträge
 
Turbo Delphi für Win32
 
#1

VirtualTreeView: Es klappt nicht ganz

  Alt 31. Mai 2006, 12:06
So, jetzt stosse ich an erste Probleme. Ich habe ein Objekt erzeugt und möchte es an den Baum anhängen. Da läuft er auch durch, aber am Ende (scheinbar bevor er den VTV anzeigen will) kommt eine EAccessViolation. Ich kann den Fehler leider nicht ganz zurückverfolgen, ich weiss nur, dass er aus der VTV Klasse kommt. Delphi bleibt in der Funktion TCustomVirtualStringTree.DoGetText stehen, aber auch nach 2-maligem Durchlauf von TBaseVirtualTree.WndProc. Hier erstmal mein bisheriger Code:

Objekt-Definition:
Delphi-Quellcode:
// Ebene 0: Sitzungsdaten
  TSessionObject = class
    private
      fdatum: integer;
      fsessiontyp: string;
      fprotokollant: string;
      fteilnehmer: string;
      fverteiler: string;
      fndatum: integer;
    published
      property datum: integer read fdatum write fdatum;
      property sessiontyp: string read fsessiontyp write fsessiontyp;
      property protokollant: string read fprotokollant write fprotokollant;
      property teilnehmer: string read fteilnehmer write fteilnehmer;
      property verteiler: string read fverteiler write fverteiler;
      property ndatum: integer read fndatum write fndatum;
  end;
Neues Objekt wird mit Daten versehen und an den Baum gehangen:
Delphi-Quellcode:
// insert new session
procedure insertSession();
var SessionObject: TSessionObject;
    datum, ndatum: integer;
begin
  Form1.VST1.NodeDataSize:=SizeOf(TTreeData);
  SessionObject:=TSessionObject.Create;
  try
    datum:=DateTimeToUnix(Form1.DateTimePicker1.Date);
    ndatum:=DateTimeToUnix(Form1.DateTimePicker2.Date);
    SessionObject.datum:=datum;
    SessionObject.sessiontyp:=Form1.ComboBox1.Text;
    SessionObject.protokollant:=Form1.Edit1.text;
    SessionObject.teilnehmer:=Form1.Edit2.Text;
    SessionObject.verteiler:=Form1.Edit3.Text;
    SessionObject.ndatum:=ndatum;
    AddVSTObject(Form1.VST1,nil,SessionObject);
  except
    SessionObject.Free;
  end;
end;
Die eigentliche Anhänge-Funktion:
Delphi-Quellcode:
// add new structure into VST
function AddVSTObject(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
  AObject: TObject): PVirtualNode;
var
  Data: PTreeData;
begin
  Result:=AVST.AddChild(ANode);
  AVST.ValidateNode(Result,False);
  Data:=AVST.GetNodeData(Result);
  Data^.FObject:=AObject;
end;
Er läuft da überall ohne Probleme durch, keine Fehlermeldungen, nur am Ende dieses EAccessViolation... vielleicht kennt sich da jemand genauer aus. Danke!
=JPSelter=

Visit www.ditonovia.de for our breathtaking movies: Herrin der Ringe (Fantasy 2005), Hemisphere (Science-Fiction 2004) & Braveknife (Parodie 2001) and more...
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#2

Re: VirtualTreeView: Es klappt nicht ganz

  Alt 31. Mai 2006, 12:24
probier mal

vst.addchild(nil, meinobj); später drauf zugreifen mit:

myobj:=TSessionObject(vst.getnodedate(node)^);
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: VirtualTreeView: Es klappt nicht ganz

  Alt 31. Mai 2006, 12:30
Die NodeDataSize Eigenschaft hast du aber schon auf die richtige Größe (SizeOf(TTreeData)) gesetzt?
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#4

Re: VirtualTreeView: Es klappt nicht ganz

  Alt 31. Mai 2006, 12:31
Zitat von JPSelter:
Delphi-Quellcode:
// add new structure into VST
function AddVSTObject(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
  AObject: TObject): PVirtualNode;
Ich denke es liegt an der Übergabe des Objektes. Probier doch mal das Ganze mit einem "const" vor "AObject". Dann sollte er das Objekt selbst bzw. eine Referenz darauf übergeben. (ich hoffe, ich verwechsel nicht schon wieder alles)
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von JPSelter
JPSelter

Registriert seit: 24. Jan 2005
Ort: Attendorn/Sauerland
235 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: VirtualTreeView: Es klappt nicht ganz

  Alt 31. Mai 2006, 12:34
Argh, hab den Fehler gefunden... hatte im Projekt noch Überbleibsel aus dem Tutorial drin, also so Sachen wie vstFreeNode und VSTGetText, die alle ohne Objekte arbeiteten... ach menno Exception ist nun weg. Dann bis zur nächsten Frage
=JPSelter=

Visit www.ditonovia.de for our breathtaking movies: Herrin der Ringe (Fantasy 2005), Hemisphere (Science-Fiction 2004) & Braveknife (Parodie 2001) and more...
  Mit Zitat antworten Zitat
Benutzerbild von JPSelter
JPSelter

Registriert seit: 24. Jan 2005
Ort: Attendorn/Sauerland
235 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: VirtualTreeView: Es klappt nicht ganz

  Alt 31. Mai 2006, 13:26
Weiter gehts

Ich habe noch nicht viel mit Pointern und Objekten programmiert. Ich will nun die Spalte korrekt beschriften und das Tutorial hat dazu diesen Code:

Delphi-Quellcode:
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: Integer; TextType: TVSTTextType; var Text: WideString);
var
  Data: PTreeData;
begin
  Data:=VST.GetNodeData(Node);

  case Column of
    0: Text := Data.FCaption;
    1: Text := Data.FColumn1;
  end;
end;
Leider ist das noch die Geschichte ohne Objekte und ich frage mich nun, wie ich die Eigenschaften meines Objektes ansprechen soll. Irgendwas mit

Data^.FObject...

oder so?
=JPSelter=

Visit www.ditonovia.de for our breathtaking movies: Herrin der Ringe (Fantasy 2005), Hemisphere (Science-Fiction 2004) & Braveknife (Parodie 2001) and more...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.078 Beiträge
 
Delphi 12 Athens
 
#7

Re: VirtualTreeView: Es klappt nicht ganz

  Alt 31. Mai 2006, 13:42
jupp, du mußt halt nur den DatenTyp ändern Data: PTreeData; ist ja ein Pointer auf 'nen Record und du brauchst Data: TSessionObject; ... eine ObjektVariable ist ja schon ein Pointer auf ein Objekt, also kannst du auch gleich dieses nutzen und mußt es nicht nochmal über 'nen Pointer ansprechen ^^

Und dann halt nur noch Data.FObject...
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von JPSelter
JPSelter

Registriert seit: 24. Jan 2005
Ort: Attendorn/Sauerland
235 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: VirtualTreeView: Es klappt nicht ganz

  Alt 31. Mai 2006, 13:46
Jepp, das klappt Danke!
=JPSelter=

Visit www.ditonovia.de for our breathtaking movies: Herrin der Ringe (Fantasy 2005), Hemisphere (Science-Fiction 2004) & Braveknife (Parodie 2001) and more...
  Mit Zitat antworten Zitat
Benutzerbild von JPSelter
JPSelter

Registriert seit: 24. Jan 2005
Ort: Attendorn/Sauerland
235 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: VirtualTreeView: Es klappt nicht ganz

  Alt 31. Mai 2006, 14:16
So, diesmal finde ich aber gar nichts zu diesem Thema: Ich will meinen Baum nun speichern. Das Tutorial behandelt aber nur das Speichern von Strings und Integer, nicht das Speichern von ganzen Objekten. Wie speichere ich da?
Ein Node kann bei mir 3 verschiedene Objekte beinhalten, die ich aber leicht über die Spalten-Nummer identifizieren kann. Ein Node hat also ein FObject, ich kann doch nicht das ganze Objekt speichern oder? Ich muss doch sicher noch IN das Objekt rein und alle Paramter einzeln speichern, oder gehts doch einfacher?
=JPSelter=

Visit www.ditonovia.de for our breathtaking movies: Herrin der Ringe (Fantasy 2005), Hemisphere (Science-Fiction 2004) & Braveknife (Parodie 2001) and more...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.078 Beiträge
 
Delphi 12 Athens
 
#10

Re: VirtualTreeView: Es klappt nicht ganz

  Alt 31. Mai 2006, 14:32
Im Grunde muß immer nur der DatenTyp angepasst werden. (abgesehn von den CompilerMagicSachen)
Delphi-Quellcode:
var Data: PString;
var Data: PInteger;
...

Wobei der String nicht dem Pointer übergeben wird (Strings und dynamische Arrays sind halt 'ne CompilerMagicSache), sondern der Pointer zum String gemacht wird und diesem dann erst der String gegeben wird (also andersrum).
Ein AnsiRING) hat ja eine Interne referenzzähling und wenn nur der Pöinter übergeben wird, dann wird der Referenzzähler nicht erhöht und somit kann der String eventuell vorzeigt freigegeben werden.

Wenn dem String z.B. erst in der Prozedur der Inhalt erzeugt/zugewiesen wurde und dann der String auch noch eine Lokale Variable ist, dann wird er ja am Prozedurende freigegeben.

Zitat:
String zuweisen >> Referenzzähler = 1
Pointer übergeben >> Referenzzähler immernoch 1
Prozedurende >> Referenzzähler = Referenzzähler - 1
wenn Referenzzähler = 0 >> string wird freigegeben
Code:
function AddVSTObject(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
  [b]AString: String[/b]): PVirtualNode;
begin
  Result:=AVST.AddChild(ANode);
  AVST.ValidateNode(Result,False);
  Data:=AVST.GetNodeData(Result);
  [b]PString(Data^.FObject)^ := AString;[/b]
end;
Und der Integer ... für den brauchste nichtma Speicher reservieren, da dieser ja genausogroß wie der Pointer ist:
Code:
function AddVSTObject(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
  [b]AInteger: Integer[/b]): PVirtualNode;
begin
  Result:=AVST.AddChild(ANode);
  AVST.ValidateNode(Result,False);
  Data:=AVST.GetNodeData(Result);
  [b]Data^.FObject := Pointer(AInteger);[/b]
end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 18:29 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