标签: vcl

在运行时删除并替换可视组件

例如,是否可以在运行时使用实例化(有条件地)的子类组件替换和释放TEdit?如果是这样,应该如何以及何时完成?我试图将父设置为nil并在表单构造函数和AfterConstruction方法中调用free(),但在这两种情况下我都遇到了运行时错误.


更具体一点,我遇到了访问冲突错误(EAccessViolation).看起来弗朗索瓦是正确的,他说在框架构造中释放组件会使用Form来控制内务管理.

delphi vcl

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

为不同的Delphi版本编译Delphi组件包(bpl)

情况如下.通常我使用RAD Studio 2010进行Delphi开发.我有一些我想以二进制形式重新分发的组件(*.bpl没有源代码).但我希望人们能够使用它们,尽管他们的Delphi版本.但是,例如,dcu文件只能由生成它们的编译器版本使用.我知道,几乎相同的情况是bpl文件.每个bpl文件都需要相应的VCLXX.bpl库,具体取决于Delphi版本.如何使我在2010年编译的bpls能够在Delphi7,2007等中使用?

安装所有Delphi版本的唯一解决方案是在每个版本中单独编译bpl文件吗?

delphi components vcl delphi-2010

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

如何在TCheckBox,TRadioButton,TGroupBox上更改字幕字体颜色?

我不知道我的问题是什么,但我无法在DEx2中为TCheckBox,TRadioButton,TGroubBox和TRadioGroup等控件设置字体颜色.如果我在IDE中或以编程方式执行它并不重要.

我已将表单颜色设置为clBlack,并希望我的标题是clWhite,但它们不会渲染任何颜色,而是clBlack.当我在表单的OnShow事件上分配颜色并在调试器中逐步执行它时,它会显示我分配给它的值,但在屏幕上它仍然是黑色.

我没有使用样式或其他任何东西.有任何想法吗?

这是一个示例表单: 白色黑色示例http://www.skippix.us/temp/Delphi-Font-Problem.bmp

delphi vcl properties colors delphi-xe2

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

检测子控件何时调整大小?

有没有办法让父控件检测子控件何时调整大小?我正在考虑编写一个面板控件来调整大小,因为它的子控件调整大小(类似于HTML DIV元素将扩展以适合它的内容的方式).

delphi user-interface vcl

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

Delphi中的自定义背景颜色,启用了运行时主题

我在运行时创建了一堆Panel,我想改变它们的颜色.颜色属性不起作用,我不想转动运行时主题...

有任何想法吗?

我正在使用Delphi XE3.

谢谢你的帮助!

delphi vcl themes colors

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

TListView SelCount报告虚拟列表中的项目数错误

我需要启用或禁用按钮,具体取决于列表中是否至少选择了一行.

以下是重现此问题的代码.使用OnData事件填充列表,它允许选择多行.

我以为我可以使用OnSelectItem来检测用户何时更改选择,然后使用TListView SelCount函数来检测所选行的数量.

问题是当用户选择多行时,SelCount返回0.如果手动填充列表(即不通过OnData事件),这可以正常工作.

有任何想法吗?

谢谢

更新:使用OnChange事件似乎可以解决问题.仍然有趣的是,当选择多行时(从SelectItem事件中),SelCount为什么返回0.

另一个更新:我发布了一个测试项目:https://dl.dropboxusercontent.com/u/35370420/TestListView2.zip以及截图:

在此输入图像描述

要重现此问题,请运行应用程序,选择Item1,然后按SHIFT +单击Item2.该按钮被禁用.我的目的是只要在列表中选择了至少一个项目,就动态启用按钮.如果没有选定项目,则禁用该按钮.

PAS文件:

unit MainUnit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls;

type
  TForm3 = class(TForm)
    ListView1: TListView;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure ListView1Data(Sender: TObject; Item: TListItem);
    procedure ListView1SelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
begin
 ListView1.Items.Count := 5;
end;

procedure …
Run Code Online (Sandbox Code Playgroud)

delphi vcl tlistview delphi-xe5

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

如何将TPageControl选项卡分解为Delphi中的单独文件?

