AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TInterfacedObject Subclass

Ein Thema von EWeiss · begonnen am 11. Mär 2011 · letzter Beitrag vom 13. Mär 2011
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

TInterfacedObject Subclass

  Alt 11. Mär 2011, 06:25
Seit ich meine Listbox auf Interface umgestellt habe kann ich die Listbox nicht mehr subclassen.

Gibt es eine andere möglichkeit TObject auf ein Interface umzulegen?

Neu..
Delphi-Quellcode:
  ISkinListBox = interface
    ['{38EF3B4F-86A1-45D0-A7F3-4E45E125979D}']
    function GetHandle: hWnd;
    property Handle: hWnd read GetHandle;
    procedure SetFont(nPointSize: Integer; FontName: PAnsiChar; AktForecolor: COLORREF;
      InAktForecolor: COLORREF; Shadow: Boolean; SOffset: Integer; ShadowColor: COLORREF);
  end;

  TSkinListBox = class(TInterfacedObject, ISkinListBox)
vorher..
TSkinListBox = class(TObject)
Delphi-Quellcode:
procedure TSkinListBox.SubClass(WinHandle: HWND);
var
  Method: TMethod;
begin
  Method.Code := @TSkinListBox.ListBoxProc;
  Method.Data := Self;
  FEnumProcInst := MakeProcInstance(Method);

  PrevWndProc := SetWindowLong(WinHandle, GWL_WNDPROC, integer(@WndProc));
  PrevWndProcLB := SetWindowLong(Handle, GWL_WNDPROC, integer(FEnumProcInst));

end;

Vorher einwandfrei Funktioniert.



gruss
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TInterfacedObject Subclass

  Alt 11. Mär 2011, 07:31
Zitat:
Seit ich meine Listbox auf Interface umgestellt habe kann ich die Listbox nicht mehr subclassen.
Wie äussert sich das? Fehlermeldung?
Markus Kinzler
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: TInterfacedObject Subclass

  Alt 11. Mär 2011, 08:05
Zitat:
Seit ich meine Listbox auf Interface umgestellt habe kann ich die Listbox nicht mehr subclassen.
Wie äussert sich das? Fehlermeldung?
Außer der Meldung Access violation kommt da leider nichts..
Es kracht auf jedenfall in der Winproc.

Kann aber ohne probleme compilieren.
Die Listbox befindet sich in einer DLL und wird von außen aufgerufen.

Delphi-Quellcode:
    InstrumentList := CTRL_ListBoxCreate(hMain, PAnsiChar(SKAERO_FOLDER + 'Sound.png'),
      145, 62, 610, 268, ID_INSTRUMENTLIST, True, 18, SKAERO_INACTIVECAPTION);
    SKAERO_SetAnchorMode(InstrumentList.Handle, ANCHOR_RIGHT);
    SKAERO_SetZorder(InstrumentList.Handle, ANCHOR_RIGHT);
    InstrumentList.SetFont(SKAERO_CAPTIONFONTHEIGHT, PAnsiChar(SKAERO_TEXTFONT),
      SKAERO_ACTIVECAPTION, SKAERO_INACTIVECAPTION, TRUE, 2, 0);

Rückgabe der Winproc
  Result := CallWindowProc(Pointer(PrevWndProcLB), WinHandle, Msg, wP, lP);

gruss

