我正在尝试使用计时器来检查文件的时间戳以检查它是否已被修改,如果这是真的,它必须将文本文件中的行添加到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;
感谢所有人的帮助。
答案 0 :(得分:5)
在您的代码中
if filedate1 <> filedate2 then begin
reset(filet);
readln(filet, readtxt);
richedit1.lines.add(readtxt);
closefile(filet);
filedate2 := filedate1;
end;
filedate
和filedate2
之间的比较假定这些值在Timer1Timer
的调用之间保留其值。他们不,因为它们被Timer1Timer
声明为本地,因此被遗忘了#39在调用之间,因为它们存储在堆栈中。
要让他们保留他们的值,请删除Timer1Timer
本地的声明,并将它们声明为TForm1的字段。
顺便说一下,请注意,使用此设计,您将遇到其他问题,例如如何处理对网络文本文件的并发访问等,但它们与您询问的具体问题无关。
答案 1 :(得分:1)
每次计时器滴答时你打开和关闭文件的问题。
在TForm1.FormCreate
上用TFileStream
打开fmOpenReadWrite or fmOpenShareDenyNone
个TForm1.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时间,其结果将继续更新上次读取的时间。