我有一个位于另一个进程窗口的VCL控件的Hwnd.有没有办法TControl.Name通过Windows API 获取该控件的VCL名称(属性)?我需要这个名称,因为该窗口上有几个TEdits,我需要识别我想要的那个以便WM_SETTEXT向它发送消息.
这两个应用程序都是使用Delphi 2010构建的.
在启用了主题的Delphi 2010应用程序中,我在一个带有clMoneyGreen背景的表单中有两个TPageControl(一个在另一个内):

外部页面控件正确地使用父组件的颜色绘制其背景,然而内部页面控件使用clBtnFace(图像中的红色省略号)而不是其父控件(TTabSheet)的白色绘制其背景.有没有办法解决这个问题,而无需将页面控件返回到其Windows经典外观(丢失Windows主题)?
我在Google和Stack Overflow中找到的所有修复都涉及OwnerDraw,这使得页面控件失去了主题.
我尝试使用一种方法来创建从TPageControl继承的新页面控件组件来处理WM_ERASEBKGND窗口消息:
procedure TMyPageControl.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
if Parent is TCustomPageControl then
begin
Brush.Color := clWhite;
Windows.FillRect(Msg.dc, ClientRect, Brush.Handle);
Msg.Result := 1;
end
else
inherited;
end;
Run Code Online (Sandbox Code Playgroud)
它描绘了背景白色,但在WM_ERASEBKGND(我猜测TWinControl的WM_PAINT方法)之后调用的其他一些方法在白色背景上重新绘制灰色.
注意:我正在研究这个,因为我正在从Delphi 7移植的大型应用程序上实现主题,这就是我试图通过派生组件解决这个问题的原因:我可以轻松搜索和替换所有207 TPageControl事件与我的新课程,但在其中一些面板后面放置需要更多时间.
例如:我将数字1到7映射到星期几.我可以使用七项case语句查找它们,或使用七项常量数组.哪个更快?
案例:
function GetDayNameBr(Num: Integer): String;
begin
case Num of
1: Result := 'Domingo';
2: Result := 'Segunda';
3: Result := 'Terça';
4: Result := 'Quarta';
5: Result := 'Quinta';
6: Result := 'Sexta';
7: Result := 'Sábado';
end;
end;
Run Code Online (Sandbox Code Playgroud)
常数组示例:
function GetDayNameBr(Num: Integer): String;
const
DayNames: array [1..7] of String = (
'Domingo',
'Segunda',
'Terça',
'Quarta',
'Quinta',
'Sexta',
'Sábado');
begin
Result := DayNames[Num];
end;
Run Code Online (Sandbox Code Playgroud) 我知道您可以将单个常量标记为已弃用
const
NotDeprConst1 = 1;
DeprConst = 2 deprecated;
NotDeprConst2 = 2;
Run Code Online (Sandbox Code Playgroud)
但是,您是否可以将整个const块标记为已弃用而不是逐个标记常量?
我想做的事情如下:
const deprecated
DeprConst1 = 1;
DeprConst2 = 2;
DeprConst3 = 3;
Run Code Online (Sandbox Code Playgroud)
但是,这不会编译(编译器将"已弃用"视为标识符).
或许有一个编译器指令:
{$DEPRECATED ON}
const
DeprConst1 = 1;
DeprConst2 = 2;
DeprConst3 = 3;
{$DEPRECATED OFF}
Run Code Online (Sandbox Code Playgroud)
Embarcadero的提示指令文档说你可以用提示标记任何声明(比如已弃用),但没有详细说明.
换句话说,为什么它们不能像常规对象那样手动管理?或者Delphi设计师是否刚刚决定使用引用计数,因为COM需要它?
我有一个使用该函数foo.exe创建进程的进程.我希望(in )枚举在其中创建的窗口的控件(假设我)需要窗口HWND.bar.exeCreateProcessfoo.exebar.exe
我知道所有的窗口类bar.exe,并且bar.exe每次只为每个类创建一个窗口,所以我可以使用类名来查找我想要的窗口.
但是我应该使用什么函数来枚举另一个进程中的窗口?我正在寻找带有进程句柄或PID(由CreateProcess函数返回)和EnumProc回调过程的东西.我应该找到bar.exe的线程ID(它是一个单线程应用程序)并使用该EnumThreadWindows函数吗?
我需要在我的表单的FormStyle属性更改之前进行一些处理,但TForm.SetFormStyle(属性setter)是私有的,是否有某种方法来覆盖属性但仍然可以访问父类属性?
TMyForm = class(TForm)
private
procedure MySetFormStyle(Style: TFormStyle);
public
property FormStyle: TFormStyle read Parent.FormStyle write MySetFormStyle;
end;
TMyForm.MySetFormStyle(Style: TFormStyle);
begin
if Parent.FormStyle <> Style then
DoSomething;
Parent.FormStyle := Style;
end;
Run Code Online (Sandbox Code Playgroud)
我正在使用delphi 2010
delphi ×7
winapi ×2
arrays ×1
com ×1
delphi-2010 ×1
delphi-7 ×1
inheritance ×1
interface ×1
performance ×1
properties ×1
setter ×1
vcl ×1
windows ×1