![]() |
TWinControl via TInterfacedObject via TInterfacedPersistent
Meine Classe
Aktuell..
Delphi-Quellcode:
Ich verwende keine WinControls daher frage ich mich was besser wäre das Aktuelle oder diese hier.
TOnSessionStateEvent = procedure(Sender: TCustomAudioVolume; NewState: integer) of object;
TCustomAudioVolume = class(TWinControl) // end; TAudioVolume = class(TCustomAudioVolume, IAudioSessionEvents, IMMNotificationClient, IAudioSessionNotification, IAudioEndpointVolumeCallback) begin // .. Inhalt jetzt egal end TInterfacedObject..
Delphi-Quellcode:
TInterfacedPersistent..
TOnSessionStateEvent = procedure(Sender: TObject; NewState: integer) of object;
TAudioVolume = class(TInterfacedObject, IAudioSessionEvents, IMMNotificationClient, IAudioSessionNotification, IAudioEndpointVolumeCallback)
Delphi-Quellcode:
welche vor bzw.. Nachteile würden sich dadurch ergeben?
TOnSessionStateEvent = procedure(Sender: TPersistent; NewState: integer) of object;
TAudioVolume = class(TInterfacedPersistent, IAudioSessionEvents, IMMNotificationClient, IAudioSessionNotification, IAudioEndpointVolumeCallback) wie sieht das dann mit create, inherited und Konsorte aus. Ja bei TObject, TPersistent müsste ich Create ändern nur welche gesamt Auswirkung hätten diese Änderungen und sind sie sinnvoll.
Delphi-Quellcode:
public
constructor Create; reintroduce;
Delphi-Quellcode:
constructor TAudioVolume.Create();
inherited Create(); gruss |
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Wenn du TWinControl nicht brauchst, macht es auch keinen Sinn davon abzuleiten.
Wenn du Interfaces benutzt, dann am besten richtig mit Referenzzählung, sprich mit TInterfacedObject. Und auch so, dass du nur über Interfaces mit den Objekten arbeitest und nie über Objektreferenzen. Denn nur so kannst du ausschließen, dass die Referenzzählung das Objekt freigibt, du aber noch eine Objektreferenz offen hast oder umgekehrt. TInterfacedPersistent macht dabei keinen Sinn, denn es schaltet die Referenzzählung aus bzw. implementiert diese nicht. |
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Ich dachte eigentlich es hätte irgendwelche Vorteile.
Bisher kann ich keinen erkennen bei deiner Aussage. Eher Nachteile falls jemand diese Klasse später mit WinControls nutzen möchte. Vielleicht dann lieber gar nichts ändern. Danke. gruss |
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Zitat:
Wenn ich tmpAudioVolume.Free aufrufe dann kracht es mit invalid Pointer weil noch 3 refcounter offen sind. (TInterfacedObject) Habe es nur testweise mal versucht. gruss |
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Ich denke, ich würde hier komplett anders vorgehen. Deine Komponente
Delphi-Quellcode:
muss die Interfaces
TAudioVolume
Delphi-Quellcode:
doch gar nicht öffentlich implementieren. Du könntest dafür eine weitere (private) Klasse in der gleichen Unit anlegen und Befehle von
IAudioSessionEvents, IMMNotificationClient, IAudioSessionNotification, IAudioEndpointVolumeCallback
Delphi-Quellcode:
an eine Instanz davon weiterleiten bzw. die Callbacks von der Instanz zur
TAudioVolume
Delphi-Quellcode:
Komponente. Also eine Art Proxy sozusagen. Von dem Proxy erstellt du dann pro
TAudioVolume
Delphi-Quellcode:
Instanz ebenfalls eine Instanz und gibst diese im Destructor frei (
TAudioVolume
Delphi-Quellcode:
besitzt also die Proxy Instanz).
TAudioVolume
Delphi-Quellcode:
selbst kannst du dann z.B. einfach von
TAudioVolume
Delphi-Quellcode:
ableiten.
TObject
|
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Zitat:
Wir sind davon abgekommen weil es nicht möglich war die Interface in OnSessionCreate und Konsorte mit PostMessage weiterzuleiten. Es ist auch keine Komponente sondern nur eine Klasse TAudioVolume. TObject habe ich versucht dann kracht es gewaltig invalid pointer ;) sagte ich schon. gruss |
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Zitat:
Extrahiere die wichtigsten Methoden von TAudioVolume in ein IAudioVolume und füge es deiner Klasse hinzu:
Delphi-Quellcode:
TAudioVolume = class(TInterfacedObject, IAudioVolume, IAudioSessionEvents, IMMNotificationClient, IAudioSessionNotification, IAudioEndpointVolumeCallback)
Delphi-Quellcode:
//Erzeugen in der Anwendung dann nur über:
var tmpAudioVolume: IAudioVolume; begin tmpAudioVolume := TAudioVolume.Create; ... end; |
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Zitat:
Ich denke werde es erst mal so belassen wie es ist. Ich muss die Kontrolle darüber haben das Object selbst freigeben zu können. Es war auch nur mal ein Test um zu sehen welche Auswirkungen das hat, haben könnte. Ich denke auch das der Mixer jetzt fertig ist das mit den kleinen Problem was die Session angeht liegt an der Audio Core selbst (Win7) die entläd diese manchmal nicht oder schickt kein Event. Ist der Grund warum ich jetzt doch über die Prozesse gehen muss. gruss |
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Zitat:
Delphi-Quellcode:
type
TOnSessionCreate = procedure(...) of Object; TAudioVolume = class(TObject) strict private FProxy: TAudioVolumeProxy; strict protected FOnSessionCreate: TOnSessionCreate; public property OnSessionCreate: TOnSessionCreate read FOnSessionCreate write FOnSessionCreate; ... TAudioVolumeProxy = class(TInterfacedObject, IAudioVolume, IAudioSessionEvents, IMMNotificationClient, IAudioSessionNotification, IAudioEndpointVolumeCallback) strict prviate FOwner: TAudioVolume; strict private procedure OnSessionCreate(...); ... constructor TAudioVolume.Create; begin inherited Create; FProxy := TAudioVolumeProxy.Create(Self); end; destructor TAudioVolume.Free; begin FProxy.Free; inherited Destroy; end; procedure TAudioVolumeProxy.OnSessionCreate(...) begin if Assigned(FOwner.FOnSessionCreate) then begin FOwner.FOnSessionCreate(...); end; end;
Delphi-Quellcode:
selbst hat hierbei praktisch gar keine eigene Funktionalität, sondern dient nur als Schnitstelle (Proxy sollte man vermutlich in Implementation oder sowas umbenennen).
TAudioVolume
|
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Zitat:
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 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