我正在开发一个大型应用程序,并为其添加了一些拖放功能.具体来说,我允许用户将文件拖放到主窗口中以打开文件.
问题是当主窗口显示对话框时(例如,当前打开文件中的项目的属性窗口),仍然允许执行拖放操作.如果主窗口显示模式对话框,我宁愿不允许这种情况发生.这是因为在对话框打开时在应用程序中加载新文件可能会导致程序崩溃:调用对话框的代码不希望在对话框打开时更改打开的文件(这就是对话框的原因)是莫代尔...).
主要应用程序是用C++编写的,但我发布了一个C#示例.两个平台上的症状/行为都是相同的,但我可以使用C#以更少的代码来演示它.我对这两种语言/平台非常熟悉,因此我可以根据需要将任何答案翻译成适当的语言.
要演示我的示例代码的问题,请编译并运行以下C#代码.它将创建一个"主窗口",它是一个有效的放置目标.将文件从Windows资源管理器拖放到主窗口:您应该看到"已删除"消息框.现在,单击窗体上的按钮以弹出一个对话框.再次,在对话框打开时尝试将文件拖放到主窗口上.请注意,即使打开了模式对话框,也允许删除.当对话框打开时,如何防止这种情况发生?
显而易见的答案是在打开对话框时暂时将AllowDrop设置为false.问题是主应用程序非常大,因此有很多地方打开对话框.很难找到打开对话框并添加此代码的每个地方.此外,这里的每个开发人员都需要知道每次打开模态窗口时都要执行此操作; 每个人都不太可能记得.我担心这不是一个很好的解决方案.
当然有一种更易于维护的方法,不需要在打开对话框的每个地方添加代码?
using System;
using System.Windows.Forms;
using System.Drawing;
public class MyDialog : Form {
public MyDialog() {
Text = "MyDialog";
}
}
public class MainForm : Form {
public MainForm() {
Button btn = new Button();
btn.Location = new Point(0, 0);
btn.Text = "ShowDialog";
btn.Size = new Size(75, 23);
btn.Click += new EventHandler(GoToDialog);
this.AllowDrop = true;
this.Controls.Add(btn);
this.Text = "Drop Target";
this.DragDrop += new DragEventHandler(this.MyDragDrop);
this.DragEnter += new DragEventHandler(this.MyDragEnter);
}
private void MyDragDrop(object sender, DragEventArgs …Run Code Online (Sandbox Code Playgroud) 我正在将我们产品的源代码组织到一堆不同的 Git 存储库中。(而且我是 Git 的新手)。其中一些将通过子模块使用同一服务器上的其他存储库。
据我了解,Git 中的子模块是指向另一个存储库中特定提交的指针,其定义如下:
问题是当添加子模块时,一个 URL 作为提交的一部分存储在存储库中。如果 URL 更改会发生什么?父存储库可能有数百个提交——所有提交都带有一个引用旧 URL 的子模块。
例如,假设我将存储库 Super 和 Sub 存储在 git://PrivateCompanyServer/repositories/* 中。Super 通过其 gitmodules 文件引用 Sub:git://PrivateCompanyServer/repositories/Sub.git。一些开发人员对 Super 进行了数百次提交——几乎 Super 中的每个提交都有一个包含该 URL 的 gitmodules 快照。几个产品版本被标记,各种分支在 gitmodules 中都有 URL。现在,假设 PrivateCompanyServer 崩溃,我们将代码移动到另一台服务器。或者我们重新组织 PrivateCompanyServer 上的目录结构。管他呢。现在我们在 Super 中有数百个提交,这些提交引用了不再存在的旧 URL 上的 Sub 存储库。显然,gitmodules 文件可以在 development 分支的头部进行更正,我们可以继续前进。但是由于维护原因,我们可能不得不返回各种旧提交,并且它们都将引用不再起作用的旧 URL。怎么处理?
显然,这可以通过变基/“重写历史记录”来解决,以便存储库中的所有 gitmodules 文件都有新的 URL,但我认为这不是一个选项,因为 Super 中的几乎每个提交都会获得一个新的提交 ID。引用 Super 的所有内容,包括使用 Super 作为子模块的“Super-Super”项目和本地开发人员存储库都会中断 - 对吗?
那么处理这个问题的最佳方法是什么? 如果您在私人公司服务器上存储一组存储库 - 其中一些通过子模块引用其他存储库 - 当服务器更改名称时您会怎么做 - 因此使 gitmodules 文件中的旧 …
是否在新的Windows 7计算机上进行了全新安装:
然后我在Qt Creator中创建了一个新项目.我在"Qt Widget Project"下选择了"Qt Gui Application",并使用Visual C++ 2008定位桌面,包括调试和发布(基本上都是默认设置).
然后我按下Build,然后......
qtmaind.lib(qtmain_win.obj):-1: warning: LNK4099: PDB 'vc90.pdb' was not
found with 'c:\QtSDK\Desktop\Qt\4.7.4\msvc2008\lib\qtmaind.lib' or at
'C:\Users\JamesJ\Desktop\QtTest-build-desktop-Qt_4_7_4_for_Desktop_-
_MSVC2008__Qt_SDK__Debug\debug\vc90.pdb'; linking object as if no debug info
Run Code Online (Sandbox Code Playgroud)
我必须遗漏一些明显的东西 - 当然,Qt的开箱即用体验不应该涉及编译器/链接器警告吗?!?!
如何解决此链接器警告?我更喜欢将警告视为错误,所以......我想解决这个问题.
TL; DR版本的问题:WMI Win32_NetworkAdapter类包含我需要的信息,但是太慢了。在Windows上获取MACAddress,ConfigManagerErrorCode和PNPDeviceID列的信息的更快方法是什么?
我需要检索连接的网络适配器的信息,以便可以获取MAC地址来唯一标识本地Microsoft Windows计算机。WMI Win32_NetworkAdapter类似乎具有我在寻找的信息。MACAddress,ConfigManagerErrorCode和PNPDeviceID列是我真正需要的唯一列:
我的计划是使用PNPDeviceID过滤掉非物理设备。然后,我将在所有剩余的表条目上使用MACAddress列(将地址保存到缓存中)。当设备被禁用(可能由非零的ConfigManagerErrorCode指示)并且MACAddress为空时,我可以从缓存中对该设备使用以前看到的MACAddress。
您可以在Windows 7计算机上看到此表的内容。您可以看到其中有大量垃圾,但是只有一个带有“ PCI” PNPDeviceID的条目。
wmic:root\cli>NIC GET Caption, ConfigManagerErrorCode, MACAddress, PNPDeviceID
Caption ConfigManagerErrorCode MACAddress PNPDeviceID
[00000000] WAN Miniport (SSTP) 0 ROOT\MS_SSTPMINIPORT\0000
[00000001] WAN Miniport (IKEv2) 0 ROOT\MS_AGILEVPNMINIPORT\0000
[00000002] WAN Miniport (L2TP) 0 ROOT\MS_L2TPMINIPORT\0000
[00000003] WAN Miniport (PPTP) 0 ROOT\MS_PPTPMINIPORT\0000
[00000004] WAN Miniport (PPPOE) 0 ROOT\MS_PPPOEMINIPORT\0000
[00000005] WAN Miniport (IPv6) 0 ROOT\MS_NDISWANIPV6\0000
[00000006] WAN Miniport (Network Monitor) 0 ROOT\MS_NDISWANBH\0000
[00000007] Intel(R) 82567LM-2 Gigabit Network Connection …Run Code Online (Sandbox Code Playgroud) 我有一个存储在本地文件系统上的HTML文件.我需要它来重定向(或以其他方式显示)一个远程网站,如果该网站是在线和可用的.如果该站点不可用,我需要显示用户友好的消息.
目前我有:
<html>
<body onload="window.location.href='http://someserver/';">
<p>Connecting to remote server...</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
问题是如果服务器不可用,则从Web浏览器向用户显示丑陋的"无法找到服务器"页面.如果页面导航出现问题,我宁愿显示一些自定义HTML来指示用户的情况.我应该尝试一些常用的解决方案,哪个适用于此?
要求:必须在IE6中通过IE9工作.FireFox/WebKit引擎不会用于此应用程序.
假设我有一个公共类和一个私有实现类(例如PIMPL模式),我希望用一个带有checked delete的模板智能指针类来包装私有类,如下所示:
PublicClass.h
class PrivateClass;
// simple smart pointer with checked delete
template<class X> class demo_ptr
{
public:
demo_ptr (X* p) : the_p(p) { }
~demo_ptr () {
// from boost::checked_delete: don't allow compilation of incomplete type
typedef char type_must_be_complete[ sizeof(X)? 1: -1 ];
(void) sizeof(type_must_be_complete);
delete the_p;
}
private:
X* the_p;
};
// public-facing class that wishes to wrap some private implementation guts
class PublicClass
{
public:
PublicClass();
~PublicClass();
private:
demo_ptr<PrivateClass> pvt;
};
Run Code Online (Sandbox Code Playgroud)
PublicClass.cpp
#include "PublicClass.h"
class PrivateClass
{ …Run Code Online (Sandbox Code Playgroud) c++ ×4
windows ×4
c# ×2
c++11 ×1
c++builder ×1
git ×1
html ×1
javascript ×1
networking ×1
qt ×1
qt-creator ×1
qt4 ×1
winforms ×1
wmi ×1