Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi proceduren (Events) aus Interface (https://www.delphipraxis.net/190149-proceduren-events-aus-interface.html)

jaenicke 7. Sep 2016 11:09

AW: proceduren (Events) aus Interface
 
Da würde ich eher dieses Tool nehmen:
http://www.modelmakertools.com/struc...wer/index.html
Das analysiert den Quelltext und merkt auch, wenn Methoden nur verschoben sind usw., zeigt an welche hinzugekommen und geändert sind usw.

EWeiss 7. Sep 2016 11:38

AW: proceduren (Events) aus Interface
 
Zitat:

Einer der Gründe weshalb ich empfehle grundsätzlich die eigenen Units von Zeit zu Zeit durch den integrierten Formatter zu jagen.
Das Problem ist dabei nur das jeder sein eigenes Süppchen kochen will.
Das war einer der gründe warum bei Mediaportal, als ich da noch mit gearbeitet habe, es strikte vorgaben gab bzg. Formatierung usw..

Zitat:

Da würde ich eher dieses Tool nehmen:
Sieht gut aus. ;)
Aber der Integrierte UltraCompare von UltraEdit ist dafür für mich persönlich ausreichend.

gruss

jaenicke 7. Sep 2016 11:47

AW: proceduren (Events) aus Interface
 
Zitat:

Zitat von EWeiss (Beitrag 1347044)
Das Problem ist dabei nur das jeder sein eigenes Süppchen kochen will.

Eine Standardeinstellung ist dabei wirklich nicht mehr zeitgemäß:
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.

EWeiss 7. Sep 2016 13:28

AW: proceduren (Events) aus Interface
 
so sieht die class jetzt aus.

Delphi-Quellcode:
  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;
Es war zwingend nötig die zSubclass_Proc in das Interface mit zu übernehmen.
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:
  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;
Durch die Umlenkung der TSubClass_Proc sind zusätzliche messagen\events in Formen oder in NonVCl erstellten Fenstern nicht mehr nötig.

gruss

jaenicke 8. Sep 2016 20:48

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.)

EWeiss 8. Sep 2016 20:58

AW: proceduren (Events) aus Interface
 
Zitat:

Zitat von jaenicke (Beitrag 1347212)
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.)

Ich weiß jetzt nicht ganz genau ob meine Vorgehensweise korrekt ist.
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

jaenicke 9. Sep 2016 04:47

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...

EWeiss 9. Sep 2016 04:56

AW: proceduren (Events) aus Interface
 
Zitat:

Zitat von jaenicke (Beitrag 1347222)
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...

Ich weiß nur nicht ob das so gut ist wenn ich meine Interface Unit in Teile aufsplitte.
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

jaenicke 9. Sep 2016 07:06

AW: proceduren (Events) aus Interface
 
Zitat:

Zitat von EWeiss (Beitrag 1347223)
So gebe ich den Leuten diese eine Unit wo alles vorhanden ist.

Genau so meine ich das doch.
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:
  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;
Interne Unit:
Delphi-Quellcode:
  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)
...
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.

EWeiss 9. Sep 2016 07:26

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:

Genau so meine ich das doch.
Der Unterschied ist, dass diese Unit in deinem Projekt normal eingebunden ist, mehr nicht.
Jo so mache ich das ja.

EDIT:
Also ich habe das mal so gemacht wie von dir vorgeschlagen. (DLL seite)

Delphi-Quellcode:
  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;
Mit meiner vorher deklarierten Variable kann ich jetzt nicht mehr darauf zugreifen.

Delphi-Quellcode:
function SubFormWindowProc(Wnd: HWND; Msg: UINT; wParam: wParam; lParam: lParam): LRESULT; stdcall;
begin

  result := MagneticWnd.zSubclass_Proc(Wnd, Msg, wParam, lParam);
end;
MagneticWnd kennt diese Funktion dann nicht mehr.


gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:55 Uhr.
Seite 3 von 5     123 45      

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