![]() |
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 |
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. |
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. |
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:
bei
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; Hier... //onEventChange soll die Anwendung eine Procedure bekommen wie in einer VCL Anwendung wenn ich hier bsp.. onScroll einfügen würde.
Delphi-Quellcode:
hoffe ist jetzt etwas besser erklärt.
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer); begin end; @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 |
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:
Hmmm schon wieder ein großes problem!
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); Es muss doch möglich sein ein Event aus der DLL zu übergeben. :cry: gruss |
AW: Interface .. onchange onscroll
|
AW: Interface .. onchange onscroll
Zitat:
Muss aber feststellen das ich mit meinem Interface keine Events weiterleiten kann. So das ich mich nun für eine Callback entschlossen habe. gruss |
AW: Interface .. onchange onscroll
Du willst dein bestehendes Interface nicht verändern oder wie?
|
AW: Interface .. onchange onscroll
Zitat:
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 |
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 10:05 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