Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde? (https://www.delphipraxis.net/209116-wie-erfahre-ich-auf-welche-zeile-im-stringgrid-geklickt-wurde.html)

jumper63 28. Okt 2021 22:10

Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
SORRY!:(
War lang nicht dabei, hab bisher irgendwo alles finden können, was ich brauchte.
Aber, seit WOCHEN suche ich und finde nicht!

In Stringgrid.MousDown erfahre ich die Maus-Koordinaten, aber ich benötige
die Angabe Col,Row, um die Werte der jeweiligen Zeile auszulesen.

Habe dies hier gefunden, aber beim Klick auf eine Zeile/Zelle zeigt mir die ListBox
völlig falsche Werte an!
BIN ABSOLUT DANKBAR für EURE HILFE!!!

Folgender Befehl bezieht sich doch auf die gesamte Form, oder?
p:=ScreenToClient(Point(x, y));

Delphi-Quellcode:
procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var  p: TPoint;
Col,Row: Integer;
begin
with StringGrid1 do// 
     begin        //
     L:=Left;     //
     T:=Top;      //
p:= ScreenToClient(Point(x, y));
//StringGrid1.MouseToCell(p.x, p.y, Col, Row); // Alt HOHE FEHLER Quote
StringGrid1.MouseToCell(p.x+L, p.y+T, Col, Row);// Neu geringe FEHLER Quote
ListBox1.Items.Add('Col,Row='+IntToStr(Col)+','+IntToStr(Row));
PopUpMenu1.PopUp(Mouse.CursorPos.X, Mouse.CursorPos.Y);// Das klappt
end;
Col,Row Werte stimmen NICHT mit geklickter Zeile/Zelle überein!

Nachtrag, hab die x,y Werte von ScreenToClient etwas verändert,
so wird Col,Row (fast)richtig angezeigt-
StringGrid1ToClient nimmt Delhi nicht

KodeZwerg 29. Okt 2021 04:13

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Hallo, ich gebe ein kleines Beispiel, lege dazu ein mousedown event an:
Delphi-Quellcode:
procedure TForm17.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  ACol, ARow: Integer;
begin
  StringGrid1.MouseToCell(X, Y, ACol, ARow); // hier bekommt ACol und ARow ihre entsprechenden werte
  Edit1.Text := StringGrid1.Cells[ACol, ARow]; // hier lese ich die zelle aus
end;
Viel spass

Jasocul 29. Okt 2021 06:19

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Oder man nimmt das Event OnSelectCell.

hoika 29. Okt 2021 06:54

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Hallo,
er will aber ein PopupMenu erstellen.
Und das wahrscheinlich auf die rechte Maustaste.

KodeZwerg 29. Okt 2021 07:09

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Zitat:

Zitat von hoika (Beitrag 1496753)
Hallo,
er will aber ein PopupMenu erstellen.
Und das wahrscheinlich auf die rechte Maustaste.

Zitat:

Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
hmmmm, mal abwarten (-:

Jasocul 29. Okt 2021 07:25

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Sorry, ich habe nur den Text gelesen und nicht den Source (der nicht mal compilieren würde).
Aber auch im Source steht nichts von rechter Maustaste. D.h.: Das PopUp wird auch bei linker Maustaste angezeigt. Und wenn ich schon am meckern bin: Bitte kein "with" im Source.:wink:

hoika 29. Okt 2021 07:33

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Hallo,
das mit der rechten Maustaste hatte ich so im Gefühl ;)

Delphi.Narium 29. Okt 2021 09:38

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Zitat:

Zitat von jumper63
aber ich benötige die Angabe Col,Row, um die Werte der jeweiligen Zeile auszulesen.

Dafür braucht man eher kein Menü, egal mit welcher Maustaste.

Genauer als
Zitat:

Zitat von Jasocul
Oder man nimmt das Event OnSelectCell.

geht es da nicht.

KodeZwerg 29. Okt 2021 09:46

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
OnSelect wird doch auch gefeuert wenn man mit Tastatur sich im Grid bewegt? (auf welche Zeile im Stringgrid geklickt wurde = maus event)

Delphi.Narium 29. Okt 2021 10:24

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Zitat:

Zitat von KodeZwerg (Beitrag 1496767)
OnSelect wird doch auch gefeuert wenn man mit Tastatur sich im Grid bewegt? (auf welche Zeile im Stringgrid geklickt wurde = maus event)

Und für die Leute, die "so dreist sind" ;-) das Programm per Tastatur zu bedienen, bauen wir eine extra Lösung?

Ein Programm, bei dem ich bestimmte Aktionen nur per Maus erreichen kann, benutze ich nicht.

KodeZwerg 29. Okt 2021 11:04

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
ich möchte weder streiten noch recht bekommen deswegen verlasse ich dieses thema.

Delbor 29. Okt 2021 12:35

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Hi jumper63

Vielleicht hilft dir ja auch das da oder auch dies.

Zitat:

//StringGrid1.MouseToCell(p.x, p.y, Col, Row);
Der Fehler hier war:
1. Du hast den werten p.x und p.y keine Inhalte zugewiesen (nicht initialisiert). Somit enthalten die beiden Zufallswerte.
oder
2. Du hättest statt einer TPointstruktur auch X & Y direkt verwenden können.

Gruss
Delbor

himitsu 29. Okt 2021 14:46

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Zitat:

Zitat von Delbor (Beitrag 1496777)
Du hast den werten p.x und p.y keine Inhalte zugewiesen (nicht initialisiert). Somit enthalten die beiden Zufallswerte.

Doch, hat er.
Zitat:

Delphi-Quellcode:
p := ScreenToClient(...

Und zu 2 ... nein, da ScreenToClient kein X und Y einzeln liefert.

Wobei ScreenToClient eh falsch war, da X und Y garkeine Screen- sondern bereits Client-Koordinaten sind
und da dann nochmal relative Client-Koordinaten (Left/Top, also Grid zu seinem Owner) dazuaddiert ... da kann ja nichts Sinnvolles bei raus kommen.

Aber will MouseToCell nun Screen- oder Client-Koordinaten?

Touchscreen ohne Tastatur ... och der Arme hat nichtmal ein Handy


Und WARUM sind L und T globale Variablen?

jumper63 29. Okt 2021 19:21

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Hallo KodeZwerg!

MEGAVIELEN DANK!
Klappt PERFEKT!

jumper63 29. Okt 2021 19:30

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Aber warum Bitte kein with im code??

Naja, bei nur 2 Zuweisungen unnötig.

Delbor 29. Okt 2021 21:20

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Hi jumper63

Zitat:

Zitat von jumper63 (Beitrag 1496809)
Aber warum Bitte kein with im code??

Naja, bei nur 2 Zuweisungen unnötig.

Alles zwischen with und dem zugehörigen end bezieht sich auf das selbe Object. Die Chance ist gross, das einer im Verlauf der Entwicklung eine Property einer andern Komponente ansprechen will und vergisst, dieses andere Objekt explizit zu adressieren (Object.Property) und dann stundenlang nach dem Fehler sucht. Und natürlich wird nicht da gesucht, wo der Code scheinbar so leicht lesbar ist und desshalb 'garantiert' ohne Fehler. Oder du hast mehrere Edits und ein Struktur wie X := TEdit(Property). Und jetzt mussder Compiler entscheiden, welches Edit du meinst.
Fazit: ein 'with' spart nur scheinbar Tipparbeit, sorgt aber in vielen Fällen für mehr Arbeit andere Aert.
Tipparbeit kann man sich auch per Drag&Drop sparen.

Und meine Argumente sind bestimmt nicht die einzigen...

Gruss
Delbor

himitsu 29. Okt 2021 22:19

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
Beispiel TRect.

früher ging sowas wie
Delphi-Quellcode:
with MyRect do begin
  Width := Right - Left;
  Height := Bottom - Top;
Um die Größe einer Form zu setzen (z.B. im OnCreate), und jetzt wunderst du dich, dass scheinbar garnichts mehr passiert, obwohl der Compiler sagt "alles OK", weil
Delphi-Quellcode:
with MyRect do begin
  Self.Width := Right - Left;
  Self.Height := Bottom - Top;

// oder
Self.Width := MyRect.Right - MyRect.Left;
Self.Height := MyRect.Bottom - MyRect.Top;
dir zu lang war.


alt
Delphi-Quellcode:
  TRect = record
  case Integer of
    0: (Left, Top, Right, Bottom: FixedInt);
    1: (TopLeft, BottomRight: TPoint);
  end;
neu (Auszug, weil knapp 100 Zeilen)
Delphi-Quellcode:
  TRect = record
  private
    ...
  public
    ...
    property Width: Integer read GetWidth write SetWidth;
    property Height: Integer read GetHeight write SetHeight;

  case Integer of
    0: (Left, Top, Right, Bottom: FixedInt);
    1: (TopLeft, BottomRight: TPoint);
  end;

seit 10.4 (10.3) darf man gern Inline-Variablen verwenden
Delphi-Quellcode:
var R := MyRect; // mitten im Code, also "inline"
Width := R.Right - R.Left;
Height := R.Bottom - R.Top;
wobei ich in diesem Fall eher "absolute" verwenden würde, wenn mir "MyRect" zu lang ist.
Delphi-Quellcode:
var
  R: TRect absolute MyRect;
begin
  Width := R.Right - R.Left;
  Height := R.Bottom - R.Top;
Aber da ich faul bin, mach ich natürlich
Delphi-Quellcode:
Width := MyRect.Width;
Height := MyRect.Height;

// oder
Self.Width := MyRect.Width;
Self.Height := MyRect.Height;

jumper63 30. Okt 2021 23:21

AW: Wie erfahre ich, auf welche Zeile im Stringgrid geklickt wurde?
 
DANKE euch für die tollen Tipps!!!
Bin absolut LERNBEREIT!


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