Hallo Ecco,
ich will dich ja nicht aus dem Konzept bringen, aber ich würde anders vorgehen.
Ich lege mir eine
Unit Global an:
Delphi-Quellcode:
unit Global;
interface
uses
Messages;
const
CM_RECALC = WM_USER;
type
TCMRecalc =
packed record
Msg: Cardinal;
iCol: integer;
iRow: integer;
Result: integer;
end;
implementation
end.
Diese
Unit binde ich in die Form-
Unit mit dem StringGrid ein. Meine Form erhält dann noch einen private message handler:
Delphi-Quellcode:
private
procedure CMRecalc(var msg: TCMRecalc); message CM_RECALC;
Und die Berechnung soll natürlich erst durchgeführt werden, wenn ich mit der Eingabe fertig bin:
Delphi-Quellcode:
procedure TCalcForm.SGSetEditText(Sender: TObject; ACol,
ARow: Integer;
const Value:
String);
begin
if not SG.EditorMode
then
PostMessage(
Handle, CM_RECALC, ACol, ARow);
end;
Jetzt muss der message handler noch implementiert werden:
Delphi-Quellcode:
procedure TCalcForm.CMRecalc(var msg: TCMRecalc);
begin
with msg do
begin
case iRow of
1:
begin
SG.Cells[iCol, 3] := FloatToStr(StrToFloate(SG.Cells[iCol, 1])
+ StrToFloate(SG.Cells[iCol, 2]));
end;
end;
end;
Den Code zum Berechnen des Zelleninhaltes habe ich von dir geklaut und verkürzt, nur um das Prinzip zu zeigen. Du wirst da noch einiges an safety code dazu geben müssen. Und wenn du wirklich wie in einem Spreadsheet rechnen möchtest, dann wirst du noch einen dependency tree aufbauen müssen nebst loop detection.
Freundliche Grüße vom marabu