标签: design-rationale

Delphi:什么是Application.Handle?

什么是TApplication.Handle

  • 它从何而来?
  • 它为什么存在?
  • 最重要的是:为什么所有表单都将它作为父窗口句柄?

德尔福帮助说:

TApplication.Handle

提供对应用程序主窗体(窗口)的窗口句柄的访问.

property Handle: HWND;
Run Code Online (Sandbox Code Playgroud)

描述

在调用需要父窗口句柄的Windows API函数时使用句柄.例如,显示其自己的顶级弹出窗口的DLL需要父窗口才能在应用程序中显示其窗口.使用Handle属性使这些窗口成为应用程序的一部分,以便使应用程序最小化,恢复,启用和禁用它们.

如果我专注于" 应用程序主窗体的窗口句柄 "这个词,我认为它是指应用程序主窗体的窗口句柄,那么我可以比较:

  • "应用程序主窗体的窗口句柄",用
  • 窗户把手MainFormApplication

但他们不一样:

Application.MainForm.Handle: 11473728
Application.Handle: 11079574
Run Code Online (Sandbox Code Playgroud)

那是什么Application.Handle

  • 它从何而来?
  • Windows®窗口处理的是什么?
  • 如果的的的Windows®窗口句柄ApplicationMainForm,那么他们为什么不匹配?
  • 如果它不是Application 's 的窗口句柄MainForm,那么它是什么?
  • 更重要的是:为什么它是每种形式的最终父母所有者?
  • 最重要的是:如果我试图让一个表格无主义(因此我可以出现在TaskBar上),或者尝试使用像IProgressDialog这样的东西,为什么一切都变得混乱

我真正要问的是:Application.Handle存在的设计原理是什么?如果我能理解为什么,应该如何变得明显.


通过20个问题的游戏更新理解:

在谈到通过让它的主人在任务栏上出现一个窗口的解决方案时null,Peter Below在2000年说:

这可能会导致从次要形式显示的模态形式出现一些问题.

如果用户在模态表单启动时从应用程序切换,然后返回到显示它的表单,则模式表单可能隐藏在表单下方.可以通过确保模态形式是父级来处理这个问题[原文如此; 他的意思是拥有]到表明它的形式(使用 params.WndParent如上)

但是对于Dialogs单元和异常 …

delphi delphi-5 design-rationale

48
推荐指数
3
解决办法
3万
查看次数

为什么不允许非类型参数中的部分特化使用嵌套模板参数

我有这个代码

template<int N, bool C = true>
struct A;

template<int N>
struct A<N, !(N % 5)> {
  /* ... */
};

// should work
A<25> a;
Run Code Online (Sandbox Code Playgroud)

也就是说,对于N可被整除的数字,5编译器应使用部分特化.但编译器不会接受部分特化,因为标准要求它拒绝这样的代码,其中部分特化的非类型参数引用参数而不仅仅是一个参数(比如,A<N, N>是有效的).但是这样做的原因是什么?

请注意,我可以简单地将我的代码更改为更罗嗦的示例,它是有效的

template<bool> struct wrap;
template<int N, typename = wrap<true> >
struct A;

template<int N>
struct A<N, wrap<!(N % 5)> > {
  /* ... */
};

// should work
A<25> a;
Run Code Online (Sandbox Code Playgroud)

这很好,因为它不再是非类型参数.但是,规范禁止更直接的部分专业化的原因是什么?

c++ partial-specialization design-rationale

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

如果密钥不存在,为什么std :: map operator []会创建一个对象?

我很确定我已经在某个地方看到了这个问题(comp.lang.c ++?Google似乎也没有在那里找到它)但是这里的快速搜索似乎没有找到它所以这里是:

如果密钥不存在,为什么std :: map operator []会创建一个对象?我不知道,但对我而言,如果你与大多数其他运算符[](如std :: vector)进行比较,这似乎是违反直觉的,如果你使用它,你必须确保索引存在.我想知道在std :: map中实现这种行为的理由是什么.就像我说的那样,当使用无效密钥访问时,更像行动中的索引和崩溃(我猜是未定义的行为)会不会更直观?

看到答案后提炼我的问题:

好到目前为止,我得到了很多答案,说基本上它便宜,所以为什么不是或类似的东西.我完全同意这一点,但为什么不使用专用函数(我认为其中一条评论说在java中没有operator []并且函数被称为put)?我的观点是为什么不映射operator []像vector一样工作?如果我在向量上的超出范围索引上使用operator []我不希望它插入一个元素,即使它很便宜,因为这可能意味着我的代码中的错误.我的观点是为什么地图不一样.我的意思是,对我来说,在地图上使用operator []意味着:我知道这个密钥已经存在(无论出于什么原因,我只是插入它,我在某处有冗余,无论如何).我认为这样会更直观.

那说使用operator []执行当前行为的优点是什么(仅限于此,我同意具有当前行为的函数应该在那里,而不是operator [])?也许它以这种方式提供更清晰的代码?我不知道.