我有一个VCL表格,上面有五个标签TPageControl.每个TTabSheet内容都是相当无关的,并且有很多单独的控件和处理逻辑...所以我想要分解它,这样就可以更容易地处理"只是那个选项卡"的代码.像一条线

//-------------------------- begin rules tab methods -------------------
Run Code Online (Sandbox Code Playgroud)

只是不再削减它了.真的,我想我想以某种方式将每个标签放在一个单独的文件中.

目前我正在考虑为每个TTabPage创建一个VCL框架.如果我这样做,我需要将所有帧加载到构造函数中的TPageControl中,或者显示选项卡时.

这是一个好方法吗?为每个标签制作一个完整的TForm会更好吗?我应该继续将选项卡包装在TPageControl中,还是应该在动态加载内容时将其更改为TTabControl?如果这是一个好方法,最好在启动时加载所有选项卡,还是每次显示选项卡?(也许是优点/缺点,如果不是完全明显哪个在大多数/所有情况下都更好)

delphi vcl tpagecontrol

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

什么是TParams.ParamRef用于?

Unit db.pas包含TParam类的实现,它表示数据库查询中的参数.

在测试带有大量参数的查询时,我注意到function TParam.ParamRef: TParam需要花费大量时间,因为它调用ParamByName了无索引的params搜索.

实现很简单:

function TParam.ParamRef: TParam;
begin
  if not Assigned(FParamRef) then
    if Assigned(Collection) and (Name <> '') then
      FParamRef := TParams(Collection).ParamByName(Name) else
      FParamRef := Self;
  Result := FParamRef;
end;
Run Code Online (Sandbox Code Playgroud)

它可以返回self或者ParamRef,所以想法是允许某种重定向.但它确实很慢ParamByName,被称为很多,我不明白的目的.事实上,如果我修改它只是返回self一切似乎工作正常.

我看到的唯一用途就是让几个同名的参数都重定向到同一个实例.如果是这种情况,那么ParamByName超过此功能的好处肯定会影响性能.

ParamRef没有文档,private因此只在db.pas单元中相关.此外,网上没有重要的讨论.

有谁遇到过同样的问题?

database delphi parameters vcl

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

标签标题中的字符数是否有(Windows)限制?

我注意到在(Windows 10 64 位上的 Delphi 10.3.3 32 位 VCL 应用程序)应用程序中,如果字符串“真的”很长,标签的标题将不会显示。进一步的测试表明它不限于 TLabel。TStaticText 也以相同的方式运行,可能所有的 TGraphicControls 也是如此。

对于表单上的 TLabel,测试表明如果标题长度为 43,679 个字符,它将显示标题。但再过一段时间,标题就会消失。自动调整大小、自动换行和 EllipsisPosition 的组合没有改变这种行为。跟踪 delphi 代码,它归结为 VCL.Controls 中的 2 条语句:

  Perform(WM_SETTEXT, 0, Buffer);
  Perform(CM_TEXTCHANGED, 0, 0);
Run Code Online (Sandbox Code Playgroud)

Buffer 在所有情况下都保存了正确的标题字符串值。但是在43,680 个字符时,标题消失了。所以它似乎是 Windows 限制,但我找不到任何确认。

windows delphi vcl

7
推荐指数
0
解决办法
140
查看次数

当主数据集为空时更新 VCL TClientDataSet(详细信息集)

我有一个主 TClientDataSet,它也是一个详细数据集。这个数据集被命名为 MasterDetail1。

另一个数据集 DetailSet1 是 MasterDetail1 的详细信息集。

DetailSet1 的查询是

SELECT * 
FROM readoutprobe_containers 
WHERE id = :parent_container
Run Code Online (Sandbox Code Playgroud)

其中parent_container参数的值是通过从主数据集中获取其数据的 DataSource 获得的。

只要 MasterDetail1 数据集有多条记录,DetailSet1 数据集就会显示相应的数据。

但是,当 MasterDetail1 数据集为空时,DetailSet1 数据集显示 MasterDetail1 数据中最后填充的记录,这是错误的数据。当主集没有数据时,明细集也应该不显示数据。

当主数据为空时如何实现空的DetailSet1?

c++ vcl tclientdataset dbexpress

7
推荐指数
0
解决办法
74
查看次数