Difference between revisions of "IDE tricks/zh CN"

From Lazarus wiki
Jump to navigationJump to search
 
(One intermediate revision by the same user not shown)
Line 129: Line 129:
 
== 对象检查器中的事件(方法属性)==
 
== 对象检查器中的事件(方法属性)==
  
事件(方法属性)是特殊属性,因为它们需要代码地址指针作为值,该指针在设计时不存在。这就是为什么Lazarus使用与Delphi IDE相同的技巧:每个方法值都可以类型转换为TMethod,其中包含Data(对象或类指针)和代码(地址指针)。在运行时,两者都已设置。但在设计时,IDE 会将“数据”设置为其内部查找表的特殊键值,并将“代码”设置为 nil。这意味着:
+
事件(方法属性)是特殊属性,因为它们需要代码地址指针作为值,该指针在设计时不存在。这就是为什么Lazarus使用与Delphi IDE相同的技巧:每个方法值都可以类型转换为'''TMethod''',其中包含''Data''(对象或类指针)和代码(地址指针)。在运行时,两者都已设置。但在设计时,IDE 会将“数据”设置为其内部查找表的特殊键值,并将“代码”设置为 nil。这意味着:
 +
 
 +
* 在运行时,当程序加载 .lfm 文件时,将使用实际方法(数据 + 代码)
 +
* 在设计时,方法值可以是实际方法(Data<>nil 和 Code<>nil),也可以是假方法(Data<>nil,Code=nil)
 +
* 编译器对于德尔菲兼容性有一些关于比较方法值的特殊信息。
 +
* = 和 <> 运算符仅检查代码,而不检查数据。
  
在运行时,当程序加载 .lfm 文件时,将使用实际方法(数据 + 代码)
 
在设计时,方法值可以是实际方法(Data<>nil 和 Code<>nil),也可以是假方法(Data<>nil,Code=nil)
 
编译器对于德尔菲兼容性有一些关于比较方法值的特殊信息。
 
= 和 <> 运算符仅检查代码,而不检查数据。
 
 
请勿使用:
 
请勿使用:
  
if OnMyEvent = NewValue then exit; // wrong, because it compares only Code
+
<syntaxhighlight lang="pascal"> if OnMyEvent = NewValue then exit; // wrong, because it compares only Code</syntaxhighlight>
 +
 
 
因为这只比较代码。改用
 
因为这只比较代码。改用
  
if CompareMem(@FOnMyEvent, @NewValue, SizeOf(TMethod)) then exit; // correct, checking both Data and Code
+
<syntaxhighlight lang="pascal">if CompareMem(@FOnMyEvent, @NewValue, SizeOf(TMethod)) then exit; // correct, checking both Data and Code</syntaxhighlight>
 +
 
 
下面是 = 运算符失败的示例:
 
下面是 = 运算符失败的示例:
 
+
<syntaxhighlight lang="pascal">
 
type
 
type
 
   TMyClass = class
 
   TMyClass = class
Line 167: Line 170:
 
   a.OnClick := @b.Click; // same code, but different data, a.OnClick still points to @a.Click;
 
   a.OnClick := @b.Click; // same code, but different data, a.OnClick still points to @a.Click;
 
end.
 
end.
 +
</syntaxhighlight>

Latest revision as of 03:38, 4 February 2023

Deutsch (de) English (en) français (fr) magyar (hu) 日本語 (ja) 한국어 (ko) русский (ru) slovenčina (sk) 中文(中国大陆)‎ (zh_CN)


使用打开文件创建新文件

您可以创建一个新文件并保存它,也可以一步创建一个具有文件名和文件类型的新文件:只需打开文件 () 并选择不存在的文件名。例如:unit1.pas。IDE 将询问您是否应创建它。Ctrl+o

自定义新单元/窗体

从0.9.27开始,您可以右键单击“新单元”(新窗体)按钮并设置应创建的文件类型。您可以通过 IDEIntf 或项目模板包注册更多文件类型。

IDE macros

IDE Macros in paths and filenames

IDE directives

IDE directives

获取工程编译的命令行参数

可以从“项目”-“>编译器选项”->“显示选项”中复制参数。这里的路径是相对于项目目录的。因此,在大多数情况下,您无需调整即可复制它们。

参数也会保存到 *.compile 文件中。例如,如果您的项目名为test1.lpi,则会创建一个test1.compile。它是一个简单的XML文件,因此您只需复制选项并调整路径即可在另一台计算机上编译。该文件被放入创建可执行文件的同一目录中。

对于包,也是一样的。

这样,您就可以在Lazarus IDE之外编译您的(希望可以工作且没有错误)代码。

源代码编辑器关闭除这个文件之外的所有打开的文件

在 GTK(适用于 Linux、macOS 和 FreeBSD)下,源代码编辑器页面的页面名称右侧有一个关闭按钮。在单击按钮的同时按Ctrl关闭除单击的文件之外的所有文件。

控件面板

在控件面板中查找组件

您知道组件名称或其中的一部分,但您不知道它在哪个页面上?此工具可以帮你找到它:右键单击控件面板中的任何组件以打开弹出菜单,从菜单中选择“查看全部”;这将弹出一个对话框(您也可以通过按Ctrl+Alt+P来实现它)。在“查找”框中输入(部分)组件名称以过滤列表。

在控件面板中打开控件的包

右键单击组件以打开弹出菜单,然后选择打开包。

在组件面板中查找组件的源声明 右键单击组件以打开弹出菜单,然后选择打开单位。

我的应用程序在调试时冻结了我的 Linux 桌面

当拥有鼠标的应用程序被 gdb(调试器)停止时,X(您的桌面)可能会冻结。

使用第二个 X 会话

您可以通过以下方式打开第二个 X:

 X :1 &