另一个答案是,它已经存在,所以为什么不保留它然后,可能当他们(stl之前的那些)选择实现它,他们发现它提供了一个优势或什么?所以我的问题基本上是:为什么选择以这种方式实现它,这意味着与其他运算符[]有点缺乏一致性.它给了什么好处?

谢谢

c++ stdmap design-rationale

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

为什么`std :: basic_ios`具有公共构造函数?

std::basic_ios有一个公共的构造函数

explicit basic_ios (std::basic_streambuf<CharT,Traits>* sb);
Run Code Online (Sandbox Code Playgroud)

IMO,一个类具有公共构造函数的唯一原因是在程序中使用该类的独立实例。如果仅存在一个类以使其他类从其派生(如的情况basic_ios),则该类的所有构造函数都应为protected。的构造函数std::ios_base均受保护。但是,由于某种原因,该标准的设计者将这一构造函数basic_ios公开了。

basic_ios用作几种流类型的基类,并且我不能设想用例中至少有一个不是a basic_istream或的用例basic_ostream。有一个吗?

c++ stream design-rationale language-lawyer

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

为什么模块在文件中明确命名?

D语言参考:

模块与源文件一一对应.模块名称是文件名,其路径和扩展名被剥离.

但是,模块名称仍然在文件中明确指定.

module foo;
Run Code Online (Sandbox Code Playgroud)

这有什么意义?如果模块对应于文件,为什么编译器不能从文件名中推断出它们的调用?

compiler-construction d language-design design-rationale

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

为什么标准库有find和find_if?

不能find_if只是一个超载find?那是怎么std::binary_search和朋友一起做的......

c++ stl std design-rationale

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

为什么drand48()和朋友已经过时了?

毕竟,它们似乎优于标准的libc rand().我错过了什么吗?

(我花了一些时间在网上搜索这个问题,而我能找到的这个问题的唯一另一个例子是在分布偏差的背景下并且没有得到答复.)

rand()和drand48()的手册页也似乎不一致.第一个推荐第二个,第二个推荐它已经过时,应该使用第一个.(虽然,公平地说,很多了解PRNG背后数学的人都会对这些函数的手册页有问题,因为它们的措辞很差,在某些情况下也是错误的.)

尽管如此,我仍然没有找到"过时"地位的理由.

c random posix design-rationale obsolete

9
推荐指数
2
解决办法
9863
查看次数

为什么C#(或.NET)不允许我们在接口中放置静态/共享方法?

为什么C#(或.NET)不允许我们在接口中放置静态/共享方法?

看似从这里重复.但我的想法有点不同,我只是想为我的插件(接口)添加一个帮助器

不应该C#至少允许这个想法吗?

namespace MycComponent
{

    public interface ITaskPlugin : ITaskInfo
    {
        string Description { get; }
        string MenuTree { get; }
        string MenuCaption { get; }

        void ShowTask(Form parentForm);
        void ShowTask(Form parentForm, Dictionary<string, object> pkColumns);

        ShowTaskNewDelegate ShowTaskNew { set; get; }
        ShowTaskOpenDelegate ShowTaskOpen { set; get; }        

        // would not compile with this:
        public static Dictionary<string, ITaskPlugin> GetPlugins(string directory)
        {

            var l = new Dictionary<string, ITaskPlugin>();

            foreach (string file in Directory.GetFiles(directory))
            {
                var fileInfo = new FileInfo(file); …
Run Code Online (Sandbox Code Playgroud)

c# interface helper design-rationale

8
推荐指数
2
解决办法
2672
查看次数

如何确定IEEE 754单精度和双精度格式

我对下一步如何确定感兴趣:

  1. 单精度具有:8位用于e,其余(23位)用于尾数
  2. 双精度:e为11位,其余为52位(52位)为尾数,符号为1位.

那么如何确定尾数的位数是多少,以及e的位数是多少.我想这是noob问题,但我想知道答案.

precision design-decisions design-rationale ieee-754

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

为什么不将std :: set <K,C,A> :: erase作为const_iterator?

看来,根据ISO 14882 2003(又名C的神圣的标准++)std::set<K, C, A>::eraseiterator作为参数(不是const_iterator)

从23.3.3 [2]

void erase(iterator position);

值得注意的是,在我对VS2008附带的STL的实现中,const_iterator当我尝试用另一个编译器编译我的代码时,擦除会导致令人不快的意外.现在,由于我的版本采用了a const_iterator,因此可以用a实现擦除const_iterator(就好像它不是不言而喻的).

我认为标准委员会考虑了一些实现(或者现有的实现),这需要擦除才能获得iterator.

  • 如果您同意这种情况,请您描述一个实现,set::erase其中需要修改将要删除的元素(我不能).
  • 如果你不同意,请告诉我为什么他们会在地球上做出这个决定?我的意思是,删除一个元素只是一些重新排列的指针!

编辑

我刚想到即使在迭代器的情况下你也无法修改集合中的元素.但问题仍然存在 - 为什么不是const_iterator,特别是如果它们在某种意义上是等同的

c++ stl set design-rationale

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