Stringgrid onSelectCell

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
juelin
Beiträge: 296
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Stringgrid onSelectCell

Beitrag von juelin »

Hallo,
in Delphi habe ich immer, wenn ich wissen wolte weche Zeile der User angeklickt hat den Evenz
OnSelectCell ausgewertet.
Wenn ich das in Lazarus mache bekomme ich flasche Werte, da die Routine
procedure TForm1.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
var CanSelect: Boolean);
nicht nur beim anklicken des Stringgrids angesprungen wird, sondern immer wenn
im Stringgrid per Programm was gemacht wird (z. B. Stringgrid geladen wird).
Kann man das eventuell nit den Properties ändern?
Oder wie fragt man ab, welche Zeile der User angeklickt hat?
Danke und Gruß
Jürgen

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

Re: Stringgrid onSelectCell

Beitrag von theo »

Willst du auf das Ereignis reagieren oder willst du nur zu jedem Zeitpunkt wissen, welche Zeile ausgewählt ist?
Letzteres geht einfach mit StringGrid1.Row.

Ansonsten könnte man vor jeder programmatischen Änderung das Event "aushängen".
StringGrid1.OnSelectCell:=nil;
und danach wieder einhängen.

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Stringgrid onSelectCell

Beitrag von Zvoni »

Wenn es tatsächlich so ist, dass OnSelectCell beim programmatischen Ändern einer Zelle gefeuert wird (was ich äusserst seltsam finde), wäre eine Alternative zum "Aushängen des Events" eine Modulweite Boolean-Variable "EditFromCode" oder so ähnlich.

Immer wenn du eine Änderung aus dem Code machst (z.B. StringGrid laden), wird als allererstes diese variable auf True gesetzt, und im OnSelectCell prüfst du dann drauf

Code: Alles auswählen

Var EditFromCode:Boolean;

.......
Procedure LoadGrid;
Begin
  EditFromCode:=True;
  LoadGrid;  //Welches dann OnSelectCell feuert
  EditFromCode:=False;
End;

Procedure OnSelectCell;
Begin
  If Not EditFromCode Then
    Begin
       //Reagiere auf Auswahl der Zelle
    End;
End;
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
juelin
Beiträge: 296
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Stringgrid onSelectCell

Beitrag von juelin »

Danke für Eure Bemühungen.
Jetzt läuft es.
Hatte ich schon ein paar mal.
Erst läuft es nicht richtig, aber nach 3-5 Durchgängen klappt es dann,
Muß wohl an Lazarus liegen???
Ich habe halt daür gesorgt, das die Variable, die ich im OnSelectCell setzte,
an allen Stellen im Programm, wo ich sie nicht mehr brauche auf Null gesetzt.
Na ja quick and dirty.
Danke nochmal und Gruß
Jürgen

wp_xyz
Beiträge: 5191
Registriert: Fr 8. Apr 2011, 09:01

Re: Stringgrid onSelectCell

Beitrag von wp_xyz »

OnSelectCell wird aufgerufen, wenn eine andere Zelle angewählt wird. Zu Programmbeginn ist noch nichts ausgewählt und die aktuelle Zelle wird erst eingestellt. Aber da wird dann OnSelect gefeuert. Warum "muss das an Lazarus liegen"?

OnClick auf der anderen Seite kommt, wenn eine andere Zelle per Klick, Tastatur oder Code angewählt wird, also wie OnSelectCell, nur dass das initiale Event nicht kommt. Bei OnClick erhältst du die aktuelle Zelle aus den Row und Col Properties des StringGrid (StringGrid1.Row, StringGrid1.Col).

Die Vergabe der Events ist nicht immer logisch (z.B. dass OnClick auch kommt, wenn die Zelle per Code angewählt wird, also gar nichts angeklickt wird). Daher schreibe ich mir im Zweifelsfall ein kleines Projekt in dem das zu untersuchende Control bei den fraglichen Events eine Meldung in ein Memo schreibt - siehe Anhang
Dateianhänge
stringgrid_onselectcell.zip
(2.24 KiB) 104-mal heruntergeladen

schoschy
Beiträge: 56
Registriert: Di 18. Okt 2022, 15:46

Re: Stringgrid onSelectCell

Beitrag von schoschy »

Gibt es MUP/MDOWN, ich verwende kaum GUI Elemente in Lazarus.

Kann man ja auch einfach einen Boolean drüber machen.

Code: Alles auswählen

OnMouseDown
boolCheckClick:= True;
OnMouseUp
boolCheckClick:= False;
und im Slect.

Code: Alles auswählen

if boolCkeckClick then 
begin
...
end;
Tastaturselektierung fällt damit aber auch raus.

Antworten