小编kob*_*bik的帖子

主线程被阻止时显示活动指示符(继续)

继续上一个问题 我希望即使主线程被阻止也能显示一些活动指示.(基于这篇文章).

基于附加代码的问题:

  • 使用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)

delphi multithreading thread-safety delphi-5

5
推荐指数
1
解决办法
3126
查看次数

使用Windows Animate Control将GIF转换为AVI

我试图转换GIF图像(Ajax等待):

等待GIF ......

将与TAnimate控件(win32动画控件)一起使用的AVI.

我尝试了一些工具,但问题是输出AVI不适合动画控件或不透明.

笔记:

  • 我不使用Windows XP主题清单(D5).即使我的节目不是主题,Common Avi也是透明的.
  • 使用GIF本身来显示动画不是一种选择.

你知道任何可以帮助我进行转换的工具吗?

编辑:

我已经尝试使用ImageMagicffmpeg的描述在这里.但我似乎无法设置ffmpeg编码msrle.

delphi winapi avi graphic

5
推荐指数
1
解决办法
2356
查看次数

列出Windows计算机上安装的所有Web浏览器

是否有一个常用的方法/ api列出我的机器(和每个用户)上安装的所有Web浏览器(名称,可执行文件,默认是/否),以及如何找出哪个是默认的Web浏览器?

我看到了这个问题:如何找到机器上安装的所有浏览器

在MSDN上:如何使用Windows开始菜单注册Internet浏览器或电子邮件客户端,该菜单指出Web浏览器HKLM\SOFTWARE\Clients\StartMenuInternet(和HKCU)下注册自己

这真的是常见/正确的方法吗?(如果是的话,那里有任何可靠的实施吗?)


我的目标是创建一个下拉菜单,其中列出了安装在用户计算机上的所有Web浏览器(指示默认值),并允许用户使用其中一个外部Web浏览器浏览其HTML文件/ URL.

c# c++ browser delphi winapi

5
推荐指数
2
解决办法
4356
查看次数

带有alpha混合图标的图像列表失去透明度

这里(或多或少)是一个相关的问题: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)

delphi imagelist delphi-7 delphi-5 common-controls

5
推荐指数
1
解决办法
3667
查看次数

按标题搜索标签

我试图找出如何通过它搜索标签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'.
我该如何解决这个问题?

delphi

5
推荐指数
2
解决办法
3387
查看次数

如何在不分配变量的情况下将整数转换为浮点值?

我想知道如何从整数转换为浮点值,而不分配给中间变量.有问题的代码如下所示:

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)

但是读得很差,并且会诱使未来的维护者去除错误中的乘法.

有没有人知道在没有中间变量的情况下做到这一点的干净方法,以及让未来读者明白代码的方式?

delphi

5
推荐指数
3
解决办法
2143
查看次数

TCustomADODataSet捕获EOleException(不是EDatabaseError)

在某些情况下(在多用户环境中),当我Edit一个TADODataSetPost它,我获得通过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)

delphi ado

5
推荐指数
1
解决办法
4120
查看次数

在Windows对话框中使用FONT和SetBkMode绘制文本

我正在创建一个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, …

c++ delphi winapi dialog

5
推荐指数
1
解决办法
525
查看次数

哪个是查找控件相对于其父窗口的位置的最佳方法?

至少有 2 种方法可以执行此 AFAIK。

如何找到 Win32 控件/窗口相对于其父窗口的位置?

和这个:

如何获取放置在 MFC 对话框中的控件的大小和位置?

    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和多显示器,因为通过0hWndFrom将使用HWND_DESKTOP

c++ delphi winapi mfc dialog

5
推荐指数
1
解决办法
844
查看次数

如何无条件退出/返回void方法?

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"也是一个可接受的答案,提供参考.

java return

4
推荐指数
1
解决办法
221
查看次数