在寻找一种方法来调整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
正确的方法吗?我没有找到任何其他方法.
CoInitialize
在使用IXMLDocument
(msxml包装器)时,是否有理由在我的DLL函数中使用?(或其他com对象)
调用应用程序/线程是否负责调用CoInitialize/CoUninitialize
?
如果我ComObj
在我的DLL中使用它CoInitialize
在其初始化部分和CoUninitialize
其终结部分中自动调用该怎么办?
我有很老的代码(来自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.
我有这个代码(我需要将字符串对象添加到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
.(我无法理解它是如何工作的)
我可以在 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) 我想在给定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
?
我有这个代码,有一个使用重载和默认参数的过程:
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)
工作正常。
我会尽量简化我的问题。例如,如果您删除 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
。
谢谢。
我不确定我是否有这个 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) 在我的主要形式中,我有一个打开模态的按钮Form2
(可以打开其他模态形式).在打开之前Form2
我正在设置一个计时器,它将以编程方式关闭所有活动的模态形式(Form2.Close
)并打开一个新的模态Form3
.
问题是,当Form3
以模态方式打开时,Form2
保持(可见)并且仅当我Form3
通过单击X
将Form2
关闭时关闭.
要重现3组的形式添加到项目中添加TButton
和删除一个TTimer
上Form1
(主要形式):
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)