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/)
-   -   Event einem bestimmten control zuweisen (https://www.delphipraxis.net/170242-event-einem-bestimmten-control-zuweisen.html)

EWeiss 6. Sep 2012 19:54


Event einem bestimmten control zuweisen
 
Ich erstelle eine CallBack..

Delphi-Quellcode:
type
  TVScrollBarState = (OnChange = 0, OnScroll = 1);
  TVScrollBarEvent = procedure(NewState: TVScrollBarState; Value: Integer); stdcall;

var
  VScrollEventCallback: TVScrollBarEvent;

...
  procedure LVScrollBarCallBack(NewState: TVScrollBarState; Value: Integer); stdcall;
Delphi-Quellcode:
procedure TSkinVScrollBar.SetVScrollBarCallBack(callback: TVScrollBarEvent); stdcall;
begin
  VScrollEventCallback := callback;

end;
Delphi-Quellcode:
if (assigned(VScrollEventCallback)) then
  VScrollEventCallback(OnChange, Trunc(FTmpVal));
Initialisierung..

Delphi-Quellcode:
LVScrollBar.SetVScrollBarCallBack(LVScrollBarCallBack);


Alles kein Problem solange ich keine 2 Listen auf der Form habe.
Weil durch die erneute zuweisung die CallBack für die vorher erstellte Liste nicht mehr gültig ist.

Wie kann ich das problem beheben ?

gruss

Christian Seehase 6. Sep 2012 20:41

AW: Event einem bestimmten control zuweisen
 
Moin,

erstelle eine erweiterte Scrollbarklasse, die dann eine Property für die Event erhält.
So hat jede Scrollbar ihren eigenen Platz für die Adresse der Routine.

EWeiss 6. Sep 2012 20:51

AW: Event einem bestimmten control zuweisen
 
Zitat:

Zitat von Christian Seehase (Beitrag 1181898)
Moin,

erstelle eine erweiterte Scrollbarklasse, die dann eine Property für die Event erhält.
So hat jede Scrollbar ihren eigenen Platz für die Adresse der Routine.

Da hab ich keinen Ansatz für wie ich das verwirklichen kann ;)
Jemand nen Tip?

Wenn ich die obere Scrollbar bewege wird unten die Liste geändert.
Die Callback ist nur gültig für die zuletzt erstellte Liste

gruss

Furtbichler 7. Sep 2012 06:48

AW: Event einem bestimmten control zuweisen
 
WER ruft denn den Callback auf? Eine Instanz einer Scrollbar?
Was ist LVScrollbar?

Sir Rufo 7. Sep 2012 08:35

AW: Event einem bestimmten control zuweisen
 
Der CallBack muss als Eigenschaft der Klasse/Instanz gespeichert werden und nicht in einer globalen/unit-globalen Variablen, da eben dort nur ein CallBack gespeichert werden kann.
Delphi-Quellcode:
type
  TSkinVScrollBar = class
  private
    FVScrollEventCallBack : TVScrollBarEvent;
    procedure SetVScrollEventCallBack( Value : TVScrollBarEvent );
  published
    property VScrollEventCallBack : TVScrollEvent read FVScrollEventCallBack write SetVScrollEventCallBack;
  end;

procedure TSkinVScrollBar.SetVScrollEventCallBack( Value : TVScrollBarEvent );
begin
  FVScrollEventCallBack := Value;
end;

sx2008 7. Sep 2012 08:44

AW: Event einem bestimmten control zuweisen
 
Ausserdem ist es eine schlechte Idee die Ereignisse OnChange und OnScroll mit dem gleichen Event abzubilden.
Man braucht eben zwei Events.
Und zusätzlich sollte der 1. Parameter der Events das Objekt selber sein damit man im Eventhandler Zugriff auf die Daten des Objekts bekommt, dass das Event ausgelöst hat.

EWeiss 7. Sep 2012 09:43

AW: Event einem bestimmten control zuweisen
 
Zitat:

Zitat von Furtbichler (Beitrag 1181922)
WER ruft denn den Callback auf? Eine Instanz einer Scrollbar?
Was ist LVScrollbar?

In dem Fall die Listbox selbst.
Wenn das Flag ShowVSroll gesetzt ist wird eine instanz der LVSrollbar gestartet.

Zitat:

Was ist LVScrollbar?[/
Ich dachte der name ansich hätte dir das schon verraten.
L = List V - Vertikal S -Scrollbar

Zitat:

Der CallBack muss als Eigenschaft der Klasse/Instanz gespeichert werden
Danke werde mal schaun ob ich damit mein problem beheben kann.

gruss

EWeiss 7. Sep 2012 10:13

AW: Event einem bestimmten control zuweisen
 
Habe den vorschlag mal umgesetzt.
Es ändert aber nichts an der problematik das dass vorherige Event(CallBack) von der nächsten Initialisierung aufgehoben wird.
Dabei spielt es im moment keine rolle ob diese global oder privat deklariert ist.
Ich lasse es jetzt aber so um eventuelle anderer probleme seitens der globalen deklaration, vorzubeugen.

gruss

Sir Rufo 7. Sep 2012 15:18

AW: Event einem bestimmten control zuweisen
 
Zitat:

Zitat von EWeiss (Beitrag 1181959)
Habe den vorschlag mal umgesetzt.
Es ändert aber nichts an der problematik das dass vorherige Event(CallBack) von der nächsten Initialisierung aufgehoben wird.

Irgendwie lässt mich das
Delphi-Quellcode:
stdcall
etwas stutzen. Hast du diesen Teil in einer DLL ausgelagert und kann es sein, dass du nur eine Instanz erzeugst und diese immer wieder verwendest?

Denn nur so kann ich mir vorstellen, dass sich das Verhalten nicht ändert.

EWeiss 7. Sep 2012 15:44

AW: Event einem bestimmten control zuweisen
 
Wenn die DirList erzeugt wird (ohne FileList) funktioniert alles soweit einwandfrei.
Der Anwender kann nur Propertys festlegen ansonsten hat er keinen Einfluss auf das Control selbst.
Alle Funktionen das füllen der Box selbst ist abhängig davon welches Laufwerk in der DriveList ausgewählt wurde.

Die Scrollbox wird quasi innerhalb der DirList erzeugt und ist nicht von außen beinflussbar.

Also wenn ich die Instanz DirList erzeugt habe und das Fenster erfolgreich registriert wurde
dann wird für die Liste eine Instanz der Scrollbar erstellt.

Das selbe mit der FileList.
Alle Deklarationen sind privat in der jeweiligen Classe.

Mit dem stdcall .. denke nicht das dies probleme bereitet.
Die scrollbox reagiert nur auf das zuletzt erstellte Fenster.

Muss mal schaun irgendwas läuft da echt daneben. ;)

EDIT:
Das problem ist wohl eher das Handle der aktuellen Listox wie es ausschaut.
Die Callback procedure in die Classe einfügen mag sie gar nicht
daher komme ich schlecht an das Handle der aktuellen ListBox.

Zitat:

[DCC Fehler] uListBox.pas(462): E2009 Inkompatible Typen: 'Reguläre Prozedur und Methodenzeiger'
gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:39 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