Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi feststellen ob geklickt ohne Klick-Prozedur (https://www.delphipraxis.net/35316-feststellen-ob-geklickt-ohne-klick-prozedur.html)

TheAn00bis 5. Dez 2004 15:46


feststellen ob geklickt ohne Klick-Prozedur
 
Hi,

Ich habe 40Panels und will herausfinden, welches geklickt wurde. Natürlich könnte ich für jedes die onClick-Procedur festlegen und dann in eine Variable schreiben ob es geklickt wurde, allerdings wäre das bei der Menge sehr aufwändig. Gibt es eine andere Möglichkeit festzustellen, welche geklickt wurde? (so Ereignisprozedur artig - ich weiß nicht ob der Begriff in Delphi anwendbar ist)

Dani 5. Dez 2004 15:50

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Zitat:

Zitat von TheAn00bis
Natürlich könnte ich für jedes die onClick-Procedur festlegen und dann in eine Variable schreiben ob es geklickt wurde, allerdings wäre das bei der Menge sehr aufwändig.

Du kannst doch einfach allen Panel dieselbe OnClick Prozedur zuweisen :)
(Designzeit: Panels markieren -> Ereignisse -> OnClick -> Doppelklick)

TheAn00bis 5. Dez 2004 15:52

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Und wie finde ich dann raus welches Panel es war das geklickt wurde?

mirage228 5. Dez 2004 15:53

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Zitat:

Zitat von TheAn00bis
Und wie finde ich dann raus welches Panel es war das geklickt wurde?

OnClick hat einen Parameter "Sender", der gleich der Komponente ist, die geklickt wurde (bzw. von welcher die Aktion ausgeht). :)=

mfG
mirage228

Dani 5. Dez 2004 15:53

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Im OnClick Event gibt es den Parameter Sender. Dieses Objekt hat den Event ausgelöst.

TheAn00bis 5. Dez 2004 15:57

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Sorry, das ich mich vielleicht so dumm anstelle, aber wie kann ich den Namen des Senders in einer Variable speichern?

mirage228 5. Dez 2004 16:00

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Zitat:

Zitat von TheAn00bis
Sorry, das ich mich vielleicht so dumm anstelle, aber wie kann ich den Namen des Senders in einer Variable speichern?

Hi,

z.B. so

Delphi-Quellcode:
var
  CompName: string;
begin
  if (Sender is TComponent) then
    CompName := TComponent(Sender).Name else
  CompName := Sender.Classname; // falls es keine Komponente ist
end;
mfG
mirage228

Neutral General 5. Dez 2004 16:01

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Sender : TObject

->

Delphi-Quellcode:
var DeinObject : TObject;

procedure TPanel1.Click(Sender : TObject);
begin
  DeinObject := Sender;
end;
So würde ichs machen

Neutral General 5. Dez 2004 16:02

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Zitat:

Zitat von mirage228
Hi,

z.B. so

Delphi-Quellcode:
var
  CompName: string;
begin
  if (Sender is TComponent) then
    CompName := TComponent(Sender).Name else
  CompName := Sender.Classname; // falls es keine Komponente ist
end;
mfG
mirage228

Sokann man aber nicht auf das Panel zugreifen oder ?? :gruebel:

[edit]Ups... Doppelpost :duck: [/edit]

mirage228 5. Dez 2004 16:04

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Zitat:

Zitat von Neutral General
Zitat:

Zitat von mirage228
Hi,

z.B. so

Delphi-Quellcode:
var
  CompName: string;
begin
  if (Sender is TComponent) then
    CompName := TComponent(Sender).Name else
  CompName := Sender.Classname; // falls es keine Komponente ist
end;
mfG
mirage228

Sokann man aber nicht auf das Panel zugreifen oder ?? :gruebel:

Nun, er hat gefragt, wie er den Namen des Senders (= des Panels) speichern kann. Was er damit macht, weiss nicht.
Wenn man wieder das Panel haben will, muss man halt Delphi-Referenz durchsuchenFindComponent verwenden.

mfG
mirage228

Neutral General 5. Dez 2004 16:05

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Ok ich nehm alles zurück :oops:

TheAn00bis 5. Dez 2004 16:18

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Aber ich brauch doch für find Component erst mal das Sufix des Panels oder nicht?

Ach ich erklär einfach alles:

Also jedes der PAnel hat eine andere Farbe, jetzt will ich rausfinden, welche Farbe das geklickte Panel hat. Allerdings eben nicht für jedes PAnel eine neue Procedure. Leider hat ein Panel ja kein Canvas, deshalb geht Panel1.Canvas.pixels[x,y] ja nicht. Allerdings will ich auch kein Bild nehmen und ein Grid ist mir zu aufwendig.

mirage228 5. Dez 2004 16:22

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Zitat:

Zitat von TheAn00bis
Aber ich brauch doch für find Component erst mal das Sufix des Panels oder nicht?

Ach ich erklär einfach alles:

