起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 106|回复: 9

【搞定】关闭后的问题

[复制链接]
发表于 2007-8-15 10:05:53 | 显示全部楼层 |阅读模式
当我关闭窗体时,跳出如图的错误.请问怎么解决?
我想应该是这段代码出错,帮开一下:

procedure TLRQCKC.BitBtn1Click(Sender: TObject);
begin
     ModalResult := business.Forms.Controls.mrOk;
end;

procedure TLRQCKC.Edit2Exit(Sender: TObject);
begin
     Edit3.Text := SysUtils.IntToStr(SysUtils.StrToInt(Edit1.Text)*SysUtils.StrToInt(Edit2.Text));
end;

procedure TLRQCKC.Edit3Exit(Sender: TObject);
begin
     if Edit1.Text = '0' then
        Edit2.Text := '0'
     else
         Edit2.Text := SysUtils.FloatToStr(SysUtils.StrToInt(Edit3.Text)/SysUtils.StrToInt(Edit1.Text));
end;

procedure TLRQCKC.Edit4Exit(Sender: TObject);
begin
     Edit5.Text := SysUtils.IntToStr(SysUtils.StrToInt(Edit1.Text)*SysUtils.StrToInt(Edit4.Text));
end;

procedure TLRQCKC.Edit5Change(Sender: TObject);
begin
     if Edit1.Text = '0' then
        Edit4.Text := '0'
     else
         Edit4.Text := SysUtils.FloatToStr(SysUtils.StrToInt(Edit5.Text)/SysUtils.StrToInt(Edit1.Text));
end;

procedure TLRQCKC.BitBtn2Click(Sender: TObject);
begin
     close;
end;

procedure TLRQCKC.Edit1Exit(Sender: TObject);
begin
     Edit3.Text := SysUtils.IntToStr(SysUtils.StrToInt(Edit1.Text)*SysUtils.StrToInt(Edit2.Text));
     Edit5.Text := SysUtils.IntToStr(SysUtils.StrToInt(Edit1.Text)*SysUtils.StrToInt(Edit4.Text));
end;

11e.jpg

12.1 KB, 下载次数: 82

回复

使用道具 举报

发表于 2007-8-15 10:48:20 | 显示全部楼层
不知道楼主是怎么操作的
也许是焦点的问题
试着加上这样的一个代码:
procedure TLRQCKC.BizFormShow(Sender: TObject);
begin
  Button2.SetFocus;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-15 11:38:32 | 显示全部楼层
如图:
金额=库存数量*单价
成本金额=库存数量*成本单价

如果填了库存数量和单价,那么就金额=库存数量*单价。这时候如果改变金额,那么单价=金额/库存数量。
这地方是不是有点像死循环了,才导致内存地址出错?

另外,2楼那句是什么意思呀?加上去了,没看到有任何效果~

33e.jpg

19.15 KB, 下载次数: 70

回复 支持 反对

使用道具 举报

发表于 2007-8-15 11:49:41 | 显示全部楼层
我这儿按你的代码试了一下,没有问题啊
你那个错误提示是在什么情况下出现的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-15 12:06:33 | 显示全部楼层
计算的时候没有错误,计算完了,把窗体关掉,就跳出来了~
回复 支持 反对

使用道具 举报

发表于 2007-8-15 12:12:21 | 显示全部楼层
没有啊
我这儿没有问题
录入数据--自动计算,然后点关闭不报错阿
是不是你这个界面关掉之后还有别的操作?(就是说这个界面是被调用的,调用完成之后还有别的操作?)
回复 支持 反对

使用道具 举报

发表于 2007-8-15 14:02:03 | 显示全部楼层
看一下您的FormShow和FormCreate事件吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-15 15:04:39 | 显示全部楼层
确实是被别的窗体调用的。
我是在别的窗体(A)中,调用本窗体(B)的。

A窗体的代码:
unit QCWTSP;

