小编Dav*_*vid的帖子

有没有办法在非客户区域中更改Windows Aero颜色?

我注意到Windows已经使Windows的非客户端区域自动成为主题的颜色--Windows Aero.我认为这是一个好主意,因为它使主题在程序和一个通常更好的界面上保持一致.作为一个狡猾的个人,我渴望在这里颠覆微软的意图,并获得一个使用我的程序设置颜色的GUI,而不是操作系统的设置.

思考?

windows user-interface winapi aero

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

如何在发布版本中编译依赖于仅调试代码的assert()?

等待!——这个问题并不像听起来那么愚蠢。标题很简单。

我有一些调试代码来验证数据结构的正确性,还有一些断言检查此正确性,我只想在调试版本中启用它们:

{$ifdef DEBUG}
  function Sorted : Boolean;
  function LinearSearchByValue(const T : TType) : NativeInt;
{$endif}
Run Code Online (Sandbox Code Playgroud)

然后在一个方法中:

assert(Sorted);
Run Code Online (Sandbox Code Playgroud)

例如。

在我启用断言的调试版本中,一切都很好。然而,在我禁用断言的发布版本中,该行assert(Sorted);会导致编译器错误E2003 Undeclared identifier: 'Sorted'。完全正确,标识符没有声明,但是断言也被关闭,不应该被评估或生成任何代码。(尝试通过声明方法来欺骗断言,但没有实现会导致正常错误“不满意的前向或外部声明”。它显然也在寻找方法主体。)

这会导致一些混乱的代码,其中根本不应该存在于发布版本中的方法必须被声明并具有主体,以便编译断言,而断言被关闭。

在 Delphi 2010 中,如何声明仅存在于调试版本中的方法,并在断言中使用那些也应仅存在于调试版本中的方法?

更多信息:

  • 我尝试用 包装方法声明{$ifopt C+},它检查断言是否打开。调用assert仍然失败,并出现“未声明的标识符”。

  • 编译器选项肯定是断言被关闭。(我检查了 :))

  • 我尝试将assert使用这些方法的调用包装为{$ifdef DEBUG}. 然而,这很混乱并且不应该是必需的。有一次,它让我担心即使在发布版本中也会编译断言,并且出于性能原因我根本不需要它们。(这没有发生 - 未生成断言代码。)

  • 我当前的策略是始终声明这些方法,但在发布版本中构建 ifdef 方法主体并用虚拟结果填充它。这里的目标是编译所有断言,但方法的开销尽可能小,并且它们的返回值(如果它们实际上在发布版本中被调用)显然是错误的。

  • Delphi 中是否有与 C/C++ 风格的宏等效的东西,ASSERT(x)在发布版本中,宏将被简单地定义为空,导致编译器既看不到也不关心断言内的语句?这是在 C++ 中使用宏的少数干净方法(IMO)之一。

因此,虽然未生成断言,但它们已被编译。这又回到了我的问题:如何最好地混合仅调试方法和断言以及发布版本?

delphi assert delphi-2010

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

对于定向广播地址,Winsock bind()与WSAEADDRNOTAVAIL失败

我正在设置一个UDP套接字,并试图绑定应该是一个有效的网络广播地址(192.168.202.255:23456),但bind失败,错误10049 ,WSAEADDRNOTAVAIL . 如果我使用localhost广播地址127.0.0.255,它会成功.

WSAEADDRNOTAVAIL文档说"请求的地址在其上下文中无效.这通常是由于尝试绑定到对本地计算机无效的地址.这也可能是由connect,sendto,WSAConnect,WSAJoinLeaf或者WSASendTo远程地址或端口对远程计算机无效(例如,地址或端口0)." 但我认为这个地址192.168.202.255应该是一个有效的广播地址,因为运行时有以下条目ipconfig:

ipconfig表示本地IP为192.168.202.213

可能是什么问题?

我是Winsock编程的新手,我可能犯了一个基本错误,但我找不到它.我到目前为止的代码是:

m_ulAddress = ParseIPAddress(strAddress);
// Winsock 2.2 is supported in XP
const WORD wVersionRequested = MAKEWORD(2, 2);
WSADATA oWSAData;
const int iError = WSAStartup(wVersionRequested, &oWSAData);
if (iError != 0) {
    PrintLine(L"Error starting the network connection: WSAStartup error " + IntToStr(iError));
} else if (LOBYTE(oWSAData.wVersion) != 2 || HIBYTE(oWSAData.wVersion) != 2) {
    PrintLine(L"Error finding version 2.2 of Winsock; got version " + …
Run Code Online (Sandbox Code Playgroud)

networking udp network-programming c++builder winsock

2
推荐指数
2
解决办法
1万
查看次数

Map API,允许图像角点坐标,适用于非Web语言

我被要求将地图支持从任意数量的地图API中添加到我们软件中的地理显示中.显示屏当前显示地理坐标,例如一系列GPS修正; 我们想在他们后面展示一张地图.我们使用C++ Builder 2010(偶尔使用Delphi),因此这是本机编译的软件,而不是Web应用程序.

问题是许多地图API似乎通过您指定一个点来工作,并且API返回以该点为中心的某个大小的地图.谷歌是最好的例子:指定一个中心,一个大小和比例(以像素为单位).这意味着对于你得到的图像,你不知道图像角点的地理位置(除非我错过了什么 - 这将是一个很好的答案!)这意味着你无法绘制图像作为地理情节的背景.

以另一种方式解释:窗户的左右边界为(例如)东经147度和147.2度; 南纬42.5度和42.6度的顶部和底部边界.为了用地图填充该窗口,您需要能够请求包含窗口角点的地图,并知道返回图像的坐标以便正确渲染图像.

所以,我正在寻求一个符合以下要求的好地图API的建议:

  • 允许包含四个角点的请求; 返回结果具有图像角点的已知坐标
  • 在本机代码中,可以从Web浏览器外部轻松使用.为了给你一个想法,像谷歌的静态图像 API这样的API是一个很好的答案,它易于使用,易于处理输出; 他们的Javascript API将是一个可怕的答案; 他们的Web服务API是可以接受的,但需要处理JSON或XML,因此比它需要的更难.

c++ delphi mapping google-maps geospatial

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

我应该从"for"循环的上限减去1吗?

我在弄清楚这个功能出了什么问题时遇到了一些麻烦.我不确定我是否应该使用-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)

delphi mdi for-loop

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

将键盘事件添加到TPaintBox组件

TPaintBox在我的应用程序中使用了一个 已经设置了几个鼠标事件处理程序:鼠标按下,鼠标按下等.但是,我还想响应键盘输入:如果用户按下任何功能键,我想执行一个单独的过程(事件处理程序)而不是Mouse*事件处理函数.但我也需要在我的新程序中使用鼠标位置.

我如何编码,因为TPaintBox不支持任何按键事件?

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  //  here some code
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  //  more code here
end;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  // here other code
end;
Run Code Online (Sandbox Code Playgroud)

delphi

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

德尔福7 - 第二种形式可以跟随主体的位置

如何在主窗体移动的任何地方都可以使用主窗体的位置.例如,可以在此GIF图像中看到:

移动一个表格和一秒钟后移动的屏幕截图视频

我尝试使用这个delphiDabbler提示,这是为了阻止一个表单移动,但没有设法得到一些有用的东西.

delphi

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