小编Dan*_*ula的帖子

有没有办法通过Windows API获取VCL Control的名称?

我有一个位于另一个进程窗口的VCL控件的Hwnd.有没有办法TControl.Name通过Windows API 获取该控件的VCL名称(属性)?我需要这个名称,因为该窗口上有几个TEdits,我需要识别我想要的那个以便WM_SETTEXT向它发送消息.

这两个应用程序都是使用Delphi 2010构建的.

delphi winapi

13
推荐指数
2
解决办法
4255
查看次数

如何修复TPageControl背景颜色而不丢失系统主题?

在启用了主题的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事件与我的新课程,但在其中一些面板后面放置需要更多时间.

delphi vcl delphi-2010

10
推荐指数
1
解决办法
5472
查看次数

查找映射到小整数的常量时,使用case语句或常量数组会更快吗?

例如:我将数字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)

arrays delphi performance switch-statement

10
推荐指数
3
解决办法
249
查看次数

是否可以将整个const块标记为已弃用?

我知道您可以将单个常量标记为已弃用

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 delphi-7

10
推荐指数
1
解决办法
643
查看次数

为什么实现接口的Delphi对象需要引用计数?

换句话说,为什么它们不能像常规对象那样手动管理?或者Delphi设计师是否刚刚决定使用引用计数,因为COM需要它?

delphi com interface

6
推荐指数
1
解决办法
302
查看次数

如何在Delphi中枚举另一个进程的窗口?

我有一个使用该函数foo.exe创建进程的进程.我希望(in )枚举在其中创建的窗口的控件(假设我)需要窗口HWND.bar.exeCreateProcessfoo.exebar.exe

我知道所有的窗口类bar.exe,并且bar.exe每次只为每个类创建一个窗口,所以我可以使用类名来查找我想要的窗口.

但是我应该使用什么函数来枚举另一个进程中的窗口?我正在寻找带有进程句柄或PID(由CreateProcess函数返回)和EnumProc回调过程的东西.我应该找到bar.exe的线程ID(它是一个单线程应用程序)并使用该EnumThreadWindows函数吗?

windows delphi winapi

3
推荐指数
1
解决办法
1070
查看次数

如何访问具有相同名称的父属性

我需要在我的表单的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 setter inheritance properties

0
推荐指数
1
解决办法
645
查看次数