Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ein Interfaced Object im TTabSet speichern? (https://www.delphipraxis.net/103713-ein-interfaced-object-im-ttabset-speichern.html)

sunny-andy 20. Nov 2007 15:36


Ein Interfaced Object im TTabSet speichern?
 
Hallo,

ich möchte in einem TTabSet ein Objekt speichern mittels "AddObject". Mein Objekt ("Fenster") implementiert aber ein Interface (ITabSetWindow).
Direkt nach dem Hinzufügen hole ich in diesem Beispiel das Objekt wieder heraus mittels Supports, was aber leider nicht funktioniert.
Folgende Meldung kommt:
"Access violation at address ... Read of address..."

Ich schätze ich habe das Fenster-Objekt nicht richtig in der Liste gespeichert oder?

Delphi-Quellcode:
procedure TTabSetController.RegistriereFenster(Fenster: ITabSetWindow);
var
  selWindow : ITabSetWindow;
begin
  With FTabSet do
  begin
    Tabs.AddObject(Fenster.GetBezeichnung, Pointer(Fenster)); // Geht das eigentlich mit Pointer(..) ?
    Repaint;

    Supports(Tabs.Objects[0], ITabSetWindow, selWindow);  // Hier tritt der Fehler auf
    selWindow.DoAnything;    
  end;
end;
Wäre toll, wenn jemand einen Tipp hat!
Danke, Andy

Bernhard Geyer 20. Nov 2007 15:39

Re: Ein Interfaced Object im TTabSet speichern?
 
Mach das nicht: GUI-Controls mit einem Interface verwalten. Hier kommst du in Teufels küche bezüglich Referenzzählung und "hintenrum" freigeben über Parent-Control wenn dieser freigegeben wird.

shmia 20. Nov 2007 15:45

Re: Ein Interfaced Object im TTabSet speichern?
 
Du musst die Referenzzählung "austricksen":
Delphi-Quellcode:
Fenster._AddRef; // <===
Tabs.AddObject(Fenster.GetBezeichnung, Pointer(Fenster));
Wobei Bernhard mit seiner Warnung schon recht hat.
Du musst jetzt nämlich dafür sorgen, dass bevor das Control freigegeben wird,
die _Release Methode aufgerufen wird. Ansonsten Speicherleck.

Nachtrag:
du könntest deine Interface-Objekte in TInterfaceList speichern. Das ist sauber und sicher.

sunny-andy 20. Nov 2007 15:56

Re: Ein Interfaced Object im TTabSet speichern?
 
Hallo, danke!

Die Fehlermeldung kommt leider immer noch..

Zitat:

Zitat von shmia
du könntest deine Interface-Objekte in TInterfaceList speichern. Das ist sauber und sicher.

OK dann habe ich eine Liste von Interface-Objekten. Und wie stelle ich die Verbindung zu den Tabs her?
Wenn ich nun zum Beispiel ein Tab aus dem TabSet auswählen, dann soll er ja eine Methode in dem zugeordneten Interface-Objekt aufrufen. Also woher weiß der Tab, welches Objekt seins ist, wenn es nicht bei ihm konkret gespeichert ist?

sunny-andy 20. Nov 2007 16:15

Re: Ein Interfaced Object im TTabSet speichern?
 
So,
ich habe das jetzt mit einer TInterfaceList gemacht und es funktioniert wunderbar :thumb:

Ich habe das jetzt sehr unsauber gelöst, da dem i-ten Tab das i-te Interface in der Liste zugeordnet ist. Könnt ihr mir sagen, wie ich die Zuordnung zwischen Tab und Interface in der Liste besser machen kann?

shmia 20. Nov 2007 17:18

Re: Ein Interfaced Object im TTabSet speichern?
 
Zitat:

Zitat von sunny-andy
Ich habe das jetzt sehr unsauber gelöst, da dem i-ten Tab das i-te Interface in der Liste zugeordnet ist. Könnt ihr mir sagen, wie ich die Zuordnung zwischen Tab und Interface in der Liste besser machen kann?

Die Add-Methode von TInterfaceList gibt ja den Index in der Liste an.
Du könntest diesen Index jetzt im Property Tag des TTabSheet speichern.
Das funktioniert aber nur solange aus der Interfacelist nichts gelöscht wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:44 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