I would like to return the contents of a cell in a string grid when the user finishes entering the data. The user is finished when pressing the enter key on the keyboard, or single- or double-clicking another cell.
In Lazarus there is a method of FinishedCellEditing, but not in Delphi. How can I detect it in Delphi?
This is the final version... Wow, I improved my own code (the other post I put before was the code I was using for years until today... I saw this post and I put the code I had... then I tried to fix my own code and I got it, wow!, I was trying that for years, now I finally got it).
It is quite tricky since, how on the hell I could imagine a cell could be selected with editor active?
Let's see how to do it:
var
MyStringGrig_LastEdited_ACol, MyStringGrig_LastEdited_ARow: Integer;
//To remember the last cell edited
procedure TmyForm.MyStringGrigSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
//When selecting a cell
if MyStringGrig.EditorMode then begin //It was a cell being edited
MyStringGrig.EditorMode:= False; //Deactivate the editor
//Do an extra check if the LastEdited_ACol and LastEdited_ARow are not -1 already.
//This is to be able to use also the arrow-keys up and down in the Grid.
if (MyStringGrig_LastEdited_ACol <> -1) and (MyStringGrig_LastEdited_ARow <> -1) then
MyStringGrigSetEditText(Sender, MyStringGrig_LastEdited_ACol, MyStringGrig_LastEdited_ARow,
MyStringGrig.Cells[MyStringGrig_LastEdited_ACol, MyStringGrig_LastEdited_ARow]);
//Just make the call
end;
//Do whatever else wanted
end;
procedure TmyForm.MyStringGrigSetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: string);
begin
//Fired on every change
if Not MyStringGrig.EditorMode //goEditing must be 'True' in Options
then begin //Only after user ends editing the cell
MyStringGrig_LastEdited_ACol:= -1; //Indicate no cell is edited
MyStringGrig_LastEdited_ARow:= -1; //Indicate no cell is edited
//Do whatever wanted after user has finish editing a cell
end else begin //The cell is being editted
MyStringGrig_LastEdited_ACol:= ACol; //Remember column of cell being edited
MyStringGrig_LastEdited_ARow:= ARow; //Remember row of cell being edited
end;
end;
This works for me like a charm.
Please note it requires two variables to hold last edited cell coordinates.
Please remember goEditing
must be True
in Options
.
Please sorry for the other post... that other code was the one I was using for years, since I did not get any better solution... until now.
I hope this helps others.
I do this by responding to WM_KILLFOCUS messages sent to the inplace editor. I have to subclass the inplace editor to make this happen.
I understand from Raymond Chen's blog that this is not appropriate if you then perform validation that changes the focus.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With