小编p1.*_*1.e的帖子

如何使用自定义比较器对通用列表进行排序?

我有点像Delphi-newbie,我不知道如何调用TList of Records的Sort方法,以便按升序整数值对记录进行排序.我有如下记录:

 type
   TMyRecord = record
     str1: string;
     str2: string;
     intVal: integer;
   end;
Run Code Online (Sandbox Code Playgroud)

以及此类记录的通用列表:

TListMyRecord = TList<TMyRecord>;
Run Code Online (Sandbox Code Playgroud)

试图在帮助文件中找到代码示例并找到以下代码:

MyList.Sort(@CompareNames);
Run Code Online (Sandbox Code Playgroud)

我不能使用,因为它使用类.所以我尝试用一​​些不同的参数编写自己的比较函数:

function CompareIntVal(i1, i2: TMyRecord): Integer;
begin
  Result := i1.intVal - i2.intVal;
end;
Run Code Online (Sandbox Code Playgroud)

但是编译器总是抛出"不够的参数" - 当我调用它时出错open.Sort(CompareIntVal);,这看起来很明显; 所以我试图更接近帮助文件:

function SortKB(Item1, Item2: Pointer): Integer;
begin
  Result:=PMyRecord(Item1)^.intVal - PMyRecord(Item2)^.intVal;
end;
Run Code Online (Sandbox Code Playgroud)

与PMyRecord一样 PMyRecord = ^TMyRecord;

我尝试了不同的方法调用函数,总是得到一些错误......

delphi sorting

33
推荐指数
2
解决办法
3万
查看次数

使用(winsock)recv收到TStringStream会损坏吗?

我正在研究一个相当简单的客户端/服务器应用程序,并且在使用winsock API提供的recv从客户端接收TStringStream时遇到一些麻烦.
我不断收到此错误:'0x00000000访问冲突:读取地址0x00000000'.
客户端只将文本复制到TStringStream中,获取它的长度并将其发送到服务器.然后服务器接收Stream并输出它的文本.下面是一些抽象代码摘录.

{ the server's part }
inBuf := TStringStream.Create;
{ MAKE THIS SOCKET A PASSIVE ONE }
  listen(serversock, LISTENQ);
{ ACCEPT CONNECTION ON serversock FROM cliaddr -> CONNECTED SOCKET = connfd }
connfd := accept(serversock, @cliaddr, @len);
recv(connfd, inLen, sizeof(inLen), 0);
//up to here everything is fine with the strem: 
//Size = InLen, Position = 0, all bytes are '0'
rec := recv(connfd, inBuf, inLen, 0);
//rec = inLen, which is fine
//now this: inBuf: …
Run Code Online (Sandbox Code Playgroud)

delphi winsock stream recv

5
推荐指数
1
解决办法
534
查看次数

标签 统计

delphi ×2

recv ×1

sorting ×1

stream ×1

winsock ×1