很简单,看清作答!!
看下面:
单价 数量 金额
10   10  100
单价输入,数量输入,金额自动改变,注意:输入过程就可以改变了,比如要数量输入20。当输入 2时,金额就会显示20了。也就是动态在变化的
补充:注意!!!!这个变化在StringGrid中的位置是指定性,比如我在第3行输入数据,那只有第三行的单价 数量 金额会发生变化,同理,我输入的也可能是第4行,也可能是第10行!行数定了,99行,但输入数据在哪一行是未知的,要判断的!
给代码吧。大概最后一次散分了。

解决方案 »

  1.   


    procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
      ARow: Integer; const Value: String);
    var
      f1,f2:Double;
    begin
      f1 := StrToFloatDef(StringGrid1.Cells[1,ARow],0);   //假如第一列是单价
      f2 := StrToFloatDef(StringGrid1.Cells[2,ARow],0);   //假如第二列是数量
      StringGrid1.Cells[3,ARow] := FloatToStr(f1*f2);     //假如第三列是金额
    end;
      

  2.   


    procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
      ARow: Integer; const Value: String);
    var
      cou,i,j:Integer;
      s:string;
    begin
      cou:=0;
      i:=(Sender as TStringGrid).ColCount;
      for j:=self.vg_fixcol to i-1 do
      begin
        s:=(Sender as TStringGrid).Cells[j,arow];
        if s='' then
          s:='0';
        cou:=cou+strtoint(s);
      end;
      (sender as TStringGrid).Cells[self.vg_fixcol-1,arow]:=IntToStr(cou);
    end;
      

  3.   

    可以通过,但StringGrid1.Cells[1,ARow]什么意思,跟FixRow没关系的吧,还有,没输入数字前那个第三列是金额就有0出现了
      

  4.   

    ARow是SetEditText事件中的参数,就是你所操作的在第几行
      

  5.   

    procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
      ARow: Integer; const Value: String);
    var
      f1,f2:Double;
    begin
      f1 := StrToFloatDef(StringGrid1.Cells[1,ARow],0);   //假如第一列是单价
      f2 := StrToFloatDef(StringGrid1.Cells[2,ARow],0);   //假如第二列是数量
      StringGrid1.Cells[3,ARow] := FloatToStr(f1*f2);     //假如第三列是金额end;
      if StringGrid1.Cells[3,ARow]='0' then StringGrid1.Cells[3,ARow]:='';
    end;
    改成这样
      

  6.   

    这个应该没问题
    而且既然你第三列是自动计算得出的,就不应该允许手动修改,通过这段代码,禁止手动修改第三列的值procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean);
    begin
      if ACol=3 then
        CanSelect:=false
      else
        CanSelect:=True;
    end;