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
Stringgrid onSelectCell
Re: Stringgrid onSelectCell
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.
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.
- 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
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
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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
- 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
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
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
Re: Stringgrid onSelectCell
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
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
Re: Stringgrid onSelectCell
Gibt es MUP/MDOWN, ich verwende kaum GUI Elemente in Lazarus.
Kann man ja auch einfach einen Boolean drüber machen.
und im Slect.
Tastaturselektierung fällt damit aber auch raus.
Kann man ja auch einfach einen Boolean drüber machen.
Code: Alles auswählen
OnMouseDown
boolCheckClick:= True;
OnMouseUp
boolCheckClick:= False;
Code: Alles auswählen
if boolCkeckClick then
begin
...
end;