小编zig*_*zig的帖子

如何使用GDI +使用Alpha通道调整PNG图像的大小?

在寻找一种方法来调整TPngObject的大小并保持透明度+ alpha通道无济于事之后,我正在尝试使用GDI +

这是我的代码,它似乎工作正常.它将向下/向上缩放PNG.到目前为止在XP上测试过:

uses GDIPAPI, GDIPOBJ, GDIPUTIL; 

procedure TForm1.Button1Click(Sender: TObject);
var
  encoderClsid: TGUID;
  stat: TStatus;
  img, img_out: TGPImage;
begin
  img := TGPImage.Create('in.png'); // 200 x 200  
  img_out := img.GetThumbnailImage(100, 100, nil, nil);
  GetEncoderClsid('image/png', encoderClsid);
  img_out.Save('out.png', encoderClsid);
  img_out.free;
  img.Free;
end;
Run Code Online (Sandbox Code Playgroud)

我的问题:正在使用GetThumbnailImage正确的方法吗?我没有找到任何其他方法.

delphi png gdi+ resize delphi-7

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

在DLL中使用IXMLDocument需要CoInitialize?

CoInitialize在使用IXMLDocument(msxml包装器)时,是否有理由在我的DLL函数中使用?(或其他com对象)

调用应用程序/线程是否负责调用CoInitialize/CoUninitialize

如果我ComObj在我的DLL中使用它CoInitialize在其初始化部分和CoUninitialize其终结部分中自动调用该怎么办?

delphi winapi

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

使用包含WideString的记录指针的New/Dispose

我有很老的代码(来自D3):

TMyRecord  = record
  Index   : Integer;
  Header  : String[70];
  Strings : Array[1..MAX_VALUES] of String[70];
end;

TMyClass = class(TComponent)
  FData  : ^TMyRecord;
  ...
end;

constructor TMyClass.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  New(FData);     
  ...
end;

destructor TMyClass.Destroy;
begin
   Dispose(FData);
   inherited;
end;
Run Code Online (Sandbox Code Playgroud)

问:是不是安全的,以取代String[70]WideString;Array[1..MAX_VALUES] of String[70]Array[1..MAX_VALUES] of WideString?(请解释原因)

我需要这个在Delphi 7中支持Unicode.

delphi unicode delphi-7

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

我必须释放用SysAllocString分配的BSTR(WideString)吗?

我有这个代码(我需要将字符串对象添加到TStringList):

var
  WS: WideString;
begin
  WS := 'allocated string';
  SL.AddObject('my string', TObject(SysAllocString(PWideChar(WS))));
Run Code Online (Sandbox Code Playgroud)

后来读了它:

var
  WS: WideString;
begin
  WS := PWideChar(SL.Objects[0]);
  ShowMessage(WS);
Run Code Online (Sandbox Code Playgroud)

我想知道系统是否会处理分配的BSTR SysAllocString.或者我必须打电话SysFreeString?从文档中不清楚.

现在,如果系统确实取消分配它,有没有办法证明它呢?

PS: 事实上,调用它是足够的:

SL.AddObject('my string', TObject(PWideChar(WS)));
Run Code Online (Sandbox Code Playgroud)

不使用SysAllocString.(我无法理解它是如何工作的)

delphi memory-management delphi-7

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

具有多个插入语句的 SQL Server CTE

我可以在 SQL Sever 中使用多个 CTE INSERT 表达式吗?

PostgreSQL 中允许这样做:

可写公共表表达式和多个插入语句

例如在 PostgreSQL 中。

with foo as 
(
      select * from ...
),
b as 
(
      insert into bar
          select * from foo
          returning *
)
insert into baz
    select * from foo;
Run Code Online (Sandbox Code Playgroud)

我在 SQL Server 中尝试过:

