![]() |
AW: proceduren (Events) aus Interface
Zitat:
Delphi-Quellcode:
einzubinden? Das Interface ist doch von
ISkinMagneticEx
Delphi-Quellcode:
abgeleitet und kennt somit alle Funktionen? Wo liegt hier der Vorteil bzw. wieso sollte man das so machen?
ISkinMagnetic
Wollte auch demnächst mit DLL Programmierung anfangen, bin da aber noch nicht so ganz firm drin. Interfaces funktionieren so einigermaßen mittlerweile. |
AW: proceduren (Events) aus Interface
Zitat:
Deshalb erkennt MagneticWnd die Funktion nicht mehr. müsste dann MagneticWnd : ISkinMagneticEx definiert werden. ISkinMagneticEx müsste dann alle geerbten Funktionen von ISkinMagnetic kennen. gruss |
AW: proceduren (Events) aus Interface
Also es geht ja wohl darum die implementation (DLL) und den Client sauber zu trennen.
Wir machen das im Prinzip so: (angepasst an Deine Interfaces) // Client Unit
Delphi-Quellcode:
unit uMagneticClient;
interface uses Windows; type ISkinMagnetic = interface ['{A00CB8B3-8433-4C58-9115-1845B29B3FF0}'] function GetSnapWidth: Integer; procedure SetSnapWidth(const Value: Integer); property SnapWidth: Integer read GetSnapWidth write SetSnapWidth; function AddMagneticWindow(Handle: HWND; hWndParent: HWND): Boolean; function RemoveMagneticWindow(Handle: HWND): Boolean; function SetFullWindowDrag(HWND: DWORD; ShowFullWindow: Boolean): Boolean; end; {$IFNDEF MAGNETICDLL} // Ist in den Projectoptionen der Dll definiert function SkinMagnetic : ISkinMagnetic; stdcall; external 'Magnetic.dll'; {$ENDIF} implementation end.
Delphi-Quellcode:
unit uMagneticDll;
interface uses windows, uMagneticClient; type ISkinMagneticEx = interface(ISkinMagnetic) ['{14454F11-1C26-4133-A46E-3271F5A9618B}'] function zSubclass_Proc(var Wnd: HWND; var Msg: UINT; var wParam: wParam; var lParam: lParam): LRESULT; end; implementation end.
Delphi-Quellcode:
unit uMagnetic;
interface uses Windows, // SysUtils, Messages, Classes, uMagneticClient, uMagneticDll; type TWND_INFO = record h_wnd: HWND; hWndParent: HWND; pOldWinProc: TFNWndProc; Glue: Boolean; end; TMagnetic = class(TInterfacedObject, ISkinMagnetic, ISkinMagneticEx) constructor Create; destructor Destroy; override; private FSnapWidth: Integer; m_uWndInfo: array of TWND_INFO; m_rcWnd: array of TRect; m_lWndCount: Integer; m_ptAnchor: TPOINT; m_ptOffset: TPOINT; m_ptCurr: TPOINT; m_ptLast: TPOINT; lOldSetting: Integer; function GetSnapWidth: Integer; procedure SetSnapWidth(const Value: Integer); procedure pvSizeRect(Handle: HWND; var rcWnd: TRect; lfEdge: Integer); procedure pvMoveRect(Handle: HWND; var rcWnd: TRect); procedure pvCheckGlueing; function pvWndsConnected(const rcWnd1, rcWnd2: TRect): Boolean; function pvWndGetInfoIndex(Handle: HWND): Integer; function pvWndParentGetInfoIndex(hWndParent: HWND): Integer; function zSubclass_Proc(var Wnd: HWND; var Msg: UINT; var wParam: wParam; var lParam: lParam): LRESULT; function getWND_INFO(aHandle: HWND; var Wnd_info: TWND_INFO): Boolean; public function AddMagneticWindow(Handle: HWND; hWndParent: HWND): Boolean; function RemoveMagneticWindow(Handle: HWND): Boolean; procedure CheckGlueing; property SnapWidth: Integer read GetSnapWidth write SetSnapWidth; function SetFullWindowDrag(HWND: DWORD; ShowFullWindow: Boolean): Boolean; end; function SkinMagnetic : ISkinMagnetic; stdcall; implementation var MagneticWnd: ISkinMagneticEx = nil; function SubFormWindowProc(Wnd: HWND; Msg: UINT; wParam: wParam; lParam: lParam): LRESULT; stdcall; begin result := MagneticWnd.zSubclass_Proc(Wnd, Msg, wParam, lParam); end; function SkinMagnetic : ISkinMagnetic; stdcall; begin if MagneticWnd = nil then MagneticWnd := TMagnetic.Create; result := MagneticWnd as ISkinMagnetic; end; initialization finalization MagneticWnd := nil; end. Die Dll:
Delphi-Quellcode:
library Magnetic;
uses uMagneticDll in 'uMagneticDll.pas', uMagnetic in 'uMagnetic.pas', uMagneticClient in 'uMagneticClient.pas'; {$R *.res} exports skinMagnetic; begin end. Benutzung dann Einfach mit z.b :
Delphi-Quellcode:
uses uMagneticClient;
SkinMagnetic.AddMagneticWindow(hWnd1, 0); Sollte so ohne Problem funktionieren Fritz |
AW: proceduren (Events) aus Interface
Danke @Fritzew
Werde es mir nachher mal anschauen muss jetzt ins Bett.. LOL Die ganze Nacht mit den Kram rumgeärgert. gruss |
AW: proceduren (Events) aus Interface
Zitat:
Delphi-Quellcode:
Fügt man IA in der Klasse hinzu, geht es. (Klar könnte man in dem Beispiel direkt zuweisen ohne as.)
type
IA = interface ['{8F0408FB-9757-45F0-9549-75A2751A7D0C}'] end; IB = interface(IA) ['{22475A3F-306B-4F66-9449-A6C0A4873C9E}'] end; TA = class(TInterfacedObject, IB) end; //... var TestA: IA; TestB: IB; begin TestB := TA.Create; TestA := TestB as IA; // Interface nicht unterstützt end; |
AW: proceduren (Events) aus Interface
Das ist eine Einschränkung auf Delphi Seite die mich auch schon "genervt" hat.
Was genau die technischen Hintergründe sind weis ich nicht. Aber man muss immer alle Interfaces in die implementierende Class einbinden. Fritz |
AW: proceduren (Events) aus Interface
Danke für eure Mühe aber auf der Basis kann ich das nicht verwenden.
TMagnetic ist keine eigenständige DLL sondern ein Modul von meiner SkinEngine.dll Und dort habe ich sie auf dies weise eingebunden.
Delphi-Quellcode:
Sollte ausreichend sein.
ISkinMagnetic = interface
['{A00CB8B3-8433-4C58-9115-1845B29B3FF0}'] function GetSnapWidth: Integer; procedure SetSnapWidth(const Value: Integer); property SnapWidth: Integer read GetSnapWidth write SetSnapWidth; function AddMagneticWindow(Handle: HWND; hWndParent: HWND): Boolean; function RemoveMagneticWindow(Handle: HWND): Boolean; function SetFullWindowDrag(HWND: DWORD; ShowFullWindow: Boolean): Boolean; end; gruss |
AW: proceduren (Events) aus Interface
Danke @Fritzew
Habe es auf deine weise umgesetzt und funktioniert ganz gut. Ist aber etwas ungewohnt da die Classe in der TMagnetic selbst erstellt wird. Aber gut.. solange es geht. ;) gruss |
AW: proceduren (Events) aus Interface
Es wäre noch anzumerken, dass in anderen Sprachen, wie bspw. C++, die Definition von der Erzeuger-Funktion SkinMagnetic Probleme verursachen kann.
Das heißt, diese Funktion...
Delphi-Quellcode:
...besser umändern zu:
function SkinMagnetic : ISkinMagnetic; stdcall;
begin if MagneticWnd = nil then MagneticWnd := TMagnetic.Create; result := MagneticWnd as ISkinMagnetic; end;
Delphi-Quellcode:
function SkinMagnetic(out ASkinMagnetic: ISkinMagnetic): HRESULT; stdcall;
begin Result := S_FALSE; try if MagneticWnd = nil then MagneticWnd := TMagnetic.Create; ASkinMagnetic := MagneticWnd as ISkinMagnetic; if Assigned(ASkinMagnetic) then begin Result := S_OK; end; except on E: Exception do Result := E_NOINTERFACE; end; end; |
AW: proceduren (Events) aus Interface
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 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