小编Rod*_*ddy的帖子

有不同的JPEG2000文件格式吗?

我已经看到JPEG2000文件同时具有.J2K和.JP2扩展名,而读取一个的编解码器并不总能读取另一个.有人可以解释为什么我认为是单一格式有多个扩展吗?

jpeg2000

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

TTabSheet在Delphi中提示

我想要一个TPageControl和一些TTabSheets,当我依次悬停在每个标签上时,"每个标签页"工具提示提示可见.

有没有办法在Delphi 2009中获得这种效果?

delphi tooltip ttabsheet

7
推荐指数
2
解决办法
3068
查看次数

如何修复RapidXML字符串所有权问题?

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来避免这个问题?

c++ rapidxml

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

构造不可复制对象的"数组"

我有一个类,是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)

我这样做的方式是使用一系列智能指针和一个初始化循环,但也许我错过了一些东西:

还有其他方式 - 可能是使用增压容器,还是使用不同的容器类型?

c++ boost stl vector

7
推荐指数
2
解决办法
2111
查看次数

在CHOOSECOLOR对话框中更改字体

我正在使用Windows常用控件CHOOSECOLOR对话框,但在Win 7上,它像拇指一样伸出,因为它仍然使用"旧"Tahoma字体.

选择颜色对话框

是否有一种相当简单的方法来使用Segoe UI或其他字体?

如果重要,我正在使用Delphi/C++ Builder ......

windows delphi colordialog common-controls

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

设置TCP_NODELAY会影响套接字两端的行为吗?

我一直认为Nagle的算法会影响两个方向的套接字,并且该设置TCP_NODELAY以某种方式通知远程端也关闭Nagle.

这是正确的,还是设置TCP_NODELAY只会影响调用它的结束行为?

network-programming tcp nagle

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

Delphi 2010表格显示在"错误"的监视器上

我有一个简单的测试应用程序,一个空表单,另一个包含TButton.按钮脚本是这样的: -

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show();
end;
Run Code Online (Sandbox Code Playgroud)

Form2在启动时自动创建.根本没有其他代码.

当我运行应用程序时,我可以按下按钮然后Form2出现.我可以Form2在主监视器上重新定位/调整大小,然后关闭它.如果我Form1再次按下按钮,Form2则会正确地重新出现在最后一个位置.到目前为止都很好......

但是,如果我Form2放在辅助显示器上,关闭它,然后按下按钮,然后再Form2显示在主监视器上!

我希望表单重新出现在它最后的监视器上 - 我怎么能得到这种行为?

delphi multiple-monitors delphi-2010

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

更好地调整TStringList的方法?

我经常发现我需要'调整'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)

是否有一种更为简单的方法可以忽略我做到这一点?

delphi tstringlist

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

构建相同C/C++应用程序变体的最佳方法是什么

我有三个密切相关的应用程序,它们是从相同的源代码构建的 - 比方说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

6
推荐指数
3
解决办法
929
查看次数

以线程安全的方式返回指针

假设我有一个线程安全的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,但是调用者仍然很容易忘记.

我看过几个替代方案:

  • 除非你需要修改Thing,否则返回值而不是指针 - 罚款
  • 添加功能ThingList::setItemBar(string name, int value)- 很好,但这些往往会增殖
  • 返回一个指针式对象,它在创建时锁定列表,并在销毁时再次解锁.不确定这是好/坏的做法......

处理这个问题的正确方法是什么?

c++ pointers thread-safety

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