AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Ein Interfaced Object im TTabSet speichern?
Thema durchsuchen
Ansicht
Themen-Optionen

Ein Interfaced Object im TTabSet speichern?

Ein Thema von sunny-andy · begonnen am 20. Nov 2007 · letzter Beitrag vom 20. Nov 2007
Antwort Antwort
sunny-andy

Registriert seit: 11. Nov 2007
26 Beiträge
 
#1

Ein Interfaced Object im TTabSet speichern?

  Alt 20. Nov 2007, 16:36
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Ein Interfaced Object im TTabSet speichern?

  Alt 20. Nov 2007, 16:39
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Ein Interfaced Object im TTabSet speichern?

  Alt 20. Nov 2007, 16:45
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.
Andreas
  Mit Zitat antworten Zitat
sunny-andy

Registriert seit: 11. Nov 2007
26 Beiträge
 
#4

Re: Ein Interfaced Object im TTabSet speichern?

  Alt 20. Nov 2007, 16:56
Hallo, danke!

Die Fehlermeldung kommt leider immer noch..

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?
  Mit Zitat antworten Zitat
sunny-andy

Registriert seit: 11. Nov 2007
26 Beiträge
 
#5

Re: Ein Interfaced Object im TTabSet speichern?

  Alt 20. Nov 2007, 17:15
So,
ich habe das jetzt mit einer TInterfaceList gemacht und es funktioniert wunderbar

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?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Ein Interfaced Object im TTabSet speichern?

  Alt 20. Nov 2007, 18:18
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.
Andreas
  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 04:34 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