很简单,看清作答!!
看下面:
单价 数量 金额
10 10 100
单价输入,数量输入,金额自动改变,注意:输入过程就可以改变了,比如要数量输入20。当输入 2时,金额就会显示20了。也就是动态在变化的
补充:注意!!!!这个变化在StringGrid中的位置是指定性,比如我在第3行输入数据,那只有第三行的单价 数量 金额会发生变化,同理,我输入的也可能是第4行,也可能是第10行!行数定了,99行,但输入数据在哪一行是未知的,要判断的!
给代码吧。大概最后一次散分了。
看下面:
单价 数量 金额
10 10 100
单价输入,数量输入,金额自动改变,注意:输入过程就可以改变了,比如要数量输入20。当输入 2时,金额就会显示20了。也就是动态在变化的
补充:注意!!!!这个变化在StringGrid中的位置是指定性,比如我在第3行输入数据,那只有第三行的单价 数量 金额会发生变化,同理,我输入的也可能是第4行,也可能是第10行!行数定了,99行,但输入数据在哪一行是未知的,要判断的!
给代码吧。大概最后一次散分了。
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;
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;
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;
改成这样
而且既然你第三列是自动计算得出的,就不应该允许手动修改,通过这段代码,禁止手动修改第三列的值procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if ACol=3 then
CanSelect:=false
else
CanSelect:=True;
end;