interface

uses
  Business.System, Business.Forms, Business.Data, Business.Model;

type
  TQCWTSP = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    BitBtn1: TBitBtn;
    DataSetBZSJJ1: TSQLDataSet;
    DataSource1: TDataSource;
    DataSetBZSJJ2: TSQLDataSet;
    DataSetBZSJJ3: TSQLDataSet;
    DataSetBZSJJ4: TSQLDataSet;
    BitBtn2: TBitBtn;
    DataGrid1: TDataGrid;
    DataGrid2: TDataGrid;
    DataSource2: TDataSource;
    DocViewBar1: TDocViewBar;
    BitBtn3: TBitBtn;
    DataGrid2DWBH: TDataGridColumn;
    DataGrid2SPBH: TDataGridColumn;
    DataGrid2DWQM: TDataGridColumn;
    DataGrid2SPQM: TDataGridColumn;
    DataGrid2GG: TDataGridColumn;
    DataGrid2XH: TDataGridColumn;
    DataGrid2CD: TDataGridColumn;
    DataGrid2DW: TDataGridColumn;
    DataGrid2KCSL: TDataGridColumn;
    DataGrid2DJ: TDataGridColumn;
    DataGrid2JE: TDataGridColumn;
    DataGrid2CBDJ: TDataGridColumn;
    DataGrid2CBJE: TDataGridColumn;
    DataGrid1SPBH: TDataGridColumn;
    DataGrid1SPQM: TDataGridColumn;
    DataGrid1GG: TDataGridColumn;
    DataGrid1XH: TDataGridColumn;
    DataGrid1CD: TDataGridColumn;
    DataGrid1DW: TDataGridColumn;
    DataGrid1Column7: TDataGridColumn;
    DataGrid1Column8: TDataGridColumn;
    DataGrid1Column9: TDataGridColumn;
    procedure BizFormCreate(Sender: TObject);
    procedure BizFormShow(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
  private
    {private declarations}
  public
    {public declarations}
  end;

implementation
var
   dwForm : XZCT1.TDWXZ;
   sgForm : TLRQCKC;

procedure TQCWTSP.BizFormCreate(Sender: TObject);
var
   i : integer;
begin
     DataSetBZSJJ2.Open;
     DataSetBZSJJ2.First;
     while not DataSetBZSJJ2.Eof do
     begin
          DataSetBZSJJ3.Open;
          DataSetBZSJJ3.First;
          while not DataSetBZSJJ3.Eof do
          begin
               i := 1;
               if not DataSetBZSJJ1.Eof = false then
                  i := 1;
               DataSetBZSJJ4.Open;
               DataSetBZSJJ4.First;
               while not DataSetBZSJJ4.Eof do
               begin
                    if (DataSetBZSJJ4.FieldByName['SPBH'].AsString = DataSetBZSJJ3.FieldByName['SPXX_SPBH'].AsString) and (DataSetBZSJJ4.FieldByName['DWBH'].AsString = DataSetBZSJJ2.FieldByName['DWXX_DWBH'].AsString) then
                    begin
                        i := 0;
                        break;
                    end;
                    DataSetBZSJJ4.Next;
               end;
               DataSetBZSJJ4.Edit;
               if i = 1 then
               begin
                    DataSetBZSJJ4.Append;
                    DataSetBZSJJ4.FieldByName['DWBH'].AsString := DataSetBZSJJ2.FieldByName['DWXX_DWBH'].AsString;
                    DataSetBZSJJ4.FieldByName['DWQM'].AsString := DataSetBZSJJ2.FieldByName['DWXX_DWQM'].AsString;
                    DataSetBZSJJ4.FieldByName['SPBH'].AsString := DataSetBZSJJ3.FieldByName['SPXX_SPBH'].AsString;
                    DataSetBZSJJ4.FieldByName['SPQM'].AsString := DataSetBZSJJ3.FieldByName['SPXX_SPQM'].AsString;
                    DataSetBZSJJ4.FieldByName['GG'].AsString := DataSetBZSJJ3.FieldByName['SPXX_GG'].AsString;
                    DataSetBZSJJ4.FieldByName['CD'].AsString := DataSetBZSJJ3.FieldByName['SPXX_CD'].AsString;
                    DataSetBZSJJ4.FieldByName['XH'].AsString := DataSetBZSJJ3.FieldByName['SPXX_XH'].AsString;
                    DataSetBZSJJ4.FieldByName['DW'].AsString := DataSetBZSJJ3.FieldByName['SPXX_DW'].AsString;
               end;
               DataSetBZSJJ3.Next;
          end;
          DataSetBZSJJ2.Next;
     end;
     DataSetBZSJJ4.ApplyUpdates;
     DataSetBZSJJ4.Close;
     DataSetBZSJJ2.Close;
     DataSetBZSJJ3.Close;
end;

procedure TQCWTSP.BizFormShow(Sender: TObject);
begin
     DataSource1.DataSet.Open;
     DataGrid1.ApplyBestFit(nil);
end;

procedure TQCWTSP.BitBtn1Click(Sender: TObject);
begin
     dwForm := XZCT1.TDWXZ.Create(self.Context);
     try
        if dwForm.ShowModal = business.Forms.Controls.mrOk then
        begin
             DataGrid1.Visible := false;
             DataGrid2.Visible := true;
             DataSource2.DataSet.Open;
             Edit1.Text := dwForm.DataSetBroker1.DataSet.FieldByName['DWXX_DWQM'].AsString;
        end;
     finally
            dwForm.Free;
     end;

end;

procedure TQCWTSP.Edit1Change(Sender: TObject);
begin
     if Edit1.Text <> '全部单位' then
     begin
          DataSetBZSJJ4.Close;
          DataSetBZSJJ4.SQLFilter := 'DWQM = '''+Edit1.Text+'''';
          DataSetBZSJJ4.SQLFiltered := true;
          DataSetBZSJJ4.Open;
          DataGrid2.ApplyBestFit(nil);
     end;
end;

procedure TQCWTSP.BitBtn2Click(Sender: TObject);
begin
     if Edit1.Text = '全部单位' then
     begin
          Dialogs.ShowMessage('现在为所有单位合计值,不能修改,请先选择某一单位后修改!');
     end
     else
     begin
          sgForm := TLRQCKC.Create(self.Context);
          if sgForm.ShowModal = Business.Forms.Controls.mrOk then
          begin
               DataSetBZSJJ4.Edit;
               DataSetBZSJJ4.FieldByName['KCSL'].AsString := sgForm.Edit1.Text;
               DataSetBZSJJ4.FieldByName['DJ'].AsString := sgForm.Edit2.Text;
               DataSetBZSJJ4.FieldByName['JE'].AsString := sgForm.Edit3.Text;
               DataSetBZSJJ4.FieldByName['CBDJ'].AsString := sgForm.Edit4.Text;
               DataSetBZSJJ4.FieldByName['CBJE'].AsString := sgForm.Edit5.Text;
               DataSetBZSJJ4.ApplyUpdates;
          end;
     end;
end;

procedure TQCWTSP.BitBtn3Click(Sender: TObject);
begin
     close;
end;

end.

B窗体的代码:
unit LRQCKC;

interface

uses
  Business.System, Business.Forms;

type
  TLRQCKC = class(TForm)
    Label1: TLabel;
    GroupBox1: TGroupBox;
    Bevel1: TBevel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
    procedure Edit2Exit(Sender: TObject);
    procedure Edit3Exit(Sender: TObject);
    procedure Edit4Exit(Sender: TObject);
    procedure Edit5Change(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
    procedure BizFormShow(Sender: TObject);
  private
    {private declarations}
  public
    {public declarations}
  end;

implementation


procedure TLRQCKC.BitBtn1Click(Sender: TObject);
begin
     ModalResult := business.Forms.Controls.mrOk;
end;

procedure TLRQCKC.Edit2Exit(Sender: TObject);
begin
     Edit3.Text := SysUtils.IntToStr(SysUtils.StrToInt(Edit1.Text)*SysUtils.StrToInt(Edit2.Text));
end;

procedure TLRQCKC.Edit3Exit(Sender: TObject);
begin
     if Edit1.Text = '0' then
        Edit2.Text := '0'
     else
         Edit2.Text := SysUtils.FloatToStr(SysUtils.StrToInt(Edit3.Text)/SysUtils.StrToInt(Edit1.Text));
end;

procedure TLRQCKC.Edit4Exit(Sender: TObject);
begin
     Edit5.Text := SysUtils.IntToStr(SysUtils.StrToInt(Edit1.Text)*SysUtils.StrToInt(Edit4.Text));
end;

procedure TLRQCKC.Edit5Change(Sender: TObject);
begin
     if Edit1.Text = '0' then
        Edit4.Text := '0'
     else
         Edit4.Text := SysUtils.FloatToStr(SysUtils.StrToInt(Edit5.Text)/SysUtils.StrToInt(Edit1.Text));
end;

procedure TLRQCKC.BitBtn2Click(Sender: TObject);
begin
     close;
end;

procedure TLRQCKC.Edit1Exit(Sender: TObject);
begin
     Edit3.Text := SysUtils.IntToStr(SysUtils.StrToInt(Edit1.Text)*SysUtils.StrToInt(Edit2.Text));
     Edit5.Text := SysUtils.IntToStr(SysUtils.StrToInt(Edit1.Text)*SysUtils.StrToInt(Edit4.Text));
end;

procedure TLRQCKC.BizFormShow(Sender: TObject);
begin
     BitBtn1.SetFocus;
end;

end.


代码全在这里,你们帮看一下。
回复 支持 反对

使用道具 举报

发表于 2007-8-15 15:22:52 | 显示全部楼层
楼主,这段代码有问题
没有释放sgForm
procedure TQCWTSP.BitBtn2Click(Sender: TObject);
begin
     if Edit1.Text = '全部单位' then
     begin
          Dialogs.ShowMessage('现在为所有单位合计值,不能修改,请先选择某一单位后修改!');
     end
     else
     begin
          sgForm := TLRQCKC.Create(self.Context);
          [B][I]try[/I] [/B]  
          if sgForm.ShowModal = Business.Forms.Controls.mrOk then
          begin
               DataSetBZSJJ4.Edit;
               DataSetBZSJJ4.FieldByName['KCSL'].AsString := sgForm.Edit1.Text;
               DataSetBZSJJ4.FieldByName['DJ'].AsString := sgForm.Edit2.Text;
               DataSetBZSJJ4.FieldByName['JE'].AsString := sgForm.Edit3.Text;
               DataSetBZSJJ4.FieldByName['CBDJ'].AsString := sgForm.Edit4.Text;
               DataSetBZSJJ4.FieldByName['CBJE'].AsString := sgForm.Edit5.Text;
               DataSetBZSJJ4.ApplyUpdates;
          end;
[I][B]          finally
              sgForm.Free;
          end;[/B] [/I]  
     end;
end;

另外,对于计算里面的那些
SysUtils.StrToInt(Edit1.Text)之类的
建议加上一个
try
except
end;
这样即使输入了一些非数字的也不会报一个错误给操作者。
还有,里面用了有除法,那万一除了之后为非整数的话,你用strtoint也会有问题的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-15 16:12:04 | 显示全部楼层
不好意思呀~没注意到没有释放sgForm窗体~
另外,非常感谢你的建议!!我这就加上去!可以结贴了,3Q~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-1-14 01:10 , Processed in 0.039936 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表