我注意到Windows已经使Windows的非客户端区域自动成为主题的颜色--Windows Aero.我认为这是一个好主意,因为它使主题在程序和一个通常更好的界面上保持一致.作为一个狡猾的个人,我渴望在这里颠覆微软的意图,并获得一个使用我的程序设置颜色的GUI,而不是操作系统的设置.
思考?
等待!——这个问题并不像听起来那么愚蠢。标题很简单。
我有一些调试代码来验证数据结构的正确性,还有一些断言检查此正确性,我只想在调试版本中启用它们:
{$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)之一。
因此,虽然未生成断言,但它们已被编译。这又回到了我的问题:如何最好地混合仅调试方法和断言以及发布版本?
我正在设置一个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:

可能是什么问题?
我是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) 我被要求将地图支持从任意数量的地图API中添加到我们软件中的地理显示中.显示屏当前显示地理坐标,例如一系列GPS修正; 我们想在他们后面展示一张地图.我们使用C++ Builder 2010(偶尔使用Delphi),因此这是本机编译的软件,而不是Web应用程序.
问题是许多地图API似乎通过您指定一个点来工作,并且API返回以该点为中心的某个大小的地图.谷歌是最好的例子:指定一个中心,一个大小和比例(以像素为单位).这意味着对于你得到的图像,你不知道图像角点的地理位置(除非我错过了什么 - 这将是一个很好的答案!)这意味着你无法绘制图像作为地理情节的背景.
以另一种方式解释:窗户的左右边界为(例如)东经147度和147.2度; 南纬42.5度和42.6度的顶部和底部边界.为了用地图填充该窗口,您需要能够请求包含窗口角点的地图,并知道返回图像的坐标以便正确渲染图像.
所以,我正在寻求一个符合以下要求的好地图API的建议:
我在弄清楚这个功能出了什么问题时遇到了一些麻烦.我不确定我是否应该使用-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) 我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 ×5
aero ×1
assert ×1
c++ ×1
c++builder ×1
delphi-2010 ×1
for-loop ×1
geospatial ×1
google-maps ×1
mapping ×1
mdi ×1
networking ×1
udp ×1
winapi ×1
windows ×1
winsock ×1