我想将对象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) 我有一份注册表和一份登录表.登录表单(我的)Firefox默认提供用户名和密码,这没关系.但是在注册表上它也是一样的 - 这没有任何意义,它会产生问题,因为输入密码字段而"重复密码"字段不是.
有没有办法可以更改注册表单的HTML,以便Firefox和其他浏览器不会自动填写特定的密码字段?
编辑:我在这个主题上发现了很多问题(和答案),但是建议的解决方案(autocomplete=off在密码输入字段上设置)对我来说在Firefox上不起作用(它仍然自动填充字段).我找到了这个解决方案,但它看起来有点难看(如果用户输入用户名并点击Tab,则不起作用).有谁知道更好的方法?
我想以给定字符串的公制单位计算确切的文本宽度.我的伪代码看起来像这样:
Bitmap.Canvas.Assign(Font);
PixelWidth := Bitmap.Canvas.TextWidth(Font)
MetricWidth := PtToMM * (PixelWidth * 72.0 / GetScreenDPI);
Run Code Online (Sandbox Code Playgroud)
PtToMM是一个定义为的常量0.352777778.对于某些字体和字体大小,这是非常准确的,但对于其他字体和字体大小,它太小或太大.我尝试了许多其他可能性,例如GetCharWidth32和GetCharABCWidths映射模式,MM_LOMETRIC但我无法让它工作.这个问题困扰着我,所以请任何人帮忙,告诉我哪里错了.非常感谢你!
编辑我检查了一个字符串:公制宽度计算为4.17厘米,实际打印输出的宽度(在纸上测量)是4.4厘米(字体Times New Roman,大小12).
我使用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条件的行.
这里发生了什么?如何避免尝试使用死连接发送?
我试图在一个小应用程序中使用模型 - 视图 - 控制器模式.该模型包含一些数据和这样的选择
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中处理DLL内部异常的正确方法是什么?
像这样的东西
on E : ESomeException do ...
Run Code Online (Sandbox Code Playgroud)
要么
if (E is ESomeException) then ...
Run Code Online (Sandbox Code Playgroud)
失败,因为DLL和主应用程序的单独类型注册表.
我需要为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.
对单元进行单元测试时,发生以下问题:
有许多与鼠标相关的事件处理程序.我看到有两种可能性来测试这些处理程序:
我知道单元测试通常仅限于类的接口(这也意味着在类内部更改时不必更改测试),但这种情况是否值得例外?
在单元测试组件时,您通常如何处理鼠标事件?
在尝试编写可测试代码时,依赖注入肯定是最重要的概念之一.但是,虽然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物体?所有权原则在这里仍然有效吗?
我知道接口是这个问题的解决方案(感谢它们是引用计数的事实).但是,如果没有接口(比如在一些遗留代码中)呢?在使用依赖注入时,还有哪些其他方法或最佳实践来处理内存管理?
德尔福可以这样吗?(使用动态字符串和记录数组)
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)
我知道它不会像那样编译.只想问是否有一个技巧可以得到类似的东西.