我试图通过写入我的网络上的共享文件来创建一个简单的聊天程序

时间:2016-09-07 14:06:10

标签: delphi timer

我正在尝试使用计时器来检查文件的时间戳以检查它是否已被修改,如果这是真的,它必须将文本文件中的行添加到richedit。问题是它每隔1/4秒(定时器间隔)不断地将行添加到richedit。我尝试了不同的方法,但无法做到正确。

procedure TForm1.Timer1Timer(Sender: TObject);
Var
Filet : textfile;
filename, readtxt : string;
filedate1, filedate2 : integer;
begin

assignfile(filet, 'S:\share.talk');
filename := 'S:\share.talk';
filedate1 := FileAge(filename);

if filedate1 <> filedate2 then begin
reset(filet);
readln(filet, readtxt);
richedit1.lines.add(readtxt);
closefile(filet);
filedate2 := filedate1;
end;//if
end;

感谢所有人的帮助。

3 个答案:

答案 0 :(得分:5)

在您的代码中

if filedate1 <> filedate2 then begin
reset(filet);
readln(filet, readtxt);
richedit1.lines.add(readtxt);
closefile(filet);
filedate2 := filedate1;
end;

filedatefiledate2之间的比较假定这些值在Timer1Timer的调用之间保留其值。他们,因为它们被Timer1Timer声明为本地,因此被遗忘了#39在调用之间,因为它们存储在堆栈中。

要让他们保留他们的值,请删除Timer1Timer本地的声明,并将它们声明为TForm1的字段。

顺便说一下,请注意,使用此设计,您将遇到其他问题,例如如何处理对网络文本文件的并发访问等,但它们与您询问的具体问题无关。

答案 1 :(得分:1)

每次计时器滴答时你打开和关闭文件的问题。
TForm1.FormCreate上用TFileStream打开fmOpenReadWrite or fmOpenShareDenyNoneTForm1.FormDestroy参数的文件,关闭它TForm1.Timer1Timer,如果读取的字节数大于零,则在if (results.length) { // The data-chartdata attribute only holds the key value pairs of the data var chartData = []; function addValueToSeries(labelField, valueField) { var temp = {}; temp['value_label'] = record.fields[labelField]; // Number of series is dynamic, add a value to each series for (var i = 0; i < record.tables['Age'].length; i++) { temp['values_' + (i+1)] = record.tables['Age'][i].fields[valueField]; } chartData.push(temp); } addValueToSeries('pls_Age2', 'pls_ageAvg'); results.attr('data-chartData', JSON.stringify(chartData)); // Connect the series to the values var series = []; for (var i = 0; i < record.tables['Age'].length; i++) { series[i] = { 'title' : record.tables['Age'][i].fields['pls_ageAvg'], 'valueField' : 'values_' + (i+1) }; } var graphsData = { 'categoryField' : 'value_label', 'graphs' : series }; results.attr('data-graphsdata', JSON.stringify(graphsData)); } 上读取它,将缓冲区转换为字符串并将其添加到richedit中。

答案 2 :(得分:0)

这是因为每次在程序运行时重置filedate1和filedate2。实现此函数的更好方法是从过程返回lastwrite时间,并使用返回给您的lastwrite时间调用timer上的过程。然后,您可以比较当前时间和上次时间并进行刷新。在第一个循环中传递当前时间,然后在所有后续调用中继续使用lastread时间,其结果将继续更新上次读取的时间。