我有一个Delphi应用程序,它使用TOpenDialog让用户选择一个文件.默认情况下,打开的对话框以当前监视器为中心显示,现在可以离应用程序窗口"英里".我希望对话框以TOpenDialog的所有者控件为中心显示,如果失败了,我会选择应用程序的主窗口.
以下代码类型的工作,它是从TJvOpenDialog派生的,它给了我一些如何做到的提示:
type
TMyOpenDialog = class(TJvOpenDialog)
private
procedure SetPosition;
protected
procedure DoFolderChange; override;
procedure WndProc(var Msg: TMessage); override;
end;
procedure TMyOpenDialog.SetPosition;
begin
var
Monitor: TMonitor;
ParentControl: TWinControl;
Res: LongBool;
begin
if (Assigned(Owner)) and (Owner is TWinControl) then
ParentControl := (Owner as TWinControl)
else if Application.MainForm <> nil then
ParentControl := Application.MainForm
else begin
// this code was already in TJvOpenDialog
Monitor := Screen.Monitors[0];
Res := SetWindowPos(ParentWnd, 0,
Monitor.Left + ((Monitor.Width - Width) div 2),
Monitor.Top + ((Monitor.Height - Height) div …Run Code Online (Sandbox Code Playgroud) 直到最近,简单阅读所有的SVN:通过只读取存储在子目录.svn一些文本文件在Subversion工作拷贝引用的外部对象.随着使用mysql表更改为新的磁盘结构,这已经不再那么简单了.
我想更新一个内部使用的工具,用于读取该外部列表以使用新结构.该工具是用Delphi 2007编写的,所以我更喜欢用Delphi编写的代码.
在sourceforge上有针对RAD Studio的版本洞察,它可能包含一些代码来完成这个技巧,但我想知道是否有任何其他人可能已经完成了从该项目中提取所需部分的工作或有替代方法.
我在使用Delphi 2010中的Inc和Dec程序时遇到问题.
这是我的代码片段:
if NOT(frmMain.Height = 0) then
begin
Dec(frmMain.Height, 2);
Inc(frmMain.Top);
end;
Run Code Online (Sandbox Code Playgroud)
我得到一个:
[DCC Error] frmMain_U.pas(44): E2064 Left side cannot be assigned to
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我有一种感觉,我可能会在这里错过一些愚蠢的东西......
编辑:阅读这里的程序:
Delphi以各种语言本地化(我认为英语,日语,德语,法语).命令行编译器(dcc32)也已本地化,因此德语版本向控制台写入"Fehler"而不是"Error"和"Warnung"而不是"Warning".
我编写了一个解析此输出的程序,并且(作为其功能之一)计算错误和警告.这与本地化字符串失败.
我可以调整程序以检测本地化的文本,但感觉不对.我宁愿强迫编译器使用英语作为输出.是否有命令行开关或任何其他选项来做到这一点?
我想支持使用msbuild的所有Delphi版本,即> = 2007.
编辑:
至于读取错误代码而不是消息,请考虑以下错误:
C:\[...]\Borland.Delphi.Targets(113,3): error : blub.pas(56) Error: E2029 ',' expected but identifier 'bla' found
Run Code Online (Sandbox Code Playgroud)
错误代码是E2029,但程序很难检测到它.检测文本"错误:"更简单,更不容易出错.
Delphi(实际上是Pascal)具有函数Odd(x:integer):boolean,如果参数不能被2整除,则返回true,如果是,则返回false:
if Odd(x) then
WriteLn('Argument is odd.')
else
WriteLn('Argument is even.')
Run Code Online (Sandbox Code Playgroud)
或者,可以使用mod运算符:
if (x mod 2) <> 0 then
WriteLn('Argument is odd.')
else
WriteLn('Argument is even.')
Run Code Online (Sandbox Code Playgroud)
表现有什么不同吗?我希望编译器为系统函数生成优化代码.
我对Delphi 2007的答案特别感兴趣,但是如果有人可以检查其他Delphi版本那就太好了.
我正在将一个Lazarus项目搬到Delphi Seattle.
Lazarus项目依赖于40多个单元(包括控件),并有几个应用程序.
在所有项目的uses子句中,他们使用了以下内容:
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, DBCtrls, {$I OurLibrary.inc};
Run Code Online (Sandbox Code Playgroud)
他们包括那些40多个单位$I OurLibrary.inc.
由于其中一些单位是控件,我在Delphi中注册了它们.
但是,如果我保存项目或构建/编译它,Delphi再次添加使用部分中的单位.
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, DBCtrls, uOurEdit, {$I OurLibrary.inc};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,uOurEdit即使它进入,该单元也会再次添加$I OurLibrary.inc.
如果我手动删除它并再次编译项目它运行.一旦我切换回设计师模式并尝试运行它同样的事情不断发生 - 它再次添加uOurEdit.
一旦你移除一个单位Lazarus不再添加它.德尔福做到了这一点.
有没有办法告诉德尔福停止读取单位或自动停止添加单位?
我想在TMemo控件中突出显示包含插入符号的行,类似于Delphi IDE中的编辑器.我尝试了以下代码,它有点工作:(抱歉With语句,这需要重构.)
procedure TMemo.WMPaint(var Message: TWMPaint);
var
PS: TPaintStruct;
DC: Hdc;
Canvas: TCanvas;
LineIdx: Integer;
X, Y: Integer;
Max: Integer;
s: string;
h: Integer;
begin
DC := Message.DC;
if DC = 0 then
DC := BeginPaint(Handle, PS);
Canvas := TCanvas.Create;
try
Canvas.Handle := DC;
Canvas.Font.Name := Font.Name;
Canvas.Font.Size := Font.Size;
with Canvas do begin
Max := TopLine + VisibleLines;
if Max > Pred(Lines.Count) then
Max := Pred(Lines.Count);
Brush.Color := Self.Color;
FillRect(Self.ClientRect);
Brush.Color := clYellow;
h := Canvas.TextHeight('Mg');
Y …Run Code Online (Sandbox Code Playgroud) 给出以下测试表(在Delphi 10.1和Delphi 2007中测试):
object Form1: TForm1
Caption = 'Form1'
ClientHeight = 340
ClientWidth = 639
object b_Test: TButton
Caption = 'Test'
OnClick = b_TestClick
end
object od_test: TOpenDialog
Filter = 'blub (blub*.dbf)|blub*.dbf|bla (bla?.dbf)|bla?.dbf'
end
end
Run Code Online (Sandbox Code Playgroud)
(我遗漏了一些默认属性,基本上它是带有TOpenDialog和按钮的表单.唯一重要的部分是TOpenDialog.Filter属性.)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
od_test: TOpenDialog;
b_Test: TButton;
procedure b_TestClick(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.b_TestClick(Sender: TObject);
begin
od_test.Execute;
end;
end.
Run Code Online (Sandbox Code Playgroud)
为什么对话框会显示包含问号的过滤器,如下所示:
这是一个已知的错误还是我做错了什么?如果这是一个已知的错误,是否有一个解决方法(除了显而易见的遗漏'(bla?.dbf)'部分描述,这意味着我必须更改所有描述.)?
编辑:这是在Windows 8.1上.我还没有尝试过其他版本.如果它有所不同:我已禁用资源管理器选项"隐藏knonw文件类型的扩展名".
最近我发现了一些奇怪的(对我而言)Delphi代码,我把它分离到一个单独的小项目中.这是我发现的.Unit1编译没有错误.Unit2(我提供用于比较)没有.区别在于Classes的方式used.
unit Unit1;
interface
uses Classes; // difference here
type TThread = class(Classes.TThread)
public
property Terminated;
end;
implementation
end.
Run Code Online (Sandbox Code Playgroud)
Unit2无法编译.产生各种错误.
unit Unit2;
interface
uses System.Classes; // difference here
type TThread = class(Classes.TThread)
public
property Terminated;
end;
implementation
end.
[dcc32 Error] Unit1.pas(7): E2003 Undeclared identifier: 'Classes'
[dcc32 Error] Unit1.pas(7): E2029 ',' or ':' expected but ')' found
[dcc32 Error] Unit1.pas(9): E2147 Property 'Terminated' does not exist in base class
Run Code Online (Sandbox Code Playgroud)
所以我担心的是这个项目正在利用编译器错误来实现它的目标.编译器错误可能会在以后的版本中修复,然后代码将不再起作用.
在解析GPS接收器的NMEA输出时,我得到以下几行:
$GPGSV,4,1,16,02,17,228,35,03,04,048,37,05,59,285,29,06,02,030,34*73
$GPGSV,4,2,16,07,58,061,46,08,80,159,40,09,11,227,32,10,51,167,47*77
$GPGSV,4,3,16,13,15,089,38,15,00,279,,16,00,018,,26,34,279,42*7A
$GPGSV,4,4,16,28,20,154,39*4C
Run Code Online (Sandbox Code Playgroud)
据我了解,从网络上的各种来源(例如这里),这是错误的.根据第3个数字,应该有16颗卫星,这对我之前遇到的所有GPS接收机都是如此,但是这个卫星的句子只包含13颗卫星的数据.
这是一个错误吗?或者我是否错误地阅读了规范?