我很想知道为什么Delphi将记录类型属性视为只读:
TRec = record
A : integer;
B : string;
end;
TForm1 = class(TForm)
private
FRec : TRec;
public
procedure DoSomething(ARec: TRec);
property Rec : TRec read FRec write FRec;
end;
Run Code Online (Sandbox Code Playgroud)
如果我尝试为Rec属性的任何成员赋值,我将得到"左侧无法分配"错误:
procedure TForm1.DoSomething(ARec: TRec);
begin
Rec.A := ARec.A;
end;
Run Code Online (Sandbox Code Playgroud)
允许对底层字段执行相同操作:
procedure TForm1.DoSomething(ARec: TRec);
begin
FRec.A := ARec.A;
end;
Run Code Online (Sandbox Code Playgroud)
这种行为有什么解释吗?
我需要将TWAIN扫描添加到Delphi应用程序中,并且无法找到现成的组件来执行此操作.
我下载了TDelphiTwain,但是当在Windows Vista上的D2010中使用时,它似乎无法识别我系统上的任何Twain源.我还尝试了MCM的Twain Toolkit for Delphi的试用版,它具有当前更新的优势(DelphiTwain的最后一次更新是2004),但Twain Toolkit甚至不能在我的系统上编译(我认为一些DCU不在日期).
任何人都可以建议一种简单的方法将TWAIN扫描到我的Delphi应用程序中吗?
更新:使用vcldeveloper对DelphiTwain的更新(见下文)我能够实现这一点.此外,我还发现Envision Image Library支持Twain扫描以及协助处理多页TIFF,并且已经更新以与D2010兼容.
最新的更新 VCLDeveloper的代码,下面,工作正常.但是,我选择了Envision库,它包括轻松创建多页TIFF文件的功能.我在几个小时内完成了Envision扫描,包括多页文件处理.
在Delphi中,如果我有一个简单的类myClass,我将它的一个实例传递给一个函数myFunction( myClass ),由function myFunction( myObject : myClass ) : Boolean... 定义
是否会制作myObject的副本?
当我在myFunction中调用myObject的方法时,原始对象是否也会受到影响和修改?
我在Delphi 2009中设置浏览路径时遇到问题:
当我安装一个新组件时,我将DCU路径添加到Delphi的Library Path,以及Delphi浏览路径的源路径.应用程序编译正常,但按住Ctrl键并单击该组件的任何单元名称都不会打开源文件!
似乎使其工作的唯一方法是向Library Path添加源路径,但这意味着每次构建项目时我都必须编译属于第三方组件的所有单元!
对于Delphi的标准单元,甚至JCL\JVCL安装程序安装的JCL和JVCL单元,此问题不存在,并且它们的源路径将添加到浏览路径中.
这是一个错误,还是我做错了什么?
问候
首先,对我的情况做一点解释:
我有一个由不同类实现的示例接口,这些类可能并不总是具有共享的祖先:
IMyInterface = interface
['{1BD8F7E3-2C8B-4138-841B-28686708DA4D}']
procedure DoSomething;
end;
TMyImpl = class(TInterfacedPersistent, IMyInterface)
procedure DoSomething;
end;
TMyImp2 = class(TInterfacedObject, IMyInterface)
procedure DoSomething;
end;
Run Code Online (Sandbox Code Playgroud)
我还有一个工厂方法,它应该创建一个实现我的接口的对象的实例.我的工厂方法接收类名作为其参数:
function GetImplementation(const AClassName: string): IMyInterface;
Run Code Online (Sandbox Code Playgroud)
我尝试了两种方法来实现这个工厂方法,第一种是使用扩展RTTI:
var
ctx : TRttiContext;
t : TRttiInstanceType;
begin
t := ctx.FindType(AClassName).AsInstance;
if Assigned(t) then
Result := t.GetMethod('Create').Invoke(t.MetaclassType, []).AsInterface as IMyInterface;
end;
Run Code Online (Sandbox Code Playgroud)
在这种方法中,我调用默认构造函数,这在我的场景中很好.这个问题是,在运行时,我得到一个错误告诉我该对象不支持IMyInterface.更重要的是,创建的对象未分配给接口变量; 因此,它将被泄露.我也尝试使用TValue.AsType方法返回值,但它给了我访问冲突:
function GetImplementation(const AClassName: string): IMyInterface;
var
ctx : TRttiContext;
rt : TRttiInstanceType;
V : TValue;
begin
rt := ctx.FindType(AClassName).AsInstance;
if Assigned(rt) then
begin
V := rt.GetMethod('Create').Invoke(rt.MetaclassType, []); …Run Code Online (Sandbox Code Playgroud) 我想从我的应用程序中获取包含所有线程(主要的GUI线程除外)的列表,以便对它们执行一些操作.(设置优先级,杀死,暂停等)如何做到这一点?
我多年来一直使用Indy通过FTP传输文件,但未能找到满意的解决方案来解决以下问题.
当用户在路由器后面上传大文件时,有时会发生以下情况:文件上传正常,但同时命令通道因超时而断开连接.通常,直接连接到服务器不会发生这种情况,因为服务器"知道"正在数据通道上进行传输.但是有些路由器并未意识到这一点,并且命令通道已关闭.
许多程序定期发送NOOP命令以保持命令通道处于活动状态,即使这不是标准FTP规范的一部分.我的问题:我该怎么做?我是否在OnWork事件中发送NOOP命令?这是否会以某种方式造成任何附带损害,例如,我是否需要处理某些响应?我该如何最好地解决这个问题?
是否可以创建运行时框架并添加现有面板,如将面板的父级设置为框架?当它添加时,重复框架并使用它?
喜欢:
f:= Tframe. create(..)
...
panel3.parent = f; //where panel3 has many controls.
Run Code Online (Sandbox Code Playgroud)
然后复制f?它可以吗?怎么样?或任何其他建议?Ë
在 Delphi 2009 中,在我的一个项目中,我有一个自定义框架,上面有一些控件,我想将其用作其他一些控件的基类。我想将此框架注册为 IDE 向导,以便在新项目列表中可用。当我将新添加的项目(我的自定义框架)添加到项目中时,我希望它:
好的,为了让它在对象检查器中显示我的属性和事件,我在 IDE 中注册了一个自定义模块。它不适用于框架。幸运的是,StackOverflow 上有人提到了这一点,并给出了答案:
然后,为了使其加载自定义框架的 DFM,我将 InitInheritedComponent 添加到自定义框架的构造函数中。像这样的东西:
constructor TMyFrame.Create(AOwner: TComponent); override;
begin
inerited;
if (ClassType <> TMyFrame) and not (csDesignInstance in ComponentState) then
begin
if not InitInheritedComponent(Self, TMyFrame) then
raise EResNotFound.CreateFmt('Resource %s not found', [ClassName]);
end;
end;
Run Code Online (Sandbox Code Playgroud)
这不起作用!它仍然在设计器中创建一个空框架而不是我自己的框架。如果我没有将自定义模块注册到 IDE 中,即使不需要 InitInheritedComponent,它也会正确显示我的框架,但对象检查器中不会显示其他属性!
如果我将构造函数源更改为此(用 TFrame 替换 TMyFrame):
constructor TMyFrame.Create(AOwner: TComponent); override;
begin
inerited;
if (ClassType <> TFrame) and not (csDesignInstance in ComponentState) then
begin
if not …Run Code Online (Sandbox Code Playgroud) 我正在创建一个访问数据库的应用程序.在每次访问数据库时,应用程序都会等待作业完成.为了保持UI响应,我想将所有数据库内容放在一个单独的线程中.
这是我的想法:
听起来不错吗?
将数据库结果从db-thread导入主线程的最佳方法是什么?
到目前为止,我对线程做的并不多,因此我想知道db-thread是否可以创建一个查询组件,主线程读取结果.主线程和数据库线程永远不会同时访问查询.这还会导致问题吗?
当我不得不为我的工作购买delphi时,我看到的一个重要卖点就是支持平板电脑的能力.现在,我工作的公司的客户想要使用平板电脑.我一直在努力寻找与平板电脑的delphi的例子,但我没有找到任何.有人有经验吗?任何类型的教程或示例?
当组件获得焦点时,我似乎甚至无法携带虚拟键盘,并且当它丢失时隐藏它.
今天我使用Indy 10(Delphi 2010附带)遇到了一种奇怪的行为.这是问题所在:
假设我们的客户端有一个IdTcpClient,服务器应用程序中有一个IdTcpServer,而我们的IdTcpServer的OnExecute事件处理程序中有这个代码:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
AStream: TStringStream;
S: string;
begin
AStream := TStringStream.Create;
try
AContext.Connection.IOHandler.ReadStream(AStream);
S := AStream.DataString;
finally
AStream.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
现在,当客户端尝试连接到服务器时,使用TIdTcpClient.Connect; 在服务器上,调用TIdTcpServer.OnExecute,并在执行到达AContext.Connection.IOHandler.ReadStream(AStream)行时阻止在OnExecute事件处理程序中运行的线程!
当我跟踪代码时,在ReadStream中调用ReadLongInt以获取字节数时会引起问题.ReadLongInt调用ReadBytes.在ReadBytes内部,FInputBuffer.Size为零.在那里,在循环中调用ReadFromSource,最终执行到达TIdSocketListWindows.FDSelect,它从WinSock2调用"select"函数,并且执行在此处停止,并且不会从该客户端连接接收任何内容.我也尝试过赋予AByteCount和AReadUntilDisconnect参数值,但它没有改变行为.
如果我用ReadLn替换ReadStream,那么连接到服务器不会阻止代码执行,并且服务器会读取从客户端发送的数据.
代码有什么问题吗?或者这是一个错误?
问候
可以在运行时调用TImagelist编辑器来查看我的内容TImagelist吗?
delphi ×13
delphi-2010 ×4
delphi-2009 ×3
indy ×2
tframe ×2
delphi-xe2 ×1
ftp ×1
gestures ×1
imagelist ×1
indy10 ×1
process ×1
record ×1
rtti ×1
runtime ×1
tablet-pc ×1
timagelist ×1
touch ×1
twain ×1
windows ×1