;WITH cte1 AS 
(
    SELECT * FROM Foo       
),
cte2 AS ( -- depends on cte1
    SELECT * FROM Bar WHERE ID IN (SELECT ID FROM cte1)
),
cte3 AS ( -- first insert …
Run Code Online (Sandbox Code Playgroud)

sql-server common-table-expression

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

设置TDBGrid可见行

我想在给定VisibleRows参数的情况下调整TDBGrid高度.网格可能有也可能没有标题.

假设我从数据库中选择了100条记录,但我想调整网格高度以显示前10行(使它们可见).数据集仍将保留100条记录.

procedure SetVisibleRows(DBGrid: TCustomDBGrid; VisibleRows: Integer);
begin
  ...
  DBGrid.Height := ???
end;
Run Code Online (Sandbox Code Playgroud)

我知道如何获得可见的行:

type
  TCustomGridHack = class(TCustomGrid);

function GetVisibleRows(DBGrid: TCustomDBGrid): Integer;
begin
   Result := TCustomGridHack(DBGrid).VisibleRowCount;
end;
Run Code Online (Sandbox Code Playgroud)

但是,有没有办法来设置VisibleRowCount

delphi tdbgrid

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

使用带有默认参数和重载过程的字符串数组

我有这个代码,有一个使用重载和默认参数的过程:

program Project2;
{$APPTYPE CONSOLE}
uses SysUtils;

procedure Foo; overload; // not actually needed to reproduce
begin
end;

procedure Foo(const a: array of string; b: Boolean=False); overload;
begin
  Writeln(Length(a));
end;

begin
  Foo(['1', '2', '3']); // => 1 ???
  Foo(['1', '2', '3'], False); // => 3 OK
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

输出是:

1
3
Run Code Online (Sandbox Code Playgroud)

请注意,第一次调用 Foo不提供默认值。为什么会这样?这个问题只与非常旧的编译器有关吗?

这仅在使用overload密钥时发生。

procedure Foo2(const a: array of string; b: Boolean=False);
begin
  Writeln(Length(a));
end;

Foo2(['1', '2', '3']);
Run Code Online (Sandbox Code Playgroud)

工作正常。

delphi delphi-5

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

如何停止 Screen.Cursor 影响窗体上的所有控件?

我会尽量简化我的问题。例如,如果您删除 2TSpeedButton并执行以下操作:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;
  SpeedButton2.Cursor := crHandPoint; // note I'm setting other cursor than crDefault
end;
Run Code Online (Sandbox Code Playgroud)

SpeedButton2.Cursor显示Screen.Cursor设置为的剩余部分crHourGlass
我已经调查了TScreen.SetCursor代码,并意识到它为整个表单设置了光标。
我的问题:是否有可能以某种方式使用Screen.Cursor整个表单,但不会影响我想设置其他光标的某些控件。

同样的情况发生在TButton. 如果我可以在Screen.Cursor设置为时以某种方式控制它的光标,我不介意将 SpeedButton 放在窗口控件上crHourGlass

谢谢。

delphi vcl delphi-7

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

仅当 LINQ 中有条件时才选择

我不确定我是否有这个 Q 的正确标题。无论如何,我正在尝试将分隔字符串解析为 Enum 元素列表:

public enum MyEnum { Enum1, Enum2, Enum3 }
Run Code Online (Sandbox Code Playgroud)

给定输入:

string s = "Enum2, enum3, Foo,";
Run Code Online (Sandbox Code Playgroud)

我只想输出MyEnum(忽略大小写)中存在的部分:
[MyEnum.Enum2, MyEnum.Enum3]

IEnumerable<MyEnum> sl = 
    s.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)                         
    .Select(a => { if (Enum.TryParse(a, true, out MyEnum e)) return e; else return nothing ??? })
Run Code Online (Sandbox Code Playgroud)

如何从Select()ifTryParse()失败中返回“无” ?
我可以做一件丑陋的事情,比如:

IEnumerable<MyEnum> sl = 
    s.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)                
    .Where(a => Enum.TryParse(a, true, out MyEnum dummy))
    .Select(a => Enum.Parse(typeof(MyEnum), …
Run Code Online (Sandbox Code Playgroud)

c# linq

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

从外部关闭模态形式并打开新的模态形式

在我的主要形式中,我有一个打开模态的按钮Form2(可以打开其他模态形式).在打开之前Form2我正在设置一个计时器,它将以编程方式关闭所有活动的模态形式(Form2.Close)并打开一个新的模态Form3.

问题是,当Form3以模态方式打开时,Form2保持(可见)并且仅当我Form3通过单击XForm2关闭时关闭.

要重现3组的形式添加到项目中添加TButton和删除一个TTimerForm1(主要形式):

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation

uses Unit2, Unit3;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := False;
end;

procedure TForm1.Button1Click(Sender: …
Run Code Online (Sandbox Code Playgroud)

delphi

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