继续上一个问题 我希望即使主线程被阻止也能显示一些活动指示.(基于这篇文章).
基于附加代码的问题:
Synchronize(PaintTargetWindow);
不会绘制窗口Canvas does not allow drawing.
在行中:{FBitmap.}StretchDraw(Rect(Left, ImageRect.Top, Right, ImageRect.Bottom), FfgPattern)
这是我用来创建指标线程的代码:
unit AniThread;
interface
uses Windows, Classes, Graphics, Controls, Math;
const
ANI_GRAD_FG_COLOR_BAGIN = $00CDFFCD;
ANI_GRAD_FG_COLOR_END = $0024B105;
ANI_GRAD_BK_COLOR_BAGIN = $00F5F5F5;
ANI_GRAD_BK_COLOR_END = $00BDBDBD;
type
TAnimationThread = class(TThread)
private
FWnd: HWND;
FPaintRect: TRect;
FInterval: Integer;
FfgPattern, FbkPattern: TBitmap;
FBitmap: TBitmap;
FImageRect: TRect;
procedure UpdatePattern(Pattern: TBitmap; ColorBegin, ColorEnd: TColor);
function CreatePatternBitmap(AColorBegin, AColorEnd: TColor): TBitmap;
procedure PaintTargetWindow;
protected
procedure Execute; …
Run Code Online (Sandbox Code Playgroud) 我试图转换GIF图像(Ajax等待):
将与TAnimate控件(win32动画控件)一起使用的AVI.
我尝试了一些工具,但问题是输出AVI不适合动画控件或不透明.
笔记:
你知道任何可以帮助我进行转换的工具吗?
编辑:
我已经尝试使用ImageMagic与ffmpeg的描述在这里.但我似乎无法设置ffmpeg
编码msrle
.
是否有一个常用的方法/ api列出我的机器(和每个用户)上安装的所有Web浏览器(名称,可执行文件,默认是/否),以及如何找出哪个是默认的Web浏览器?
我看到了这个问题:如何找到机器上安装的所有浏览器
在MSDN上:如何使用Windows开始菜单注册Internet浏览器或电子邮件客户端,该菜单指出Web浏览器应在HKLM\SOFTWARE\Clients\StartMenuInternet
(和HKCU
)下注册自己
这真的是常见/正确的方法吗?(如果是的话,那里有任何可靠的实施吗?)
我的目标是创建一个下拉菜单,其中列出了安装在用户计算机上的所有Web浏览器(指示默认值),并允许用户使用其中一个外部Web浏览器浏览其HTML文件/ URL.
这里(或多或少)是一个相关的问题:Delphi - 在运行时使用图标填充图像列表'破坏'透明度.
我测试了@TOndrej的答案.但似乎我需要启用视觉样式(XP Manifest)才能工作(将使用版本6.0的Windows常用控件 - 我现在不想要).我通过ExtractIconEx
和运行时添加图标ImageList_AddIcon
.
显然,设置ImageList.Handle
使用系统图像列表手柄,并不需要XP清单.因此,当我使用系统图像列表显示文件列表(带有a TListView
)时,即使是我在D3中写回的旧程序也正确显示alpha混合图标.
我在徘徊系统图像列表有什么特别之处以及它是如何创建的,所以它在所有情况下都支持alpha混合?我无法弄明白.以下是一些示例代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ImgList, StdCtrls, ShellAPI, ExtCtrls, Commctrl;
type
TForm1 = class(TForm)
ImageList1: TImageList;
PopupMenu1: TPopupMenu;
MenuItem1: TMenuItem;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
FileName: string;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// {$R WindowsXP.res} …
Run Code Online (Sandbox Code Playgroud) 我试图找出如何通过它搜索标签Caption
:
for I := ComponentCount - 1 downto 0 do
begin
if Components[i] is TLabel then
if Components[i].Caption = mnNumber then
begin
Components[i].Left := Left;
Components[i].Top := Top + 8;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:Undeclared identifier: 'Caption'
.
我该如何解决这个问题?
我想知道如何从整数转换为浮点值,而不分配给中间变量.有问题的代码如下所示:
Format('Theoretical peak scaling %6.2f', [ThreadCount])
Run Code Online (Sandbox Code Playgroud)
这显然在运行时失败,因为它ThreadCount
是一个整数.
我试过了明显的事
Format('Theoretical peak scaling %6.2f', [Double(ThreadCount)])
Run Code Online (Sandbox Code Playgroud)
并且编译器拒绝使用
E2089 Invalid typecast
Run Code Online (Sandbox Code Playgroud)
我知道我可以写
Format('Theoretical peak scaling %6.2f', [ThreadCount*1.0])
Run Code Online (Sandbox Code Playgroud)
但是读得很差,并且会诱使未来的维护者去除错误中的乘法.
有没有人知道在没有中间变量的情况下做到这一点的干净方法,以及让未来读者明白代码的方式?
在某些情况下(在多用户环境中),当我Edit
一个TADODataSet
和Post
它,我获得通过ADO引发异常:
"无法找到行进行更新.某些值可能自上次读取后已更改."
如果我从IDE运行我的程序,则引发异常EOleException
与错误号一样-2147217864
.
我希望能够捕获此异常,但是当我在IDE外部运行程序时,会引发异常,因为我EDatabaseError
没有ErrorCode
需要检查.这是我的代码的一部分:
procedure TForm1.DataSetCommit(ds: TADODataSet);
begin
ds.Connection.BeginTrans;
try
try
ds.Post; // <- Exception is raised here
except
on E: EOleException do; // EOleException is NOT fired! (E.ErrorCode = -2147217864) - see "ADODB.TCustomADODataSet.InternalPost"
on E: EDatabaseError do
begin
// todo: Handle this situation
end;
end;
ds.Connection.CommitTrans;
except
ds.Connection.RollbackTrans;
raise;
end;
end;
Run Code Online (Sandbox Code Playgroud)
如果你看,ADODB.TCustomADODataSet.InternalPost
你会注意到它被包裹如下:
procedure TCustomADODataSet.InternalPost;
begin
UpdateCursorPos;
try
... // <- Exception is raised …
Run Code Online (Sandbox Code Playgroud) 我正在创建一个Dialog CreateDialog
.
在对话框proc中我做了一些文字绘图WM_PAINT
:
function DialogProc(hDlg: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
...
case Msg of
WM_PAINT:
begin
dc := BeginPaint(hDlg, ps);
bkmodePrev := SetBkMode(dc, TRANSPARENT);
hfnt := SendMessage(hDlg, WM_GETFONT, 0, 0);
hfntPrev := SelectObject(dc, hfnt);
DrawTextW(dc, 'Text', -1, R, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
SelectObject(dc, hfntPrev);
// SetBkMode(dc, bkmodePrev); // do I need this?
EndPaint(hDlg, ps);
Result := True;
end;
end;
...
Run Code Online (Sandbox Code Playgroud)
现在的问题是,我是否正确使用字体,这意味着,这是使用SendMessage(hDlg, WM_GETFONT, 0, 0)
和恢复对话框的字体句柄的正确方法SelectObject(dc, hfntPrev
吗?我是否需要恢复旧的BkMode bkmodePrev
使用SetBkMode(dc, …
至少有 2 种方法可以执行此 AFAIK。
和这个:
htext := GetDlgItem(hDlg, IDI_TEXT);
GetWindowRect(htext, R);
// (1)
// Pt := Point(R.Left, R.Top);
// ScreenToClient(hDlg, Pt);
// R := Rect(Pt.X, Pt.Y, Pt.X + R.Right - R.Left, Pt.Y + R.Bottom - R.Top);
// OR: (2)
MapWindowPoints(0, {GetParent(htext)} hDlg, R, 2);
FrameRect(dc, R, brush);
Run Code Online (Sandbox Code Playgroud)
哪种方法更好,为什么?该方法MapWindowPoints
是否适用于多个显示器?
我所关注的主要是MapWindowPoints
和多显示器,因为通过0
如hWndFrom
将使用HWND_DESKTOP
void A() {
B();
// return; <- compiler error "unreachable code"
if (true) return; // <- this works
// code that I will test later
...
C();
D();
}
Run Code Online (Sandbox Code Playgroud)
这就是我现在所做的.是否有一个简单的" exit;
"或" return;
","unreachable code"
如果不使用if
?
只是为了说清楚:if (true) return;
工作(警告"死代码",我不关心,可以抑制)!
如果我只是使用return;
然后我得到"unreachable code"
错误.
注意:一个简单的"不能不使用if
"也是一个可接受的答案,提供参考.