Geändert von EWeiss (11. Mär 2011 um 08:09 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#4

AW: TInterfacedObject Subclass

  Alt 11. Mär 2011, 09:04
Alle Variablen auf ISkinListBox umgestellt?
Ist sichergestellt, das es nirgends im Programm eine Variable gibt, die direkt auf das Objekt "TSkinListBox" verweist?
Existiert mindestens eine Interfacevariable, die das verwendete Objekt TSkinListBox referenziert, so lange wie das geskinnte Objekt existiert?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: TInterfacedObject Subclass

  Alt 11. Mär 2011, 09:47
Warum nicht so?
TSkinListBox = class(TListBox, ISkinListBox);
In der Klasse TComponent sind die Methoden _AddRef, _Release und QueryInterface schon implementiert.
Deshalb kann man Komponenten und Controls als Basisklasse verwenden und damit weitere Interfaces implementieren.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: TInterfacedObject Subclass

  Alt 11. Mär 2011, 09:51
Zitat:
Alle Variablen auf ISkinListBox umgestellt?
Wenn du mir sagen könntest was alles für Variablen ..
Also die ich definiert habe im ISkinListBox Interface selbst ja .. Zumindest meldet der Compiler da keine Fehler.

Zitat:
Ist sichergestellt, das es nirgends im Programm eine Variable gibt, die direkt auf das Objekt "TSkinListBox" verweist?
Doch eine die hat aber keine Funktion mehr gehabt wurde also nicht mehr aufgerufen.

TMPlayList: TSkinListBox;
Zitat:
Existiert mindestens eine Interfacevariable, die das verwendete Objekt TSkinListBox referenziert, so lange wie das geskinnte Objekt existiert?
InstrumentList.Handle

Welches beim erstellen der ListBox zurückgegeben wird.

Ich habe aber bemerkt das die ListBox kurz nach dem erstellen wieder zerstört wird
Delphi-Quellcode:
destructor TSkinListBox.Destroy;
begin
  UnSubClass(FHOwner);

  inherited Destroy;
end;
Obwohl ich diese selber nicht beende.


Beim beenden.
error: to many consecutive exceptions.
Aber welche meldet er nicht.
Denke das hat damit zu tun das die ListBox schon zerstört wurde.

er springt dann in

Delphi-Quellcode:
001D3D32 8B08 mov ecx,[eax]
001D3D34 FF51FC call dword ptr [ecx-$04]
001D3D37 C3 ret
TObject.InitInstance:
001D3D38 53 push ebx
sagt mir aber ehrlich gesagt nicht viel!


gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: TInterfacedObject Subclass

  Alt 11. Mär 2011, 09:52
Warum nicht so?
TSkinListBox = class(TListBox, ISkinListBox);
In der Klasse TComponent sind die Methoden _AddRef, _Release und QueryInterface schon implementiert.
Deshalb kann man Komponenten und Controls als Basisklasse verwenden und damit weitere Interfaces implementieren.
Weil es eine Nonvcl ListBox mit OwnerDraw ist.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: TInterfacedObject Subclass

  Alt 11. Mär 2011, 10:01
Weil es eine Nonvcl ListBox mit OwnerDraw ist.
Ach ja, stimmt ja; IMHO eine totale Zeitverschwendung.
Aber jeder soll seine eigenen Erfahrungen machen...
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: TInterfacedObject Subclass

  Alt 11. Mär 2011, 10:07
Weil es eine Nonvcl ListBox mit OwnerDraw ist.
Ach ja, stimmt ja; IMHO eine totale Zeitverschwendung.
Aber jeder soll seine eigenen Erfahrungen machen...
OT:
Um ein Controll vernünftig zu Überzeichen kommt man da nicht drumherum.
Und ob es eine Zeitverschwendung ist ?
Für mich nicht!

Und Erfahrungen habe ich gute gemacht.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: TInterfacedObject Subclass

  Alt 11. Mär 2011, 12:23
Auch wenn es eine blöde frage zu sein scheint.
aber wie komme ich an die WinProc der Hauptanwendung?

Denke das ich das problem erkannt habe.
ich muss die Winproc der Anwendung subclassen nicht meine eigene.

PrevWndProc := SetWindowLong(WinHandle, GWL_WNDPROC, integer(@WndProc));

anstelle von
PrevWndProc := SetWindowLong(WinHandle, GWL_WNDPROC, integer(@TSkinListBox.ListBoxProc));

Aber ich habe die Vermutung ... Gar nicht!

gruss
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:24 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