小编jpf*_*ius的帖子

Delphi:为什么FreeAndNil*真的没有我的对象?

我想将对象A传递给第二个对象B,让B做一些处理,最后释放A以防不再需要它.下面给出了一个淡化版本.

program Project6;
{$APPTYPE CONSOLE}
uses
  SysUtils;
type
  TMyObject = class(TObject)
  public
    FField1:  string;
    FField2:  string;
  end;
  TBigObject = class(TObject)
  public
    FMyObject:  TMyObject;
    procedure Bind(var MyObject:  TMyObject);
    procedure Free();
  end;
procedure TBigObject.Bind(var MyObject: TMyObject);
begin
  FMyObject := MyObject;
end;
procedure TBigObject.Free;
begin
  FreeAndNil(FMyObject);
  Destroy();
end;
var
  MyObject:   TMyObject;
  BigObject:  TBigObject;
begin
  try
    MyObject := TMyObject.Create();
    BigObject := TBigObject.Create();
    BigObject.Bind(MyObject);
    BigObject.Free();
    if (Assigned(MyObject)) then begin
      WriteLn('Set MyObject free!');
      MyObject.Free();
    end;
    ReadLn;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end; …
Run Code Online (Sandbox Code Playgroud)

delphi memory-management

5
推荐指数
3
解决办法
1277
查看次数

禁用某些密码输入字段的Firefox密码管理器

我有一份注册表和一份登录表.登录表单(我的)Firefox默认提供用户名和密码,这没关系.但是在注册表上它也是一样的 - 这没有任何意义,它会产生问题,因为输入密码字段而"重复密码"字段不是.

有没有办法可以更改注册表单的HTML,以便Firefox和其他浏览器不会自动填写特定的密码字段

编辑:我在这个主题上发现了很多问题(和答案),但是建议的解决方案(autocomplete=off在密码输入字段上设置)对我来说在Firefox上不起作用(它仍然自动填充字段).我找到了这个解决方案,但它看起来有点难看(如果用户输入用户名并点击Tab,则不起作用).有谁知道更好的方法?

html passwords firefox

5
推荐指数
1
解决办法
7589
查看次数

以公制单位准确计算文本宽度

我想以给定字符串的公制单位计算确切的文本宽度.我的伪代码看起来像这样:

Bitmap.Canvas.Assign(Font);
PixelWidth := Bitmap.Canvas.TextWidth(Font)
MetricWidth := PtToMM * (PixelWidth * 72.0 / GetScreenDPI);
Run Code Online (Sandbox Code Playgroud)

PtToMM是一个定义为的常量0.352777778.对于某些字体和字体大小,这是非常准确的,但对于其他字体和字体大小,它太小或太大.我尝试了许多其他可能性,例如GetCharWidth32GetCharABCWidths映射模式,MM_LOMETRIC但我无法让它工作.这个问题困扰着我,所以请任何人帮忙,告诉我哪里错了.非常感谢你!

编辑我检查了一个字符串:公制宽度计算为4.17厘米,实际打印输出的宽度(在纸上测量)是4.4厘米(字体Times New Roman,大小12).

delphi fonts gdi delphi-xe

5
推荐指数
1
解决办法
1867
查看次数

如何确定Indy的连接是否仍然存在?

我使用Indy进行TCP通信(D2009,Indy 10).

在评估客户端请求后,我想将答案发送给客户端.因此我存储TIdContext,就像这样(伪代码)

procedure ConnectionManager.OnIncomingRequest (Context : TIdContext);
begin
  Task := TTask.Create;
  Task.Context := Context;
  ThreadPool.AddTask (Task);
end;

procedure ThreadPool.Execute (Task : TTask);
begin
  // Perform some computation
  Context.Connection.IOHandler.Write ('Response');
end;
Run Code Online (Sandbox Code Playgroud)

但是,如果客户端在请求和准备发送的答案之间的某处终止连接,该怎么办?如何检查上下文是否仍然有效?我试过了

if Assigned (Context) and Assigned (Context.Connection) and Context.Connection.Connected then
  Context.Connection.IOHandler.Write ('Response');
Run Code Online (Sandbox Code Playgroud)

但它没有帮助.在某些情况下,程序只是挂起,如果我暂停执行,我可以看到当前行是if条件的行.

这里发生了什么?如何避免尝试使用死连接发送?

delphi tcp indy delphi-2009

