我已经看到JPEG2000文件同时具有.J2K和.JP2扩展名,而读取一个的编解码器并不总能读取另一个.有人可以解释为什么我认为是单一格式有多个扩展吗?
我想要一个TPageControl和一些TTabSheets,当我依次悬停在每个标签上时,"每个标签页"工具提示提示可见.
有没有办法在Delphi 2009中获得这种效果?
RapidXML是一个快速,轻量级的C++ XML DOM Parser,但它有一些怪癖.
我想到的最糟糕的是:
3.2字符串的所有权.
RapidXml生成的节点和属性不拥有其名称和值字符串.他们只是指着他们.这意味着在使用
xml_base::name(const Ch *)或xml_base::value(const Ch *)函数手动设置这些值时必须小心.必须注意确保传递的字符串的生命周期至少与节点/属性的生命周期一样长.实现它的最简单方法是从文档拥有的memory_pool中分配字符串.使用
memory_pool::allocate_string()功能用于此目的.
现在,我明白它是以这种方式为速度做的,但这感觉就像车祸等待发生.以下代码看起来无害,但当foo返回时,'name'和'value'超出范围,因此doc未定义.
void foo()
{
char name[]="Name";
char value[]="Value";
doc.append_node(doc.allocate_node(node_element, name, value));
}
Run Code Online (Sandbox Code Playgroud)
根据allocate_string()手动工作使用的建议,但它很容易忘记.
有没有人'增强'RapidXML来避免这个问题?
我有一个类,是inhenerently不可复制的(一个线程,所以没有拷贝语义意义),我想有这些的largeish"阵",具有非默认构造函数构造相同.请注意,该数组是固定大小.
我只能使用带有C++数组的默认构造函数,除非我单独初始化每一个.
Thread myArray[128]; // uses default constructor - wrong
Run Code Online (Sandbox Code Playgroud)
我可以明确地列出对象构造函数和参数,但这很冗长和丑陋
Thread myArray[128] = { Thread(params,...), Thread(params,...), ... x 128 ; // ugly
Run Code Online (Sandbox Code Playgroud)
似乎我不能使用stl向量,因为该对象是不可复制的 - 虽然向量永远不会改变大小.我猜构造函数实际上是在复制!
std::vector<Thread> myVector(128, Thread(params,...));// won't compile
Run Code Online (Sandbox Code Playgroud)
我这样做的方式是使用一系列智能指针和一个初始化循环,但也许我错过了一些东西:
还有其他方式 - 可能是使用增压容器,还是使用不同的容器类型?
我正在使用Windows常用控件CHOOSECOLOR对话框,但在Win 7上,它像拇指一样伸出,因为它仍然使用"旧"Tahoma字体.

是否有一种相当简单的方法来使用Segoe UI或其他字体?
如果重要,我正在使用Delphi/C++ Builder ......
我一直认为Nagle的算法会影响两个方向的套接字,并且该设置TCP_NODELAY以某种方式通知远程端也关闭Nagle.
这是正确的,还是设置TCP_NODELAY只会影响调用它的结束行为?
我有一个简单的测试应用程序,一个空表单,另一个包含TButton.按钮脚本是这样的: -
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show();
end;
Run Code Online (Sandbox Code Playgroud)
Form2在启动时自动创建.根本没有其他代码.
当我运行应用程序时,我可以按下按钮然后Form2出现.我可以Form2在主监视器上重新定位/调整大小,然后关闭它.如果我Form1再次按下按钮,Form2则会正确地重新出现在最后一个位置.到目前为止都很好......
但是,如果我Form2放在辅助显示器上,关闭它,然后按下按钮,然后再Form2显示在主监视器上!
我希望表单重新出现在它最后的监视器上 - 我怎么能得到这种行为?
我经常发现我需要'调整'aa TStringList来准确保存N个元素,或者在列表中添加额外的空字符串,或者删除不必要的字符串.
在C++ STL容器上我可以使用该resize方法,但由于这似乎不存在,我通常会做这样的事情(警告:伪代码!).
list.beginUpdate;
while list.Count < requiredSize do
begin
list.add('');
end;
while list.Count > requiredSize do
begin
list.delete(list.count-1);
end;
list.endUpdate;
Run Code Online (Sandbox Code Playgroud)
是否有一种更为简单的方法可以忽略我做到这一点?
我有三个密切相关的应用程序,它们是从相同的源代码构建的 - 比方说APP_A,APP_B和APP_C.APP_C是APP_B的超集,APP_B又是APP_A的超集.
到目前为止,我一直在使用预处理器定义来指定正在构建的应用程序,它就像这样工作.
// File: app_defines.h
#define APP_A 0
#define APP_B 1
#define APP_C 2
Run Code Online (Sandbox Code Playgroud)
然后我的IDE构建选项指定(例如)
#define APPLICATION APP_B
Run Code Online (Sandbox Code Playgroud)
...在源代码中,我会有类似的东西
#include "app_defines.h"
#if APPLICATION >= APP_B
// extra features for APPB and APP_C
#endif
Run Code Online (Sandbox Code Playgroud)
然而,我今天早上在脚上射击并且浪费了很多时间,只需从一个文件中省略#include"app_defines.h"的行.一切编译得很好,但应用程序在启动时与AVs崩溃.
我想知道更好的处理方法是什么.以前,这通常是我认为#define可以使用的少数几次之一(无论如何都是在C++中),但我仍然很糟糕,并且编译器没有保护我.
c++ configuration-management c-preprocessor software-product-lines
假设我有一个线程安全的Things集合(称之为ThingList),我想添加以下函数.
Thing * ThingList::findByName(string name)
{
return &item[name]; // or something similar..
}
Run Code Online (Sandbox Code Playgroud)
但通过这样做,我已将线程安全的责任委托给调用代码,该代码必须执行以下操作:
try
{
list.lock(); // NEEDED FOR THREAD SAFETY
Thing *foo = list.findByName("wibble");
foo->Bar = 123;
list.unlock();
}
catch (...)
{
list.unlock();
throw;
}
Run Code Online (Sandbox Code Playgroud)
显然,RAII锁定/解锁对象会简化/删除try/catch/unlocks,但是调用者仍然很容易忘记.
我看过几个替代方案:
ThingList::setItemBar(string name, int value)- 很好,但这些往往会增殖处理这个问题的正确方法是什么?