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
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: proceduren (Events) aus Interface

  Alt 5. Sep 2016, 03:02
Zitat:
Zu überlegen wäre, ob du nur bestimmer Messages erlauben willst, denn ansonsten könntest du auch einfach die WndProc durchleiten. Das wäre natürlich etwas langsamer.
Jo nur bestimmte..

Mein Problem ist ein anderes.

procedure WMMoving(var Msg: TMessage); //ohne message WM_MOVING; aufgenommen in meinem Interface.
Delphi-Quellcode:
var
  SkinBrowseForFile : ISkinBrowseForFile;
//--------------------------
SkinBrowseForFile := TSkinBrowseForFile.create; // Interface erstellen

procedure SkinBrowseForFile.WMMoving(var Msg: TMessage);
begin

end;
Bezeichner redefiniert.
Geht also nicht.
Hmm....

Zitat:
denn ansonsten könntest du auch einfach die WndProc durchleiten.
Das habe ich bisher gemacht aber dabei friert meine Anwendung ein.
Ich vermute bald mal das es einfach nicht geht. (Aufgeben.. LOL)

gruss

Geändert von EWeiss ( 5. Sep 2016 um 03:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: proceduren (Events) aus Interface

  Alt 5. Sep 2016, 04:14
Delphi-Quellcode:
var
  SkinBrowseForFile : ISkinBrowseForFile;
//--------------------------
SkinBrowseForFile := TSkinBrowseForFile.create; // Interface erstellen

procedure SkinBrowseForFile.WMMoving(var Msg: TMessage);
begin

end;
Das ist eine Mischung zwischen Deklaration und Aufruf. Der Aufruf muss aber auf ein Interface erfolgen, das aus der DLL bereitgestellt wird. Deshalb verstehe ich gerade nicht was du an der Stelle versuchst.

Ich bin unterwegs und am Handy lässt sich Quelltext schlecht schreiben, deshalb einmal nur kurz die beiden Varianten...
Delphi-Quellcode:
// Aufruf
procedure TfrmChild2.WMMoving(var Msg: TMessage);
var
  SkinBrowseForFile: ISkinBrowseForFile;
begin
  SkinBrowseForFile := TSkinBrowseForFile.Create;
  SkinBrowseForFile.WMMoving(Msg);
end;
Delphi-Quellcode:
// Implementierung (in der DLL soweit ich verstanden habe)
Type
  TSkinBrowseForFile = class(TInterfacedObject, ISkinBrowseForFile)
  public
    procedure WMMoving(var Msg: TMessage);
  end;

procedure TSkinBrowseForFile.WMMoving(var Msg: TMessage);
begin

end;
Sebastian Jänicke
AppCentral

Geändert von jaenicke ( 5. Sep 2016 um 04:17 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: proceduren (Events) aus Interface

  Alt 5. Sep 2016, 04:16
Danke dir werde es mal versuchen..

Zitat:
// Implementierung (in der DLL soweit ich verstanden habe)
Nein.. In der Anwendung.

Ich poste mal den richtigen Code..
Macht sonst keinen sinn.

Mein Interface in der DLL.
Delphi-Quellcode:
  ISkinMagnetic = interface
    ['{A00CB8B3-8433-4C58-9115-1845B29B3FF0}']
    function GetSnapWidth: Integer;
    procedure SetSnapWidth(const Value: Integer);
    function AddWindow(Handle: HWND; hWndParent: HWND; var FuncPointer : TSubClass_Proc): Boolean;
    property SnapWidth: Integer read GetSnapWidth write SetSnapWidth;
    function RemoveWindow(Handle: HWND): Boolean;
    function SetFullWindowDrag(hwnd: DWORD; ShowFullWindow: Boolean): Boolean;
    procedure MagneticWindowDestroy;
    procedure WMEnterSizeMove(var Msg: TMessage);
    procedure WMSizing(var Msg: TMessage);
    procedure WMMoving(var Msg: TMessage);
    procedure WMExitSizeMove(var Msg: TMessage);
    procedure WMSysCommand(var Msg: TMessage);
    procedure WMCommand(var Msg: TMessage);
    procedure zSubclass_Proc(lng_hWnd: HWND;
                             uMsg, wParam, lParam: Integer;
                             var lReturn: Integer;
                             var bHandled: Boolean);
  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(rcWnd1: TRECT; rcWnd2: TRECT): Boolean;
    function pvWndGetInfoIndex(Handle: HWND): Integer;
    function pvWndParentGetInfoIndex(hWndParent: HWND): Integer;
    procedure WMEnterSizeMove(var Msg: TMessage);
    procedure WMSizing(var Msg: TMessage);
    procedure WMMoving(var Msg: TMessage);
    procedure WMExitSizeMove(var Msg: TMessage);
    procedure WMSysCommand(var Msg: TMessage);
    procedure WMCommand(var Msg: TMessage);
   public
    function AddWindow(Handle: HWND; hWndParent: HWND; var FuncPointer : TSubClass_Proc): Boolean;
    function RemoveWindow(Handle: HWND): Boolean;
    procedure CheckGlueing;
    property SnapWidth: Integer read GetSnapWidth write SetSnapWidth;
    function SetFullWindowDrag(hwnd: DWORD; ShowFullWindow: Boolean): Boolean;
    procedure MagneticWindowDestroy;
    procedure zSubclass_Proc(lng_hWnd: HWND;
                             uMsg, wParam, lParam: Integer;
                             var lReturn: Integer;
                             var bHandled: Boolean);
  end;
Das Interface in der Anwendung.
Delphi-Quellcode:
  ISkinMagnetic = interface
    ['{A00CB8B3-8433-4C58-9115-1845B29B3FF0}']
    function GetSnapWidth: Integer;
    procedure SetSnapWidth(const Value: Integer);
    function AddWindow(Handle: HWND; hWndParent: HWND; var FuncPointer : TSubClass_Proc): Boolean;
    property SnapWidth: Integer read GetSnapWidth write SetSnapWidth;
    function RemoveWindow(Handle: HWND): Boolean;
    function SetFullWindowDrag(hwnd: DWORD; ShowFullWindow: Boolean): Boolean;
    procedure MagneticWindowDestroy;
    procedure WMEnterSizeMove(var Msg: TMessage);
    procedure WMSizing(var Msg: TMessage);
    procedure WMMoving(var Msg: TMessage);
    procedure WMExitSizeMove(var Msg: TMessage);
    procedure WMSysCommand(var Msg: TMessage);
    procedure WMCommand(var Msg: TMessage);
    procedure zSubclass_Proc(lng_hWnd: HWND;
                             uMsg, wParam, lParam: Integer;
                             var lReturn: Integer;
                             var bHandled: Boolean);
  end;

Diese proceduren kann ich dann in der Anwendung nicht erstellen.
Delphi-Quellcode:
    procedure WMEnterSizeMove(var Msg: TMessage);
    procedure WMSizing(var Msg: TMessage);
    procedure WMMoving(var Msg: TMessage);
    procedure WMExitSizeMove(var Msg: TMessage);
    procedure WMSysCommand(var Msg: TMessage);
    procedure WMCommand(var Msg: TMessage);
Und ich glaube langsam das es auch nicht geht.

Zitat:
// Aufruf
Delphi-Quellcode:
procedure TfrmChild2.WMMoving(var Msg: TMessage);
var
   SkinBrowseForFile: ISkinBrowseForFile;
begin
   SkinBrowseForFile := TSkinBrowseForFile.Create;
   SkinBrowseForFile.WMMoving(Msg);
end;
Das kann ich nicht da meine Anwendung NonVcL ist.
Sonst wäre es einfach. und richtig so wie du es gepostet hast.
Das ist wieder so ein Spezial Fall.. LOL

Die Klasse TMagnetic funktioniert ja richtig mit VCL.
Ich möchte sie aber in meine DLL integrieren damit ich diese nicht bei jeden Projekt mit einbinden muss (als Datei).

Mich nerven schon die ganzen Proceduren in der "TMagnetic = class"
procedure WMSizing(var Msg: TMessage); usw. Aber ich muss sie einbinden (Obwohl ich sie in der TMagnetic eigentlich gar nicht benötige)
Nur wenn ich sie nicht einbinde kann ich sie auch nicht veröffentlichen.
Was für ein Kram

gruss

Geändert von EWeiss ( 5. Sep 2016 um 04:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: proceduren (Events) aus Interface

  Alt 5. Sep 2016, 04:56
Als Ergänzung: Ich hätte jetzt so etwas erwartet...
Delphi-Quellcode:
// in der DLL
unit DllPlugin;

uses
  PluginInterface;

type
  TPlugin = class(TInterfacedObject, IPlugin)
  private
    FSkinBrowseForFile: ISkinBrowseForFile;
    function GetSkinBrowseForFile: ISkinBrowseForFile;
  public
    property SkinBrowseForFile: ISkinBrowseForFile read GetSkinBrowseForFile;
  end;

// veröffentlichen als DLL Funktion
function InitPlugin: IPlugin;
begin
  Result := TPlugin.Create;
end;

exports
  InitPlugin

end.
Analog könntest du natürlich auch das hier genannte Interface so veröffentlichen, aber ich vermute das ist nicht das einzige.

Und dann in der Anwendung:
Delphi-Quellcode:
uses
  PluginInterface;

var
  Plugin: IPlugin;
begin
  ...LoadLibrary...
  DllInitPlugin := GetProcAddress(...);
  Plugin := DllInitPlugin;
//...
  SkinBrowseForFile := Plugin.SkinBrowseForFile;
  SkinBrowseForFile.WMMoving(Msg);
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: proceduren (Events) aus Interface

  Alt 5. Sep 2016, 05:11
Als Ergänzung: Ich hätte jetzt so etwas erwartet... Genauso habe ich es ja auch.
Nur meine Namensgebung ist etwas anders.

Delphi-Quellcode:
// MagneticWindow
function CTRL_MagneticWindowCreate(): ISkinMagnetic; stdcall;
Der Export ist dann logischerweise "CTRL_MagneticWindowCreate"

In der Anwendung dann einfach
Delphi-Quellcode:
{$REGION 'WM_CREATE'}
  case Msg of
    WM_CREATE:
      begin
        if not SKAERO_INIT then
          Halt;
        MagneticWnd := CTRL_MagneticWindowCreate;
      end;
{$ENDREGION}
Aber wie gesagt die Messagen machen Probleme.
MagneticWnd.WMMoving(Msg); Das macht keine sinn auf diese Weise..
Wenn ich meine Anwendung über WM_MOVING ( also verschiebe)
Dann muss diese Procedure WMMoving aufgerufen werden damit die Messagen an meine DLL weitergeleitet werden
und das geht so nicht.

Etwas verworren das ganze.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: proceduren (Events) aus Interface

  Alt 5. Sep 2016, 05:20
Aber wie gesagt die Messagen machen Probleme.
MagneticWnd.WMMoving(Msg); Das macht keine sinn auf diese Weise..
// EDIT:
Weil du in der WndProc bist, das hatte ich überlesen.

Wie wäre es so:
Delphi-Quellcode:
procedure TfrmChild2.WMMoving(var Msg: TMessage);
var
  MagneticWnd: IMagneticWnd;
begin
  MagneticWnd := CTRL_MagneticWindowCreate;
  MagneticWnd.WMMoving(Msg);
end;
Das ginge, allerdings sollte der Aufruf von CTRL_MagneticWindowCreate besser in das FormCreate und FMagneticWnd ein privates Feld sein. Dann kannst du direkt FMagneticWnd.WMMoving(Msg) aufrufen ohne vorher bei jeder Message das Interface aus der DLL neu zu holen (das wäre viel zu langsam, Messages sollten so schnell wie irgend möglich beantwortet werden).
Sebastian Jänicke
AppCentral

Geändert von jaenicke ( 5. Sep 2016 um 05:23 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: proceduren (Events) aus Interface

  Alt 5. Sep 2016, 05:45
Delphi-Quellcode:
procedure TfrmChild2.WMMoving(var Msg: TMessage);
var
   MagneticWnd: IMagneticWnd;
begin
   MagneticWnd := CTRL_MagneticWindowCreate;
   MagneticWnd.WMMoving(Msg);
end;
Wäre möglich aber nicht umsetzbar weil ich über keine Form verfüge.
Meine Form wird in NonVcl erstellt.

Delphi-Quellcode:
    // Window erstellen
    MainHandle := CreateWindowEx(dwExStyle, myClass, myTitle, dwStyle, MainLeft, MainTop,
      MainWidth, MainHeight, 0, 0, wc.hInstance, nil);
gruss
  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 04:21 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