4
推荐指数
1
解决办法
3336
查看次数

如何在Delphi的MVC中避免循环通知?

我试图在一个小应用程序中使用模型 - 视图 - 控制器模式.该模型包含一些数据和这样的选择

TModelSelection = record
  CurrentItem : TItem;
end;  

TModel = class
public
  property Items : TList <TItem>;
  property Selection : TModelSelection;
  property Subject : TSubject <TModel>;    // Observer pattern
end;
Run Code Online (Sandbox Code Playgroud)

现在我有一个观察模型的树视图.如果用户在树视图中选择项目,则模型选择应该更改.

问题是我遇到了循环更改通知的问题:我在树视图的OnChange事件中更改了模型选择.这会导致树视图更新其选择(因为选择也可以由应用程序的其他部分更改),这会再次触发OnChange事件,依此类推.

我该如何避免这个问题?

delphi model-view-controller design-patterns

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

Delphi中的异常和DLL

在Delphi中处理DLL内部异常的正确方法是什么?

像这样的东西

on E : ESomeException do ...
Run Code Online (Sandbox Code Playgroud)

要么

if (E is ESomeException) then ...
Run Code Online (Sandbox Code Playgroud)

失败,因为DLL和主应用程序的单独类型注册表.

delphi dll exception-handling

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

Delphi,VirtualStringTree - 类(对象)而不是记录

我需要为VirtualStringTree节点使用类而不是记录.

我应该声明它是标准的(但在这种情况下是棘手的)方式:

PNode = ^TNode;
TNode = record
 obj: TMyObject;
end;
//..
var
 fNd: PNode;
begin
fNd:= vstTree.getNodeData(vstTree.AddChild(nil));
fNd.obj:= TMyObject.Create; 
//..
Run Code Online (Sandbox Code Playgroud)

还是我应该直接使用TMyObject?如果是这样 - 怎么样?!如何分配(构建)对象并释放它?

在此先感谢m.

delphi class delphi-7 virtualtreeview

4
推荐指数
1
解决办法
2211
查看次数

单元测试鼠标事件处理程序

对单元进行单元测试时,发生以下问题:

有许多与鼠标相关的事件处理程序.我看到有两种可能性来测试这些处理程序:

  1. 使用Windows API调用模拟鼠标事件.
  2. 使用受保护的hack访问受保护的事件处理程序并直接调用它们.

我知道单元测试通常仅限于类的接口(这也意味着在类内部更改时不必更改测试),但这种情况是否值得例外?

在单元测试组件时,您通常如何处理鼠标事件?

delphi components unit-testing

4
推荐指数
1
解决办法
934
查看次数

Delphi,依赖注入和内存管理

在尝试编写可测试代码时,依赖注入肯定是最重要的概念之一.但是,虽然Java和C#具有垃圾收集功能,但Delphi没有并且通常使用所有权原则来管理对象处理(创建对象的人会破坏它).这try..finally构造很好地支持了这一点

Obj := TObject.Create;
try
  ...
finally
  Obj.Free;
end;
Run Code Online (Sandbox Code Playgroud)

现在如果使用依赖注入怎么办:

constructor TFileLister.Create(FileSystem: TFileSystem);
Run Code Online (Sandbox Code Playgroud)

谁现在应该负责摧毁这个FileSystem物体?所有权原则在这里仍然有效吗?

我知道接口是这个问题的解决方案(感谢它们是引用计数的事实).但是,如果没有接口(比如在一些遗留代码中)呢?在使用依赖注入时,还有哪些其他方法或最佳实践来处理内存管理?

delphi oop memory-management dependency-injection

4
推荐指数
1
解决办法
731
查看次数

Delphi中字符串和记录的常量就地数组

德尔福可以这样吗?(使用动态字符串和记录数组)

type
  TStringArray = array of String;
  TRecArray = array of TMyRecord;

procedure DoSomethingWithStrings(Strings : TStringArray);
procedure DoSomethingWithRecords(Records : TRecArray);
function BuildRecord(const Value : String) : TMyRecord;

DoSomethingWithStrings(['hello', 'world']);
DoSomethingWithRecords([BuildRecord('hello'), BuildRecord('world')]);
Run Code Online (Sandbox Code Playgroud)

我知道它不会像那样编译.只想问是否有一个技巧可以得到类似的东西.

arrays delphi delphi-xe

4
推荐指数
1
解决办法
2412
查看次数