Stringgrid Popup-Menü -> Verweis auf aktuelle Zelle/Zeile

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Joh
Lazarusforum e. V.
Beiträge: 352
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Stringgrid Popup-Menü -> Verweis auf aktuelle Zelle/Zeile

Beitrag von Joh »

Moin,

ich möchte in einem Stringgrid mit einer Liste von Dateien eine Datei per PopUp-Menu automagisch öffnen.
Theoretisch klappt es so weit, praktisch scheitert es daran, das beim Rechtsklick die darunterliegende Zelle nicht den Focus erhält.

Im DBGrid gibt es das Element "dgAnyButtonCanSelect"; gibt es da im Stringgrid analoges?

aktuell habe ich es über eine globale Variable gelöst. aber das macht mich irgendwie nicht glücklich:

Code: Alles auswählen

procedure TfrmLpiStart.grdDateienMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var aCol, aRow: Integer;
begin
  grdDateien.MouseToCell(x, Y, aCol, aRow);
  aktZeile := aRow;
end;  
just my two Beer

Benutzeravatar
theo
Beiträge: 11259
Registriert: Mo 11. Sep 2006, 19:01

Re: Stringgrid Popup-Menü -> Verweis auf aktuelle Zelle/Zeile

Beitrag von theo »

Joh hat geschrieben: Mi 8. Apr 2026, 09:33 aktuell habe ich es über eine globale Variable gelöst. aber das macht mich irgendwie nicht glücklich:
Warum nicht?

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 311
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 4.3, FPC3.2.3
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Stringgrid Popup-Menü -> Verweis auf aktuelle Zelle/Zeile

Beitrag von h-elsner »

Dafür gibt es doch die Procedur MouseToCell(x, y, iCol, iRow); Damit kann man beim MouseUp Event (alle Mouse Events, die x,y Position melden) die daunterliegende Zelle im StringGrid ermitteln.

Sieben
Beiträge: 299
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Stringgrid Popup-Menü -> Verweis auf aktuelle Zelle/Zeile

Beitrag von Sieben »

Warum selektierst du die Zeile nicht gleich in deinem MouseDown? Der Event scheint ja vor dem PopUp zu kommen, sonst würde dir aktZeile ja auch nichts nützen. Dann hättest du beim PopUp genau die gewünschte Situation und kannst dir aktZeile sparen. Oder übersehe ich was?

Benutzeravatar
theo
Beiträge: 11259
Registriert: Mo 11. Sep 2006, 19:01

Re: Stringgrid Popup-Menü -> Verweis auf aktuelle Zelle/Zeile

Beitrag von theo »

Mir ist immer noch nicht ganz klar, wie das ablaufen soll, oder wo der Haken liegt.
Ich würde das PopupMenu nicht im Grid registrieren, sondern manuell auslösen.
Die Row kann man mit dem Row Property des StringGrid übergeben.
z.B. etwas in dieser Art:

Code: Alles auswählen

procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var aCol, aRow: Integer;
begin
  if ssRight in Shift then
  begin
    TStringGrid(Sender).MouseToCell(X, Y, aCol, aRow);
    TStringGrid(Sender).Row:=ARow;
    PopupMenu1.PopUp;
  end;
end;

procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
  TPopupMenu(Sender).Items[0].Caption:=StringGrid1.Row.ToString; //Test
end;

Joh
Lazarusforum e. V.
Beiträge: 352
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: Stringgrid Popup-Menü -> Verweis auf aktuelle Zelle/Zeile

Beitrag von Joh »

Alles ok...

Ich bin nur immer noch so gepolt, das globale Variablen nicht gut sind und ich von daher versuche drauf zu verzichten.
Die Art der Zuweisung liegt daran, das ich in einer anderen Prozedur ähnlichen mache und es für mich so auf den ersten Blick ersichtlich ist.
just my two Beer

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7267
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Stringgrid Popup-Menü -> Verweis auf aktuelle Zelle/Zeile

Beitrag von af0815 »

Joh hat geschrieben: Mi 8. Apr 2026, 21:07 Alles ok...

Ich bin nur immer noch so gepolt, das globale Variablen nicht gut sind und ich von daher versuche drauf zu verzichten.
Global ist ein dehnbarer Begriff. Man kann auch etwas Unit Global machen.

Vor allen, brauchst du das nur in einem Objekt, dann lass die Variable im Objekt.

Per se ist ja Global nicht komplett böse, man sollte es nur bewusst und gezielt einsetzen. Betonung liegt auf bewusst.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 11259
Registriert: Mo 11. Sep 2006, 19:01

Re: Stringgrid Popup-Menü -> Verweis auf aktuelle Zelle/Zeile

Beitrag von theo »

Oder wie oben gezeigt:

Code: Alles auswählen

  TStringGrid(Sender).Row:=ARow;
Löst das nicht dein Problem? Warum nicht?

Joh
Lazarusforum e. V.
Beiträge: 352
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: Stringgrid Popup-Menü -> Verweis auf aktuelle Zelle/Zeile

Beitrag von Joh »

theo hat geschrieben: Do 9. Apr 2026, 10:33 Oder wie oben gezeigt:

Code: Alles auswählen

  TStringGrid(Sender).Row:=ARow;
Löst das nicht dein Problem? Warum nicht?
Doch, jein...

Es ging mir ja nicht darum, eine programmatische Lösung zu finden, sondern darum, ob es einen eleganteren Weg gibt.

Irgendwie verstehe ich nicht, warum manche Funktionalitäten in TStringGrid und andere in TDBGrid drin sind.
In meiner kleinen Welt hätte ich die in den gemeinsamen Vorfahren TCustomGrid gepackt...
just my two Beer

Benutzeravatar
theo
Beiträge: 11259
Registriert: Mo 11. Sep 2006, 19:01

Re: Stringgrid Popup-Menü -> Verweis auf aktuelle Zelle/Zeile

Beitrag von theo »

Joh hat geschrieben: Do 9. Apr 2026, 11:34 Es ging mir ja nicht darum, eine programmatische Lösung zu finden, sondern darum, ob es einen eleganteren Weg gibt.
Ist das nicht elegant? Warum nicht?

Ich kann mit Aussagen wie "macht nicht glücklich" oder "eleganteren Weg" nicht viel anfangen.
Du musst schon sagen, was du haben willst.
Oder einfach weitermachen, wenn ein Problem gelöst ist. Zuviel grübeln macht auch nicht "glücklich". :wink:

Antworten