问题标签 [c++builder-xe8]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
909 浏览

c++ - Firemonkey:缩小文本字体以适应 TLabel

TLabel如果 a 的文本太大以适合标签的范围,我正在尝试降低它的字体大小。我没有看到我可以在标签上设置任何属性来实现这一点,所以我尝试编写自己的方法。我的方法是使用TCanvas.TextWidth来测量标签中文本的宽度,然后缩小字体,直到文本的宽度适合标签的宽度。

这在某些时候有效,但在其他时候它不会将字体缩小得足够近。似乎我从调用Canvas->TextWidth中获得的值很多次,远小于标签实际需要的像素宽度以适合文本。

我使用Canvas->TextWidth不正确吗?有没有更好的方法来计算字符串的宽度,或者重新调整 a 的字体大小TLabel以使其文本适合其尺寸?

编辑:
在这种情况下,我将传入我的函数,TCanvas即我的标签所在的函数。我尝试过使用它TCanvas以及Label->Canvas. 两者都给了我相同的文本宽度数字,并且两者都缺少显示整个字符串所需的实际像素值。

0 投票
1 回答
1682 浏览

c++ - Embarcadero TThread:在 C++ 中传递 TThreadMethod

编辑:现在我对正在发生的事情有了更好的了解,我想我可以更好地表达这个问题,这样它就更有用了。

我正在尝试在 C++ 中复制以下 delphi 代码

代码的目的是调用一个TMemo以线程安全方式更新表单的方法。这是我尝试调用的方法的 C++ 版本Thread.Queue

因为我使用的是没有 CLANG 增强功能的 BCC32 编译器,所以不能选择使用 Lambda。相反,根据本文档,我需要创建一个继承自该类的类,该类TThreadProcedure会覆盖该Invoke()方法来完成我需要完成的工作。然后我可以将该类的一个实例传递给TThread::Queue.

我创建了以下类,它继承TThreadProcuedure并包含一个调用方法。

但是,由于TThreadProcedure是一个抽象类,我不能简单地创建它的一个实例来传递给TThread::Queue. TThreadProcedure当我将类的实例传递给时,继承和定义要调用的函数的正确方法是什么TThread::Queue

0 投票
1 回答
273 浏览

c++ - 模态对话框打开时无法聚焦 Firemonkey 应用程序,除非单击模态对话框本身

我有一个应用程序,用户在登录时会收到一个模态对话框提示,他们必须在其中选择他们希望工作的设施。在这个阶段,应用程序如下所示:

在此处输入图像描述

通过调用此方法显示模态对话框:

在这种情况下,TFacChoiceForm继承自TForm所以ShowFacChoiceForm()函数调用此处记录的标准TForm.ShowModal方法

我遇到的问题是,如果我的应用程序失去焦点,除非单击模式对话框本身,否则它不能再次成为活动窗口。为了更好地说明这一点,我将展示以下场景:

假设现在是星期五下午,我决定放纵一下并阅读一些网络漫画。打开我的应用程序后,我会在其顶部打开另一个窗口,如下所示:

在此处输入图像描述

然后,我的老板不知从何而来进行绩效评估,我试图通过单击主窗体上的某个位置来重新调整我的应用程序。例如,在下一个图像中这个红色 X 的位置。

在此处输入图像描述

在上图中,我点击了红色 X 的位置。现在,包含网络漫画的表单和我的应用程序都处于非活动状态。因此,我的应用程序不会出现在屏幕前面。

但是,如果我能够单击模态对话框中的某个位置,例如下图中的红色 X...

在此处输入图像描述

...然后我的申请就会像人们期望的那样出现在前面。

在此处输入图像描述

为了解决这个问题,我已经研究过使用 Windows API 中的SetForegroundWindow之类的东西,但我无法找到触发事件的方法,因为我的主窗体在打开模式对话框时不会触发事件。

我的问题是,我如何确保如果用户单击我的应用程序上的任何位置,它会被带到前面?我可以在我的表单中编辑一个属性来执行此操作吗?

0 投票
2 回答
162 浏览

c++ - Firemonkey:如何使用 TScreen.Forms 遍历应用程序中的所有表单

我正在尝试遍历我在应用程序中打开的表单。我找到了FMX.Forms.TScreen.Forms的文档,看起来它可以用来实现我的目标。但是,我对应该如何使用它感到困惑。

起初我在表单的 CPP 文件中的一个函数中尝试了这个:

这产生了错误'Member TScreen::FormCount cannot be used without an object'

我认为这意味着我需要尝试从我的表单或全局Application变量中访问此属性。我都试过了

然而,它们既不存在Forms也不TScreen存在于这些对象中。

我该如何访问Forms.TScreen.Forms

0 投票
1 回答
223 浏览

c++ - 在鼠标钩子代码中调用方法会导致访问冲突

我有一个低级鼠标钩子,我试图用它来处理全局左键单击事件。我在一个基本的主窗体类中定义了钩子,如下所示:


我的鼠标钩子可以很好地检测到左键单击,但是当我尝试获取我的句柄时,我MainForm遇到了访问冲突。

我最初认为这可能是因为我试图在TMainForm类中检索句柄,而实际上在运行时,继承自的表单TMainForm将处于活动状态。为此,我编写了一个名为GetHandle().

这个函数在TMainForm头文件中定义如下:

在继承类中是这样的:

但是,当我打电话时GetHandle()TMainForm我仍然会遇到访问冲突。此外,在尝试了更多的事情之后,我意识到从内部调用任何虚函数都会MouseHook导致访问冲突。