Also jedes der PAnel hat eine andere Farbe, jetzt will ich rausfinden, welche Farbe das geklickte Panel hat. Allerdings eben nicht für jedes PAnel eine neue Procedure. Leider hat ein Panel ja kein Canvas, deshalb geht Panel1.Canvas.pixels[x,y] ja nicht. Allerdings will ich auch kein Bild nehmen und ein Grid ist mir zu aufwendig.

Hi,

dann würde ich folgendes machem.

Im private oder public Bereich Deines Forms (je nach dem, wo du es brauchst) erstellst Du eine Variable vom Typ Delphi-Referenz durchsuchenTColor.
(In dem Beispiel nenne ich die Variable mal "MyColorVar")

Dein Panel kennt ja die Eigenschaft Color, also dürfte das ganz passend sein.

In die OnClick-Methode, die Du jedem Panel zuweist, schreibst du Folgendes:
Delphi-Quellcode:
begin
  if (Sender is TPanel) then
    MyColorVar := TPanel(Sender).Color;
end;
mfG
mirage228

TheAn00bis 5. Dez 2004 16:30

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Hab vielen Dank, klappt perfekt!

Noch eine Frage, die if Abfrage ist doch eigentlich überflüßig, da die Procdur ja nur bei einem Panel-Klick ausgeführt wird, oder? Und was ich nicht verstehe, wenn der Sender TPanel ist (dann steht ja in "Sender" nur TPanel oder nicht?), warum erkennt der dann mit TPanel(Sender).Color; die Nummer des PAnels?


Anubis, besser gleich richtig fragen....

Jens Schumann 5. Dez 2004 16:33

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Zitat:

Zitat von TheAn00bis
... Leider hat ein Panel ja kein Canvas, deshalb geht Panel1.Canvas.pixels[x,y] ja nicht. ...

Das ist so nicht richtig. TPanel hat eine Canvas property. Nur nicht sichtbar, da protected.
So ein Problem lößt man am schnellsten mit einem TPanel-Dummy.
Hier kommt der Dummy:
Delphi-Quellcode:
Type
  TPanelCanvas = class(TPlanel)
  public
    property Canvas;
  end;
Das ist erstmal alles!
Jetzt kannst Du in dem OnMouseUpEventhandler folgendes schreiben
Delphi-Quellcode:
procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  If Sender is TPanel then
    TPanelCanvas(Sender).Canvas.Pixels[X,Y]:=clRed;
end;
Wie man sieht, wird nie eine Instanz der TPanelCanvas erzeugt, sondern das Ding
wird nur für einen Typecast verwendet.

In der Anlage ist ein kleines Beispiel

mimi 5. Dez 2004 16:38

Re: feststellen ob geklickt ohne Klick-Prozedur
 
er erkennt keien nummer sonder die farbe *G* in sender steht der name drin von wo aus die procedure aufgerufen wurden ist und jetzt kann man mit sender is TPannel prüfen ob es ein TPannel überhaupt ist, ist es nur eine sicherheitsabrfage.

TheAn00bis 5. Dez 2004 16:39

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Danke für deine Antwort, Jens!

Ist wirklich nützlich zu wissen, dass es möglich ist, auf ein Panel zu zeichnen. Gibt es denn noch mehr Objekte mit einem versteckten Canvas? Wie finde ich das raus? [hoffe das geht nicht zu sehr ins OT...]


Zitat:

Zitat von mimi
er erkennt keien nummer sonder die farbe *G* in sender steht der name drin von wo aus die procedure aufgerufen wurden ist und jetzt kann man mit sender is TPannel prüfen ob es ein TPannel überhaupt ist, ist es nur eine sicherheitsabrfage.

die Farbe erkennt er durch das .color, das ist selbst mir klar :P. Aber was genau steht denn jetzt im Sender? Panel1, oder was, was macht dann das TPanel davor? Ich schreib doch sonst auch nicht TPanel.Panel1.Color sondern nur Panel1.color.

Jens Schumann 5. Dez 2004 16:40

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Zitat:

Zitat von mimi
er erkennt keien nummer sonder die farbe *G* in sender steht der name drin von wo aus die procedure aufgerufen wurden ist und jetzt kann man mit sender is TPannel prüfen ob es ein TPannel überhaupt ist, ist es nur eine sicherheitsabrfage.

Achtung: In Sender steht nicht der Name, sondern es handelt um eine Referenz auf das Objekt, dass das Event ausgelöst hat.

Jens Schumann 5. Dez 2004 16:42

Re: feststellen ob geklickt ohne Klick-Prozedur
 
Zitat:

Zitat von TheAn00bis
Danke für deine Antwort, Jens!

Ist wirklich nützlich zu wissen, dass es möglich ist, auf ein Panel zu zeichnen. Gibt es denn noch mehr Objekte mit einem versteckten Canvas? Wie finde ich das raus? [hoffe das geht nicht zu sehr ins OT...]

Ganz einfach - in den VCL-Sourcecode schauen.
Alle Nachfahren von TCustomControl und TGraphicControl haben die Canvas property.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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 by Thomas Breitkreuz