2016-03-03 28 views
0

我有一个日志文件,我希望保持较小。文本字段中的先入先出行

我有一个TDBListBox。

我有一个通过串行端口传入数据流。

procedure LogIt(tStr : String); 
begin 
    dm.tblLogs.Edit; 
    dm.tblLogs.FieldByName(fldCommands).AsString:= 
    dm.tblLogs.FieldByName(fldCommands).AsString+#10+tStr; 
    dm.tblLogs.Post; 
end; 

这是工作,但该名单还在不断增加,我也不需要比对过去十年的条目多。

我能想到这样做的唯一方法是野外数据加载到不可见TMemo然后

if Memo1.Lines.Count > 0 then 
    Memo1.Lines.Delete(0); 

加入下一行之前,然后通过Memo.Lines.Text到数据库字段。

有没有更好的方法?

回答

0

您可以使用TStringList而不是TMemo。但是,是的,您可以在内存中维护一个单独的日志消息列表,然后在列表更新时仅将最新的10条消息保存到数据库。例如:

var 
    log: TStringList; 

... 

log := TStringList.Create; 
log.Capacity := 10; 

... 

procedure LogIt(tStr : String); 
begin 
    while log.Count >= 10 then 
    log.Delete(0); 
    log.Add(tStr); 

    dm.tblLogs.Edit; 
    try 
    dm.tblLogs.FieldByName(fldCommands).AsString := log.Text; 
    dm.tblLogs.Post; 
    except 
    dm.tblLogs.Cancel; 
    end; 
end; 
+0

感谢雷米,这(使用TRY)比我有想法,当我列出的TMemo方法,它只是似乎有点麻烦,但更多的我看它有点亲切,这是关于就像它可以用TStringList得到的一样光滑。我在Tlistbox中显示文本(AfterScroll),所以我必须像上面那样添加#10。如果我使用#10#13,我会在列表框中找到一个空行。 – user2175495

+0

然后,您不正确显示列表框中的数据。无论如何,你可能会考虑升级到Delphi的现代版本。 'TStrings'在过去的十年中已经拥有了一个'LineBreak'属性(因为肯定可能会在更早的时候出现在Delphi 2006中)。 –

+0

谢谢,我在2006年购买了2005年,并已安装和卸载了很多次。恨它。与GExperts等D5-ent是更友好的方式。另外,请问“不显示..正确”是基于什么?我正在修改一些非常旧的软件,为了改变而改变事物并不是很明智的做法。 – user2175495