小编Tom*_*Tom的帖子

如何在Delphi中使用alpha透明度绘制透明度?

我想用alpha透明矩形和alpha透明图像绘制非常复杂的图像. 有来自Mitov的GDI +包装器,但它似乎不支持32位BMP文件加上它重新调整它们并且文档非常糟糕.BMP比PNG更快,所以我想使用它们. 有GDI +的SynGDI包装器,但它看起来很基本,没有它的文档.GDI还有这个技巧:

procedure DrawAlphaAPI(Source: TBitmap; Destination: TCanvas;
  const X, Y: Integer; const Opacity: Byte = 255);
var  BlendFunc: TBlendFunction;
begin
  BlendFunc.BlendOp := AC_SRC_OVER;
  BlendFunc.BlendFlags := 0;
  BlendFunc.SourceConstantAlpha := Opacity;

  if Source.PixelFormat = pf32bit then
    BlendFunc.AlphaFormat := AC_SRC_ALPHA
  else
    BlendFunc.AlphaFormat := 0;

  Windows.AlphaBlend(Destination.Handle, X, Y, Source.Width, Source.Height,
  Source.Canvas.Handle, 0, 0, Source.Width, Source.Height, BlendFunc);
end;
Run Code Online (Sandbox Code Playgroud)

但是当我用Opacity = 255调用它时,它不能正确地绘制32位位图(就像它们应该是完全的半透明一样).我不想使用Scanline来使像素透明,因为这太复杂了,无法以这种方式绘制所有透明矩形.另外我在现代计算机上应该更快GDI +,我是对的吗?

所以问题是:如何轻松绘制alpha透明矩形和位图(没有大量的代码)?

首选Delphi:7.我也有2005和XE3,但由于7是速度恶魔,我最希望从7开始工作.

delphi graphics gdi+ image

9
推荐指数
1
解决办法
1万
查看次数

安装组件的最佳方法是什么?

在Delphi XE3下安装组件是一场噩梦.

  • 首先,我需要添加源文件

    工具 - > 选项 - >

  • 然后我需要找到一个普通的包并编译它

  • 最后我需要找到设计时包并安装它.

这非常繁琐且容易出错.有没有更好的方法来安装组件?

我找到了Delphi Package Installer.不幸的是它不支持Delphi XE3或更高版本.

我听说有类似的东西生产exe自己安装的软件包(类似于Inno Setup),但我找不到这样的东西.

delphi installation components delphi-xe3

8
推荐指数
1
解决办法
1万
查看次数

为什么500个组件的表单速度慢?

我正在创建一个表格,桌面上有图标,可以自由移动.我有时甚至会显示500个或更多图标,因此需要快速工作.我的图标是:

TMyIcon = class(TGraphicControl)

所以它没有Windows句柄.图纸是:

  • 1 x Canvas.Rectangle(大约64x32)
  • 1 x Canvas.TextOut(比矩形小一点)
  • 1 x Canvas.Draw(图片为32x32)

移动东西的代码是这样的:MyIconMouseMove:

Ico.Left := Ico.Left + X-ClickedPos.X;
Ico.Top  := Ico.Top  + Y-ClickedPos.Y;
Run Code Online (Sandbox Code Playgroud)

在表格上通常有50个左右的图标 - 其余的在可见区域之外.当我有100个图标时 - 我可以自由移动它并且它可以快速工作.但是,当我创建500个图标时,它会变得迟钝 - 但可见图标的数量仍然相同.如何告诉Windows完全忽略隐形图标,以便一切顺利进行?

或者也许有一个组件可以显示类似桌面的图标,能够移动它们?类似于使用AutoArrange = False的TShellListView?

delphi

7
推荐指数
1
解决办法
1713
查看次数

在Delphi中将HBitmap转换为字节数组

我试图将hBitmap转换为字节数组,但我不想使用单位Graphics的TBitmap.我的输入图像是128x64x32bit.

var TheBits: array of array of Cardinal;
begin   
  with info.bmiHeader do begin
    biWidth:=131;
    biHeight:=64;
    biSize:=SizeOf(TBITMAPINFOHEADER);
    biCompression:=BI_RGB;
    biBitCount:=32;
    biPlanes:=1;
    biSizeImage:=0;
  end; 

  DC := CreateCompatibleDC(0);    
  SetLength(TheBits, 128, 64);    
  GetDIBits(DC, BmpHandle, 0, 64,@TheBits[0][0],Info,DIB_RGB_COLORS);
Run Code Online (Sandbox Code Playgroud)

这给了我一个很好的形象(当然是颠倒的),但我不得不把131放入biWidth,这对我来说并没有多大意义.为什么不能是128?

delphi winapi bitmap hbitmap

