![]() |
AW: Pointer wirrwarr. Bitte um hilfe
Hallo,
das sind dann also Variablen deiner Klasse?
Delphi-Quellcode:
Wenn ja, brauchst du im Destructor gar nichts machen.
type
TeVCLqueryTable = class private FVST:TVirtualStringTree; FMySQL:TmySQLe; constructor TeVCLqueryTable.Create(const VST: TVirtualStringTree; const MySQL:TmySQLe); begin FVST := VST; FMySQL := MySQL; Gibst du das Objekt vielleicht aus Versehen 2mal frei? Heiko |
AW: Pointer wirrwarr. Bitte um hilfe
Ja, das sind variablen.
Nachfolgend das gesamte Interface
Delphi-Quellcode:
type
TsqlData = record Data: array of string; end; PsqlData = ^TsqlData; //Das war ein versuch. Wird nicht benutzt PmySQL = ^TmySQLe; Pvst = ^TVirtualStringTree; type TeVCLqueryTable = class private FVST:TVirtualStringTree; FMySQL:TmySQLe; FsearchMode:boolean; FsearchString:string; //FsqlData:array of string; procedure onGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); procedure onFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure onBeforeCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect); public constructor Create(const VST:TVirtualStringTree; const MySQL:TmySQLe); destructor Destroy; override; function Query(Query:string):integer; procedure FilterNodes(const Text : string); end; implementation ... Nein, das wird nicht zweimal freigegeben. Sieht so aus:
Delphi-Quellcode:
Mit .free gibts direkt eine exception.
procedure TForm6.Button1Click(Sender: TObject);
var table:TeVCLqueryTable; begin //VirtualStringTree1 liegt als Objekt zur Designzeit auf dem Form //mysql ist eine Variable der Klasse TForm6 und wird zum Programmstart erstellt. table := TeVCLqueryTable.create(VirtualStringTree1, mysql); table.Query('SELECT * FROM rechnung'); table.Free; end; Ohne gibts keine und es funktioniert. Auch bei mehrmaligem klicken. |
AW: Pointer wirrwarr. Bitte um hilfe
Ich glaube es liegt daran:
Delphi-Quellcode:
Ich weise dem VirtualStringTree ein paar Proceduren und Funktionen zu, welche sich innerhalb des Objekts befinden.
constructor TeVCLqueryTable.Create(const VST: TVirtualStringTree; const MySQL:TmySQLe);
begin FVST := VST; FMySQL := MySQL; //Hier weise ich Funktionen und Proceduren zu, welche sich innerhalb des Objekts befinden. FVST.OnGetText := onGetText; FVST.OnFreeNode := onFreeNode; FVST.OnBeforeCellPaint := onBeforeCellPaint; FsearchMode := false; //Optische einstellungen treffen! //FVST.Header.AutoSizeIndex := 0; //, hoVisible, hoColumnResize, hoHeaderClickAutoSort FVST.Header.Options := FVST.Header.Options + [hoAutoResize]; FVST.TreeOptions.PaintOptions := [toShowRoot, toThemeAware]; //FVST.TreeOptions.AutoOptions := [toAutoChangeScale]; FVST.TreeOptions.MiscOptions := [toFullRepaintOnResize]; end; Wie dumm auch ^^ Dann ist es klar, dass es nach dem Free nicht mehr geht. Nun muss ich mir was überlegen, wie man dies am besten löst, so dass der VirtualStringTree weiterhin seine Daten anzeigt. |
AW: Pointer wirrwarr. Bitte um hilfe
Hallo,
dann darfst du die Klasse nicht freigeben, oder setzt die Events vor der Freigabe auf nil. Heiko |
AW: Pointer wirrwarr. Bitte um hilfe
Danke für deine Antwort.
Leider benötigt VirtualStringTree die Events um korrekt zu funktionieren. Da ich mehrere VSTs auf dem Formular habe, müsste ich für jedes ein eigenes privates Objekt innerhalb meiner Form erstellen. Das erscheint mir sehr unschön. Ich sollte vielleicht lieber eine Klasse machen, welche von VirtualStringTree ableitet und diese um meine Funktionen ergänzt. Idealerweise, könnte ich diese dann zur Designzeit auf das Formular ziehen. Mal sehen, ob ich ein Tutorial finde, welches mir erklärt, wie ich eine Komponente erstllen kann... By the way, wie kann man ein grosses Projekt übersichtlich halten? Soll man funktionen zu bestimmten bereichen in eigene units auslagern und diese manuell dort hin kopiere? |
AW: Pointer wirrwarr. Bitte um hilfe
Hallo,
deine einzelnen Darstellungs-Klassen für die einzelnen VSTs nennt man Renderer. Jeder VST bekomme seine eigene Renderer-Klasse und solange der VST existiert, muss die Renderer-Klasse existieren. Pro Renderer-Klasse bietet sich eine eigene Datei (Unit) an. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 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