考虑假设的对象层次结构,从以下开始:
TFruit = class(TObject)
public
constructor Create(Color: TColor); virtual;
end;
Run Code Online (Sandbox Code Playgroud)
及其后代:
TApple = class(TFruit)
public
constructor Create(); overload; virtual;
constructor Create(Color: TColor); overload; override; //deprecated. Calls other constructor - maintaining the virtual constructor chain
end;
Run Code Online (Sandbox Code Playgroud)
这里的想法是我已经覆盖了基类的虚构造函数,其重载也恰好是虚拟的.
德尔福抱怨:
方法'Create'隐藏基类型'TFruit'的虚方法
除了它不隐藏它 - 它就在那里!
这是怎么回事?
我用
DirectoryExists (const PathName : String);
Run Code Online (Sandbox Code Playgroud)
检查是否可以从计算机访问目录.但是如果目录不存在且路径名是网络路径,即
\\computer1\Data
Run Code Online (Sandbox Code Playgroud)
该方法需要很长时间才能返回.
必须有一种更快的方法来确定无法访问网络文件夹.或者我可以配置DirectoryExists在内部使用的一些超时参数(我查看了源代码,但它只是委托给kernel32中定义的GetFileAttributes)?
有任何想法吗?
是否有更简单的方法来显示控件中的struct
字段及其对应的值RichEdit
?
这就是我现在正在做的事情:
AnsiString s;
s = IntToStr(wfc.fontColor);
RichEdit1->Lines->Append(s);
Run Code Online (Sandbox Code Playgroud)
等等...
有没有比单独呼叫每个人更简单的方法?我想读取一个二进制文件,然后在RichEdit
我正在构建的小实用程序的控件中显示相应的结构,并且没有找到其他方法.我知道如何读取二进制文件并将值读入struct
已经存在的文件中.
VCL表单设计器提供粉红色指导,用于在各自的文本基线上对齐控件:
但据我所知,这对标签和复选框不起作用. 更新:如果您准确地放置控件,它适用于标签,例如Ctrl- arrow.它适用于复选框 - 请参见截图.
现在,在某些形式上,我正在代码中创建控件,例如
ed := TEdit.Create(Self);
ed.SetBounds(...);
ed.Parent := SomePanel;
Run Code Online (Sandbox Code Playgroud)
我如何确保其文本基线对齐?我想将它用于编辑,组合框,标签和复选框.结果应该是这样的(没有红线,当然:-)):
编辑:我目前的做法是调用像AlignTop(8, [Edit1, ComboBox1], [CheckBox1, Label1]);
用
procedure ControlArray_SetTop(const AControls: array of TControl; ATop: Integer);
var
i: Integer;
begin
for i := Low(AControls) to High(AControls) do
AControls[i].Top := ATop;
end;
procedure AlignTop(ATop: Integer; const AControls: array of TControl; const ALabelLikeControls: array of TControl);
begin
ControlArray_SetTop(AControls, ATop);
ControlArray_SetTop(ALabelLikeControls, ATop + 3);
end;
Run Code Online (Sandbox Code Playgroud)
我的目标是用更强大,更少hacky的东西取而代之.
我们经常在D2007调试器中启动应用程序时遇到崩溃,暂停并继续(通过按F9).例如
为Button1添加此OnClick处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
while True do
begin
for i := 0 to 9999 do
Edit1.Text := IntToStr(Random(i));
Application.ProcessMessages;
end;
end;
Run Code Online (Sandbox Code Playgroud)我们几乎总是遇到访问冲突.我在Windows 7/64bit下测试了这个,我的同事在XP/32bit下.在我的同事的D2006中,我们无法重现此错误.
你能复制一下吗?任何想法如何解决它?
是否有重构工具来删除"with"块?例如转换
with Form1 do
begin
Height := Blah;
Blubb := Name;
end;
Run Code Online (Sandbox Code Playgroud)
至
Form1.Height := Blah;
Blubb := Form1.Name;
Run Code Online (Sandbox Code Playgroud)
其中Form1是VCL TForm.最好它应该与Delphi 2007一起使用.
(我已经在CodeReview上询问了这个问题,因为它已经关闭了主题.希望这是关于主题的.)
我有一个派生类型的静态数组(如LabelsA: array[0..3] of TLabel;
下面的示例代码)和一个接受基类型的开放数组的例程(如procedure DoSomethingWithControls(const AControls: array of TControl);
),我想DoSomethingWithControls
用这些静态数组调用.请看我的样本:
procedure DoSomethingWithControls(const AControls: array of TControl);
var
i: Integer;
begin
for i := Low(AControls) to High(AControls) do
Writeln(AControls[i].Name);
end;
procedure Test;
var
LabelsA: array[0..3] of TLabel;
LabelsB: array[0..1] of TLabel;
procedure Variant1;
type
TArray1 = array[Low(LabelsA)..High(LabelsA)] of TControl;
TArray2 = array[Low(LabelsB)..High(LabelsB)] of TControl;
begin
DoSomethingWithControls(TArray1(LabelsA));
DoSomethingWithControls(TArray2(LabelsB));
end;
procedure Variant2;
type
TControlArray = array[0..Pred(MaxInt div SizeOf(TControl))] of TControl;
PControlArray = ^TControlArray;
begin
DoSomethingWithControls(Slice(PControlArray(@LabelsA)^, …
Run Code Online (Sandbox Code Playgroud) 在将一些代码从D2007移植到XE2时,我遇到了编译错误,我无法理解.请参阅以下示例:
procedure TForm1.FormPaint(Sender: TObject);
var
c: Char;
pc: PChar;
r: TRect;
begin
c := '1';
pc := @c;
r := Bounds(100, 100, 100, 100);
DrawText(Canvas.Handle, pc, 1, r, DT_SINGLELINE or DT_NOCLIP); //1
{$TYPEDADDRESS OFF}
DrawText(Canvas.Handle, @c, 1, r, DT_SINGLELINE or DT_NOCLIP); //2
{$TYPEDADDRESS ON}
DrawText(Canvas.Handle, @c, 1, r, DT_SINGLELINE or DT_NOCLIP); //3
DrawText(Canvas.Handle, PChar(@c), 1, r, DT_SINGLELINE or DT_NOCLIP); //4
end;
Run Code Online (Sandbox Code Playgroud)
D2007编译没有问题.的XE2编译器将拒绝标注的线//3
与
[DCC Fehler] Unit1.pas(38):E2010 Inkompatible Typen:'string'和'Pointer'
我想这是由于新添加的DrawText
重载接受Delphi字符串.
你能解释一下这个错误吗?这不是什么大问题,因为我有一个解决方法(显式铸造),但我很好奇.这个错误在后来的Delphi版本中是否仍然存在?
编辑:我问的是编译器中是否有错误,而不是解释为什么它存在.很可能我忽略了编译器拒绝我的代码的正当理由.
我想设置一个小程序,从数据库中检索信息,然后在请求时将该信息分发给另一个程序.例如,一个名为"Master"的程序将从数据库中检索数据并创建一个对象集合(列表,数组等等,无论什么效果最好),然后一个名为"Slave"的程序(从多个桌面运行)可以调用一个方法(即,GetNextRecord)来自"Master"以检索集合中的下一条记录.
我希望能够只让一个'Slave'能够一次调用GetNextRecord方法,以避免给多个slave提供相同的记录."Master"将在具有数据库的服务器上运行,而"Slave"将在多台桌面计算机上运行.
有没有人有这样的例子或教程如何做到这一点?
TIA,Brian Enderle
我有一个例程procedure DrawStuff(ACanvas: TCanvas; const ARect: TRect)
,它在TCanvas上绘制一个指定的矩形.目前我DrawStuff
用PaintBox的画布调用.现在我添加了一个Save as
选项,用户可以从各种文件格式(bmp,wmf,jpg,... - 最好尽可能多的TGraphic后代)中选择以保存结果DrawStuff
.
绘制到a TMetafile
并将其保存为"bla.bmp"或将Assign
其保存为a TPicture
无法正常工作 - 例如,它会生成扩展名为".bmp" 且不是位图的文件.现在我无法找到一个不涉及特殊套管的解决方案:
TBitmap.Canvas
.TMetafileCanvas
.你知道对我有什么想法吗?
delphi ×9
delphi-2007 ×4
arrays ×1
c++ ×1
c++builder-5 ×1
canvas ×1
casting ×1
crash ×1
debugging ×1
delphi-2009 ×1
delphi-xe2 ×1
designer ×1
image ×1
networking ×1
overloading ×1
refactoring ×1
richedit ×1
save ×1
struct ×1