AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Event einem bestimmten control zuweisen
Thema durchsuchen
Ansicht
Themen-Optionen

Event einem bestimmten control zuweisen

Ein Thema von EWeiss · begonnen am 6. Sep 2012 · letzter Beitrag vom 7. Sep 2012
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

Event einem bestimmten control zuweisen

  Alt 6. Sep 2012, 20:54
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..

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

Geändert von EWeiss ( 6. Sep 2012 um 20:58 Uhr)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Event einem bestimmten control zuweisen

  Alt 6. Sep 2012, 21:41
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Event einem bestimmten control zuweisen

  Alt 6. Sep 2012, 21:51
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

Geändert von EWeiss (11. Jul 2019 um 16:41 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Event einem bestimmten control zuweisen

  Alt 7. Sep 2012, 07:48
WER ruft denn den Callback auf? Eine Instanz einer Scrollbar?
Was ist LVScrollbar?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Event einem bestimmten control zuweisen

  Alt 7. Sep 2012, 09:35
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Event einem bestimmten control zuweisen

  Alt 7. Sep 2012, 09:44
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Event einem bestimmten control zuweisen

  Alt 7. Sep 2012, 10:43
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Event einem bestimmten control zuweisen

  Alt 7. Sep 2012, 11:13
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

Geändert von EWeiss ( 7. Sep 2012 um 14:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Event einem bestimmten control zuweisen

  Alt 7. Sep 2012, 16:18
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 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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Event einem bestimmten control zuweisen

  Alt 7. Sep 2012, 16:44
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

Geändert von EWeiss ( 7. Sep 2012 um 16:54 Uhr)
  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 18:34 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