我有一个包含多个表单的应用程序。其中两个非常相似,它们具有共同的 VCL 对象(标签、图像等)形式的特征,我将其命名为相同的。我想在特定类中有一个函数,它可以接受这两个 Form 之一作为参数,以便修改它们共有的参数。我遇到的解决方案似乎不起作用。
由于我的应用程序非常大且复杂,我使用一个小示例复制了该问题。首先,下面是我的 MainForm 的一个例子:
以及一个子表单的示例(它们都以类似的方式排列)
我有一个额外的类,用于填写子表单上的编辑。这个类的代码如下:
#pragma hdrstop
#include "master_class.h"
#include "sub_Form2.h"
#include "sub_Form3.h"
#include "sub_Form4.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
Master::Master(void)
{
}
Master::~Master(void)
{
}
void Master::WriteToForm(TForm* Form)
{
TForm2* curForm = static_cast<TForm2*>(Form);
TForm3* self = dynamic_cast<TForm3*>(Form);
TForm2* self2 = dynamic_cast<TForm2*>(Form);
if (self != NULL && self2 == NULL) {
TForm3* curForm = static_cast<TForm3*>(Form);
}
else if (self == NULL && self2 != NULL) {
TForm2* curForm = static_cast<TForm2*>(Form);
}
curForm -> Edit1 -> Text = …Run Code Online (Sandbox Code Playgroud) 我编写了一个应在启动 Windows 时运行的应用程序。
我使用此代码来使用复选框来决定它是否在启动时运行:
// d('randomString'); -> this is a function which adds text to a memo for debugging purposes
// GetDosOutput is a function to run cmd commands and get the output of them piped in a memo
function GetRegistryValue(KeyName: string): string;
var
Registry: TRegistry;
begin
Registry := TRegistry.Create(KEY_READ);
try
Registry.RootKey := HKEY_CURRENT_USER;
// False weil kein Eintrag erzeugt werden soll, sofern er nicht vorhanden ist.
Registry.OpenKey(KeyName, False);
result := Registry.ReadString('SomeRandomAppIWantToRun');
finally
Registry.Free;
end;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
var …Run Code Online (Sandbox Code Playgroud) try..except当尝试将 PNG 文件加载到以下文件中时,我有一个捕获错误的基本方法TImage:
try
Previewimage.Picture.LoadFromFile(filename);
except
//code to handle exception
end;
Run Code Online (Sandbox Code Playgroud)
通常,如果文件不存在,或者在我的情况下 PNG 已损坏,则此方法可以正常工作。我无法控制 PNG 的源创建,因此需要捕获 PNG 无法加载的情况,即它给出错误:
此“便携式网络图形”图像无效,因为它包含无效的数据片段(crc 错误)。
我的问题是它try..except在工作线程内。这似乎导致try..except被忽略,并且我的程序因 CRC 异常而崩溃。
对于这个问题有什么简单的解决办法吗?
在 FireMonkey (FMX) 中,每个TControl组件都有一个HitTest属性,允许我启用或禁用组件上的鼠标事件。
VCL中有类似的东西吗?我试着寻找它,但我HitTest在任何地方都找不到房产。
如果没有HitTestVCL,如何实现同样的效果呢?有人可以提供一个关于如何在 VCL 中执行此操作的代码示例吗?
我正在使用 Embarcadero Delphi 12。
我正在尝试编写一个自定义TGraphicControl后代,允许用户在VCL表单上嵌入SDL渲染表面.这将提供一种在表单中显示SDL动画的简单方法.
显然,使用Paint方法重绘了TGraphicControl.这种情况多久被召唤一次?只有当某些事情发生在使控件无效时,或者还有其他事情可以调用它吗?它如何与自己绘图的东西相互作用?
VCL本身不允许MainForm以外的其他表单托管MDI子表单。这是Borland的硬编码限制,不是Microsoft MDI体系结构的限制。Microsoft允许应用程序中的多个窗口托管MDI子级。Win32 API中没有MainForms的概念。
我尝试将下面的embarcadro c ++示例转换为embarcadro delphi,但未成功。创建mdi子表单时,我始终遇到错误“当前没有任何mdi表单处于活动状态”。
此c ++示例演示了如何允许一个非MDI项目承载多个MDI父窗体,这些窗体都不是VCL的MainForm。
随信息一起下载(需要下载帐户) http://cc.embarcadero.com/item/23574
直接下载(无需下载帐户) http://www.delphibasics.info/MultipleMDIParentFormsInASingleApplication.zip
如果有人将这个示例从embarcadro c ++语言转换为embarcadro delphi语言,将不胜感激。谢谢。
我编写了一个自定义控件(TCustomControl),它显示了悬停时的标准内置提示.但是,禁用该控件时,不会显示提示.但是,TSpeedButton当它被禁用时确实显示了一个暗示,所以必须有一种方法可以在我的控制中做同样的事情.
当我的控件被禁用时,我需要做什么才能显示提示?
我有一个树视图和一个列表视图,以及一个应该将所选项目从树视图移动到列表视图的按钮.选择和传输完全正常,但删除树视图中的项目不是.它仅在我在树视图下选择单个项目时才有效.当我有TreeView1.MultiSelect := True,然后有一个问题.
这是我正在使用的代码:
For i := 0 to TreeView1.Items.Count-1 do Begin
If TreeView1.Items[i].Selected then
Begin
Itm := ListView1.Items.add;
.....
TreeView1.Items[i].Delete
Run Code Online (Sandbox Code Playgroud)
上述代码在某些选择后给出无效索引.不完美有时只添加两个中的一个.
尝试:
For i := TreeView1.Items.Count to 1 do Begin当我选择父节点中的所有元素被复制的最后一个元素时,这是不起作用的代码
for Itr := TreeView1.Items.Count-1 downto 0 do Begin
if TreeView1.Items[Itr].Selected then
begin
Str := TreeView1.Items[Itr].Parent.Text + ' ,' + TreeView1.Items[Itr].Text;
TrimLeft(Str);
for k := 0 to SaveList.Count -1 do Begin
If ansipos(Str, SaveList[k]) > 0 Then Begin
Value := StringReplace(SaveList[k], Str, '',[rfReplaceAll, rfIgnoreCase]);
End; …Run Code Online (Sandbox Code Playgroud) 我在尝试将4字节十六进制格式颜色转换为RGB格式时遇到问题,最大的问题是4字节十六进制颜色的两个第一个字符,我不知道如何转换它.所以我有这个十六进制:$16750899并希望转换格式RGB(0..255,0..255,0..255)
我在 Delphi 中使用 ListView。我将 OwnerData 属性设置为 true,以便在 OnData 事件中提供该项目的数据。
此外,我想为列表视图的每个项目添加一个复选框。但是Checkbox 属性只支持vsList 和vsReport 模式,不支持vsIcon 和vsSmallicon。有解决方法吗?或者是否有任何现成的 3rd 方 VCL 支持这样的功能?
我正在将Delphi Xe5用于Windows和Firemonkey移动应用程序.
我在我的项目组中有两个不同项目的单元.(Windows应用程序和Firemonkey移动应用程序)
1.)如何确定Delphi Xe5的版本?或者,版本是什么?
2.)有没有办法确定Win 32应用程序之间.赢得64应用程序和Firemonkey移动应用程序
3.)在代码中,如何根据应用程序的类型告诉编译器使用哪个版本的Dialogs.那就是VCL.Dialogs(Windows App)与FMX.Dialogs(Firemonkey移动应用程序)
谢谢
vcl ×13
delphi ×12
firemonkey ×2
listview ×2
autostart ×1
c++ ×1
c++builder ×1
checkbox ×1
delphi-xe5 ×1
hittest ×1
image ×1
mdi ×1
mouseevent ×1
png ×1
sdl ×1
timage ×1
treeview ×1
windows ×1