Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sender:Tobject - Sender is Benutzer (https://www.delphipraxis.net/109841-sender-tobject-sender-benutzer.html)

Noobinator 8. Mär 2008 20:54


Sender:Tobject - Sender is Benutzer
 
Hallo

Ich sitze gerade vor einem kleinen Problemchen und google konnte mir nicht helfen.

Situation:

ich habe eine Trackbar, welche
1. vom Programm geändert wird
2. von mir geändert wird.

Nun sollen aber bei im Onchange ereigniss der Trackbar je nachdem wer was andert unterschiedliche Dinge passieren.

Das muss ja irgendwie über den Sender zu realisieren gehen, nur wie?

ich habe mal debugt und immer steht da:
sender = ();

wie kann ich das realisieren?

das Programm ändert wie folgt:

Delphi-Quellcode:
trackbar1.position := x;
und ich ändere ja durch klicken
Nun gibt es aber kein Onmousedown und Onmouseup indem ich nen Bool umlegen könnte ob ich Klicke oder nicht.

Hoffe ihr versteht mein Problem und könnt mir helfen.

BUG 8. Mär 2008 21:00

Re: Sender:Tobject - Sender is Benutzer
 
Zitat:

Zitat von Noobinator
Nun gibt es aber kein Onmousedown und Onmouseup indem ich nen Bool umlegen könnte ob ich Klicke oder nicht.

Dann mach es doch andersrum:
Delphi-Quellcode:
var tudochwasanderes: boolean;
//...
tudochwasanderes := true;
trackbar1.position := x;
tudochwasanderes := false;
Ist vielleicht nicht die beste Lösung, aber es sollte funktionieren.

EDIT: Apropros, der Sender ist in beiden Fällen die Komponente, also im Beispiel "trackbar1".

MfG,
Bug

Phoenix 8. Mär 2008 21:03

Re: Sender:Tobject - Sender is Benutzer
 
Der Sender ist immer das Control, welches das Event auslöst. Das heisst wenn etwas Deine Trackbar ändert, ist der Auslöser (und damit der Sender) eigentlich immer die Trackbar selber.

Ich denke das von BUG wäre ein Straightforward Ansatz, den man in Erwägung ziehen sollte.

Jelly 8. Mär 2008 21:10

Re: Sender:Tobject - Sender is Benutzer
 
Das OnChange Event wird ausgelöst, wenn sich die Position ändert. Dies passiert unabhängig ob das manuell vom Benutzer gemacht wird, oder via Code durch Setzen der Position Eigenschaft. Der Sender im OnChange Event hat aber nix damit zu tun, sondern gibt ledilich das Objekt zurück, das das Ereignis ausgelöst hat. Und das ist in beiden Fällen die Trackbar Instanz, die geändert wurde. Damit wird lediglich ermöglicht, den gleichen Eventhandler für unterschiedliche Trackbars zu nutzen, sprich, den Code nicht doppelt zu schreiben, wenn analoges passieren soll.

Die OnMouseDown/Up Events kannst du getrost vergessen, da die Position auch über die Tastatur geändert werden kann, wenn das Control den Fokus hat.

Genau dein Problem finde ich ist eins von den Dingen, die in allen IDE Umgebungen ziemlich schlecht gelöst sind. Es bleibt in der Tat nur der Weg, über eine Zwischenvariable zu testen, ob die Position über Code oder vom Benutzer verändert wurde. Anders als BUG würde ich das aber nicht über eine globale oder Formvariable lösen, sondern über eine Eigenschaft der Trackbar selbst. Da bietet sich allerdings nur die Property Tag an. Das hat den Vorteil, dass der Trick auch bei mehreren Trackbar Instanzen funktioniert.

Noobinator 8. Mär 2008 21:20

Re: Sender:Tobject - Sender is Benutzer
 
ersmtal Danke euch allen =)

Funktioniert :thumb:

habe es mit der Variable gemacht.

Cyberbob 9. Mär 2008 03:59

Re: Sender:Tobject - Sender is Benutzer
 
du könntest allerdings auch alle Programminternen veränderungen der Trackbar über eine Eigene Procedure laufen lassen und dort entsprechen reagieren.
Wobei das mit dem Setzen von Tag schon eine recht gute Lösung ist!

Sharky 9. Mär 2008 06:41

Re: Sender:Tobject - Sender is Benutzer
 
Hai Noobinator,

ich würde mir für das setzen der Position eine Procedure schreiben und in dieser dann das OnChange-Event kurzzeitig deaktivieren.

Zum Beispiel so:
Delphi-Quellcode:
procedure SetTrackBarPosition(const aTB: TTrackBar; const aValue: Integer);
var
  oldTBChange: TNotifyEvent;
begin
  with aTB do
  begin
    oldTBChange := OnChange; // Original OnChange merken
    OnChange := NIL; // OnChange deaktivieren
    Position := aValue; // Wert setzen
    OnChange := oldTBChange; // Original OnChange wieder zuweisen
  end;
end;

procedure TDemo_Form.Button1Click(Sender: TObject);
begin
  SetTrackBarPosition(TrackBar1, 5);
end;

procedure TDemo_Form.TrackBar1Change(Sender: TObject);
begin
  Label1.Caption := IntToStr((Sender as TTrackBar).Position);
end;

Cyberbob 9. Mär 2008 15:36

Re: Sender:Tobject - Sender is Benutzer
 
genau so habe ich das gemeint


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