我知道,我问了很多问题......但是作为一个新的delphi开发人员,我一直在讨论所有这些问题:)
使用印10.为了使通信效率这一个与TCP通信交易,我编写一个客户端操作请求作为单个字节(在大多数情况下,接着,当然其他数据字节,但在这种情况下,只有一个单一的字节).问题是
var Bytes : TBytes;
...
SetLength (Bytes, 1);
Bytes [0] := OpCode;
FConnection.IOHandler.Write (Bytes, 1);
ErrorCode := Connection.IOHandler.ReadByte;
Run Code Online (Sandbox Code Playgroud)
不立即发送该字节(至少不调用服务器执行处理程序).如果我将'1'更改为'9',例如一切正常.我假设Indy缓冲了输出字节,并尝试禁用写缓冲
FConnection.IOHandler.WriteBufferClose;
Run Code Online (Sandbox Code Playgroud)
但它没有帮助.如何发送单个字节并确保立即发送?并且 - 我在这里添加另一个小问题 - 使用indy发送整数的最佳方法是什么?不幸的是,我无法在TIdTCPServer的IOHandler中找到像WriteInteger这样的函数......而且
WriteLn (IntToStr (SomeIntVal))
Run Code Online (Sandbox Code Playgroud)
对我来说似乎不是很有效率.是否有所作为我是否使用多个写命令行或字节数组一起收拾东西,并发送一次?
谢谢你的回答!
编辑:我补充说,我使用的是印地10日以来似乎有关于读了重大变化,写程序的提示.
在我的代码中,我使用了一个小型数据存储类,它在不同的地方创建.为了避免内存泄漏并简化操作,我想使用引用计数,所以我做到了
type TFileInfo = class (TInterfacedObject, IInterface)
Run Code Online (Sandbox Code Playgroud)
并删除了我对TFileInfo.Free的所有手动调用.不幸的是Delphi报告了很多内存泄漏.搜索SO我发现以下问题解释了为什么这不起作用:
这里有一个解决方法,但它需要我(至少如果我做对了)编写一个自定义接口IFileInfo并为它提供了许多getter和setter,我想避免它.
编辑我应该补充一点,我将创建的FileInfo对象插入到两种不同类型的哈希表中:一个来自TBucketList,另一个是来自Codegear论坛的哈希映射实现.在内部它们都是用户指针,因此情况就像在另一个问题中一样.
还有其他可能使Delphi中的对象使用引用计数吗?
Delphi是否以任何方式支持国际化?
我已经看到我可以为项目添加不同的语言,但这似乎创建了dfm文件的多个实例.我是否正确,因此语言无法在运行时更改?
你如何处理国际化(如果你这样做)?有没有最好的做法?
我非常沮丧.我正在使用Delphi 2009,并且很高兴在这个版本的Delphi中包含泛型.一切都在一开始就很好用,但是现在我在整个地方使用泛型我遇到了问题 - 大多数时候是一些内部错误,我甚至都看不到它们究竟在哪里造成的.我尝试多次重构代码以避免泛型问题,但总是遇到新的问题.
现在我决定完全删除泛型并使用一些动态强制转换来专门化我的类.不是很激动,但我没有看到另一种选择.我不能花一天时间追踪Delphi的内部编译错误......
是否有人在大型项目中使用泛型而没有遇到这样的问题?也许是我的错吗?或者只是不可能在复杂的项目中使用它们?
我希望D2010修复所有这些东西.
正如我在上一个问题的答案中所建议的那样,我使用ProcessExplorer来分析我的应用程序用来查找句柄泄漏的句柄列表.
泄漏的句柄属于Section类型.
什么是截面句柄,它在哪里使用以及什么可能导致截面手柄泄漏?
我没有在我的代码中使用内存映射文件.
在询问有关记录中的接口字段的这个问题后,我假设以下内容可以正常工作(注意断言):
type
TRec <T> = record
Intf : IInterface;
end;
TTestClass = class
public
function ReturnRec : TRec <Integer>;
end;
// Implementation
function TTestClass.ReturnRec : TRec <Integer>;
begin
Assert (Result.Intf = nil); // Interface field in record should be initialized!
Result.Intf := TInterfacedObject.Create;
end;
Run Code Online (Sandbox Code Playgroud)
我用以下代码测试了这个:
for I := 1 to 1000 do
Rec := Test.ReturnRec;
Run Code Online (Sandbox Code Playgroud)
并且断言失败了!
我的错在哪里?什么假设是错的?
我有一个自定义组件(继承自TCustomPanel),由两个其他组件组成(比方说两个编辑).如何在使用组件时正确获取Tab键顺序?
在Tab键顺序设计器中,我只能访问无法获得焦点的组件本身,因为它是一个面板.在运行时发生的事情是我可以使用tab键访问编辑,但只有在组件下方的两个按钮聚焦后才能访问.
如何在这种情况下更改Tab键顺序?
我有一个应用程序,其中大多数操作需要一些时间,我希望始终保持GUI响应.用户触发的任何操作的基本模式如下:
我尝试了几个方法来实现这一目标,但从长远来看,所有这些都会导致问题(在某些情况下看似随机访问违规).
Synchronize调用OnFinish主线程中的事件.PostMessage通知GUI线程结果已准备就绪.Application.ProcessMessages)直到后台线程完成,然后继续显示结果.我无法想出另一种选择,但这对我来说都不是很完美.这样做的首选方法是什么?
假设您有一个带有重载相等运算符的记录
TSomeRecord = record
Value : String;
class operator Equal(Left, Right : TSomeRecord) : Boolean;
end;
Run Code Online (Sandbox Code Playgroud)
(实现比较字符串值).如果根据重载运算符向列表中添加两个相等的记录,我希望该Contains方法在两种情况下都返回true.但实际上,通用列表似乎只是比较记录的内存内容而不是应用重载的相等运算符.
var
List : TList <TSomeRecord>;
Record1,
Record2 : TSomeRecord;
begin
Record1.Value := 'ABC';
Record2.Value := 'ABC';
List.Add(Record1);
Assert(List.Contains(Record1));
Assert(List.Contains(Record2)); // <--- this is not true
end;
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?有什么解释吗?
刚发现一些相当有趣的东西
var
Queue : TQueue <TProc>;
MyProc : TProc;
...
MyProc := Queue.Dequeue;
Run Code Online (Sandbox Code Playgroud)
我想你看到这里有什么意思.但是,编译器认为我想存储Queue.Dequeue方法(键入"对象的过程")MyProc并报告错误
E2010 Incompatible Types: 'TProc' und 'Procedure of object'
Run Code Online (Sandbox Code Playgroud)
我想出的解决方法是这样的
MyProc := TProc (Pointer (Queue.Dequeue));
Run Code Online (Sandbox Code Playgroud)
有更优雅的解决方案吗?
delphi ×10
delphi-xe ×4
delphi-2009 ×2
generics ×2
asynchronous ×1
components ×1
delphi-xe2 ×1
handle ×1
indy ×1
interface ×1
performance ×1
record ×1
tcp ×1
vcl ×1
windows ×1