为什么我无法使用 Platform::Win::WindowHandleToPlatform(this->Handle)->Wnd;inside of检索我的表单句柄MouseHook?为什么在内部调用虚函数MouseHook会导致访问冲突?

编辑:

为了测试 Remy 提出的 MainForm 指针无效的答案,我在TMainForm构造函数中添加了一段代码来测试指针是否有效。TMainForm此外,我向继承自并在启动我的应用程序时加载的类的构造函数添加了一段代码,以测试其全局指针。我班级中的全局MainForm指针TMainForm实际上是无效的。但是,继承类的全局指针是有效的,因为它是实际被实例化的类。

0 投票
1 回答
719 浏览

c++ - Firedac:如何使用数据集读取器/写入器设置 TFDBatchMove?

我正在尝试设置一个使用读取器和写入器数据集TFDBatchMove调用的对象。FDBatchMove根据这个文档

应用程序应将所需的读取器和写入器分配给属性,然后调用 Execute 方法。

根据一个应该的文件TFDBatchMoveDataSetReader

使用 TFDBatchMoveDataSetReader 定义源数据集,使用 TFDBatchMove 从中加载信息。

设置 DataSet 属性以选择数据集。

选择 TFDBatchMoveDataSetReader 作为 TFDBatchMove 的 Reader 属性。

文档包含TFDBatchMoveDataSetWriter相同的步骤。

因此,我创建了一个TFDBatchMoveDataSetReader和一个TFDBatchMoveDataSetWriter对象,并像这样设置它们的数据集值:

但是,当我尝试设置TFDBatchMove对象的读取器和写入器属性时(即文档中的第三步),我遇到了一个问题。

编码...

...给我以下错误:

我尝试显式创建一个新_di_IFDBatchMoveReader对象,但是该对象不允许我访问 Dataset 属性。我应该如何TFDBatchMove使用数据集阅读器和数据集编写器设置我的对象?

0 投票
1 回答
111 浏览

c++ - 如何访问单个 TListViewItem 上的文本按钮

我有一个 Firemonkey TListView组件,我已经对其进行了定制,以在每个项目上包含一个Text和组件。TextButton为了自定义我的组件,我遵循了本文档TListView的“使用自定义值”部分。

我需要TextButton在我的列表中隐藏某些项目。我已经想出了如何TextButton使用以下方法一次隐藏列表中的所有组件:

MyListView->ItemAppearanceObjects->ItemObjects->TextButton->Visible = false;

但是我无法弄清楚如何访问TextButton单个行的,以隐藏我需要隐藏的特定按钮。我如何才能访问TextButton我的列表中的单个行?

0 投票
1 回答
408 浏览

c++ - How to override on click event of custom Firemonkey control

I am attempting to create a custom Firemonkey control which inheirts from the TListView control. I want to add some functionality to the control which is automatically executed when a user clicks on the control. Therefore, my goal is NOT to specify an OnItemClick method on my control's form, but rather add functionality directly into the control itself.

I am struggling to comprehend what I need to do in order to tap into the on click handler for TListView. In my head, I imagine my solution would look something similar to this pseudo code:

However, I cant seem to find anything in the documentation about what method I should attempt to override, or how I should be going about this at all.

I did find this information about calling the 'Click-event' handler. I set up a simple example like so:

This works fine, however according to the documentation:

If the user has assigned a handler to a control's OnClick event, clicking the control results in that method being called.

Therefore, any additional logic I placed in the Click() method of the control would be lost if one of the control's on click event properties was set.

What is the proper way to go about extending the functionality of what happens when a custom control is clicked?

0 投票
1 回答
571 浏览

c++ - Firemonkey:在运行时将子控件添加到 TListViewItem

我试图在运行时TEdit向控件添加控件。TListView我想将控件设置为属于 myTEdit的所选控件,但是,我找不到执行此操作的方法。 TListViewItemTListView

最初,我试过这个:

但是,这给了我以下错误:

[bcc32 错误] E2034 无法将 'TListViewItem *' 转换为 'TFmxObject *'

一时兴起,我试图在我的列表视图中对选定的项目进行类型转换,TFmxObject如下所示:

在编译时,这会在运行时导致访问冲突。

我搜索了很多文档和论坛帖子,但找不到很多关于在代码中动态添加控件到列表视图项的信息。我已经看到建议使用样式编辑器的解决方案,但我想尽可能避免这种情况。

如何将控件的父级设置为我的项目TListView?有没有更好/更合适的方法在运行时向 a 添加控件TListViewItem

0 投票
2 回答
145 浏览

c++ - Firemonkey:尽管 autosize 属性为 true,但 TLabel 文本仍被截断

我的 Firemonkey 应用程序遇到了一个奇怪的问题。这是我的应用程序在本地 Windows 8.1 机器上运行时的屏幕截图。在蓝色面板内,是一个自动调整大小的标签,带有特意较长的描述,以确保调整工作正常。

在此处输入图像描述

一切似乎都很好,直到我在特定的远程机器上运行相同的应用程序。这是在远程 Windows Server 2008 R2 机器上运行的同一应用程序的屏幕截图。

在此处输入图像描述

如您所见,蓝色面板内的标签现在被截断,尽管它的自动大小属性设置为 true。此外,“显示日志”按钮的文本也被截断。

除了验证标签的自动大小属性之外,我还尝试以不同的窗口大小运行远程计算机,以查看问题是否与屏幕分辨率有关。但是,标签继续被截断。

Firemonkey 是否存在任何已知问题,即在不同操作系统之间以不同方式绘制事物?远程计算机上是否有任何可能导致应用程序无法正确呈现的显示设置?还有什么我应该考虑尝试缩小/解决问题的吗?