是否有Delphi函数通过多字符分隔符而不是单个字符来分割字符串?
例如,当我以这种方式使用该功能时:
SplitString('Whale<->Mammal<->Ocean', '<->')
Run Code Online (Sandbox Code Playgroud)
我会得到这3个字符串的结果:
'Whale', 'Mammal', 'Ocean'
Run Code Online (Sandbox Code Playgroud)
Delphi中有这样的功能吗?
Delphi调试器非常适合调试线性代码,其中一个函数以可预测的线性方式调用其他函数,我们可以逐行逐步执行该程序.
我发现调试器在处理事件驱动的gui代码时没那么有用,其中一行代码可以导致触发新事件,这可能反过来触发其他事件.在这种情况下,"逐步执行代码"方法不会让我看到正在发生的一切.
我通常解决这个问题的方法是1)猜测哪些事件可能是问题的一部分,然后2)添加断点或记录每个事件.
问题是这种方法是随意而耗时的.
是否有一个开关我可以在调试器中轻弹以说'记录所有gui事件'?或者是否有一些我可以添加到陷阱事件的代码,例如
procedure GuiEventCalled(ev:Event)
begin
log(ev);
ev.call();
end
Run Code Online (Sandbox Code Playgroud)
我正在寻找的最终结果是这样的(例如):
FieldA.KeyDown
FieldA.KeyPress
FieldA.OnChange
FieldA.OnExit
FieldB.OnEnter
Run Code Online (Sandbox Code Playgroud)
这将需要Delphi gui调试的所有猜测.
我正在使用Delphi 2010
[编辑]一些答案建议拦截或记录Windows消息的方法.其他人则指出并非所有Delphi事件都是Windows消息.我认为这是我要问的这类"非Windows消息"事件; 由Delphi代码创建的事件.[/编辑]
[EDIT2]在阅读了这里的所有信息后,我有一个想法,即使用RTTI动态拦截TNotifyEvents并将它们记录到Debugging窗口中的Event Log.这包括OnEnter,OnExit,OnChange,OnClick,OnMouseEnter,OnMouseLeave事件.经过一段时间的黑客攻击后,我得到了相当好的工作,至少对我来说是这样(它不会记录Key事件,但可以添加).我在这里发布了代码
使用
在代码中的某个位置为要跟踪的每个表单添加此行.
AddEventInterceptors(MyForm的);
打开调试器窗口,所有调用的事件都将记录到事件日志中
[/ EDIT2]
看看这段代码:
dic:=TObjectDictionary<Integer, TObject>.Create([doOwnsValues]);
testObject:=TObject.Create;
dic.AddOrSetValue(1,testObject);
dic.AddOrSetValue(1,testObject);
Run Code Online (Sandbox Code Playgroud)
代码
令人惊讶的是,当您第二次添加对象时,该对象将被释放.
这是预期的行为吗?或者是Delphi库中的错误?
文档简单地说"如果对象是拥有的,当从字典中删除条目时,键和/或值被释放".因此,释放一个我刚刚要求添加的对象似乎有点奇怪!
有没有办法告诉TObjectDictionary不这样做?目前,每次添加一个值时,我必须首先检查Key-Value组合是否已经在Dictionary中.
Delphi 2010
[编辑:阅读完所有评论后:
我的结论(他们的价值)]
[/编辑]
Delphi标准库中是否有一个函数来搜索特定值的字符串数组?
例如
someArray:=TArray<string>.Create('One','Two','Three');
if ArrayContains(someArray, 'Two') then
ShowMessage('It contains Two');
Run Code Online (Sandbox Code Playgroud) 我目前正在TLabel中显示一些文本.我现在想强调文本中的某些词语,用粗体或斜体显示.在Delphi中推荐的方法是什么?是否有类似TLabel的组件可以显示简单的HTML或标记?我想象一些像这样的代码:
label.text:='This information is <b>important</b>';
Run Code Online (Sandbox Code Playgroud)
我正在使用Delphi 2010
我得到这个相当混乱的编译器警告:
[DCC警告] W1056警告:资源重复:类型14(ICON GROUP),ID MAINICON; 保存文件C:\ dev\dispense\trunk\dev\source\mountaintop\dispense\MtnDispense.res资源; 文件C:\ dev\dispense\trunk\dev\source\mountaintop\dispense\MtnDispense.res资源被丢弃.
如果格式不清楚; 它提到的两条路径是相同的.
该应用程序在Project-> Resources下没有任何条目
该应用程序有一个自定义图标,在Project-> Options-> Application-> Icon下定义.
这个警告意味着什么吗?我该如何删除它?
动态数组是引用计数的,因此编译器会自动释放内存.我的问题是,什么时候发生这种自动释放?它会立即发生,还是在包含程序结束时发生?
这是一个具体的例子
procedure DoStuff;
var data:TBytes;
begin
data:=GetData; // lets say data now contains 1 Gig of data.
DoStuffWithData(data);
// I now want to free up this 1Gig of memory before continuing.
// Is this call needed, or would the memory be freed in the next line anyway?
Finalize(data);
data:=GetMoreData; // The first array now has no remaining references
DoStuffWithData(data);
end
Run Code Online (Sandbox Code Playgroud)
对Finalize()的调用是多余的吗?
有时我们想要一个可选参数
function doSomething(foo:Integer; bar:TObject=nil)
begin
if bar <> nil then // do something optional with bar
....
end
Run Code Online (Sandbox Code Playgroud)
如何使用布尔值来执行等效操作,这允许我区分两个布尔值和"无值"?
function doSomething(foo:Integer; bar:Boolean=nil) // Won't compile
begin
if bar <> nil then // do something optional with bar
end
Run Code Online (Sandbox Code Playgroud)
显然这不会编译为布尔不能为零.
基本上,我想要一个具有三种可能状态的参数; 真,假或"未指明".
我想动态更改一个标题TButton.问题是,TButton如果标题太长而无法放在按钮上,则不会自行调整大小; 所以文字在按钮的边缘流血.
如何让按钮更改大小以适合标题?
一些想法:
TButton和集AutoSize=True(没试过这个,不知道它是否会起作用).我有一个界面.
type IProgressObserver = interface(IInterface)
procedure ReportProgress(Progress:Integer);
procedure ReportError(Message:string);
end;
Run Code Online (Sandbox Code Playgroud)
我使用命名类实现了接口,如下所示:
type TProgressObserver=class(TInterfacedObject, IProgressObserver)
procedure ReportProgress(Progress:Integer);
procedure ReportError(Message:string);
end;
... implementation of methods go here .....
addProgressObserver(TProgressObserver.Create);
Run Code Online (Sandbox Code Playgroud)
是否可以在不声明类的情况下创建此接口的实例?像这个(虚构的)代码,它会做与上面相同的事情:
addProgressObserver(IProgressObserver.Create()
begin
procedure ReportProgress(Progress:Integer)
begin
ShowMessage('Progress Observed!');
end
procedure ReportError(Message:string)
begin
Log(Message);
end
end;);
Run Code Online (Sandbox Code Playgroud)
Delphi有匿名程序,但是它有匿名类吗?
我发现了类似的问题,但它是用Java编写的.
我正在使用Delphi 2010