6
推荐指数
1
解决办法
1253
查看次数

如何检测流的结束?

我有一个DLL将数据输出到流.但它添加了我不想要的后缀和前缀.我可以创建一个MemoryStream,让DLL输出数据然后修剪它,但是可以有几GB的数据,所以我只想将它直接保存到文件(FileStream).我认为最好的解决方案是创建自己的Stream类.所以我做了:

function TFileStream2.Write(const Buffer; Count: Integer): Longint;
Run Code Online (Sandbox Code Playgroud)

我检查位置,如果它是= 0,那么我从缓冲区丢弃前几个字节.这样我可以修剪文件的开头.但是,如何检测流的结束,以便从末尾丢弃一些字节?

delphi position file stream eof

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

我可以在Delphi中动态编译代码并执行它吗?

是否可以生成一个字节数组,然后让Windows像普通代码一样执行它?假设我们有一些汇编代码:

inc  ecx
Run Code Online (Sandbox Code Playgroud)

这是一个计划的一部分.在我们用Nasm编译之后,我们得到一个EXE,其中上面的行被转换成这样的东西:

00000035 41 
Run Code Online (Sandbox Code Playgroud)

是否可以创建一个字节数组,用上面的字节填充它并执行 - 所以增量实际发生了?

我已经制作了超级简单的解释语言,但由于它被解释得很慢.我不想为它编写真正的编译器,但我想让它更快 - 编译并在运行中运行.

delphi assembly winapi interpreter compilation

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

如何从TListBox中删除虚线焦点矩形?

我使用ListBox.Style := lbOwnerDrawFixedOnDrawItem:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  ARect: TRect; State: TOwnerDrawState);
begin
  with ListBox1.Canvas do begin
    Brush.Color := clWhite;
    Pen.Color := clWhite;
    FillRect(ARect);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

它应该给出一个空的空间来绘制我想要的东西,但事实并非如此.当项目聚焦时,我仍然可以看到它周围的虚线矩形.

如何删除矩形?

delphi listbox canvas ownerdrawn

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

使用gmail和Indy发送电子邮件

我正在尝试使用gmail从Delphi发送电子邮件.我有Indy 10.5.9.0和Delphi XE3.

我从以下代码获得了示例代码:http: //www.andrecelestino.com/delphi-xe-envio-de-e-mail-com-componentes-indy/

我也尝试了其他示例代码,但结果相同.

我从这里有libeay32.dll和ssleay32.dll:http://www.andrecelestino.com/wp-content/files/DLLs-SSL-DelphiXE.rar 但我也尝试过:http: //indy.fulgan.com/ SSL/openssl-1.0.2d-i386-win32.zip 没有运气.

我的代码(全部):

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdMessage,
  IdSMTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdText;






procedure TForm1.Button1Click(Sender: TObject);
var
  // variáveis e objetos necessários para o envio
  IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
  IdSMTP: TIdSMTP;
  IdMessage: TIdMessage;
  IdText: TIdText;
  sAnexo: string;
begin
  // instanciação dos objetos
  IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
  IdSMTP := TIdSMTP.Create(Self);
  IdMessage := …
Run Code Online (Sandbox Code Playgroud)

delphi ssl gmail indy

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

我可以强制SoapClient将数组作为数组返回吗?

我正在使用SoapClient获取一些数据.我从其中一个电话得到了这个结果:

stdClass Object
(
    [payTransIncome] => stdClass Object
        (
            [item] => stdClass Object
                (
                    [payTransId] => 141281
                    [payTransItId] => 630260
                    [payTransBuyerId] => 1311

                )
        )
)
Run Code Online (Sandbox Code Playgroud)

但是,这个WebAPI的文档说payTransIncome是一个数组.在我看来,SoapClient找到了一个单元素数组并将其转换为单个stdClass对象.这使得解析变得更加困难,因为有时我认为它实际上可能会返回超过1个元素.

当然,我可以把所有地方检查,if (is_array())但也许有一个简单,更优雅的方式?

php soap soap-client asp.net-web-api

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

TSaveDialog和2种具有相同扩展名的格式

在TSaveDialog中,我添加了两种具有相同扩展名的格式:

Format A|*.form
Format B|*.form
Format C|*.diff
Run Code Online (Sandbox Code Playgroud)

现在,我要确定用户选择的格式:

var Ext: String;
begin
  if not SaveDialog1.Execute then Exit;

  Ext := LowerCase(ExtractFileExt(SaveDialog1.FileName));
Run Code Online (Sandbox Code Playgroud)

这样我可以将“格式B”与“格式C”区分开来,但不能将“格式A”与“格式B”区分开。

delphi save-dialog tsavedialog

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