小编dum*_*uch的帖子

是否存在用于存储对象的已排序TStringList的泛型?

我想存储按列表中的名称排序的对象.应忽略重复项,添加后应自动释放对象.在pre-generics时代,我会使用像这样的TStringList:

List := TStringList.Create;
List.Sorted := true;
List.Duplicates := dupIgnore;

List.AddObject('bla', TSomeObject.Create({parameters go here});
List.AddObject('blub', TSomeObject.Create({parameters go here});
List.AddObject('bla', TSomeObject.Create({parameters go here});
Run Code Online (Sandbox Code Playgroud)

(插入'bla'两次会造成内存泄漏,我知道,这是我想在这里解决的一个问题.)

由于Delphi现在有多个通用容器,我认为应该有一个使上面更清洁的容器.

我想出的第一个是TDictionary:

type
  TSomeObjectContainer = TDictionary<string, TSomeObject>

// etc.
Run Code Online (Sandbox Code Playgroud)

不幸的是TSomeObjectContainer不允许我忽略重复,所以我必须自己实现检查.

我错过了什么吗?

delphi generics

0
推荐指数
1
解决办法
754
查看次数

将PAnsiChar分配给(unicode-)字符串的正确方法是什么?

我有一个DLL函数,返回一个指向ANSI文本(PAnsiChar)的指针.我想将它分配给(unicode-)字符串(这是Delphi XE2.).以下编译,但我得到一个警告"W1057隐式字符串从'AnsiChar'转换为'字符串'":

function TProj4.pj_strerrno(_ErrorCode: Integer): string;
var
  Err: PAnsiChar;
begin
  Err := Fpj_strerrno(_ErrorCode);
  Result := Err;
end;
Run Code Online (Sandbox Code Playgroud)

编辑:有问题的文本是英文错误信息,因此这里不太可能有任何转换问题.

我现在很想明确地将Err明确强制转换成这样的字符串......

Result := String(Err);
Run Code Online (Sandbox Code Playgroud)

..摆脱警告.这可能会出错吗?我宁愿使用临时的AnsiString变量吗?

var
  s: AnsiString;
[...]
s := Err;
Result := String(s);
Run Code Online (Sandbox Code Playgroud)

如果是,为什么?

或者我应该明确说明,代码首先将PAnsiChar转换为AnsiString,然后将AnsiString转换为String?

Result := String(AnsiString(Err));
Run Code Online (Sandbox Code Playgroud)

当然,我可以使它成为一个功能:

function PAnsicharToString(_a: PAnsiChar): string;
begin
   // one of the above conversion codes goes here
end;
Run Code Online (Sandbox Code Playgroud)

所有这些选项都可以编译,但它们会起作用吗 这里最好的做法是什么?

加分:理想情况下,代码应该与Delphi 2007和更新版本一起编译和使用.

delphi unicode delphi-2007 pchar delphi-xe2

0
推荐指数
1
解决办法
2499
查看次数

delphi 一种将十六进制字符串转换为二进制字符串的快速方法

我必须像这样将十六进制字符串转换为二进制字符串

"F" -> "?1111?"
"A" -> "?1010?"
"1AF1" -> "1101011110001"
Run Code Online (Sandbox Code Playgroud)

我有这个功能:

function HexToBin(Hexadecimal: string): string;
const
  BCD: array [0..15] of string =
    ('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
    '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111');
var
  i: integer;
begin
  Result := '';
  for i := Length(Hexadecimal) downto 1 do
    Result := BCD[StrToInt('$' + Hexadecimal[i])] + Result;
end; 
Run Code Online (Sandbox Code Playgroud)

我这样称呼它:

for I := 0 to Trunc(tcpFrame.Length/100) do
begin
   str := copy(tcpFrame , (I*100)+1 , 100  );
   data  := data …
Run Code Online (Sandbox Code Playgroud)

delphi

0
推荐指数
1
解决办法
714
查看次数

使用Delphi if语句时遇到困难

注意:不要编辑此代码的布局!(见下面的答案)

procedure TForm1.ReadCardTimer(Sender: TObject);
begin
ReadCard2(StrToInt(PChar('$' + Form2.Edit1.Text)),1);
ReadCard2(StrToInt(PChar('$' + Form2.Edit3.Text)),2);
ReadCard2(StrToInt(PChar('$' + Form2.Edit2.Text)),3);
ReadCard2(StrToInt(PChar('$' + Form2.Edit4.Text)),4);
ReadCard2(StrToInt(PChar('$' + Form2.Edit5.Text)),5);
ReadCard2(StrToInt(PChar('$' + Form2.Edit6.Text)),6);
ReadCard2(StrToInt(PChar('$' + Form2.Edit7.Text)),7);
ReadCard2(StrToInt(PChar('$' + Form2.Edit8.Text)),8);
ReadCard2(StrToInt(PChar('$' + Form2.Edit9.Text)),9);
ReadCard2(StrToInt(PChar('$' + Form2.Edit10.Text)),10);
ReadCard2(StrToInt(PChar('$' + Form2.Edit11.Text)),11);
ReadCard2(StrToInt(PChar('$' + Form2.Edit12.Text)),12);
ReadCard2(StrToInt(PChar('$' + Form2.Edit13.Text)),13);
ReadCard2(StrToInt(PChar('$' + Form2.Edit14.Text)),14);
if NewValue = 0 then
Image1.Hide;
Image2.Hide;
if NewValue > 0 then
Image1.Show;
Image2.Show;
UpdateCardImage(NewValue,NewValue2,'Image1');
UpdateCardImage(NewValue3,NewValue4,'Image2');
UpdateCardImage(NewValue5,NewValue6,'Image3');
UpdateCardImage(NewValue7,NewValue8,'Image4');
UpdateCardImage(NewValue9,NewValue10,'Image5');
UpdateCardImage(NewValue11,NewValue12,'Image6');
UpdateCardImage(NewValue13,NewValue14,'Image7');
end;
Run Code Online (Sandbox Code Playgroud)

由于某种原因,第二张图片我试图隐藏......不会隐藏......我可以注释掉第一张图片而第二张图片会隐藏在这里发生什么?

delphi delphi-7

-1
推荐指数
2
解决办法
705
查看次数

分配的值从未使用过.Delphi bug还是代码bug?

此代码是我在我的应用程序中使用的第三方组件的一部分.我正在尝试解决与我的应用程序中的提示相关的所有可能问题.但我无法理解这一点.Delphi Compiler标记了这段代码的第一行,提示"分配给NewState的值从未使用过!我只是想了解情况

  NewState := STATE_UNCHECKED;   //Value assigned never used?Really?
  while ( Node <> nil ) and ( Node.Parent <> nil ) do
  begin
    Node := Node.Parent.GetFirstChild;
    CheckedCount := 0;
    UnCheckedCount := 0;
    while True do
    begin
     ....
      if ( Node.StateIndex = STATE_PARTCHECKED ) or
         ( ( CheckedCount > 0 ) and ( UnCheckedCount > 0 ) ) then
      begin
        NewState := STATE_PARTCHECKED; ///assign value on condition
        Break;
      end;

      if Node.GetNextSibling = nil then
      begin
        if CheckedCount > 0 then
          NewState …
Run Code Online (Sandbox Code Playgroud)

delphi

-1
推荐指数
1
解决办法
388
查看次数

标签 统计

delphi ×5

delphi-2007 ×1

delphi-7 ×1

delphi-xe2 ×1

generics ×1

pchar ×1

unicode ×1