AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi proceduren (Events) aus Interface
Thema durchsuchen
Ansicht
Themen-Optionen

proceduren (Events) aus Interface

Ein Thema von EWeiss · begonnen am 4. Sep 2016 · letzter Beitrag vom 12. Sep 2016
Antwort Antwort
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.960 Beiträge
 
Delphi 12 Athens
 
#1

AW: proceduren (Events) aus Interface

  Alt 8. Sep 2016, 20:48
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.)
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: proceduren (Events) aus Interface

  Alt 8. Sep 2016, 20:58
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.960 Beiträge
 
Delphi 12 Athens
 
#3

AW: proceduren (Events) aus Interface

  Alt 9. Sep 2016, 04:47
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...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: proceduren (Events) aus Interface

  Alt 9. Sep 2016, 04:56
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.960 Beiträge
 
Delphi 12 Athens
 
#5

AW: proceduren (Events) aus Interface

  Alt 9. Sep 2016, 07:06
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.
Sebastian Jänicke
AppCentral

Geändert von jaenicke ( 9. Sep 2016 um 07:08 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: proceduren (Events) aus Interface

  Alt 9. Sep 2016, 07:26
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

Geändert von EWeiss ( 9. Sep 2016 um 07:54 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: proceduren (Events) aus Interface

  Alt 9. Sep 2016, 08:43
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)
...
Wieso bindest du an dieser Stelle beide Interfaces ein? Würde es nicht reichen nur ISkinMagneticEx einzubinden? Das Interface ist doch von ISkinMagnetic abgeleitet und kennt somit alle Funktionen? Wo liegt hier der Vorteil bzw. wieso sollte man das so machen?

Wollte auch demnächst mit DLL Programmierung anfangen, bin da aber noch nicht so ganz firm drin. Interfaces funktionieren so einigermaßen mittlerweile.

Geändert von Aviator ( 9. Sep 2016 um 08:45 Uhr) Grund: Rechtschreibfehler behoben :s
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: proceduren (Events) aus Interface

  Alt 9. Sep 2016, 08:51
Zitat:
Wieso bindest du an dieser Stelle beide Interfaces ein? Würde es nicht reichen nur ISkinMagneticEx einzubinden?
Ich denke auch das dies der Fehler ist
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

Geändert von EWeiss ( 9. Sep 2016 um 08:55 Uhr)
  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:36 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