发现VCL样式的故障:当您更新表单标题时,之前在同一过程中重绘的其他控件不会重新绘制,并且您被迫调用Repaint,从而丢失了重绘的宝贵处理时间.
示例:(手动设置项目选项/ vcl样式)
unit Unit11;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm11 = class(TForm)
Button1: TButton;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form11: TForm11;
implementation
{$R *.dfm}
procedure TForm11.Button1Click(Sender: TObject);
begin
Panel1.Caption := 'test';
caption := 'glitch';
end;
end.
object Form11: TForm11
Left = 0
Top = 0
Caption = 'Form11'
ClientHeight = 89
ClientWidth = 352
Color = clBtnFace
Font.Charset …Run Code Online (Sandbox Code Playgroud) 我正在移植一些32到64位delphi的应用程序,它们进行了大量的文本处理,并注意到处理速度的极端变化.例如,使用一些程序进行了一些测试,这比64位的时间已经超过200%,而编译为32(2000 + ms与~900相比)
这是正常的吗?
function IsStrANumber(const S: AnsiString): Boolean;
var P: PAnsiChar;
begin
Result := False;
P := PAnsiChar(S);
while P^ <> #0 do begin
if not (P^ in ['0'..'9']) then Exit;
Inc(P);
end;
Result := True;
end;
procedure TForm11.Button1Click(Sender: TObject);
Const x = '1234567890';
Var a,y,z: Integer;
begin
z := GetTickCount;
for a := 1 to 99999999 do begin
if IsStrANumber(x) then y := 0;//StrToInt(x);
end;
Caption := IntToStr(GetTickCount-z);
end;
Run Code Online (Sandbox Code Playgroud) 如何重置PopupMenu项目列表的最大宽度?
比如你在运行时向popupmenu添加一些TMenuItems:
item1: [xxxxxxxxxxxxxxxxxxx]
item2: [xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]
Run Code Online (Sandbox Code Playgroud)
菜单会自动调整大小以适合最大的项目.但是然后你做Items.Clear并添加一个新项目:
item1: [xxxxxxxxxxxx ]
Run Code Online (Sandbox Code Playgroud)
最终结果如此,标题后面有一个很大的空白区域.
除了重新创建popupmenu之外还有其他解决方法吗?
这里是重现这种异常的代码:
procedure TForm1.Button1Click(Sender: TObject);
var
t: TMenuItem;
begin
t := TMenuItem.Create(PopupMenu1);
t.Caption := 'largelargelargelargelargelarge';
PopupMenu1.Items.Add(t);
PopupMenu1.Popup(200, 200);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
t: TMenuItem;
begin
PopupMenu1.Items.Clear;
t := TMenuItem.Create(PopupMenu1);
t.Caption := 'short';
PopupMenu1.Items.Add(t);
PopupMenu1.Popup(200, 200);
end;
Run Code Online (Sandbox Code Playgroud) 自从将应用程序从XE移植到XE2后,我注意到一个奇怪的错误,只需在ide中打开表单或运行应用程序,屏幕左上角(表单外)就会绘制一个白色方框,远离鼠标或窗户.我将其跟踪到TLabel,只需在表单上删除一个并将Glowsize设置为0就会导致问题.
我重新安装并更新到最后的XE2 update3,问题仍然存在.有人知道发生了什么事吗?



我在"Application.Run"之后放了一些代码 通常在应用关闭时运行.但是,当用户重新启动或关闭Windows时,永远不会达到这一点.
这可以在不捕获WM_ENDSESSION的情况下解决吗?(并且不涉及任何形式,我希望在dpr结束时application.run之后保留代码)
多年来,大多数Delphi版本都有这个版本,所以我想知道我的代码是否有问题,或者这是IDE的预期行为.
通常,当您将光标放在过程/函数/变量等上时,您可以按Alt + Up并将其转到声明的位置,无论是在同一单元中还是在单独的单元中,就像右键单击并选择"查找声明"一样",但是经常这不起作用,即使你将鼠标悬停在一秒钟之后它会告诉你像......"在xx.pas中声明,但它仍然不会去那里.即使我键入unitname.proc并尝试proc,它仍然不会跳转到proc.如果我先打开装置(按住ctrl +进入装置),即使我之后将其关闭,也可以.
这有什么原因吗?
我的应用程序的一些用户报告链接不在浏览器中打开.我总是用shellexecute启动它们(0,'打开','http:// ......
我可以检查http链接关联中的错误(?)设置?
我遇到了一个很大的应用程序非常奇怪的问题.我大量使用TObjectList存储自定义对象.在大型列表中,当我使用CLEAR方法时,我遇到了"地址访问冲突,地址读取......","特权指令"等奇怪的崩溃.在尝试删除列表中的最后一项时,我已经跟踪到这一点.我已经通过从破坏过程中记录包含的对象删除来检查这一点,并且还试图自己删除它们(对于:= olist.count-1 downto 0 do .. debugmsg('deleted'+ inttostr(a) ).. olist.delete(a)),这两种方式都是在删除列表中剩余的剩余项目时获得访问权限的权利.
这并不总是发生,因为我在其他领域使用clear,以及一些不同的(较小的)列表,但在我的应用程序中的一个非常具体的点发生这种情况.
我不知道可能出现什么问题,在清除过程中没有什么可以尝试访问列表,并且被硬币化的对象无法访问其父对象列表,在TObjectList.delete/clear方法中必须有一些东西搞砸了.它来清除最后一项.
有什么建议?使用Delphi XE.
我在XE2遇到了一个奇怪的问题:
我正在使用HWND_TOPMOST和SetWindowPos将表单设置在顶部,但是如果我在运行时切换VCL样式,那么窗口不再是最顶层的,并且取消设置/重新设置它也不会修复它.
有任何解决这个问题的方法吗?
delphi ×10
delphi-xe2 ×4
64-bit ×1
apng ×1
browser ×1
delphi-xe3 ×1
delphi-xe7 ×1
http ×1
ide ×1
menuitem ×1
png ×1
popupmenu ×1
shellexecute ×1
skinning ×1
styles ×1
tlabel ×1
vcl ×1
vcl-styles ×1
winapi ×1