小编jpf*_*ius的帖子

Firemonkey ScrollBox Bug

我们正在体验Firemonkey的ScrollBox组件中似乎是一个奇怪的错误(因为TGridTScrollBox它继承也会影响所有网格).在我们的开发机器上,一切正常,而在其他机器上则会发生错误.我们未能检测到系统之间的任何模式(我们检查了操作系统,图形硬件,DirectX版本).

再生产:

  1. 创建一个新的FireMonkey应用程序.TScrollBox在表格上放置一个.
  2. 向scrollBox添加一个按钮,并将其垂直位置设置为500000.
  3. 启动应用程序并检查滚动到滚动框末尾时是否显示按钮.

如果发生错误,则该按钮不可见.

使用网格时,这会导致1-19047行正确显示,并且不显示19047及以上的所有行.

有谁知道是什么原因引起的?或者任何想法我们如何更详细地识别问题?

delphi delphi-xe2 firemonkey

39
推荐指数
1
解决办法
4355
查看次数

在Delphi 2010或更高版本中获取文件的大小?

Delphi 2010有一套很好的新文件访问功能IOUtils.pas(我特别喜欢与日期相关的函数的UTC版本).到目前为止我想念的是类似的东西

TFile.GetSize (const Path : String)
Run Code Online (Sandbox Code Playgroud)

什么是Delphi 2010-获取文件大小的方法?我是否必须返回并使用FindFirst访问TSearchRec.FindData

谢谢.

delphi file delphi-2010

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

样式组件和反应引导程序?

有没有办法将样式组件react-bootstrap一起使用?react-bootstrap公开bsClass属性而不是className它们的组件,这似乎与样式组件不兼容.

有经验吗?

reactjs react-bootstrap styled-components

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

测量Delphi中的代码覆盖率

有没有办法用DUnit测量代码覆盖率?或者是否有任何免费工具实现?你用的是什么?你通常会使用什么代码覆盖?

Jim McKeeth:谢谢你的详细解答.我说的是TDD方法意义上的单元测试,不仅仅是发生故障后的单元测试.我对一些基本的预写单元测试可以实现的代码覆盖感兴趣.

delphi unit-testing code-coverage dunit

24
推荐指数
4
解决办法
4916
查看次数

德尔福所有权混乱

我一直认为所有者负责销毁视觉控制,如果我nil作为所有者传递,我可以手动控制销毁.

请考虑以下示例:

TMyForm = class (TForm)
private
  FButton : TButton;
end;

...
FButton := TButton.Create(nil);   // no owner!!
FButton.Parent := Self;
Run Code Online (Sandbox Code Playgroud)

我希望这个按钮产生内存泄漏,但它没有,实际上是析构函数TButton被调用.

进一步调查显示TWinControl析构函数包含以下代码片段:

I := ControlCount;
while I <> 0 do
begin
  Instance := Controls[I - 1];
  Remove(Instance);
  Instance.Destroy;
  I := ControlCount;
end;
Run Code Online (Sandbox Code Playgroud)

看起来它正在摧毁子组件(Parent设置为控件本身的组件).

我没想到父控件会破坏控件.任何人都可以解释为什么会这样吗?如果我通过一个所有者,谁在摧毁这个物体?

delphi components memory-management ownership delphi-xe

24
推荐指数
2
解决办法
2680
查看次数

实现线程安全

问题如何确保我的应用程序是线程安全的?他们的任何常见做法,测试方法,要避免的事情,要寻找的东西是什么?

背景我目前正在开发一个服务器应用程序,它在不同的线程中执行许多后台任务,并使用Indy与客户端进行通信(使用另一组自动生成的线程进行通信).由于应用程序应该是高度可用的,程序崩溃是一件非常糟糕的事情,我想确保应用程序是线程安全的.无论如何,我不时发现一段代码抛出一个以前从未发生过的异常,在大多数情况下我发现它是某种同步错误,我忘了正确地同步我的对象.因此,我的问题涉及最佳实践,线程安全测试和类似的事情.

mghie:谢谢你的回答!我或许应该更准确一点.为了清楚起见,我了解多线程的原理,我在整个程序中使用同步(监视器),我知道如何将线程问题与其他实现问题区分开来.但尽管如此,我仍然忘记不时添加适当的同步.举个例子,我在代码中使用了RTL排序功能.看起来像

