即使子窗口具有焦点,如何让 KeyDown 事件在 Delphi (2007) MDI 应用程序父窗口中工作?
我想实现一个在 MDI 应用程序中显示帮助屏幕的快捷键 (F1),我已将 KeyDown 过程添加到 MDI 父窗口并在父窗口和子窗口中启用 KeyPreview,但它不起作用预期的。
如果我在Parents KeyDown 代码中放置一个断点,我可以看到它永远不会执行,即使没有打开子窗口。但是如果我将相同的代码添加到子窗口,它就可以正常工作。
有没有办法让父窗口接收按键,即使子窗口有焦点,因为将代码添加到 25+ 表单接缝有点浪费?
图标也有同样的问题。我对您的回答感到满意,即 seticon 属性为 false。但是我的表单是 MDI 表单的子表单,那么这个问题仍然存在,图标没有被删除。你能帮助我吗。
我正在大学学习 VB.Net 主题,主要任务是创建 WPF 应用程序。
该应用程序以管理为中心(添加、修改、删除条目等)。由于这些都是相当不同的任务,我正在考虑为我的任务创建一个选项卡式界面(与 Spybot 的界面类似:http : //www.2-spyware.com/images/data_images/spybot-search-and-销毁1.jpg)。
我有点困惑我应该如何解决这个问题?顺便说一句,这会归类为 MDI 吗?
我们被建议创建一个列出所有选项的菜单系统 - 选择一个选项后,将打开一个新窗口,进行交互。如果用户想做其他事情,他将关闭窗口以返回菜单屏幕。
这对我来说似乎并不是一种优雅的方法,而且实现我解释的基于选项卡的系统似乎是一个有趣的练习。
如果有人能指出我正确的方向或就我应该如何实现提供任何提示,我将不胜感激。例如,是否可以在单独的 xaml/代码隐藏文件中创建每个选项,然后将它们“插入”到每个选项卡中?
编辑:为了澄清,让我们假设一个室内足球队管理系统。假设用户可以执行五种不同的任务:“注册玩家”、“修改玩家”、“注册团队”、“修改团队详细信息”、“将玩家添加到团队”。
每个任务都与下一个任务分开。创建应用程序的一种方法是为每个任务创建一个带有按钮的主页。当用户单击每个按钮时,会打开一个新窗口(例如,如果用户单击“注册玩家”,则会打开一个新的 PlayerRegistration 窗口)。
如上所述,我正在寻找的是一种基于选项卡的方法。在我的应用程序中,如果用户单击“注册播放器”,则整个 PlayerRegistration xaml 文件将加载到窗口的一部分中。当用户单击任何其他按钮时也会发生同样的情况。
我想一种思考方式是使用框架的网站。
注意:如果您认为我的目标不是很合适,并且有更好的方式来布置我的应用程序,我很想听听一些建议。
我有一个 MDI 应用程序。这个 MDI 应用程序还有许多其他工具,包括一个编辑器。我想用我的 MDI 应用程序的编辑器打开所有“.txt”文件,从而使我的应用程序成为所有“.txt”文件的默认查看器。
每当用户编辑“.txt”文件时,MDI 应用程序应启动,并且编辑器窗口应填充所选“.txt”文件的内容。
请问有什么办法可以做到。
谢谢
我一直在使用工厂模型创建子表单以添加到MDI表单.这是我一直在使用的代码:
/// <summary>
/// This uses the Factory Model to create the child node and then add it to the MDI Parent (this)
/// </summary>
/// <param name="childName">String class name of the child, i.e. RentalEase.PropertyGrid must extend Form or SingleInstance</param>
/// <param name="singleInstance">bool If this class is to be a single instance and restricted to only on instance. Must extend SingleInstance</param>
public void createChild(string childName, bool singleInstance) {
if (singleInstance) {
try {
BaseAndSingleInstanceForm f = BaseAndSingleInstanceForm.getInstanceByType(this, Type.GetType(childName));
f.MdiParent = …Run Code Online (Sandbox Code Playgroud) 我在弄清楚这个功能出了什么问题时遇到了一些麻烦.我不确定我是否应该使用-1或者不再使用-1,无论我如何尝试安排代码,它似乎都会返回nil,即使它不应该.有新鲜眼睛的人可以看看吗?另外,我不确定我的结果:= nil是否在适当的位置.
function TFrmMain.FindQueryFrm(Server, Nickname: String): TFrmMessage;
var
I,M: Integer;
begin
/// No -1 in the I loop - why? Because the first childform will not always be
/// of type TFrmMessage, which is what we're looking for.
///
/// Is this approach wrong?
for I := 0 to MDIChildCount do
begin
if Screen.Forms[I] is TFrmMessage then
begin
/// Same concept with -1 here (M Loop)... I need to check all forms
/// stored by QueryManager to see if their …Run Code Online (Sandbox Code Playgroud) 我在VS2008环境中使用C#.
我有一个名为frmStrategy5YrPlan的表单,其中包含一个数据网格视图,用于填充数据,然后允许用户键入新的预测数据.完成后,用户将单击一个按钮上传他们输入的新数据,我希望显示另一个表单,要求他们确认是否要这样做(因为该过程会删除所有旧数据并替换为'我进入了).
我总是被表单欺骗,但基本上我希望我的初始表单加载第二个表单,评估用户是否选择确认加载数据(或不加载),然后使用初始表单中的代码处理数据.
这是我的初始形式,今天工作正常而没有调用第二种形式(我正在询问).下面是初学者的第二种形式的代码和我添加的按钮的工作方式,只是试图让两种形式相互交流.在另一部分中调用表单时,总是让我感到困惑.我对MDIParents不太熟悉,但是我在这里尝试过,我的初始表单没有设置为一个,所以我不确定这是否是解决方案.
public void btnUploadNewStrategy5YrPlan_Click(object sender, EventArgs e)
{
//this.ConfirmForm.Text = "DSC_0 Staged";
//this.ConfirmForm.EnableReport(false);
//this.ConfirmForm.Type = frmConfirmForecastUpload.LoadType.DSC_0;
//this.ConfirmForm.MdiParent = this;
this.ConfirmForm.Top = this.Height / 3 - this.ConfirmForm.Height / 2;
this.ConfirmForm.Left = this.Width / 2 - this.ConfirmForm.Width / 2;
this.ConfirmForm.Show();
Cursor.Current = Cursors.WaitCursor;
SqlCommand cmd = null;
SqlDataReader dr = null;
StringBuilder sql = new StringBuilder();
try
{
var dtForecast = new DataTable();
dtForecast.Columns.Add("Unit");
dtForecast.Columns.Add("Year");
dtForecast.Columns.Add("Period");
dtForecast.Columns.Add("Acct");
dtForecast.Columns.Add("Descr");
dtForecast.Columns.Add("DEFERRAL_TYPE");
dtForecast.Columns.Add("NDC_Indicator");
dtForecast.Columns.Add("Mgmt Cd");
dtForecast.Columns.Add("Prod");
dtForecast.Columns.Add("Node");
dtForecast.Columns.Add("Curve_Family");
dtForecast.Columns.Add("Sum Amount");
dtForecast.Columns.Add("Base Curr"); …Run Code Online (Sandbox Code Playgroud) 我有一个带有两个子窗体的 MDI 容器。我们已经被教导(并且 MSDN 文档仅给出了示例)使用关键字“this”,它假定所讨论的子对象是从 MDI 容器本身创建的。
如果我在 MDI 容器中创建对象,这将是正确的:
Form_Child2 child = new Form_Child2(textBox1.Text);
child.MdiParent = this;
child.Show();
Run Code Online (Sandbox Code Playgroud)
相反,我正在尝试做一些更像:
Form_Child2 child = new Form_Child2(textBox1.Text);
child.MdiParent = Form_Parent;
child.Show();
Run Code Online (Sandbox Code Playgroud)
但是,这会引发错误,指出“Form_Parent”是一种类型,不能用作变量。我想我隐约明白它的意思,但不清楚。我也尝试过研究关键字“this”,但仍然卡住了。
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语言,将不胜感激。谢谢。
使用 Windows 窗体使 Window 的大小响应每种类型的屏幕分辨率
有一个很好的组件可以在客户区域中最大化子窗口(必须保留SHIFT键) - NLDExtraMDIProps.
或者可以使用此代码:
procedure WMSIZE(var Msg: TMessage); message WM_SIZE;
procedure TForm2.WMSIZE(var Msg: TMessage);
begin
inherited;
if Msg.WParam = SIZE_MAXIMIZED then
begin
ShowWindow(Handle, SW_RESTORE);
Left := 0;
Top := 0;
Width := Form1.ClientWidth - 4; // The BORDER
Height := Form1.ClientHeight - 4;
end;
end;
Run Code Online (Sandbox Code Playgroud)
但最大化并不是真正的最大化.子窗口仅与客户区对齐.它必须在调整父窗口大小时自动调整大小并适合客户区域,最大化/恢复系统按钮必须更改等.
我尝试完成下面描述的效果.
正如您在图片上看到的那样,子窗口最大化,并且
1)它们不占用整个父窗口(仅占用客户区域).
2)将它们移动到标题/标题栏上是不可能的,因为它们是最大化的.
3)他们有恢复按钮,而不是最大化按钮.
4)它们与客户区对齐(父窗口的大小调整导致子客户区域的大小调整).
我的问题中的代码和组件不像图片上的子窗口那样.
我们可以使窗口真正最大化(不仅仅是对齐)吗?
没有最大化(不好;我的问题中的组件和代码在这些图片上最大化):

最大化(我需要的):

如果子项被最大化或最小化,我想在我的 MDI 父级中隐藏我的一些控件。