Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#13

Re: Wie zellsensitives Rechnen in StringGrid ?

  Alt 15. Dez 2005, 12:00
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
  Mit Zitat antworten Zitat