![]() |
Re: Wie zellsensitives Rechnen in StringGrid ?
ich habs
Trick 17 mit Selbstüberlistung. ? Es geht doch wohl nur OnKeyPressed oder OnSetEditText ? Neiin, es geht ja beides. siehe meinen Code:
Delphi-Quellcode:
Das wars, Danke danke
var
Form1: TForm1; Kai : Char; implementation {$R *.dfm} function StrToFloate(wert:String):single; begin if wert ='' then result :=0 else result := StrToFloat(wert); end; procedure TForm1.SG1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); var update:boolean; begin // if Kai = #13 then begin Case aRow of 1: begin SG1.Cells[ACol,3]:= FloatToStr(StrToFloate(SG1.Cells[ACol,1])+StrToFloate(SG1.Cells[ACol,2])); end; 2: begin SG1.Cells[ACol,3]:= FloatToStr(StrToFloate(SG1.Cells[ACol,1])+StrToFloate(SG1.Cells[ACol,2])); end; 3: begin SG1.Cells[ACol,1]:= FloatToStr(StrToFloate(SG1.Cells[ACol,2])+StrToFloate(SG1.Cells[ACol,3])); end; end; end; end; procedure TForm1.SG1KeyPress(Sender: TObject; var Key: Char); begin Kai := Key; end; end. E. B. |
Re: Wie zellsensitives Rechnen in StringGrid ?
HiGi
Jetzt doch noch mal eine Frage zu meinem Trick "17" (Eingabe mit OnKeyPressed und OnSetEditText in StringGrid steuern): Zellselektives Ereignissteuern im StringGrid mit OnSetEditText wird erst bei Key=#13 durch OnKeyPressed ausgelöst - klassisches gewontes Arbeiten mit Tabellen (siehe meinen Code oben) setzt doch voraus, daß EreignisProcedure OnKeyPressed immer vor OnSetEditText ausgeführt wird. Kann ich mich darauf verlassen, daß OnKeyPressed wirklich zuerst abgearbeitet wird? (Dieses war bisher auch unbewußt der Grund, wieso ich mich an eine solche Ereignisstrukur nicht herangetraut habe) Danke E. B. |
Re: Wie zellsensitives Rechnen in StringGrid ?
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:
Diese Unit binde ich in die Form-Unit mit dem StringGrid ein. Meine Form erhält dann noch einen private message handler:
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.
Delphi-Quellcode:
Und die Berechnung soll natürlich erst durchgeführt werden, wenn ich mit der Eingabe fertig bin:
private
procedure CMRecalc(var msg: TCMRecalc); message CM_RECALC;
Delphi-Quellcode:
Jetzt muss der message handler noch implementiert werden:
procedure TCalcForm.SGSetEditText(Sender: TObject; ACol,
ARow: Integer; const Value: String); begin if not SG.EditorMode then PostMessage(Handle, CM_RECALC, ACol, ARow); end;
Delphi-Quellcode:
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.
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; Freundliche Grüße vom marabu |
Re: Wie zellsensitives Rechnen in StringGrid ?
Danke danke, ich werd's heute abend proobieren.
E. B. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz