IDE tricks/zh CN: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | + | ## Contents | |
| 2 | + | ||
| 3 | + | * 1 使用打开文件创建新文件 | |
| 4 | + | * 2 自定义新单元/窗体 | |
| 5 | + | * 3 IDE macros | |
| 6 | + | * 4 IDE directives | |
| 7 | + | * 5 获取工程编译的命令行参数 | |
| 8 | + | * 6 源代码编辑器关闭除这个文件之外的所有打开的文件 | |
| 9 | + | * 7 控件面板 | |
| 10 | + | * 7.1 在控件面板中查找组件 | |
| 11 | + | * 7.2 在控件面板中打开控件的包 | |
| 12 | + | * 7.3 我的应用程序在调试时冻结了我的 Linux 桌面 | |
| 13 | + | * 7.4 使用第二个 X 会话 | |
| 14 | + | * 7.5 Using VNC | |
| 15 | + | * 7.6 在第二台服务器上调试应用程序 | |
| 16 | + | * 8 快速编译IDE | |
| 17 | + | * 9 DebugLn of the IDE or a LCL application | |
| 18 | + | * 10 查找 IDE 窗口的源文件 | |
| 19 | + | * 11 从 IDE 打开终端窗口 | |
| 20 | + | * 12 对象检查器:事件:帧:跳转到继承事件的源 | |
| 21 | + | * 13 对象检查器中的事件(方法属性) | |
| 22 | + | ||
| 1 | 23 | ## 使用打开文件创建新文件 | |
| 2 | 24 | ||
| 3 | - | ||
| 25 | + | 您可以创建一个新文件并保存它,也可以一步创建一个具有文件名和文件类型的新文件:只需打开文件 () 并选择不存在的文件名。例如:unit1.pas。IDE 将询问您是否应创建它。Ctrl+o | |
| 4 | 26 | ||
| 5 | 27 | ## 自定义新单元/窗体 | |
| 6 | 28 | ||
| 7 | - | ||
| 29 | + | 从0.9.27开始,您可以右键单击“新单元”(新窗体)按钮并设置应创建的文件类型。您可以通过 IDEIntf 或项目模板包注册更多文件类型。 | |
| 8 | 30 | ||
| 9 | 31 | ## IDE macros | |
| 10 | 32 | ||
| 11 | 33 | [[IDE Macros in paths and filenames]] | |
| 12 | 34 | ||
| 13 | 35 | ## IDE directives | |
| 14 | 36 | ||
| 15 | 37 | [[IDE directives]] | |
| 16 | 38 | ||
| 17 | 39 | ## 获取工程编译的命令行参数 | |
| 18 | 40 | ||
| 19 | - | ||
| 41 | + | 可以从“项目”-“>编译器选项”->“显示选项”中复制参数。这里的路径是相对于项目目录的。因此,在大多数情况下,您无需调整即可复制它们。 | |
| 20 | 42 | ||
| 21 | - | ||
| 43 | + | 参数也会保存到 *.compile 文件中。例如,如果您的项目名为test1.lpi,则会创建一个test1.compile。它是一个简单的XML文件,因此您只需复制选项并调整路径即可在另一台计算机上编译。该文件被放入创建可执行文件的同一目录中。 | |
| 22 | 44 | ||
| 23 | - | ||
| 45 | + | 对于包,也是一样的。 | |
| 24 | 46 | ||
| 25 | - | ||
| 47 | + | 这样,您就可以在Lazarus IDE之外编译您的(希望可以工作且没有错误)代码。 | |
| 26 | 48 | ||
| 27 | 49 | ## 源代码编辑器关闭除这个文件之外的所有打开的文件 | |
| 28 | 50 | ||
| 29 | - | ||
| 51 | + | 在 GTK(适用于 Linux、macOS 和 FreeBSD)下,源代码编辑器页面的页面名称右侧有一个关闭按钮。在单击按钮的同时按`Ctrl`关闭除单击的文件之外的所有文件。 | |
| 30 | 52 | ||
| 31 | 53 | ## 控件面板 | |
| 32 | 54 | ||
| 33 | 55 | ### 在控件面板中查找组件 | |
| 34 | 56 | ||
| 35 | - | ||
| 57 | + | 您知道组件名称或其中的一部分,但您不知道它在哪个页面上?此工具可以帮你找到它:右键单击控件面板中的任何组件以打开弹出菜单,从菜单中选择“查看全部”;这将弹出一个对话框(您也可以通过按`Ctrl+Alt+P`来实现它)。在“查找”框中输入(部分)组件名称以过滤列表。 | |
| 36 | 58 | ||
| 37 | 59 | ### 在控件面板中打开控件的包 | |
| 38 | 60 | ||
| 39 | - | ||
| 61 | + | 右键单击组件以打开弹出菜单,然后选择打开包。 | |
| 40 | 62 | ||
| 41 | - | ||
| 63 | + | 在组件面板中查找组件的源声明 右键单击组件以打开弹出菜单,然后选择打开单位。 | |
| 42 | 64 | ||
| 43 | 65 | ### 我的应用程序在调试时冻结了我的 Linux 桌面 | |
| 44 | 66 | ||
| 45 | - | ||
| 67 | + | 当拥有鼠标的应用程序被 gdb(调试器)停止时,X(您的桌面)可能会冻结。 | |
| 46 | 68 | ||
| 47 | 69 | ### 使用第二个 X 会话 | |
| 48 | 70 | ||
| 49 | - | ||
| 50 | - | ||
| 51 | - | ||
| 52 | - | ||
| 53 | - | ||
| 71 | + | 您可以通过以下方式打开第二个 X: | |
| 72 | + | ``` | |
| 73 | + | X :1 & | |
| 74 | + | ``` | |
| 54 | 75 | ||
| 55 | - | ||
| 76 | + | 使用`Ctrl-Alt-F7`可以切换到 :0,`Ctrl-Alt-F8`切换到 :1,之后您可以通过以下方式开始第二个 GNOME 会话: | |
| 77 | + | ``` | |
| 78 | + | gnome-session --display=:1 & | |
| 79 | + | ``` | |
| 56 | 80 | ||
| 57 | 81 | ### Using VNC | |
| 58 | 82 | ||
| 59 | - | ||
| 60 | - | ||
| 61 | - | ||
| 83 | + | 您可以通过安装 tightvncserver 或 realvncserver 来使用 vncserver/client。使用以下命令启动服务器: | |
| 84 | + | ``` | |
| 85 | + | vncserver :1 | |
| 86 | + | ``` | |
| 62 | 87 | ||
| 63 | - | ||
| 88 | + | AFAIK,会话也已启动。您可以使用 vncviewer 连接到 vncserver。 | |
| 64 | 89 | ||
| 65 | 90 | ### 在第二台服务器上调试应用程序 | |
| 66 | 91 | ||
| 67 | - | ||
| 68 | - | ||
| 69 | - | ||
| 92 | + | 在Lazarus中,在项目的运行参数中,选中“使用显示”并输入 | |
| 93 | + | ``` | |
| 94 | + | :1 | |
| 95 | + | ``` | |
| 70 | 96 | ||
| 71 | - | ||
| 97 | + | 现在,您的应用程序将在第二台服务器上运行,因此在调试时,只有第二台服务器会冻结(但这不会影响您,因为您是在第一台服务器上进行调试)。 | |
| 72 | 98 | ||
| 73 | 99 | ## 快速编译IDE | |
| 74 | 100 | ||
| 75 | - | ||
| 101 | + | 在Lazarus上工作本身意味着多次重建IDE。如果您使用以下技巧并且有足够的内存和最新的 CPU,您应该能够在几秒钟内重新编译 IDE。 | |
| 76 | 102 | ||
| 77 | - | ||
| 78 | - | ||
| 79 | - | ||
| 103 | + | * 将Lazarus源放在快速硬盘或固态驱动器上。不在慢速网络文件系统上。 | |
| 104 | + | * 仅安装所需的软件包。 | |
| 105 | + | * 设置 USESVN2REVISIONINC=0 以跳过 revision.inc 文件的更新。 | |
| 80 | 106 | ||
| 81 | 107 | ## DebugLn of the IDE or a LCL application | |
| 82 | 108 | ||
| 83 | - | ||
| 109 | + | IDE通过DebugLn编写了许多有用的提示。你可以通过这种方式得到这些: | |
| 84 | 110 | ||
| 85 | - | ||
| 86 | - | ||
| 111 | + | * Windows:使用命令行参数 --debug-log=filename.txt 启动 Lazarus。 | |
| 112 | + | * Linux/FreeBSD/macOS/Solaris:只需在终端中启动Lazarus即可。 | |
| 87 | 113 | ||
| 88 | - | ||
| 114 | + | 这是常规的LCL功能。 | |
| 89 | 115 | ||
| 90 | 116 | ## 查找 IDE 窗口的源文件 | |
| 91 | 117 | ||
| 92 | - | ||
| 93 | - | ||
| 94 | - | ||
| 95 | - | ||
| 118 | + | * 打开 IDE 窗口。 | |
| 119 | + | * 按下`Ctrl+Shift+F1` 可打开帮助编辑器。 | |
| 120 | + | * 记住窗口类名。关闭窗口。 | |
| 121 | + | * 使用“[[IDE Window: Find in files|在文件中查找]]”查找类的源文件。 | |
| 96 | 122 | ||
| 97 | 123 | ## 从 IDE 打开终端窗口 | |
| 98 | 124 | ||
| 99 | - | ||
| 125 | + | 能够在当前项目的工作目录中打开终端通常很方便。也许要使用像git或svn这样的版本控制系统,或者出于许多其他可能的原因。以下是将菜单项添加到Lazarus's Tool的菜单的方法。感谢 taazz 和论坛帖子的其他贡献者。 | |
| 100 | 126 | ||
| 101 | - | ||
| 102 | - | ||
| 103 | - | ||
| 104 | - | ||
| 105 | - | ||
| 127 | + | * 单击工具,配置外部工具 | |
| 128 | + | * 单击“添加”以添加新菜单项(在“工具”下)。 | |
| 129 | + | * 将标题设置为(例如)“打开终端” | |
| 130 | + | * 将程序文件名设置为系统上打开终端的命令,以下是一些建议。 | |
| 131 | + | * 将参数设置为终端在命令行上期望打开特定目录和指向那里的 Lazarus var $projPath() 的任何内容。 | |
| 106 | 132 | ||
| 107 | - | ||
| 133 | + | 最后两个在系统之间差异很大,如果您不知道第一个,请尝试查看正在运行的程序列表,“终端”一词可能会出现。第二,一旦你知道终端的名称,查找它的手册页或谷歌。 | |
| 108 | 134 | ||
| 109 | - | ||
| 135 | + | 一些例子包括 - | |
| 110 | 136 | ||
| 111 | - | ||
| 112 | - | ||
| 113 | - | ||
| 114 | - | ||
| 115 | - | ||
| 116 | - | ||
| 117 | - | ||
| 118 | - | ||
| 137 | + | O.S. | 程序文件名 | 参数 | |
| 138 | + | ---|---|--- | |
| 139 | + | Ubuntu Mate | mate-terminal | \--tab --working-directory=$projPath() | |
| 140 | + | xfce | exo-open | \--launch TerminalEmulator --working-directory $ProjPath() | |
| 141 | + | KDE | konsole | \--working-directory $projPath() | |
| 142 | + | GNOME | gnome-terminal | \--working-directory $projPath() | |
| 143 | + | Mac(见下文) | /User/$HOME/bin/ttab | cd $projPath() | |
| 144 | + | Windows | CMD.exe | /k cd “$ProjPath()” | |
| 145 | + | ||
| 146 | + | [](</File:ExtTool.PNG> "IDE Ext Tool") | |
| 119 | 147 | ||
| 120 | - | ||
| 148 | + | **在Mac上** ,一切都变得容易得多,您所要做的就是: | |
| 121 | 149 | ||
| 122 | - | ||
| 123 | - | ||
| 124 | - | ||
| 125 | - | ||
| 150 | + | 1. 安装 <https://www.npmjs.com/package/ttab,它只有> 665 行,请使用安装它的路径,而不是上表中显示的示例。 | |
| 151 | + | 2. 运行它,以便您可以勾选其安全性以访问辅助功能。 | |
| 152 | + | 3. 然后按照描述设置拉撒路工具设置。 | |
| 153 | + | 4. 然后,从Lazarus中,工具>打开终端,然后类似于3)勾选以允许Lazarus访问可访问性的东西。 | |
| 126 | 154 | ||
| 127 | - | ||
| 155 | + | **在Windows上** ,还需要勾选“显示控制台”,如右图所示: | |
| 128 | 156 | ||
| 129 | 157 | ## 对象检查器:事件:帧:跳转到继承事件的源 | |
| 130 | 158 | ||
| 131 | - | ||
| 159 | + | 对象检查器将继承事件的事件显示为 ClassName.MethodName。双击将创建一个新事件。 `Ctrl+Mouse click`将直接跳转到继承的方法主体,而不创建新方法。 | |
| 132 | 160 | ||
| 133 | 161 | ## 对象检查器中的事件(方法属性) | |
| 134 | 162 | ||
| 135 | - | ||
| 136 | - | ||
| 137 | - | ||
| 138 | - | ||
| 139 | - | ||
| 140 | - | ||
| 163 | + | 事件(方法属性)是特殊属性,因为它们需要代码地址指针作为值,该指针在设计时不存在。这就是为什么Lazarus使用与Delphi IDE相同的技巧:每个方法值都可以类型转换为**TMethod** ,其中包含 _Data_ (对象或类指针)和代码(地址指针)。在运行时,两者都已设置。但在设计时,IDE 会将“数据”设置为其内部查找表的特殊键值,并将“代码”设置为 nil。这意味着: | |
| 141 | 164 | ||
| 142 | - | ||
| 165 | + | * 在运行时,当程序加载 .lfm 文件时,将使用实际方法(数据 + 代码) | |
| 166 | + | * 在设计时,方法值可以是实际方法(Data<>nil 和 Code<>nil),也可以是假方法(Data<>nil,Code=nil) | |
| 167 | + | * 编译器对于德尔菲兼容性有一些关于比较方法值的特殊信息。 | |
| 168 | + | * = 和 <> 运算符仅检查代码,而不检查数据。 | |
| 143 | 169 | ||
| 144 | - | ||
| 145 | - | ||
| 170 | + | 请勿使用: | |
| 146 | 171 | ``` | |
| 147 | - | ||
| 148 | - | ||
| 172 | + | if OnMyEvent = NewValue then exit; // wrong, because it compares only Code | |
| 173 | + | ``` | |
| 149 | 174 | ||
| 150 | - | ||
| 175 | + | 因为这只比较代码。改用 | |
| 176 | + | ``` | |
| 151 | 177 | if CompareMem(@FOnMyEvent, @NewValue, SizeOf(TMethod)) then exit; // correct, checking both Data and Code | |
| 152 | 178 | ``` | |
| 153 | 179 | ||
| 154 | - | ||
| 155 | - | ||
| 156 | - | ||
| 180 | + | 下面是 = 运算符失败的示例: | |
| 181 | + | ``` | |
| 157 | 182 | type | |
| 158 | - | ||
| 159 | - | ||
| 160 | - | ||
| 161 | - | ||
| 162 | - | ||
| 163 | - | ||
| 164 | - | ||
| 165 | - | ||
| 166 | - | ||
| 167 | - | ||
| 168 | - | ||
| 169 | - | ||
| 170 | - | ||
| 171 | - | ||
| 172 | - | ||
| 173 | - | ||
| 174 | - | ||
| 175 | - | ||
| 176 | - | ||
| 177 | - | ||
| 178 | - | ||
| 179 | - | ||
| 180 | - | ||
| 183 | + | TMyClass = class | |
| 184 | + | private | |
| 185 | + | FOnClick: TNotifyEvent; | |
| 186 | + | procedure SetOnClick(Value: TNotifyEvent); | |
| 187 | + | public | |
| 188 | + | procedure Click(Sender: TObject); | |
| 189 | + | property OnClick: TNotifyEvent read FOnClick write SetOnClick; | |
| 190 | + | end; | |
| 191 | + | ||
| 192 | + | procedure TMyClass.SetOnClick(Value: TNotifyEvent); | |
| 193 | + | begin | |
| 194 | + | if Value = FOnClick then exit; // bug, checks only for Code, not for data | |
| 195 | + | FOnClick := Value; | |
| 196 | + | end; | |
| 197 | + | ||
| 198 | + | var | |
| 199 | + | a, b: TMyClass; | |
| 200 | + | begin | |
| 201 | + | a := TMyClass.Create; | |
| 202 | + | b := TMyClass.Create; | |
| 203 | + | a.OnClick := @a.Click; | |
| 204 | + | a.OnClick := @b.Click; // same code, but different data, a.OnClick still points to @a.Click; | |
| 205 | + | end. | |
| 181 | 206 | ``` | |
| 182 | 207 | ||
| 183 | 208 | --- | |
| 184 | - | ||
| 209 | + | *From the Free Pascal wiki, page "IDE tricks/zh CN", as the Internet Archive kept it on 2024-07-16. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
