![]() |
AW: proceduren (Events) aus Interface
Da würde ich eher dieses Tool nehmen:
![]() Das analysiert den Quelltext und merkt auch, wenn Methoden nur verschoben sind usw., zeigt an welche hinzugekommen und geändert sind usw. |
AW: proceduren (Events) aus Interface
Zitat:
Das war einer der gründe warum bei Mediaportal, als ich da noch mit gearbeitet habe, es strikte vorgaben gab bzg. Formatierung usw.. Zitat:
Aber der Integrierte UltraCompare von UltraEdit ist dafür für mich persönlich ausreichend. gruss |
AW: proceduren (Events) aus Interface
Zitat:
Die Beschränkung auf 80 Zeichen pro Zeile. Das haben wir auf 130 eingestellt. Ansonsten benutzen wir den Formatter fast auf Standard außer dass "Großschreibung von reservierten Wörtern und Direktiven" auf Kleinbuchstaben eingestellt ist. Wenn man da natürlich noch viel mehr nicht dem Standard entsprechend einstellt, bringt das ganze nicht mehr so viel, das stimmt. |
AW: proceduren (Events) aus Interface
so sieht die class jetzt aus.
Delphi-Quellcode:
Es war zwingend nötig die zSubclass_Proc in das Interface mit zu übernehmen.
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; function zSubclass_Proc(var Wnd: HWND; var Msg: UINT; var wParam: wParam; var lParam: lParam): LRESULT; end; TMagnetic = class(TInterfacedPersistent, ISkinMagnetic) 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; function AddWindow(Handle: HWND; hWndParent: HWND): Boolean; public function AddMagneticWindow(Handle: HWND; hWndParent: HWND): Boolean; function RemoveMagneticWindow(Handle: HWND): Boolean; property SnapWidth: Integer read GetSnapWidth write SetSnapWidth; function SetFullWindowDrag(HWND: DWORD; ShowFullWindow: Boolean): Boolean; end; var MagneticWnd: ISkinMagnetic; Ich habe diese aber an letzter stelle gesetzt so muss ich die in dem öffentlichen Interface nicht integrieren. Das sieht dann so aus.
Delphi-Quellcode:
Durch die Umlenkung der TSubClass_Proc sind zusätzliche messagen\events in Formen oder in NonVCl erstellten Fenstern nicht mehr nötig.
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
Wir machen das so, dass es ein internes Interface gibt, das von dem öffentlichen abgeleitet ist. So brauchen wir die öffentlichen Sachen nicht doppelt zu deklarieren.
(Öffentlich heißt bei uns im Pascal Skript verfügbar.) |
AW: proceduren (Events) aus Interface
Zitat:
Ich dachte mir nur solange ich die Reihenfolge einhalte und die zSubclass_Proc an unterster stelle ansiedele das ich sie dann nicht veröffentlichen muss. Es wäre etwas anderes wenn ich jetzt hingehen würde und diese über SetFullWindowDrag sezen würde. Dann müsste ich die veröffentlichen da sonst die Reihenfolge der Deklarationen im Interface nicht mehr stimmen. gruss |
AW: proceduren (Events) aus Interface
Ja, das funktioniert, basiert aber auf Voraussetzungen (Anordnung der Methoden) und erfordert für die Veröffentlichung andere Versionen der gleichen Datei (mit dem Interface).
Ein abgeleitetes Interface hingegen liegt in einer anderen Unit, macht es egal wie Methoden angeordnet sind und die Units werden syntaktisch beim Kompilieren geprüft ohne manuell danach modifiziert zu werden. Dadurch gibt es viel weniger Fehlerquellen und weniger Aufwand. Zudem hat das Vorgehen keine Nachteile, die mir einfallen würden, insofern... |
AW: proceduren (Events) aus Interface
Zitat:
So gebe ich den Leuten diese eine Unit wo alles vorhanden ist. Ja ist nicht so professionell wie bei dir aber solange es das tut was es soll ? Und fehlerfrei ist geht das noch. gruss |
AW: proceduren (Events) aus Interface
Zitat:
Der Unterschied ist, dass diese Unit in deinem Projekt normal eingebunden ist, mehr nicht. Dass beides funktioniert, ist klar, aber ich sehe eben keinen Vorteil an dem Mehraufwand. Bei uns würde das so aussehen. SDK-Unit:
Delphi-Quellcode:
Interne Unit:
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;
Delphi-Quellcode:
Die Interfaces haben so auch eindeutige GUIDs usw. und du weißt vor allem genau, dass die veröffentlichte Unit auch genau zu deinen internen Interfaces passt. Außerdem sparst du dir das Abgleichen der Deklarationen, wenn du etwas änderst bzw. hinzufügst.
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; // (die Klasse wäre bei uns lediglich in einer eigenen Unit) TMagnetic = class(TInterfacedPersistent, ISkinMagnetic, ISkinMagneticEx) ... |
AW: proceduren (Events) aus Interface
Ahhh jetzt hat es klick gemacht..
War mir auch nicht bekannt das man die Interface so verzweigen kann. Klasse Info ;) Und man braucht dafür 2 GUIDS unterschiedliche? Hmmmm... Zitat:
EDIT: Also ich habe das mal so gemacht wie von dir vorgeschlagen. (DLL seite)
Delphi-Quellcode:
Mit meiner vorher deklarierten Variable kann ich jetzt nicht mehr darauf zugreifen.
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; ISkinMagneticEx = interface(ISkinMagnetic) ['{7AFFBAB7-211A-4B02-9787-5A566607A8C7}'] function zSubclass_Proc(var Wnd: HWND; var Msg: UINT; var wParam: wParam; var lParam: lParam) : LRESULT; stdcall; end; TMagnetic = class(TInterfacedPersistent, ISkinMagnetic, ISkinMagneticEx) constructor Create; destructor Destroy; override;
Delphi-Quellcode:
MagneticWnd kennt diese Funktion dann nicht mehr.
function SubFormWindowProc(Wnd: HWND; Msg: UINT; wParam: wParam; lParam: lParam): LRESULT; stdcall;
begin result := MagneticWnd.zSubclass_Proc(Wnd, Msg, wParam, lParam); end; gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12: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