我收到了一个我不明白的编译错误(MS VS 2008).在弄乱了好几个小时之后,这一切都很模糊,我觉得有一些非常明显(而且非常愚蠢)的东西,我很想念.这是基本代码:
typedef int (C::*PFN)(int);
struct MAP_ENTRY
{
int id;
PFN pfn;
};
class C
{
...
int Dispatch(int, int);
MAP_ENTRY *pMap;
...
};
int C::Dispatch(int id, int val)
{
for (MAP_ENTRY *p = pMap; p->id != 0; ++p)
{
if (p->id == id)
return p->pfn(val); // <--- error here
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器在箭头处声称"术语不评估为采用1参数的函数".为什么不?PFN原型为带有一个参数的函数,MAP_ENTRY.pfn是PFN.我在这里错过了什么?
有没有办法保护我的Delphi应用程序不被Windows任务管理器(或其他像Process Explorer)杀死?
我认为Windows消息可以做到这一点(通过挂钩和拦截TerminateProcess消息).
我想要一个这种保护的例子.卡巴斯基反病毒套件就像这样; 我们无法在任务管理器中结束他们的流程.
我的Delphi程序在很大程度上依赖于Outlook自动化.2007-SP2之前的Outlook版本由于编写错误的插件和编写错误的Outlook代码而倾向于卡在内存中.
如果Outlook卡住,调用CreateOleObject('Outlook.Application')或GetActiveObject ...不会返回并保持我的应用程序挂起,直到任务管理器中的Outlook.exe关闭.
我想到了一个解决方案,但我不确定这是否是好的做法.
我在一个单独的线程中使用CreateOleObject启动Outlook,在我的主线程中等待10秒,如果Outlook挂起(CreateOleObject没有返回),则让用户从我的程序中终止Outlook.exe进程.
但是因为我不想强迫用户杀死Outlook.exe进程,作为替代方案,我还需要一种方法来杀死程序中的新线程,该线程现在一直挂起.
我已经用Delphi编程了很长时间,我专注于桌面应用程序.我决定进入网页编程世界.我怎样才能拥有像Delphi这样的界面,但是有一个用于Web编程的脚本环境?有没有任何版本的Delphi我可以制作网页?
IntraWeb创建的应用程序可以作为整个站点上传吗?
保存到INI文件时,尤其是在定义了多个部分时,数据将一起保存,部分之间不存在任何行.
对于外部编辑,将每个部分与换行符分开会很方便,以便更容易查看和编辑INI文件.
例如:
标准Ini
[GENERAL]
value1=0
value2=somestring
[ADVANCED]
type=1
autosave=0
[OTHER]
showatstartup=1
Run Code Online (Sandbox Code Playgroud)
Ini有分隔线
[GENERAL]
value1=0
value2=somestring
[ADVANCED]
type=1
autosave=0
[OTHER]
showatstartup=1
Run Code Online (Sandbox Code Playgroud)
如何才能做到这一点?
对于我的跨平台应用程序,我已经开始使用Boost,但我无法理解如何实现代码来重现Win32的关键部分或.Net的行为lock.
我想编写一个Foo可以从不同线程调用的方法来控制对共享字段的写操作.应该允许同一线程内的递归调用(Foo() - > Foo()).
在C#中,这个实现非常简单:
object _synch = new object();
void Foo()
{
lock (_synch) // one thread can't be lock by him self, but another threads must wait untill
{
// do some works
if (...)
{
Foo();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将Delphi代码转换为vb.net,我不确定这一行:
stream.Seek($42, soFromBeginning);
Run Code Online (Sandbox Code Playgroud)
我熟悉在文件流上使用搜索(在vb.net中),但我不确定$42.
我假设这对应于某个职位,但这又如何转化为vb.net?
如何使用Delphi将正整数转换为负数?我知道你可以使用ABS(int)将负数转换为正数,但我需要它将正数转换为负数.
我的DBTreeListView中的一个单元格绑定到作为进度条的存储库项目.
我希望能够通过单击此单元格来编辑显示的进度.在这个阶段,我的应用程序应该将其单元格更改为另一个存储库项目:一个文本字段,我将能够插入一个值.将焦点更改为另一个单元格后,应再次显示我的进度条,显示新值.我该怎么做呢?
DBTreeListView具有列事件OnGetEditingProperty和OnGetEditProperties.我可能会使用其中一个(或两个),但不能提出任何好主意.
关于TEvent的Delphi XE2文档说明了这一点:
有时,您需要等待线程完成某些操作,而不是等待特定线程完成执行.为此,请使用事件对象.应使用全局范围创建事件对象(System.SyncObjs.TEvent),以便它们可以像所有线程可见的信号一样工作.
当线程完成其他线程所依赖的操作时,它会调用TEvent.SetEvent.SetEvent打开信号,因此任何其他检查的线程都会知道操作已完成.要关闭信号,请使用ResetEvent方法.
例如,考虑一种情况,您必须等待多个线程才能完成执行而不是单个线程.因为您不知道哪个线程最后会完成,所以您不能简单地使用其中一个线程的WaitFor方法.相反,您可以让每个线程在完成时递增一个计数器,并让最后一个线程信号通过设置事件来完成它们.
但是,Delphi文档没有解释另一个线程如何检测到调用了TEvent.Set事件.你能解释一下如何检查TEvent.Set是否被调用?
delphi ×8
c++ ×2
automation ×1
boost ×1
ini ×1
messages ×1
numbers ×1
outlook ×1
process ×1
progress-bar ×1
syntax ×1
taskmanager ×1
vb.net ×1
windows ×1