Delphi无法正确终止I / O进程

时间:2015-09-17 09:10:07

标签: delphi delphi-7

Delphi没有写最后几行。
一个程序为每一行调用public void StartWorking() { MessageBox.Show(taskName2 + " " + DateTime2 + " " + More2); ListViewItem lvi = new ListViewItem(taskName2); lvi.SubItems.Add(DateTime2); lvi.SubItems.Add(More2); listView1.Items.Add(lvi); }

writeToText(a1, a2, ...)

示例输出:

  

UPDATE POSITIONS SET ODOMETER = 904068,1 WHERE LABEL =' 34 XXX 11' AND POSITIONNO =' 12110126' AND ODOMETER = 904092,2;

     

UPDATE POSITIONS SET ODOMETER = 904068,1 WHERE LABEL =' 01 AL 101' AND POSITIONNO =' 165556' AND ODOMETER = 904092,2;

     

UPDATE POSITIONS SET ODOMETER = 904148,7

2 个答案:

答案 0 :(得分:2)

您的代码的某些部分可能会在F_TextTQuerySQL来电之间的Create课程之外访问Destroy变量。

只要在单元的TQuerySQL部分声明F_Text,就可以同时运行类var的多个实例。

如果没有理由这样做,您可以考虑将其private

type
  TQuerySQL = class
    private
      F_Text: TextFile;
    public
      Constructor Create;
      Destructor Destroy; override;
      procedure writeToText( plate:String; positionNo:String; newOdometer:String; oldOdometer:String);
  end;

同样适用于:

tconnect : TADOConnection;
tquery : TADOQuery;

为了避免在同一个单元中出现错误,您也可以考虑将strict关键字添加到班级的private部分。

除了上述内容之外,执行除析构函数中释放的对象以外的任务通常不是一种好习惯。

我的建议是考虑使用额外的公共方法来执行关闭操作,让析构函数完成它的工作。

public
  procedure writeToTextClose;

。 。

procedure TQuerySQL.writeToTextClose;
begin
  CloseFile(F_Text);
  tquery.Close;
  tconnect.Close;
  ShowMessage('write to text finished');
end;

destructor TQuerySQL.Destroy;
begin
  tquery.Free;
  tconnect.Free;
  inherited;
end;

任务可以像这样完成:

var
  qSql: TQuerySQL;

. . .

qSql := TQuerySQL.Create;
try

  try
    //here multiple calls to writeToText take place
    qSql.writeToText(a1, a2, ...);

  finally
    //ensure CloseFile(F_Text) at least
    qSql.writeToTextClose;
  end;

finally
  //ensure objects freeing
  qSql.Free;
end;

答案 1 :(得分:1)

在关闭文件之前尝试刷新缓冲区:

Flush(F_Text);