小编vcl*_*per的帖子

"左侧不能分配给"Delphi中的记录类型属性

我很想知道为什么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)

这种行为有什么解释吗?

delphi record

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

用于Delphi的TWAIN扫描组件

我需要将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 twain delphi-2010

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

德尔福:通过引用或通过值传递?

在Delphi中,如果我有一个简单的类myClass,我将它的一个实例传递给一个函数myFunction( myClass ),由function myFunction( myObject : myClass ) : Boolean... 定义

  • 是否会制作myObject的副本?

  • 当我在myFunction中调用myObject的方法时,原始对象是否也会受到影响和修改?

delphi parameter-passing

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

在Delphi选项页面中设置浏览路径的问题

我在Delphi 2009中设置浏览路径时遇到问题:

当我安装一个新组件时,我将DCU路径添加到Delphi的Library Path,以及Delphi浏览路径的源路径.应用程序编译正常,但按住Ctrl键并单击该组件的任何单元名称都不会打开源文件!

似乎使其工作的唯一方法是向Library Path添加源路径,但这意味着每次构建项目时我都必须编译属于第三方组件的所有单元!

对于Delphi的标准单元,甚至JCL\JVCL安装程序安装的JCL和JVCL单元,此问题不存在,并且它们的源路径将添加到浏览路径中.

这是一个错误,还是我做错了什么?

问候

delphi delphi-2009

11
推荐指数
1
解决办法
1627
查看次数

在运行时创建接口实现实例

首先,对我的情况做一点解释:

我有一个由不同类实现的示例接口,这些类可能并不总是具有共享的祖先:

  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)

delphi rtti delphi-2010 delphi-xe2

10
推荐指数
1
解决办法
2449
查看次数

如何获取包含我的应用程序创建的所有线程的列表

我想从我的应用程序中获取包含所有线程(主要的GUI线程除外)的列表,以便对它们执行一些操作.(设置优先级,杀死,暂停等)如何做到这一点?

windows delphi multithreading process

8
推荐指数
2
解决办法
6468
查看次数

Indy FTP,大文件和NAT路由器

我多年来一直使用Indy通过FTP传输文件,但未能找到满意的解决方案来解决以下问题.

当用户在路由器后面上传大文件时,有时会发生以下情况:文件上传正常,但同时命令通道因超时而断开连接.通常,直接连接到服务器不会发生这种情况,因为服务器"知道"正在数据通道上进行传输.但是有些路由器并未意识到这一点,并且命令通道已关闭.

许多程序定期发送NOOP命令以保持命令通道处于活动状态,即使这不是标准FTP规范的一部分.我的问题:我该怎么做?我是否在OnWork事件中发送NOOP命令?这是否会以某种方式造成任何附带损害,例如,我是否需要处理某些响应?我该如何最好地解决这个问题?

delphi ftp indy

7
推荐指数
1
解决办法
3447
查看次数

在运行时创建Tframe:

是否可以创建运行时框架并添加现有面板,如将面板的父级设置为框架?当它添加时,重复框架并使用它?

喜欢:

f:= Tframe. create(..)
...

panel3.parent = f; //where panel3 has many controls.
Run Code Online (Sandbox Code Playgroud)

然后复制f?它可以吗?怎么样?或任何其他建议?Ë

delphi runtime tframe

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

注册自定义框架

在 Delphi 2009 中,在我的一个项目中,我有一个自定义框架,上面有一些控件,我想将其用作其他一些控件的基类。我想将此框架注册为 IDE 向导,以便在新项目列表中可用。当我将新添加的项目(我的自定义框架)添加到项目中时,我希望它:

  1. 显示我在对象检查器中添加到自定义框架的所有属性和事件。
  2. 从我的自定义框架而不是 TFrame 派生新创建的框架。

好的,为了让它在对象检查器中显示我的属性和事件,我在 IDE 中注册了一个自定义模块。它不适用于框架。幸运的是,StackOverflow 上有人提到了这一点,并给出了答案:

在对象检查器上显示 TFrame 后代的附加属性

然后,为了使其加载自定义框架的 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)

delphi delphi-2009 tframe

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

在单独的线程中进行数据库连接 - 最好的方法是什么?

我正在创建一个访问数据库的应用程序.在每次访问数据库时,应用程序都会等待作业完成.为了保持UI响应,我想将所有数据库内容放在一个单独的线程中.
这是我的想法:

  • db-thread在创建时创建所需的所有数据库组件
  • 现在线程就坐在那里等待命令
  • 如果它收到命令,它将执行操作并返回空闲状态.在此期间主线程等待.
  • 只要应用程序正在运行,db-thread就会存在

听起来不错吗?
将数据库结果从db-thread导入主线程的最佳方法是什么?
到目前为止,我对线程做的并不多,因此我想知道db-thread是否可以创建一个查询组件,主线程读取结果.主线程和数据库线程永远不会同时访问查询.这还会导致问题吗?

delphi multithreading delphi-2009

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

Delphi 2010平板电脑支持

当我不得不为我的工作购买delphi时,我看到的一个重要卖点就是支持平板电脑的能力.现在,我工作的公司的客户想要使用平板电脑.我一直在努力寻找与平板电脑的delphi的例子,但我没有找到任何.有人有经验吗?任何类型的教程或示例?

当组件获得焦点时,我似乎甚至无法携带虚拟键盘,并且当它丢失时隐藏它.

delphi tablet-pc touch gestures delphi-2010

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

当客户端连接到Indy中的服务器时,为什么IOHandler.ReadStream会阻塞线程?

今天我使用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,那么连接到服务器不会阻止代码执行,并且服务器会读取从客户端发送的数据.

代码有什么问题吗?或者这是一个错误?

问候

delphi indy delphi-2010 indy10

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

在运行时查看TImagelist的内容

可以在运行时调用TImagelist编辑器来查看我的内容TImagelist吗?

delphi imagelist timagelist

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