我想存储按列表中的名称排序的对象.应忽略重复项,添加后应自动释放对象.在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不允许我忽略重复,所以我必须自己实现检查.
我错过了什么吗?
我有一个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和更新版本一起编译和使用.
我必须像这样将十六进制字符串转换为二进制字符串
"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) 注意:不要编辑此代码的布局!(见下面的答案)
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 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)