我有以下问题:我们正在构建一个相当大的应用程序(win32,Delphi 6 Enterprise).在应用程序的几个部分中,使用模态窗口,通常包含主窗口选择的细节.
我们包含了对WM_SYSCOMMAND消息处理的修改,这样,如果窗口是模态的,那么SW_SHOWMINNOACTIVE消息将被发送到应用程序的主窗口.这导致整个应用程序被最小化而不仅仅是模态形式.
但是,在特定情况下会出现问题:如果调用窗口设置为全屏,则在恢复时,模式窗口将显示在(禁用)最大化主窗口下(这似乎发生在Windows 7上)
我的问题有两个问题:
首先,当应用程序恢复时,我似乎没有得到任何syscommand消息,因此我无法引入代码来恢复Z-Order,因为我不知道在哪里放置它.其次,在我看来,如果整个应用程序被最小化,单击任务栏中的应用程序按钮应该以相同的状态恢复它,而不是在它下面的模式窗口.有办法解决这个问题吗?
编辑:我们做了一些额外的测试,似乎我们实际上可以在WM_ACTIVATE处理程序中检测主窗体的问题.我们还可以在该阶段识别模态窗口.但是,我无法找到将其恢复到Z-Order顶部的方法.
Edit2:这是最小化模态形式时最小化应用程序的代码:
procedure TfmGITForm.WMSysCommand(var Message: TWMSysCommand);
begin
if (fsModal in FormState) or
not Application.MainForm.Visible then
begin
case Message.CmdType of
SC_MINIMIZE:
begin
ShowWindow(Application.Handle, SW_SHOWMINNOACTIVE);
end;
SC_RESTORE:
begin
ShowWindow(Application.Handle, SW_SHOWNORMAL);
inherited;
end;
else
inherited;
end; // case
end
else
inherited;
end;
Run Code Online (Sandbox Code Playgroud)
我们所有的形式都来自那个.
嵌入式Chromium与单独的Chrome在提醒用户"坏网站"方面没有相同的保护.Chrome用户熟悉当您尝试导航到Google检测到恶意软件或其他恶意网络元素的网站时出现的警告屏幕.但是,在嵌入式Chromium中重复此操作不会导致警告屏幕.有谁知道如何重现这个功能,所以我可以将它添加到我的嵌入式Chromimum项目(在Delphi 6 Pro中)?如果有人"追踪"了重新创建此功能所需的网络电话,我想知道.
我有一个Delphi程序,我正在研究这个程序如何在日志文件中打印自己的"虚拟大小",以便我可以看到它何时使用了太多内存.如何使用Delphi代码确定"虚拟大小"?
"虚拟大小"是指Process Explorer显示的值.普通任务管理器无法显示此值.它不是程序的内存使用,而是地址空间的使用.在Win32上,程序不能使用超过2 GB的地址空间.
PS:我使用的是Delphi 6,但其他版本的代码/信息也应该没问题.
我在我的Delphi 6应用程序中使用Chromium Web浏览器控件.
每当用户点击当前正在显示的不在我的主网站上的网页中的网页链接时,我通过使用带有"打开"动词的Windows ShellExecute()函数打开URL来启动带有URL的默认Web浏览器.我从BeforeBrowse()事件处理程序执行此操作并同时取消导航.
换句话说,我不在Chromium控件中显示外部URL,而是在用户的默认Web浏览器中显示它们.
它工作正常,但有时我也会得到一个由我的应用程序拥有的独立窗口弹出窗口,它占据了大约一半的完全空的屏幕(我的Windows主题的空白白色客户区).窗口的Windows类名是"webviewhost".
谁能告诉我如何压制这个"鬼"窗口?
我想在当前行的特定单元格的右下角显示弹出按钮或花哨的消息(带有彩色背景等).
现在我只想知道如何获取网格坐标:
x = DBGrid.DataSource.DataSet.RecNo
y = DBGrid.Columns [index]
还有TCustomGrid.CellRect,它会做我想要的,但它受到保护,我不想继承和创建另一个组件类.
我能想到的一个疯狂的解决方法是将onDrawColumnCell事件中的TRect-s保存到某个数组中.
所以你怎么看 ?
编辑
如何获取当前行中第二个单元格的屏幕坐标?
考虑低于该编译并在Delphi 6.当我恢复动态字符串数组没有错误运行,而不是看到空数组的代码SA,我看到的1与含有一个空字符串的单个元件的长度的数组.为什么这样,我如何安全地将NIL动态数组分配给Variant并正确恢复?这是代码:
TDynamicStringArray = array of string;
var
V: Variant;
sa: TDynamicStringArray;
begin
sa := nil;
V := sa;
sa := V;
OutputDebugString('sa has a single element now with an empty string in it when I expect it to be empty.');
end;
Run Code Online (Sandbox Code Playgroud) 我有一个Delphi 6应用程序,它使用ODBC DSN连接到目标数据库.我想要包含列出DSN所连接的数据库名称的文本.我尝试使用SQL命令db_name(),但只有在我登录SQL服务器时才能使用它才响应nil.
Delphi中有一种方法可以识别我连接的数据库吗?我可以提取sys.databases表,但不确定如何识别哪个数据库是我连接的数据库
举个例子:
如果我连接到该DSN LocalDSN我希望能够以显示给它们连接到用户数据库,其中数据库是它们与通信的SQL数据库的名称.
TADOQuery组件具有"准备"属性,手册说当准备好设置为TRUE时,ADO'准备'命令,这意味着什么?
这是手册解释:
在调用Execute方法之前设置Prepared以指定ADO是否准备命令.如果将Prepared设置为True并且命令组件连接到数据存储,则ADO会在执行命令之前准备该命令.如果Prepared设置为False,则ADO不会准备该命令.
它将参数注入SQL Text?
我有以下变量声明:
arrChar_1: array[0..2] of Char;
arrChar_2: array[0..2] of Char;
str: string;
Run Code Online (Sandbox Code Playgroud)
然后我做了作业:
str := arrChar_1 + arrChar_2;
Run Code Online (Sandbox Code Playgroud)
这个赋值在Delphi 6上正常工作.但是当我在Delphi 10.2上编译它时会发生错误:
[dcc32 Error] MigrateConcatenateCharArray.dpr(26): E2008 Incompatible types
Run Code Online (Sandbox Code Playgroud)
我正在通过以下方式解决这个问题:
str := Copy(first_arrChar, 0, StrLen(first_arrChar));
str := str + Copy(second_arrChar, 0, StrLen(second_arrChar));
Run Code Online (Sandbox Code Playgroud)
这个问题有没有其他好的解决方案?(1)
在Delphi 6中:
String = AnsiString
Char = AnsiChar
Run Code Online (Sandbox Code Playgroud)
在Delphi 10.2中:
String = UnicodeString
Char = WideChar
Run Code Online (Sandbox Code Playgroud)
可以告诉我是什么原因造成了不兼容问题?(2)
我理解widechar是一个多字节字符类型.Unicode是字符编码的方式.但我对他们感到困惑.