在Delphi中进行调试时,我经常会意外地进入我不感兴趣的代码.
让我们首先说我知道你可以用F8跳过,并且你可以用f4跑到某一行.
例:
function TMyClass.DoStuff():Integer;
begin
// do some stuff
bla();
end;
procedure TMyClass.Foo()
begin
if DoStuff()=0 then // press F7 when entering this line
beep;
end;
Run Code Online (Sandbox Code Playgroud)
示例:我想通过按F7进入方法DoStuff(),但是我没有去那里,而是首先进入FastMM4.FastGetMem(),这是一个庞大的汇编代码,显然我对它不感兴趣.时刻.
有几种方法可以解决这个问题,我不喜欢它们中的任何一种:
在" bla " 上添加一个断点(如果你只想在特殊情况下进入DoStuff,几乎没用,比如迭代23498938);
而不是按F7,手动将光标移动到" bla ",然后按F4(Works为这个简单的例子.实际上,它没有);
在FastMM的情况下:暂时禁用fastmm;
有没有办法提示IDE我从来没有兴趣进入某个代码块,或者我是否总是要设置额外的断点或使用F4来避免这种情况?
我希望有一些神奇的编译器指令,如{$ NODEBUG BEGIN/END}或类似的东西.
在大多数情况下,能够排除整个单元对我来说足够精细,但能够避免某些方法或甚至代码行会更好.
更新:也许codegear应该引入像跳过点(而不是断点)的东西:-)
当一个动作甚至触发时,"发送者"总是动作本身.通常这是最有用的,但是在某种程度上可以找出谁触发了行动的onexecute事件?
例
假设您有一个包含以下内容的表单:
Button1和Button2 actDoStuff两个按钮分配相同的操作.是否可以显示我点击了哪个按钮?
Example.dfm
object Form1: TForm1
object Button1: TButton
Action = actDoStuff
end
object Button2: TButton
Action = actDoStuff
Left = 100
end
object actDoStuff: TAction
Caption = 'Do Stuff'
OnExecute = actDoStuffExecute
end
end
Run Code Online (Sandbox Code Playgroud)
Example.pas
unit Example;
interface
uses Windows, Classes, Forms, Dialogs, Controls, ActnList, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
actDoStuff: TAction;
procedure actDoStuffExecute(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.actDoStuffExecute(Sender: TObject);
begin …Run Code Online (Sandbox Code Playgroud) 从恐龙时代开始,Turbo Pascal和现在的Delphi都有一个Write()和WriteLn()程序,可以悄悄地做一些简洁的事情.
参数的数量是可变的;
每个变量可以是各种类型的; 你可以提供整数,双打,字符串,布尔值,并按任意顺序混合它们;
您可以为每个参数提供其他参数:
写( '你好':10, '世界!':7); //对齐参数
现在我输入了这个,我注意到Write和WriteLn在代码完成下拉列表中没有相同的括号.因此看起来这不是自动生成的,但它是由某人硬编码的.
无论如何,我能够自己编写这样的程序,还是所有这些神奇的硬编码编译技巧?
在其中一个Delphi演示应用程序中,我偶然发现了一些我不知道Delphi编译器接受的语法:
// ......\Demos\DelphiWin32\VCLWin32\ActiveX\OleAuto\SrvComp\Word\
// Main.pas, line 109
Docs.Add(NewTemplate := True); // note the assignment
Run Code Online (Sandbox Code Playgroud)
我似乎无法重现这种类型的参数传递我自己的代码,我从来没有看到任何人使用它.所以这些是我的问题:
我可以在"普通"方法中使用它,它是"Delphi语言"的一部分,还是一些编译器破解自动化对象?
为了能够使用它需要什么?
这有点像C#4的命名和可选参数吗?
附加信息:当方法有许多可选参数时,我通常会传递记录或简单类,但看起来我不需要使用这种语法.我知道默认参数值,但它们的用处是有限的,因为你不能在省略的参数值的右边提供任何参数.在JavaScript中,我一直在使用这个命名参数样式(使用不同的语法),并且功能强大.
如果我有一些.dcu文件; 我怎样才能找出他们编译的Delphi版本?
我收到了一些旧的源代码,包含了一些.dcu文件,我无法访问原始源代码.我想重构这个库,但为此我想让它首先在原始的Delphi版本中进行编译.
顺便说一句,编译器在这里可能会更有帮助.它声明文件X是用"不同"版本编译的,没有说 - 是 - 版本是....
从我的主要问题开始:
我可以在FireMonkey应用程序中使用像素着色器模型3,4或5吗?
我希望能够在我的FireMonkey程序中动态创建像素着色器.为此,我现在使用DirectX SDK附带的fxc.exe编译像素着色器,并将编译后的代码加载到我的TShaderFilter后代中.这很好(如果你对我的表现感兴趣,请告诉我).
但是,如果我ps_2_0作为目标配置文件进行编译,我只能让事情发挥作用.
我目前正在遇到着色器模型2.0的限制.例如,循环似乎是由编译器展开的,并且在2级着色器中可以有最大数量的指令.因此,可能性的数量非常有限.
示例:
下面的着色器代码创建了一个mandelbrot分形.如果我设置Iterations得太高,它就不会编译.错误信息:
error X5608: Compiled shader code uses too many arithmetic instruction slots (78). Max. allowed by the target (ps_2_0) is 64.
#define Iterations 12
float2 Pan;
float Zoom;
float Aspect;
float4 main(float2 texCoord : TEXCOORD0) : COLOR0
{
float2 c = (texCoord - 0.5) * Zoom * float2(1, Aspect) - Pan;
float2 v = 0;
for (int n = 0; n < Iterations; n++)
{
v = float2(v.x * …Run Code Online (Sandbox Code Playgroud) 有时我在没有重载的方法后面有"overload"关键字.
除了代码的可读性和可维护性之外,这还有其他我应该注意的影响吗?
在Delphi的对象检查器中,我在属性名称(ConnectionName*)后面看到一个星号:

它是如何实现的,最重要的是:它是什么意思?
在TMySQLConnection的源代码中,我没有看到任何特别的东西,所以我想这是一些设计时间的事情?
更新
它与TSQLConnection的内容有关.
要重现,请将下面的代码粘贴到表单上.
经过一些游戏后,我得出结论,当Params属性被编辑时,星号会出现,因此它不再具有默认值.对我来说,如何实现这一目标仍然是个谜.
object SQLConnection1: TSQLConnection
ConnectionName = 'MySQLConnection'
DriverName = 'MySQL'
LoginPrompt = False
Params.Strings = (
'DriverUnit=Data.DBXMySQL'
'DriverPackageLoader=TDBXDynalinkDriverLoader,DbxCommonDriver190.' +
'bpl'
'DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borla' +
'nd.Data.DbxCommonDriver,Version=19.0.0.0,Culture=neutral,PublicK' +
'eyToken=91d62ebb5b0d1b1b'
'MetaDataPackageLoader=TDBXMySqlMetaDataCommandFactory,DbxMySQLDr' +
'iver190.bpl'
'MetaDataAssemblyLoader=Borland.Data.TDBXMySqlMetaDataCommandFact' +
'ory,Borland.Data.DbxMySQLDriver,Version=19.0.0.0,Culture=neutral' +
',PublicKeyToken=91d62ebb5b0d1b1b'
'GetDriverFunc=getSQLDriverMYSQL'
'LibraryName=dbxmys.dll'
'LibraryNameOsx=libsqlmys.dylib'
'VendorLib=LIBMYSQL.dll'
'VendorLibWin64=libmysql.dll'
'VendorLibOsx=libmysqlclient.dylib'
'MaxBlobSize=-1'
'DriverName=MySQL'
'HostName='
'Database='
'User_Name=xxx'
'Password='
'ServerCharSet='
'BlobSize=-1'
'ErrorResourceFile='
'LocaleCode=0000'
'Compressed=True'
'Encrypted=False'
'ConnectTimeout=60')
Left = 48
Top = 24
end
Run Code Online (Sandbox Code Playgroud) 我一直在浏览GoogleCode上的DeHL存储库,它看起来对我很好.
许多有趣的功能使基本编程任务更容易; DotNet FCL中的一些简洁的东西,但Delphi RTL中缺少的东西可以在这个库中找到;
以现代方式编码,充分利用新的语言功能;
每个类,记录类型,成员函数和参数都以这样的方式记录,它将在Delphi IDE的代码完成中显示;
组织良好,干净的代码;
大量的单元测试;
开源和免费;
基本上,看起来这个库应该包含在Delphi中,作为RTL的一部分.
一个主要缺点:该项目已经停产.:-(
现在我的问题是:
将这个库用于未来的项目是否安全,并将其作为基础框架来构建?
基本上我想听听那些真正使用过这个库的人是否值得花时间去了解这个库,以及为什么.
我构建了类系统
TTableSpec=class(Tobject)
private
FName : string;
FDescription : string;
FCan_add : Boolean;
FCan_edit : Boolean;
FCan_delete : Boolean;
FFields : array[1..100] of TFieldSpec;
public
property Name: String read FName;
property Description: String read FDescription;
property Can_add : Boolean read FCan_add;
property Can_edit : Boolean read FCan_edit;
property Can_delete : Boolean read FCan_delete;
property Fields : array read FFields;
end;
Run Code Online (Sandbox Code Playgroud)
因此,在TableSpec中,Fields属性应该是字段列表(我使用TFieldSpec数组).如何组织字段列表(使用或不使用数组)作为编译的结果我收到错误
[Error] Objects.pas(97): Identifier expected but 'ARRAY' found
[Error] Objects.pas(97): READ or WRITE clause expected, but identifier 'FFields' found
[Error] Objects.pas(98): …Run Code Online (Sandbox Code Playgroud) delphi ×10
delphi-xe2 ×2
arguments ×1
dcu ×1
debugging ×1
dehl ×1
delphi-2010 ×1
delphi-7 ×1
delphi-ide ×1
delphi-xe5 ×1
firemonkey ×1
oop ×1
overloading ×1
pixel-shader ×1
shader ×1
taction ×1