AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi TWinControl via TInterfacedObject via TInterfacedPersistent
Thema durchsuchen
Ansicht
Themen-Optionen

TWinControl via TInterfacedObject via TInterfacedPersistent

Ein Thema von EWeiss · begonnen am 3. Jun 2018 · letzter Beitrag vom 8. Jun 2018
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 4. Jun 2018, 08:55
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 6. Jun 2018, 22:58
Zitat:
TInterfacedPersistent macht dabei keinen Sinn, denn es schaltet die Referenzzählung aus bzw. implementiert diese nicht.
Aber nur damit funktioniert es gerade weil die Referenzzählung ausgeschaltet ist.
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

Geändert von EWeiss ( 6. Jun 2018 um 23:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 7. Jun 2018, 01:15
Ich denke, ich würde hier komplett anders vorgehen. Deine Komponente TAudioVolume muss die Interfaces IAudioSessionEvents, IMMNotificationClient, IAudioSessionNotification, IAudioEndpointVolumeCallback doch gar nicht öffentlich implementieren. Du könntest dafür eine weitere (private) Klasse in der gleichen Unit anlegen und Befehle von TAudioVolume an eine Instanz davon weiterleiten bzw. die Callbacks von der Instanz zur TAudioVolume Komponente. Also eine Art Proxy sozusagen. Von dem Proxy erstellt du dann pro TAudioVolume Instanz ebenfalls eine Instanz und gibst diese im Destructor frei (TAudioVolume besitzt also die Proxy Instanz). TAudioVolume selbst kannst du dann z.B. einfach von TObject ableiten.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 7. Jun 2018, 01:24
Zitat:
Du könntest dafür eine weitere (private) Klasse in der gleichen Unit anlegen und Befehle von TAudioVolume an eine Instanz davon weiterleiten bzw. die Callbacks von der Instanz zur TAudioVolume Komponente.
Das war die vorherige Version..
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

Geändert von EWeiss ( 7. Jun 2018 um 01:31 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 7. Jun 2018, 08:29
Zitat:
tmpAudioVolume.Free
Einfach nicht machen.
Extrahiere die wichtigsten Methoden von TAudioVolume in ein IAudioVolume und füge es deiner Klasse hinzu:

 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;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 7. Jun 2018, 08:49
Zitat:
tmpAudioVolume.Free
Einfach nicht machen.
Extrahiere die wichtigsten Methoden von TAudioVolume in ein IAudioVolume und füge es deiner Klasse hinzu:

 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;
Danke. Tigü

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

Geändert von EWeiss ( 7. Jun 2018 um 08:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 7. Jun 2018, 12:53
Wir sind davon abgekommen weil es nicht möglich war die Interface in OnSessionCreate und Konsorte mit PostMessage weiterzuleiten.
Denke mal du willst es jetzt eh nicht mehr ändern, aber mit "Weiterleiten" meinte ich im Grunde auch nur folgendes:
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;
TAudioVolume selbst hat hierbei praktisch gar keine eigene Funktionalität, sondern dient nur als Schnitstelle (Proxy sollte man vermutlich in Implementation oder sowas umbenennen).
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 7. Jun 2018, 13:06
Zitat:
Denke mal du willst es jetzt eh nicht mehr ändern, aber mit "Weiterleiten" meinte ich im Grunde auch nur folgendes:
Versuchen kann man es ja mal

gruss
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#9

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 7. Jun 2018, 13:21
@Zacherl

Mit der Anleitung kann man allerdings nur Schiffbruch erleiden, oder? Wo ist denn jetzt der Unterschied zu der vorherigen Situation?

- TAudioVolume erzeugen
- Über TAudioVolumeProxy eine Interface-Instanz weiterreichen
- TAudioVolume freigeben
- Es knallt, wenn die Interface-Instanz auf nil gesetzt wird.

Dieses Verhalten hatte der TE schon selber gebaut und auch noch mit viel weniger Code.

Wenn ich tmpAudioVolume.Free aufrufe dann kracht es mit invalid Pointer weil noch 3 refcounter offen sind. (TInterfacedObject)
Habe es nur testweise mal versucht.
  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 01:26 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