AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Interface .. onchange onscroll

Ein Thema von EWeiss · begonnen am 23. Jun 2011 · letzter Beitrag vom 25. Jul 2012
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

Interface .. onchange onscroll

  Alt 23. Jun 2011, 21:51
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..

Implements ISkinScrollBar
oder
WithEvents scrollbar As ISkinScrollBar

Oder kann man das nur über ein Callback verwirklichen.

gruss

Geändert von EWeiss (23. Jun 2011 um 21:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Interface .. onchange onscroll

  Alt 23. Jun 2011, 22:26
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Peter1999

Registriert seit: 13. Dez 2007
Ort: Dresden
88 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Interface .. onchange onscroll

  Alt 23. Jun 2011, 22:30
Keine Ahnung, ob ich dich richtig verstanden habe. Ich habe auch von VB keine Ahnung (wer macht denn sowas? )
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Interface .. onchange onscroll

  Alt 23. Jun 2011, 22:44
Beispiel

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

Geändert von EWeiss (23. Jun 2011 um 23:04 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Interface .. onchange onscroll

  Alt 24. Jun 2011, 04:31
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;
function CreateTMachWas: TMachwas;

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

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

gruss

Geändert von EWeiss (24. Jun 2011 um 04:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Interface .. onchange onscroll

  Alt 24. Jun 2011, 11:31
http://www.delphipraxis.net/149369-p...nterfaces.html
Sebastian
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Interface .. onchange onscroll

  Alt 24. Jun 2011, 18:17
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
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#8

AW: Interface .. onchange onscroll

  Alt 24. Jun 2011, 19:37
Du willst dein bestehendes Interface nicht verändern oder wie?
Sebastian

Geändert von geskill (24. Jun 2011 um 19:39 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Interface .. onchange onscroll

  Alt 24. Jun 2011, 21:06
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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

AW: Interface .. onchange onscroll

  Alt 24. Jun 2011, 21:38
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:11 Uhr.
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