小编awm*_*oss的帖子

如何通过多字符分隔符拆分字符串?

是否有Delphi函数通过多字符分隔符而不是单个字符来分割字符串?

例如,当我以这种方式使用该功能时:

SplitString('Whale<->Mammal<->Ocean', '<->')
Run Code Online (Sandbox Code Playgroud)

我会得到这3个字符串的结果:

'Whale', 'Mammal', 'Ocean'
Run Code Online (Sandbox Code Playgroud)

Delphi中有这样的功能吗?

delphi delphi-2010

17
推荐指数
4
解决办法
2万
查看次数

有没有办法在Delphi中记录每个gui事件?

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事件,但可以添加).我在这里发布了代码

使用

  1. 下载EventInterceptor单元并将其添加到您的项目中
  2. 将EventInterceptor单元添加到Uses子句中
  3. 在代码中的某个位置为要跟踪的每个表单添加此行.

    AddEventInterceptors(MyForm的);

打开调试器窗口,所有调用的事件都将记录到事件日志中

[/ EDIT2]

delphi

15
推荐指数
1
解决办法
2693
查看次数

将两个相同的Object添加到TObjectDictionary会释放该对象

看看这段代码:

dic:=TObjectDictionary<Integer, TObject>.Create([doOwnsValues]);
testObject:=TObject.Create;
dic.AddOrSetValue(1,testObject);
dic.AddOrSetValue(1,testObject);
Run Code Online (Sandbox Code Playgroud)

代码

  1. 创建拥有包含值的Dictionary
  2. 添加值
  3. 使用相同的键再次添加相同的值

令人惊讶的是,当您第二次添加对象时,该对象将被释放.

这是预期的行为吗?或者是Delphi库中的错误?

文档简单地说"如果对象是拥有的,当从字典中删除条目时,键和/或值被释放".因此,释放一个我刚刚要求添加的对象似乎有点奇怪!

有没有办法告诉TObjectDictionary不这样做?目前,每次添加一个值时,我必须首先检查Key-Value组合是否已经在Dictionary中.

Delphi 2010

[编辑:阅读完所有评论后:

我的结论(他们的价值)]

  • 这似乎是预期的行为
  • 无法修改此行为
  • 不要将TObjectDictionary(或任何其他类似的类)用于除了常见的"将这些对象添加到容器之外的任何东西.将它们保留在那里.做一些事情.释放容器和你添加的所有对象"使用.如果您正在做更复杂的事情,最好自己管理对象.
  • 行为记录很少,如果你想真正知道发生了什么,你应该阅读源代码

[/编辑]

delphi delphi-2010

15
推荐指数
3
解决办法
3549
查看次数

在Delphi中搜索String数组

Delphi标准库中是否有一个函数来搜索特定值的字符串数组?

例如

someArray:=TArray<string>.Create('One','Two','Three');
if ArrayContains(someArray, 'Two') then
    ShowMessage('It contains Two');
Run Code Online (Sandbox Code Playgroud)

delphi

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

在Delphi中的Label中显示简单标记

我目前正在TLabel中显示一些文本.我现在想强调文本中的某些词语,用粗体斜体显示.在Delphi中推荐的方法是什么?是否有类似TLabel的组件可以显示简单的HTML或标记?我想象一些像这样的代码:

label.text:='This information is <b>important</b>';
Run Code Online (Sandbox Code Playgroud)

我正在使用Delphi 2010

delphi

12
推荐指数
2
解决办法
4291
查看次数

来自同一文件的重复资源警告

我得到这个相当混乱的编译器警告:

[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下定义.

这个警告意味着什么吗?我该如何删除它?

delphi

12
推荐指数
2
解决办法
1万
查看次数

什么时候动态数组会收集垃圾?

动态数组是引用计数的,因此编译器会自动释放内存.我的问题是,什么时候发生这种自动释放?它会立即发生,还是在包含程序结束时发生?

这是一个具体的例子

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()的调用是多余的吗?

delphi

10
推荐指数
1
解决办法
501
查看次数

传递一个可选的布尔变量

有时我们想要一个可选参数

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)

显然这不会编译为布尔不能为零.

基本上,我想要一个具有三种可能状态的参数; 真,假或"未指明".

delphi

9
推荐指数
1
解决办法
2286
查看次数

自动调整Delphi按钮的大小

我想动态更改一个标题TButton.问题是,TButton如果标题太长而无法放在按钮上,则不会自行调整大小; 所以文字在按钮的边缘流血.

如何让按钮更改大小以适合标题?

一些想法:

  • 使用可以自行调整大小的其他按钮组件.有吗?
  • 子类TButton和集AutoSize=True(没试过这个,不知道它是否会起作用).
  • 计算标题的大小(以像素为单位),并在每次更改标题时手动更改宽度.

delphi button autosize delphi-2010

9
推荐指数
2
解决办法
6347
查看次数

使用'anonymous'类实现Delphi接口

我有一个界面.

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

delphi

8
推荐指数
2
解决办法
2753
查看次数

标签 统计

delphi ×10

delphi-2010 ×3

autosize ×1

button ×1