Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Interface .. onchange onscroll (https://www.delphipraxis.net/161241-interface-onchange-onscroll.html)

EWeiss 23. Jun 2011 20:51

Interface .. onchange onscroll
 
Hat schon jemand aus einer Dll (nonvcl) ein event übergeben?
Speziell über ein Interface?

Mein problem ist das ich aus der DLL vom Interface
ISkinScrollBar scroll und change weiterleiten will.

Ähnlich wie ich es aus VB kenne..

Delphi-Quellcode:
Implements ISkinScrollBar

oder
Delphi-Quellcode:
WithEvents scrollbar As ISkinScrollBar


Oder kann man das nur über ein Callback verwirklichen.

gruss

sirius 23. Jun 2011 21:26

AW: Interface .. onchange onscroll
 
Wie meinst du das?

die DLL löst ein Event aus, dessen Ziel das Hauptprogramm ist?
Klar, erstelle im Hauptprogramm ein Interface welches du der DLL mitgiebst.

Peter1999 23. Jun 2011 21:30

AW: Interface .. onchange onscroll
 
Keine Ahnung, ob ich dich richtig verstanden habe. Ich habe auch von VB keine Ahnung (wer macht denn sowas? :wink: )
So müsste es aber ungefähr in Delphi aussehen (ungetestet, nur schnell zusammengetippt):

Delphi-Quellcode:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type

{ANWENDUNG UND DLL}
  IMachWas = interface
    procedure SetOnChange(value: TNotifyEvent);
    function GetOnChange:TNotifyEvent;
    procedure MachWas;

    property OnChange:TNotifyEvent read GetOnChange write SetOnChange;
  end;


{DLL}
  TMachwas = class(TInterfacedObject,IMachWas)
  private
    FOnChange:TNotifyEvent;
  protected

  public
    procedure MachWas;
    procedure SetOnChange(value: TNotifyEvent);
    function GetOnChange:TNotifyEvent;
    property OnChange:TNotifyEvent read GetOnChange write SetOnChange;
  end;

{ANWENDUNG}
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
     FMachWas: IMachWas;
  protected
    procedure ReagiereAufMachwas(Sender: TObject);
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
  end;

  //hier wird dann, wenn vorhanden, die Funktion der DLL geladen:
  // function CreateTMachWas: TMachwas; external 'DieDLL.dll'
  // Da ich aber jetzt zu faul bin die DLL zu erzeugen steht es hier ohne dem EXTERNAL
  function CreateTMachWas: TMachwas;

var
  Form1: TForm1;

implementation

{$R *.dfm}


{ ANWENDUNG }

procedure TForm1.Button1Click(Sender: TObject);
begin
  FMachWas.MachWas;
end;

constructor TForm1.Create(AOwner: TComponent);
begin
  inherited;
  FMachWas := CreateTMachWas;
  FMachWas.OnChange := ReagiereAufMachwas;
end;

procedure TForm1.ReagiereAufMachwas(Sender: TObject);
begin
  ShowMessage('REAKTION!');
end;


{ DLL }

function TMachwas.GetOnChange: TNotifyEvent;
begin
  Result := FOnChange;
end;

procedure TMachwas.MachWas;
begin
  if Assigned(FOnChange) then
    FOnChange(Self);
end;

procedure TMachwas.SetOnChange(value: TNotifyEvent);
begin
  FOnChange := value;
end;

function CreateTMachWas: TMachwas;
begin
  Result := TMachwas.Create;
end;
exports CreateTMachWas;

end.

EWeiss 23. Jun 2011 21:44

AW: Interface .. onchange onscroll
 
Beispiel

Delphi-Quellcode:
Implements ISkinScrollBar

ISkinScrollBar enthält ein Winproc
Durch die implementierung kann ich in meiner Hauptanwendung direkt auf
ISkinScrollBar_WindowProc(...
zugreifen.

Ich möchte also quasi ein Event aus der DLL übergeben und zwar dann wenn ich onscroll oder onchange aufrufe.

Mein Interface!
Delphi-Quellcode:
type
  ISkinScrollBar = interface
    ['{FEAD54BF-FFDD-43E9-9388-5F96A8643948}']
    function GetHandle: hWnd;
    property Handle: hWnd read GetHandle;
    procedure SetSmallChange(Value: Single);
    function GetSmallChange: Single;
    procedure SetLargeChange(Value: Single);
    function GetLargeChange: Single;
    procedure SetMinVal(Value: Single);
    function GetMinVal: Single;
    procedure SetMaxVal(Value: Single);
    function GetMaxVal: Single;
    procedure SetVal(Value: Single);
    function GetVal: Single;
  end;

  TSkinScrollBar = class(TInterfacedPersistent, ISkinScrollBar)
  private
    FHScrollBar: HWND;
    ImgW, ImgH:  Cardinal;
    Style:       DWORD;
    FLargeChange: Single;
    FSmallChange: Single;
    FMinVal:     Single;
    FMaxVal:     Single;
    FVal:        Single;
    FBackgroundHeight: Single;
    function GetHandle: hWnd;
    function GetLargeChange: Single;
    function GetSmallChange: Single;
    function GetMinVal: Single;
    function GetMaxVal: Single;
    function GetVal: Single;
    procedure SubClass(WinHandle: HWND);
    procedure UnSubClass(WinHandle: HWND);
    procedure SetLargeChange(Value: Single);
    procedure SetSmallChange(Value: Single);
    procedure SetMinVal(Value: Single);
    procedure SetMaxVal(Value: Single);
    procedure SetVal(Value: Single);
    procedure DrawThumbBarValue;
    procedure CalculateThumbBarTop;
    procedure SetThumbBarHeight;
    function ScrollBarProc(WinHandle: HWND; Msg: UINT; wP: WParam; lP: LParam): LRESULT; stdcall;
    procedure ClientWndProc(var Message: TMessage);
  public
    property Handle: HWND Read FHScrollBar;
    constructor Create(hOwner: HWND; PageImg, DownImg, UpImg, ThumpImg: WideString;
      x, y, yH, CtrlID, StateMax:Integer; Enabled, Visible: Boolean);

    destructor Destroy; override;
  end;

Delphi-Quellcode:
procedure TSkinScrollBar.SetVal(Value: Single);
begin

    If (Value >= FMinVal) and (Value <= FMaxVal) then
        FVal := Value
    else if Value < FMinVal then
        FVal := FMinVal
    else If Value > FMaxVal then
        FVal := FMaxVal;

    DrawThumbBarValue;
    Hier...
    //onEventChange  
end;
bei
Hier...
//onEventChange

soll die Anwendung eine Procedure bekommen wie in einer VCL Anwendung
wenn ich hier bsp.. onScroll einfügen würde.

Delphi-Quellcode:
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
begin

end;
hoffe ist jetzt etwas besser erklärt.

@Peter1999
Sieht fast so aus als wenn es das ist was ich suche..
Werde es mal testen.

Danke!

EDIT:
Verstehe aber nicht warum ich noch Setter und getter definieren muss wenn ich diese schon habe.

Delphi-Quellcode:
procedure TSkinScrollBar.SetVal(Value: Single);
begin

Wird aus der Hauptanwendung übergeben
und soll dann aus dieser procedure an das OnEventChange in der HauptAnwendung weitergeleitet werden.



gruss

EWeiss 24. Jun 2011 03:31

AW: Interface .. onchange onscroll
 
Geht leider nicht.
Kann Create nicht nochmals aufrufen da TSkinScrollBar über das Interface erstellt wird.

Delphi-Quellcode:
function CTRL_ScollBarCreate(hOwner: HWND; PageImg, DownImg, UpImg, ThumpImg: WideString; x, y, yH, CtrlID,
  StateMax:Integer; Enabled, Visible: Boolean): ISkinScrollBar; stdcall;
begin

  result := TSkinScrollBar.Create(hOwner, PageImg, DownImg, UpImg, ThumpImg,
    x, y, yH, CtrlID, StateMax, Enabled, Visible);
end;
Delphi-Quellcode:
function CreateTMachWas: TMachwas;


TSkinScrollBar(CreateTMachWas) wäre demnach auch nicht exportierbar.

Und
Delphi-Quellcode:
LVScrollBar.OnChange := ReagiereAufMachwas;


führt unweigerlich zum crash da die LVScrollBar das Interface ist.
Delphi-Quellcode:
LVScrollBar:    ISkinScrollBar;

    LVScrollBar := CTRL_ScollBarCreate(hMain,
      (SKAERO_FOLDER + 'VScroll\' + 'VSPage.png'), (SKAERO_FOLDER + 'VScroll\' + 'VSDown.png'),
      (SKAERO_FOLDER + 'VScroll\' + 'VSUp.png'), (SKAERO_FOLDER + 'VScroll\' + 'VSThump.png'),
      767, 70, 253, ID_VSCROLL, 0, True, True);
    LVScrollBar.SetLargeChange(10);
    LVScrollBar.SetSmallChange(1);
    LVScrollBar.SetMinVal(1);
    LVScrollBar.SetMaxVal(127);
    LVScrollBar.SetVal(1);
    SKAERO_SetAnchorMode(LVScrollBar.Handle, ANCHOR_BOTTOM_RIGHT);
    SKAERO_SetZorder(LVScrollBar.Handle, HWND_TOP);
Hmmm schon wieder ein großes problem!
Es muss doch möglich sein ein Event aus der DLL zu übergeben. :cry:

gruss

geskill 24. Jun 2011 10:31

AW: Interface .. onchange onscroll
 
http://www.delphipraxis.net/149369-p...nterfaces.html

EWeiss 24. Jun 2011 17:17

AW: Interface .. onchange onscroll
 
Zitat:

Zitat von geskill (Beitrag 1108059)

Danke für den Link..
Muss aber feststellen das ich mit meinem Interface keine Events weiterleiten kann.
So das ich mich nun für eine Callback entschlossen habe.

gruss

geskill 24. Jun 2011 18:37

AW: Interface .. onchange onscroll
 
Du willst dein bestehendes Interface nicht verändern oder wie?

EWeiss 24. Jun 2011 20:06

AW: Interface .. onchange onscroll
 
Zitat:

Zitat von geskill (Beitrag 1108176)
Du willst dein bestehendes Interface nicht verändern oder wie?

Wie meinst du das?
Hast du meine Post mal gelesen ?
Vielleicht verstehst du dann warum das nicht funktioniert.

Ich kann keine neue Instanz von TSkinScrollbar erstellen da diese eine ableitung von ISkinScrollbar ist.
Sie wird also schon erstellt beim Aufruf von

CTRL_ScollBarCreate.

Schau mal was als Result zurück geliefert wird.

gruss

sirius 24. Jun 2011 20:38

AW: Interface .. onchange onscroll
 
Na dann häng doch der Klasse noch ein weiteres Interface an und caste dahin.


Du kannst auch eine komplett eigene Klasse erstellen mit einem eigenen Interaface, dass gibst du dann an die DLL weiter und die Klasse kennt auch dein IScroll-dinsgbums.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:05 Uhr.
Seite 1 von 2  1 2      

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