使用Ctrl-Alt-F7可以切换到 :0,Ctrl-Alt-F8切换到 :1,之后您可以通过以下方式开始第二个 GNOME 会话:

 gnome-session --display=:1 &

Using VNC

您可以通过安装 tightvncserver 或 realvncserver 来使用 vncserver/client。使用以下命令启动服务器:

 vncserver :1

AFAIK,会话也已启动。您可以使用 vncviewer 连接到 vncserver。

在第二台服务器上调试应用程序

在Lazarus中,在项目的运行参数中,选中“使用显示”并输入

:1

现在,您的应用程序将在第二台服务器上运行,因此在调试时,只有第二台服务器会冻结(但这不会影响您,因为您是在第一台服务器上进行调试)。

快速编译IDE

在Lazarus上工作本身意味着多次重建IDE。如果您使用以下技巧并且有足够的内存和最新的 CPU,您应该能够在几秒钟内重新编译 IDE。

  • 将Lazarus源放在快速硬盘或固态驱动器上。不在慢速网络文件系统上。
  • 仅安装所需的软件包。
  • 设置 USESVN2REVISIONINC=0 以跳过 revision.inc 文件的更新。

DebugLn of the IDE or a LCL application

IDE通过DebugLn编写了许多有用的提示。你可以通过这种方式得到这些:

  • Windows:使用命令行参数 --debug-log=filename.txt 启动 Lazarus。
  • Linux/FreeBSD/macOS/Solaris:只需在终端中启动Lazarus即可。

这是常规的LCL功能。

查找 IDE 窗口的源文件

  • 打开 IDE 窗口。
  • 按下Ctrl+Shift+F1 可打开帮助编辑器。
  • 记住窗口类名。关闭窗口。
  • 使用“在文件中查找”查找类的源文件。

从 IDE 打开终端窗口

能够在当前项目的工作目录中打开终端通常很方便。也许要使用像git或svn这样的版本控制系统,或者出于许多其他可能的原因。以下是将菜单项添加到Lazarus's Tool的菜单的方法。感谢 taazz 和论坛帖子的其他贡献者。

  • 单击工具,配置外部工具
  • 单击“添加”以添加新菜单项(在“工具”下)。
  • 将标题设置为(例如)“打开终端”
  • 将程序文件名设置为系统上打开终端的命令,以下是一些建议。
  • 将参数设置为终端在命令行上期望打开特定目录和指向那里的 Lazarus var $projPath() 的任何内容。

最后两个在系统之间差异很大,如果您不知道第一个,请尝试查看正在运行的程序列表,“终端”一词可能会出现。第二,一旦你知道终端的名称,查找它的手册页或谷歌。

一些例子包括 -

O.S. 程序文件名 参数
Ubuntu Mate mate-terminal --tab --working-directory=$projPath()
xfce exo-open --launch TerminalEmulator --working-directory $ProjPath()
KDE konsole --working-directory $projPath()
GNOME gnome-terminal --working-directory $projPath()
Mac(见下文) /User/$HOME/bin/ttab cd $projPath()
Windows CMD.exe /k cd “$ProjPath()”
IDE Ext Tool

在Mac上,一切都变得容易得多,您所要做的就是:

  1. 安装 https://www.npmjs.com/package/ttab,它只有 665 行,请使用安装它的路径,而不是上表中显示的示例。
  2. 运行它,以便您可以勾选其安全性以访问辅助功能。
  3. 然后按照描述设置拉撒路工具设置。
  4. 然后,从Lazarus中,工具>打开终端,然后类似于3)勾选以允许Lazarus访问可访问性的东西。

在Windows上,还需要勾选“显示控制台”,如右图所示:

对象检查器:事件:帧:跳转到继承事件的源

对象检查器将继承事件的事件显示为 ClassName.MethodName。双击将创建一个新事件。 Ctrl+Mouse click将直接跳转到继承的方法主体,而不创建新方法。

对象检查器中的事件(方法属性)

事件(方法属性)是特殊属性,因为它们需要代码地址指针作为值,该指针在设计时不存在。这就是为什么Lazarus使用与Delphi IDE相同的技巧:每个方法值都可以类型转换为TMethod,其中包含Data(对象或类指针)和代码(地址指针)。在运行时,两者都已设置。但在设计时,IDE 会将“数据”设置为其内部查找表的特殊键值,并将“代码”设置为 nil。这意味着:

  • 在运行时,当程序加载 .lfm 文件时,将使用实际方法(数据 + 代码)
  • 在设计时,方法值可以是实际方法(Data<>nil 和 Code<>nil),也可以是假方法(Data<>nil,Code=nil)
  • 编译器对于德尔菲兼容性有一些关于比较方法值的特殊信息。
  • = 和 <> 运算符仅检查代码,而不检查数据。

请勿使用:

 if OnMyEvent = NewValue then exit; // wrong, because it compares only Code

因为这只比较代码。改用

if CompareMem(@FOnMyEvent, @NewValue, SizeOf(TMethod)) then exit; // correct, checking both Data and Code

下面是 = 运算符失败的示例:

type
  TMyClass = class
  private
    FOnClick: TNotifyEvent;
    procedure SetOnClick(Value: TNotifyEvent);
  public
    procedure Click(Sender: TObject);
    property OnClick: TNotifyEvent read FOnClick write SetOnClick;
  end;

procedure TMyClass.SetOnClick(Value: TNotifyEvent);
begin
  if Value = FOnClick then exit; // bug, checks only for Code, not for data
  FOnClick := Value;
end;

var
  a, b: TMyClass;
begin
  a := TMyClass.Create;
  b := TMyClass.Create;
  a.OnClick := @a.Click;
  a.OnClick := @b.Click; // same code, but different data, a.OnClick still points to @a.Click;
end.