![]() |
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:
Wäre toll, wenn jemand einen Tipp hat!
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; Danke, Andy |
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.
|
Re: Ein Interfaced Object im TTabSet speichern?
Du musst die Referenzzählung "austricksen":
Delphi-Quellcode:
Wobei Bernhard mit seiner Warnung schon recht hat.
Fenster._AddRef; // <===
Tabs.AddObject(Fenster.GetBezeichnung, Pointer(Fenster)); 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. |
Re: Ein Interfaced Object im TTabSet speichern?
Hallo, danke!
Die Fehlermeldung kommt leider immer noch.. Zitat:
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? |
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? |
Re: Ein Interfaced Object im TTabSet speichern?
Zitat:
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