AGB  ·  Datenschutz  ·  Impressum  







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

Pointer wirrwarr. Bitte um hilfe

Ein Thema von hedie · begonnen am 4. Feb 2016 · letzter Beitrag vom 5. Feb 2016
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.662 Beiträge
 
Delphi 12 Athens
 
#1

AW: Pointer wirrwarr. Bitte um hilfe

  Alt 5. Feb 2016, 12:39
Ich wüsste auch nicht wo genau jetzt der Unterschied zwischen einem dynamischen Array und dem Record von Uwes Beispielcode sein soll. Es sind am Ende Variablen. Ich wäre echt dankbar, wenn mir jemand das erklären kann...
Der Unterschied ist rein semantisch. Die Speicherstruktur und der erzeugte Code sind wohl so gut wie identisch. Der Record-Ansatz erfordert halt keine Pointer-Dereferenzierung und ist später leichter zu erweitern, aber das muss hier ja nicht unbedingt ein Kriterium sein.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#2

AW: Pointer wirrwarr. Bitte um hilfe

  Alt 5. Feb 2016, 17:07
Vielen Dank für eure Hilfe.
Dies habe ich nun verstanden und es hat auch geklappt!

Nu habe ich gleich noch eine andere Frage zum selben Thema.

Ich habe bei mir in der hauptunit ein ObjektA erstellt, welches ich im private bereich deklariert habe.
Dieses erstelle ich beim öffnen der Anwendung.

Während der Laufzeit, möchte ich mit diesem ObjektA arbeiten.
Um mit diesem ObjektA arbeiten zu können, habe ich mir eine zweite Klasse geschrieben, welche die entsprechenden "bearbeitungs methoden" beinhaltet. Damit ich mit dieser Klasse arbeiten kann, muss ich davon ja auch ein ObjektB erstellen. Soweit so gut. Klappt auch.

Nun möchte ich bei einem Button click, das ObjektB, welches mir Hilft ObjektA zu bearbeiten, erstellen -> verwenden -> und wieder freigeben.

Hier gibts das Problem. Da ich bisher nicht ans freigeben gedacht habe, hab ich das erst jetzt bemerkt.

Ich übergebe ObjektB folgendes beim Create:

Delphi-Quellcode:
FVST:TVirtualStringTree;
FMySQL:TmySQLe;

constructor TeVCLqueryTable.Create(const VST: TVirtualStringTree; const MySQL:TmySQLe);
begin
  FVST := VST;
  FMySQL := MySQL;
...
Beim ObjectB.Free bekomme ich eine Exception.
Ich vermute mal, dass es dabei auch die übergebenen Objekte VST und MySQL freigegeben hat.
Dann wäre mir klar, dass es nicht mehr funktioniert!

Eigentlich möchte ich nur einen Pointer auf das ObjektA bzw. VST und MySQL damit ich mit diesen bereits existierenden Objekten innerhalb meines neuen Objektes arbeiten kann.

Nach dem Freigeben von ObjektB sollen die Objekte VST und MySQL weiterleben.


Könnte mir hier jemand weiterhelfen?

Vielen Dank
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Pointer wirrwarr. Bitte um hilfe

  Alt 5. Feb 2016, 17:10
Hallo,
wie sieht denn der Destructor der Klasse TeVCLqueryTable (also von ObjectB) aus, den Constructor sehe ich ja.


Heiko
Heiko

Geändert von hoika ( 5. Feb 2016 um 17:12 Uhr)
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#4

AW: Pointer wirrwarr. Bitte um hilfe

  Alt 5. Feb 2016, 17:12
Bisher sieht der so aus:

Delphi-Quellcode:
destructor TeVCLqueryTable.Destroy;
begin

  //FVST := nil;
  //FMySQL := nil;

  inherited;
end;
Wie du an den kommentaren siehst, war ich mir nicht ganz sicher... ^^
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Pointer wirrwarr. Bitte um hilfe

  Alt 5. Feb 2016, 17:14
Hallo,
das sind dann also Variablen deiner Klasse?


Delphi-Quellcode:
type
  TeVCLqueryTable = class
    private
      FVST:TVirtualStringTree;
      FMySQL:TmySQLe;


constructor TeVCLqueryTable.Create(const VST: TVirtualStringTree; const MySQL:TmySQLe);
begin
  FVST := VST;
  FMySQL := MySQL;
Wenn ja, brauchst du im Destructor gar nichts machen.

Gibst du das Objekt vielleicht aus Versehen 2mal frei?


Heiko
Heiko

Geändert von hoika ( 5. Feb 2016 um 17:17 Uhr)
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#6

AW: Pointer wirrwarr. Bitte um hilfe

  Alt 5. Feb 2016, 17:21
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:
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;
Mit .free gibts direkt eine exception.
Ohne gibts keine und es funktioniert.

Auch bei mehrmaligem klicken.
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#7

AW: Pointer wirrwarr. Bitte um hilfe

  Alt 5. Feb 2016, 17:29
Ich glaube es liegt daran:

Delphi-Quellcode:
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;
Ich weise dem VirtualStringTree ein paar Proceduren und Funktionen zu, welche sich innerhalb des Objekts befinden.
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.
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  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 16:16 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