示例:我创建一个新单元,按顺序使用构造函数,析构函数,方法1,方法2,方法3等几个方法声明一个类,然后按Ctrl-Shift-C.IDE会自动创建所有方法体,但是顺序是混合的,而不是在接口部分中声明的那样.
现在,这不是问题,但是有理由这样做.混合起来似乎比按声明的顺序进行组合要困难得多.
或者是否有一些规则是有道理的,我看不到?
我有一个包含唯一ID字段的表.另一个字段(REF)包含对另一个数据集的ID字段的引用.现在我必须选择REF指向不存在的数据集的所有数据集.
SELECT * FROM table WHERE ("no dataset with ID=REF exists")
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我的存储库中有几个项目,每个项目都有自己的文件夹.是否可以删除其中一个项目的最新修订而不更改其他任何内容?
示例:项目A的最新版本已提交创建rev.50.关于其他项目的工作正在进行,存储库现在处于转速状态.60.
现在A的用户回来并请求删除最后一个版本的更改,因为它们不适合他.他想回到以前的版本,所有进一步的改变应该从那里开始.
在这一点上,我想要转.50消失,以便项目A可以像转速一样继续.50从未发生过.
我能看到的唯一方法是创建一个分支,从现在开始在该分支上工作.但随着时间的推移,这只是创造了许多分支,而且项目的历史变得杂乱无章.
对于这种情况,什么是好的解决方案?
我正在创建一个OmniWorker-Task来进行一些数据处理.
到目前为止,该任务能够从/向其他任务接收和发送消息.
现在我需要为这个任务实现main函数.此函数将连续运行并执行数据处理,而消息将修改其行为.
但是我在哪里放这个主要功能?
是否有类似OmniWorker的"执行"方法,我需要实现什么?
有两个程序,A1和A2,它们都在代码中调用函数B:
function B: boolean;
begin
// do other stuff
end;
procedure A1;
begin
// do stuff
if b then
...
// do stuff
end;
procedure A2;
begin
// do stuff
if b then
A1; // <- how to call A1 "delayed"?
// do stuff
end;
Run Code Online (Sandbox Code Playgroud)
如果A2中的条件为真,则必须调用过程A1,但是当A2仍在运行时会发生这种情况,这是我不想要的.
应该发生的是:如果A2中的条件为真,则应该完成A2,并且在离开A2之后应该调用过程A1.
一个丑陋的解决方案是设置一个定时器,在延迟确认A2完成后调用A1.
但必须有更好的方法,对吗?
编辑:在我的情况下A1和A2是事件,所以他们没有被代码调用,我不能只是在A2完成后从调用过程调用A1.
当在任何过程/函数/方法中调试某些代码时发生未处理的异常时,调试器会在那里停止并显示消息.
如果我现在继续逐步调试,执行将直接从创建异常的行跳转到当前过程的结尾(如果没有finally块).
继续使用当前程序的下一行是不是很好?
为什么跳转到proc的结尾并继续调用过程?这只是设计还是有充分的理由呢?
我有一些在自定义硬件上运行的项目.现在硬件已经改变,这需要一些软件更改.因此,"旧硬件"有源A,"新硬件"有源B,95%相同.
如果将来添加新功能,则必须为两个版本执行此功能.换句话说,A和B将并排存在,从现在开始将始终需要相同的变化.
我刚刚开始使用Subversion,因此我对所有可能性都不是很熟悉.
据我了解,B的新分支将从那一点开始分离,这不是我需要的.
维护A和B的最佳方法是什么,以便将来的更改适用于两个版本而无需手动应用它们两次?
我的应用程序将有多个任务用于各种操作.
所有任务都在FormCreate中创建并在FormDestroy中终止,只要应用程序正在运行,它们就会一直运行.
主线程的唯一目的是处理用户I/O并将用户输入发送到适当的任务或接收要在主窗体中显示的任务信息.
必须在任务之间传输数据.
示例:
我将执行任务A进行数据处理.
它会将一些结果发送到主线程进行显示.
它还必须将一些(其他)数据发送到任务B,任务B将数据传输到另一台PC.
任务C将从硬件设备接收一些数据,并且必须将此数据发送到任务A进行处理.
等等...
据我所知,到目前为止,使用OmniThreadLibrary发送消息总是在任务和创建任务的线程之间(主线程和任务A,或主线程和任务B).
如何在任意两个任务之间直接发送消息?
或者到目前为止我的方法有什么问题,它应该完全不同吗?
我玩过使用COM接口访问的第三方库.
对于某些测试,我创建了主窗体:
TForm1 = class (TForm, IThirdParyCOMInterface)
Run Code Online (Sandbox Code Playgroud)
TForm1实现了IThirdParyCOMInterface的所有方法,我得到了我需要的功能.
下一步是创建一个单独的类,仅用于处理此COM接口.
做这样的事情:
TMyClass = class (TInterfacedObject, IThirdParyCOMInterface)
Run Code Online (Sandbox Code Playgroud)
导致编译器错误:
E2291缺少接口方法IDispatch.GetTypeInfoCount的
实现E2291缺少接口方法IDispatch.GetTypeInfo的
实现E2291缺少接口方法IDispatch.GetIDsOfNames的
实现E2291缺少接口方法IDispatch.Invoke的实现
(IThirdPartyCOMInterface = interface(IDispatch))
似乎TForm已经实现了这些IDispatch方法,但我的新简单类却没有.
如何为上面这样的新课程做到这一点?
我应该从哪个类继承我的新类,以便已经实现了这些IDispatch方法?
编辑:
我刚刚找到了TAutoIntfObject.这就是我需要的吗?
(COM对我来说有点混乱,我只是在这里猜测)
在阅读了一些关于为单个开发人员使用源代码控制的优点的帖子后,在我看来,主要的优点是我将备份源文件的所有更改.Delphi有一个内置的历史记录功能,默认情况下会这样做.
这是真的相同还是应该使用"真正的"源代码控制工具呢?
我继承了一个用C++(VS2003)MFC编写的遗留应用程序,该应用程序多年未更新.我在C++方面经验有限,主要是Delphi开发人员.该公司的所有其他应用程序都是用Delphi编写的.
展望未来,我看到了一些选择:
1)保持应用程序不变,成为C++ MFC开发人员.但我不喜欢在未来几年使用过时技术(MFC)的想法,试图跟上新的Windows版本和UI标准.它在某种程度上感觉像向后退了几步,我不认为这是最好的方式(?)
2)将应用程序转换为C++提供的任何现代UI技术,并成为C++开发人员,但至少使用现代技术.可能需要做很多工作,不确定.
3)在Delphi中从头开始重建应用程序,在那里我将更加高效地思考未来.现在这项工作要多得多,但以后可能会有所收获.
显然,我个人更喜欢3)但我想从您的经验中了解哪种方式最适合该产品.
这是一个长期的决定,我将不得不坚持下去,因此我不想冲向一个方向.
(我故意没有将这个问题标记为C++,试图在类似的情况下从Delphi开发人员那里得到答案)
编辑:
感谢大家的回答.
在得知可以使用MFC应用程序切换到C++ Builder之后,这似乎是最佳解决方案.它结合了对当前应用程序的最少量修改,可以使用VCL继续进行GUI改进.
EDIT2:
在一个应用程序中组合MFC和VCL是不可能的,因此C++ Builder不是一个选项.(感谢大卫指出这一点)
我需要使用TCP/IP连接连接到本地网络上的设备.当我使用TIdTCPClient时,一切正常,除了一件事:
如果连接不可用,则在超时之前大约需要18-20秒.无论我设置什么值,ConnectTimeout属性都没有效果.在超时之前总是花费相同的时间.
这个答案提到超时的延迟时间很长,我想知道这是否与Indy组件有关?
我必须找出连接是否不能很快建立,让我们说最多在1秒内.
有没有办法使用Indy做到这一点,还是我需要使用不同的组件/不同的方法?
(我使用的是Delphi 2009附带的Indy 10版本)
编辑:
我按照说明将Indy升级到这篇文章中的最新版本.
仍然相同,它现在始终需要22秒,直到TCPClient.Connect在没有连接时返回.ConnectTimeout和/或ReadTimeout似乎对此没有影响.
一个单独的线程创建一个TidTCPClient和一个TTimer.TTimer设置为3s,如果TCPClient未连接,则调用TCPClient.Connect.
如果没有要连接的服务器,则会导致尝试每3秒连接一次.
主线程(UI)什么都不做,但是如果我用鼠标抓住窗口并在屏幕上缓慢移动它,它会每隔3秒钟被卡住约2秒钟,然后它会跳转到鼠标光标位置并跟随鼠标再次,直到下一次尝试连接发生.
换句话说,当TCPClient尝试连接时,主线程似乎被阻止.
为什么会发生这种情况,即使TCPClient在它的单独线程中?
delphi ×10
delphi-2009 ×3
indy10 ×2
svn ×2
com ×1
delphi-xe2 ×1
exception ×1
ide ×1
indy ×1
sql ×1
tortoisesvn ×1