FKeyList.Sort (CompareKeysFunc);
Run Code Online (Sandbox Code Playgroud)

事实证明,我必须在排序时同步FKeyList.在最初编写那么简单的代码行时,我才想起它.这是我想谈的这些问题.一个人容易忘记添加同步代码的地方有哪些?您如何确保在所有重要位置添加同步代码?

delphi multithreading synchronization thread-safety

19
推荐指数
2
解决办法
2570
查看次数

Firemonkey版本的VirtualTreeView

有没有人碰巧知道是否有正在准备的流行VirtualTreeView的Firemonkey版本?此外,是否有人收集了一些将自定义控件移植到Firemonkey的经验,并且可以估算将虚拟树视图移植到Firemonkey的工作量?我们需要这个控件,如果我们可以让这个控件工作,切换到Firemonkey只是一个选项.

谢谢!

delphi virtualtreeview delphi-xe2 firemonkey

19
推荐指数
1
解决办法
5089
查看次数

Indy TCP客户端/服务器,客户端充当服务器

如何使用Indy TIdTCPClientTIdTCPServer在以下场景中使用:

Client  ---------- initate connection -----------> Server
...
Client  <---------------command------------------- Server
Client  ----------------response-----------------> Server
...
Client  <---------------command------------------- Server
Client  ----------------response-----------------> Server
Run Code Online (Sandbox Code Playgroud)

客户端启动连接,但充当"服务器"(等待命令并执行它们).

OnExecute的方法TIdTCPServer并不在此情况下(至少我没有得到它的工作好)很好地工作.我怎么能这样做?

我希望这个问题足够清楚.

delphi client-server indy indy10 delphi-xe

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

接口,匿名方法和内存泄漏

这是一个构造的例子.我不想在这里发布原始代码.我尝试提取相关部分.

我有一个管理监听器列表的界面.

TListenerProc = reference to procedure (SomeInt : ISomeInterface);

ISomeInterface = interface
   procedure AddListener (Proc : TListenerProc);   
end;
Run Code Online (Sandbox Code Playgroud)

现在我注册一个监听器:

SomeObj.AddListener (MyListener);

procedure MyListener (SomeInt : ISomeInterface);
begin
  ExecuteSynchronized (procedure
                       begin
                       DoSomething (SomeInt);
                       end);
end;
Run Code Online (Sandbox Code Playgroud)

我确实得到了内存泄漏.永远不会释放匿名方法和接口.我怀疑这是由于某种循环引用.匿名方法保持界面生效,界面保持匿名方法生效.

两个问题:

  1. 你支持这个解释吗?或者我在这里错过了其他什么?
  2. 我能做些什么吗?

提前致谢!


编辑:在一个小到足以在此发布的应用程序中重现这一点并不容易.我现在能做的最好的事情如下.匿名方法不会在这里发布:

program TestMemLeak;

{$APPTYPE CONSOLE}

uses
  Generics.Collections, SysUtils;

type
  ISomeInterface = interface;
  TListenerProc  = reference to procedure (SomeInt : ISomeInterface);

  ISomeInterface = interface
  ['{DB5A336B-3F79-4059-8933-27699203D1B6}']
    procedure AddListener (Proc : TListenerProc);
    procedure NotifyListeners;
    procedure Test;
  end;

  TSomeInterface = class (TInterfacedObject, ISomeInterface) …
Run Code Online (Sandbox Code Playgroud)

delphi memory-management interface anonymous-methods delphi-2010

17
推荐指数
1
解决办法
1057
查看次数

如何避免循环单位参考?

想象一下国际象棋游戏的以下两类:

TChessBoard = class
private
  FBoard : array [1..8, 1..8] of TChessPiece;
...
end;

TChessPiece = class abstract
public
   procedure GetMoveTargets (BoardPos : TPoint; Board : TChessBoard; MoveTargetList : TList <TPoint>);
...
end;
Run Code Online (Sandbox Code Playgroud)

我希望在两个单独的ChessBoard.pasChessPiece.pas单元中定义这两个类.

如何避免我遇到的圆形单元参考(在另一个单元的接口部分需要每个单元)?

delphi project-organization circular-reference

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