Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 字符串连接不使用';行不通_String_Lazarus_Delphi - Fatal编程技术网

String 字符串连接不使用';行不通

String 字符串连接不使用';行不通,string,lazarus,delphi,String,Lazarus,Delphi,我创建了一个简单的类来存储从串行端口接收的数据,并根据特定条件将其拆分。我意识到它不能正常工作,所以我一步一步地重新编码,看看到底出了什么问题。我发现这是一个字符串连接。这是这个类的代码。失败的行是buffer=buffer+tail unit InBuffer; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type TInBuffer = class private

我创建了一个简单的类来存储从串行端口接收的数据,并根据特定条件将其拆分。我意识到它不能正常工作,所以我一步一步地重新编码,看看到底出了什么问题。我发现这是一个字符串连接。这是这个类的代码。失败的行是
buffer=buffer+tail

unit InBuffer;

{$mode objfpc}{$H+}

interface

uses
    Classes, SysUtils;

type
    TInBuffer = class
        private
            buffer: String;
            messages: TStrings;
        public
            constructor Create;
            destructor Destroy;
            procedure Add(tail: string);
            function getBuffer: String;
            function getLast: String;
            function DataAvailable: boolean;
    end;

implementation

constructor TInBuffer.Create;
begin
    buffer := '';
    messages := TStringList.Create;
end;

destructor TInBuffer.Destroy;
begin
    messages.Free;
    inherited Destroy;
end;

procedure TInBuffer.Add(tail: string);
begin
    buffer := buffer + tail;
end;

function TInBuffer.GetBuffer: String;
begin
    Result := buffer;
end;

function TInBuffer.GetLast: String;
begin
    if DataAvailable then
        begin
        Result := messages[0];
        messages.Delete(0);
        end;
end;

function TInBuffer.DataAvailable: boolean;
begin
    Result := messages.Count > 0;
end;

end.
我用它来交流。在OnRxData事件中,我有以下代码

procedure TfrmMain.serOnRxData(Sender: TObject);
var
    msg: string;
begin
    msg := ser.ReadData;
    buff.Add(msg);
    log('Stored buffer: ' + buff.getBuffer);
    log('Receive trace: ' + msg);
end;
在日志中,我在“接收跟踪”中看到了正确的数据,但“存储缓冲区”中的行始终相同(通信中接收到的第一条消息)。我尝试过使用
Copy
Concat
等函数来构建缓冲区,但没有任何变化

我可能做错了什么

谢谢

编辑: 根据Abelisto的建议,我将此代码放在按钮的onClick事件中

buff.Add('111');
buff.Add('222');
ShowMessage(buff.getBuffer);

显示的信息是正确的。因此,传递来自串行端口的数据时存在一些问题。它正确地显示在日志中,但不在缓冲区中。你知道为什么吗?

而诸如RS232之类的外部设备可以向端口发送任何你必须准备好的信息。在我们的例子中,设备发送空字符,该字符在C编写的操作系统中断开字符串。Pascal字符串可以处理它,但操作系统wigets不能。然而,我被类似于控制台的应用程序弄糊涂了,它可以很好地处理空字符。所以要小心。

您是否尝试过用更简单的方法测试您的类,比如
buff:=TInBuffer.Create;加上('111');加上('222');ShowMessage(buff.GetBuffer)?Hi Abelisto。谢谢你给我这个简单的主意。我试过了,它成功了,我在信息中得到了一个“111222”。所以你的问题在其他方面。祝你好运按照我的理解,复制您的错误。请尝试
logMemo.Lines.Add(FormatDateTime(fmt,now)+StringReplace(line,#0,,[rfReplaceAll])