【问题标题】:Error with "uses" in Delphi XE2 [duplicate]Delphi XE2中的“使用”错误[重复]
【发布时间】:2014-03-08 15:48:50
【问题描述】:

您好我对下面的代码有问题,问题是我在使用“use”时似乎忘记了一个组件,因为它总是给我错误“tagBITMAP”,代码如下:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,Vcl.Graphics,Vcl.Imaging.jpeg,Windows;



procedure capturar_pantalla(nombre: string);

// Function capturar() based in :
// http://forum.codecall.net/topic/60613-how-to-capture-screen-with-delphi-code/
// http://delphi.about.com/cs/adptips2001/a/bltip0501_4.htm
// http://stackoverflow.com/questions/21971605/show-mouse-cursor-in-screenshot-with-delphi
// Thanks to Zarko Gajic , Luthfi and Ken White

var
  aca: HDC;
  tan: TRect;
  posnow: TPoint;
  imagen1: TBitmap;
  imagen2: TJpegImage;
  curnow: THandle;

begin

  aca := GetWindowDC(GetDesktopWindow);
  imagen1 := TBitmap.Create;

  GetWindowRect(GetDesktopWindow, tan);
  imagen1.Width := tan.Right - tan.Left;
  imagen1.Height := tan.Bottom - tan.Top;
  BitBlt(imagen1.Canvas.Handle, 0, 0, imagen1.Width, imagen1.Height, aca, 0,
    0, SRCCOPY);

  GetCursorPos(posnow);

  curnow := GetCursor;
  DrawIconEx(imagen1.Canvas.Handle, posnow.X, posnow.Y, curnow, 32, 32, 0, 0,
    DI_NORMAL);

  imagen2 := TJpegImage.Create;
  imagen2.Assign(imagen1);
  imagen2.CompressionQuality := 60;
  imagen2.SaveToFile(nombre);

  imagen1.Free;
  imagen2.Free;

end;

//



begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

有人可以帮助我吗?

【问题讨论】:

  • FWIW,当你遇到编译器错误时,你应该逐字报告

标签: delphi delphi-xe2


【解决方案1】:

这里的问题是范围之一。 Windows 单元和Graphics 单元都定义了一个名为TBitmap 的类型。编译器可以看到这两种类型,并且作用域规则是最后定义的是编译器使用的类型。

由于Windows 单元是在Graphics 之后引入的,因此您的代码会找到在Windows 单元中定义的TBitmap。但是您想要在Graphics 单元中定义的那个。

通过将Windows 移动到uses 子句中的Graphics 之前来解决问题。

现在,您也可以单独保留uses 子句并完全指定类型:Vcl.Graphics.TBitmap。我想你会同意重新排序使用条款是可取的。

顺便说一句,我不太重视这段代码。它完全忽略了检查 Win32 API 返回值是否有错误。我建议一旦可以编译,就添加错误检查。来自SysUtils 的函数Win32Check 是你的朋友。并且还需要一些尝试/最终保护位图的生命周期。

【讨论】:

  • 有趣的是,我会选择显式的 Vcl.Graphics.TBitmap。这样,我的代码就会告诉我在本单元中需要注意潜在的冲突。如果uses 子句被重新排序怎么办?
  • @Jan 如果对子句重新排序,则代码无法编译。所以没有危险。写Bitmap := Vcl.Graphics.TBitmap.Create; 不好玩
  • @Jan 作为一般规则,我注意在我的代码中使用一致的排序策略。先说下级单位。所以,系统单元,然后是 RTL,然后是 VCL,然后是 3rd 方组件,然后是我的低级单元,然后是我的业务逻辑,然后是 UI。你明白了。
  • 我也这样做,这就是为什么我的单位有时会“重新排序”;-)
  • 感谢大卫赫弗南的帮助
猜你喜欢
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
相关资源
最近更新 更多