大家新年好!散分!顺便问个小问题,大家热热身~~

hongss 2021-01-13 12:03:20
大家新年快乐!牛年大牛!!!



Win10 + XE2 环境

一个新Project,主窗口添加一个Chart,启动窗口最大化

新加一个Unit,取名fLarge,启动窗口最大化,也添加一个Chart,添加Chart双击事件,代码只有一句 this->Hide();

主窗口Chart也添加双击事件,代码也只有一句 fLarge->Show();

编译,运行。

双击主窗口Chart,打开fLarge正常;

双击fLarge窗口,隐藏该窗口时,就会出错 cannot focus a disabled or invisible window

======================================================

同样的操作,在C++builder 6下就没问题,哪位大牛给解释下?或者,怎么能解决这个问题?
...全文
1425 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐胖电工 2021-02-28
  • 打赏
  • 举报
回复
路过学习。新手
  • 打赏
  • 举报
回复
现在都人工审核帖子了,能兴旺才怪~
hongss 2021-01-26
  • 打赏
  • 举报
回复
引用 13 楼 早打大打打核战争 的回复:
测试了XE5,和你说的XE2一样,加上Chart_1->Enabled = false;并不能解决问题。 chart内部的双击事件处理如果调用用户事件处理之后还有其他操作(更新焦点状态之类的),用户的双击事件处理中调用了Hide()、Close()就会出现那个问题。 解决的方法是不要调用Hide()、Close(),只能: void __fastcall TfLarge::Chart_1DblClick(TObject *Sender) { // ... PostMessage(Handle, WM_CLOSE, 0, 0); }
的确,可以用这个办法解决。谢谢了! 这个论坛现在人好少,没有以前兴旺了~~~
  • 打赏
  • 举报
回复
测试了XE5,和你说的XE2一样,加上Chart_1->Enabled = false;并不能解决问题。
chart内部的双击事件处理如果调用用户事件处理之后还有其他操作(更新焦点状态之类的),用户的双击事件处理中调用了Hide()、Close()就会出现那个问题。
解决的方法是不要调用Hide()、Close(),只能:
void __fastcall TfLarge::Chart_1DblClick(TObject *Sender)
{
// ...
PostMessage(Handle, WM_CLOSE, 0, 0);
}
hongss 2021-01-18
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------
void __fastcall TfLarge::Chart_1DblClick(TObject *Sender)
{
    Chart_1->Enabled = false;

	Hide();
}
//---------------------------------------------------------------------------
void __fastcall TfLarge::FormShow(TObject *Sender)
{
	this->WindowState = wsMaximized;
	Chart_1->Enabled = true;
}
//---------------------------------------------------------------------------
测试结果还是不行啊,麻烦在别的版本测试一下?
  • 打赏
  • 举报
回复
不是XE2的问题,只是高版本TChart有内置的双击事件处理导致的,10.2.1也有这种情况,关闭前加上那句就好了。
你的代码之所以还有问题,是因为
void __fastcall TfMain::Chart_1DblClick(TObject *Sender)
{
fLarge->Chart_1->Enabled = true; //把这行去掉
fLarge->Show();
}
可以在TfLarge::OnShow事件中Chart_1->Enabled = true;
hongss 2021-01-18
  • 打赏
  • 举报
回复
引用 8 楼 早打大打打核战争 的回复:
很明显你第二个chart事件处理写错了
呃。。。我在这里编辑的,不是直接复制的~~~我的代码里没错 Chart_1->Enabled = false; 我现在有点怀疑我的XE2有问题。。。 无论是D7,还是CB6,我都试过了,都没问题,就在这个XE2下出这问题。
  • 打赏
  • 举报
回复
实测10.2.1是可以的,没有其他版本,我家里的电脑还有XE5,晚上测试一下,明天告诉你结果
  • 打赏
  • 举报
回复
很明显你第二个chart事件处理写错了
hongss 2021-01-15
  • 打赏
  • 举报
回复
两个Unit,第一个,主窗口 uMain
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "uMain.h"
#include "uLarge.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "RzButton"
#pragma resource "*.dfm"
TfMain *fMain;
//---------------------------------------------------------------------------
__fastcall TfMain::TfMain(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfMain::FormShow(TObject *Sender)
{
 	this->WindowState = wsMaximized;
}
//---------------------------------------------------------------------------
void __fastcall TfMain::Chart_1DblClick(TObject *Sender)
{
	fLarge->Chart_1->Enabled = true;
	fLarge->Show();
}
//---------------------------------------------------------------------------
第二个 uLarge
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "uLarge.h"
#include "uMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "RzButton"
#pragma resource "*.dfm"
TfLarge *fLarge;
//---------------------------------------------------------------------------
__fastcall TfLarge::TfLarge(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfLarge::Chart_1DblClick(TObject *Sender)
{
        Chart_1->Enabled = true;
	this->Hide();
}
//---------------------------------------------------------------------------
void __fastcall TfLarge::FormShow(TObject *Sender)
{
	this->WindowState = wsMaximized;
}
//---------------------------------------------------------------------------
就这么简单个东西。。。毛病依旧~~~~~~
  • 打赏
  • 举报
回复
你不是有两个chart么,这个要放在fLarge的那个chart事件处理中
hongss 2021-01-15
  • 打赏
  • 举报
回复
也就放在Chart_1DblClick双击事件中会出现问题,其他的单击等事件都不会出这个问题
hongss 2021-01-15
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争 的回复:
实测10.2.1有效,你可能没写对地方
就在Chart的双击事件中啊,还能放哪里?
  • 打赏
  • 举报
回复
实测10.2.1有效,你可能没写对地方
hongss 2021-01-13
  • 打赏
  • 举报
回复
引用 1 楼 早打大打打核战争 的回复:
应该chart导致的,它内部可能有双击事件处理更新焦点状态,而此时父窗口隐藏了。 可以: Chart1->Enabled = false; this->Hide();
没用,我也试过了。 本来还以为是主窗口的焦点转移出问题,还专门给主窗口加了个Btn,先把焦点聚焦到这个Btn上,再Hide,还是一样~~~
  • 打赏
  • 举报
回复
应该chart导致的,它内部可能有双击事件处理更新焦点状态,而此时父窗口隐藏了。
可以:
Chart1->Enabled = false;
this->Hide();

13,870

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