我有一个界面.
type IProgressObserver = interface(IInterface)
procedure ReportProgress(Progress:Integer);
procedure ReportError(Message:string);
end;
Run Code Online (Sandbox Code Playgroud)
我使用命名类实现了接口,如下所示:
type TProgressObserver=class(TInterfacedObject, IProgressObserver)
procedure ReportProgress(Progress:Integer);
procedure ReportError(Message:string);
end;
... implementation of methods go here .....
addProgressObserver(TProgressObserver.Create);
Run Code Online (Sandbox Code Playgroud)
是否可以在不声明类的情况下创建此接口的实例?像这个(虚构的)代码,它会做与上面相同的事情:
addProgressObserver(IProgressObserver.Create()
begin
procedure ReportProgress(Progress:Integer)
begin
ShowMessage('Progress Observed!');
end
procedure ReportError(Message:string)
begin
Log(Message);
end
end;);
Run Code Online (Sandbox Code Playgroud)
Delphi有匿名程序,但是它有匿名类吗?
我发现了类似的问题,但它是用Java编写的.
我正在使用Delphi 2010
我刚刚将SVN存储库从1.6升级到1.7.1.7中存储库格式的一个主要变化是".svn"文件夹不再存储在每个子目录中; 仅在存储库的根文件夹中.
不幸的是,这似乎混淆了我一直在使用的JCL SVN集成.它似乎认为我的文件不受源代码控制.
是否有任何Delphi SVN集成现在可以与1.7一起使用,或者计划在不久的将来支持它?
我正在使用Delphi 2010.
UPDATE
我正在对我的Delphi项目进行一些重构.我希望能够进行更改,然后查看项目中因该更改而中断的所有位置.类似于Eclipse列出项目的所有编译错误(在Java中).
在Delphi中,我可以进行更改,然后重新编译我的项目,但编译器在找到第一个不编译的Unit时会停止.我必须修复该单元,再次编译,然后将显示下一个错误,等等.
我希望能够立刻看到项目中的所有编译错误.然后我可以决定改变是否值得做.例如,如果更改需要手动修复50个单独的源文件,则不值得这样做.但如果它只打破2个文件那么这是一个很容易的改变.
在Delphi中有什么办法吗?我是否可以告诉编译器在找到无法编译的单元后仍继续运行?
我正在使用Delphi 2010
我正在尝试编写一个函数,它接受任何TList并返回TList的所有元素的String表示.
我试过这样的功能
function ListToString(list:TList<TObject>):String;
Run Code Online (Sandbox Code Playgroud)
这工作正常,除了你不能传递TList<String>给它.
E2010 Incompatible types: 'TList<System.TObject>' and 'TList<System.string>'
Run Code Online (Sandbox Code Playgroud)
在Delphi中,String不是Object.为了解决这个问题,我写了第二个函数:
function StringListToString(list:TList<string>):String;
Run Code Online (Sandbox Code Playgroud)
这是唯一的解决方案吗?还有其他方法可以将String视为更像"对象"吗?
同样,我也想写一个'equals'函数来比较两个TList.我再次陷入同样的问题
function AreListsEqual(list1:TList<TObject>; list2:TList<TObject>):boolean;
Run Code Online (Sandbox Code Playgroud)
有没有办法编写这个函数(也许使用泛型?)所以它还可以处理一个TList<String>?在尝试创建处理字符串和对象的代码时,是否还有其他技巧或"最佳实践"?或者我只创建每个函数的两个版本?仿制药可以帮助吗?
我来自Java背景,但现在在Delphi工作.看起来他们最近在Java世界中向Delphi添加了很多东西(或者也许是从Java复制它们的C#世界).就像向TObject添加equals()和hashcode(),以及创建一个通用的Collections框架等.我想知道如果你不能使用Strings这些添加是否非常实用.
[编辑:有人提到过TStringList.到目前为止我已经习惯了,但是我在问TList.我正在努力研究如果使用TList的一切(包括字符串)是一种更清洁的方式.]
通常,当您使用ShowModal打开对话框时,当前线程的执行将停止,直到对话框关闭.我想显示一个模态对话框,但在对话框仍处于打开状态时继续在当前线程上执行.
通过"模态",我只是意味着在关闭模态对话框之前,用户无法与应用程序的任何其他形式进行交互.
Delphi ShowModal函数提供了与我需要的"模态"略有不同的定义:
模式表单是在表单关闭之前应用程序无法继续运行的表单.
目前我的代码如下:
dialog.Parent:=self;
dialog.Show;
// keep doing stuff...
Run Code Online (Sandbox Code Playgroud)
这是有效的,除了我仍然可以与父窗口交互(移动它,关闭它等)
如何在不使用ShowModal的情况下显示阻止用户与父窗口交互的表单?
我有一个包含10列的TStringGrid.添加500行需要大约2秒钟.这是正常的表现吗?
对我来说似乎有点慢.
我从数据库查询中获取数据.如果我遍历查询但不将结果写入StringGrid,则该过程大约需要100毫秒,因此数据库不会减慢速度.
添加行后,StringGrid性能很好.
这是我正在使用的代码
Grid.RowCount := Query.RecordCount;
J := 0;
while not Query.EOF do
begin
Grid.Cells[0,J]:=Query.FieldByName('Value1').AsString;
Grid.Cells[1,J]:=Query.FieldByName('Value2').AsString;
Grid.Cells[2,J]:=Query.FieldByName('Value3').AsString;
// etc for other columns.
Inc(J);
Query.Next();
end;
Run Code Online (Sandbox Code Playgroud)
实际代码实际上有点复杂(表列与查询列不完全对应),但这是基本的想法
我有一个扩展名的文件.ib.我猜它是Interbase或Firebird文件,但我无法确切地解决哪个问题.此外,尚不清楚确切地使用哪个版本的Interbase(或Firebird)来创建文件.
到目前为止我发现了什么:
我已经尝试了各种不同的软件来读取这个文件(FlameRobin,Firebird的isql.exe以及最新版本的Interbase),我得到的错误消息告诉我ODS("On Disk Structure")是版本9.这是相当旧的,并且约会Firebird从Interbase分叉的时间.
我已经设法连接到数据库并使用Firebird查询它,但是我得到的一些错误让我相信它实际上是一个Interbase数据库(如果需要,我可以进一步解释)
是否有一种简单的方法来确定我正在处理的数据库到底是什么类型的?即它是一个Interbase或Firebird文件,如果是这样,它是用哪个版本编写的?
编辑:gstat.exe -h使用Firebird 2.5运行的输出:
Database header page information:
Flags 0
Checksum 12345
Generation 7558
Page size 4096
ODS version 9.1
Oldest transaction 7506
Oldest active 7544
Oldest snapshot 7544
Next transaction 7549
Bumped transaction 1
Sequence number 0
Next attachment ID 5
Implementation ID 16
Shadow count 0
Page buffers 0
Next header page 0
Database dialect 1
Attributes force write
Variable …Run Code Online (Sandbox Code Playgroud) 我想尽快将表的全部内容读入内存.我正在使用Nexus数据库,但可能有一些我可以使用的技术适用于Delphi中的所有数据库类型.
我正在查看的表有60,000条记录,有20列.所以不是一个庞大的数据集.
从我的分析中,到目前为止我找到了以下内容:
使用TnxTable直接访问表并不比使用SQL查询和"SELECT*FROM TableName"更快或更慢
循环遍历行而不实际读取或复制任何数据的简单操作占用大部分时间.
我得到的表现是
我的代码示例
var query:TnxQuery;
begin
query.SQL.Text:='SELECT * FROM TableName';
query.Active:=True;
while not query.Eof do
query.Next;
Run Code Online (Sandbox Code Playgroud)
这在60,000行表上需要3.5秒.
这种表现听起来合理吗?我能采取其他方法让我更快地读取数据吗?
我目前正在同一台计算机上的服务器上读取数据,但最终可能是来自LAN上的另一台服务器.
Delphi链接器删除任何实际未使用的函数,从而减少可执行文件的大小.
有没有办法阻止Delphi Linker这样做?例如编译器开关?
那些想知道"为什么?"的人......
我正在尝试使用delphi-code-coverage工具,但它只报告实际编译到可执行文件中的代码.这使它不是很有用.如果我能让Delphi包含所有代码,我希望我能得到一些有用的代码覆盖率统计信息.
我应该提一下,我在我的应用程序的单独项目中进行了DUnit测试.因此,即使代码在DUnit项目中"未使用",它也会在实际应用程序中使用.
有关详细信息,请参见此处
Delphi有函数System.copy,StrUtils.MidStr它们都返回一个子字符串string.这两个功能有区别吗?
如果是这样,有什么区别?我什么时候应该使用每一个?