我正在开发Delphi Firemonkey移动应用程序.我想在Firemonkey中创建一个圆角按钮.如何在不使用第三方组件的情况下执行此操作?
我有这个函数,需要 4.2 秒才能将 jpg 转换为 bmp。为什么需要这么长时间?我可以做得更快吗?
IrfanView 只需一小部分时间即可加载并转换文件。
我认为大部分时间都花在 JPG.LoadFromFile 上。但当我测量时间时,我惊讶地发现它大部分时间都花在 BMP.Assing(JPG) 上。
function ConvertJPG2BMP(CONST FileName: string): TBitmap;
VAR JPG: TJpegImage;
begin
Result:= NIL;
JPG:= TJpegImage.Create;
TRY
JPG.LoadFromFile(FileName);
if (JPG.Width > 0) AND (JPG.Width < 32768)
AND (JPG.Height> 0) AND (JPG.Height < 32768) then
begin
Result:= TBitmap.Create;
TRY
Result.HandleType:= bmDIB;
// Fuji_FinePix_F550.JPG [3200x1800] [1.44MB]
Result.Assign(JPG); <--- 4 seconds!!
EXCEPT
FreeAndNil(Result);
END;
end;
FINALLY
FreeAndNil(JPG);
end;
end;
Run Code Online (Sandbox Code Playgroud) 我想创建一个复选框,可以自动调整其宽度,就像TLabel一样。
UNIT cvCheckBox;
{ It incercepts CMTextChanged where it recomputes the new Width}
INTERFACE
USES
Winapi.Windows, Winapi.Messages, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.StdCtrls;
TYPE
TcCheckBox = class(TCheckBox)
private
FAutoSize: Boolean;
procedure AdjustBounds;
procedure setAutoSize(b: Boolean); reintroduce;
procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
protected
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); override;
published
//property Caption read GetText write SetText;
property AutoSize: Boolean read FAutoSize write setAutoSize stored TRUE;
end;
IMPLEMENTATION
CONST
SysCheckWidth: Integer = 21; // In …Run Code Online (Sandbox Code Playgroud) 我需要在我的C#应用程序中使用Delphi 7中的DLL(硬件ID提取器).
此DLL导出的函数是:
导出功能:
// CPU
function GetCPUSpeed: Double;
function CPUFamily: ShortString; { Get cpu identifier from the windows registry }
function GetCpuTheoreticSpeed: Integer; { Get cpu speed (in MHz) }
function IsCPUIDAvailable: Boolean; Register;
function GetCPUID (CpuCore: byte): ShortString;
Function GetCPUVendor: ShortString;
// RAM
function MemoryStatus (MemType: Integer): cardinal; { in Bytes }
function MemoryStatus_MB (MemType: Integer): ShortString; { in MB }
// HDD
function GetPartitionID (Partition : PChar): ShortString; { Get the ID of the specified patition. Example …Run Code Online (Sandbox Code Playgroud) 我有一个主机应用程序,它在启动时加载了十几个库.我想从Delphi 7s默认内存管理器切换到FastMM4的完整版本,以获得更好的内存泄漏报告.
我应该在主机应用程序和库的使用部分中包含FastMM4吗?那么共享运行时包呢?
一些补充信息:
其他问题:
我想使用ShellExecute命令创建然后打开一个txt文件.
我已经使用这段代码多年使用Delphi 7并且它有效:
function Executa(CONST ExeName, Parameters: string): Boolean;
begin
if Parameters= ''
then Result:= ShellExecute(0, 'open', PChar(ExeName), NIL , nil, SW_SHOWNORMAL)> 32
else Result:= ShellExecute(0, 'open', PChar(ExeName), PChar(Parameters), nil, SW_SHOWNORMAL)> 32;
end;
Run Code Online (Sandbox Code Playgroud)
现在,我切换到Windows 7,当它从IDE运行时代码不再工作.Delphi显示CPU窗口,标题为"CPU-Process unknown(2352)".我关闭CU窗口,一切正常,直到我关闭应用程序,当Delphi再次显示CPU窗口时.如果我从IDE外部运行应用程序,它可以正常工作.
看起来调试器有话要对我说,但我不知道是什么.
我必须检查我是否在FileListBox中有重复的路径(FileListBox具有某种作业列表或播放列表的角色).使用Delphi的SameText,CompareStr,CompareText需要6秒.所以我带了我自己的比较功能,它(更快)但速度不够快.任何想法如何改进它?
function SameFile(CONST Path1, Path2: string): Boolean;
VAR i: Integer;
begin
Result:= Length(Path1)= Length(Path2); { if they have different lenghts then obviously are not the same file }
if Result then
for i:= Length(Path1) downto 1 DO { start from the end because it is more likely to find the difference there }
if Path1[i]<> Path2[i] then
begin
Result:= FALSE;
Break;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我这样使用它:
for x:= JList.Count-1 downto 1 DO
begin
sMaster:= JList.Items[x];
for y:= x-1 downto 0 DO
if …Run Code Online (Sandbox Code Playgroud) 我在DPK文件中放置了几个第三方控件,以便在我(重新)安装Delphi时单击安装它们.这个DPK中的一个控件是Melander的GIFImage.pas.问题是,当我编译包时,蓝色圆点不会出现在这个文件中.为什么?
文件IS已编译.我删除了DCU并且我放了一些无法编译的垃圾文本,编译器确实在该行停止并抱怨它无法编译该文件.没有生成DCU,编译和整个DPK都失败了.然后我删除了垃圾文本并重新编译.它起作用并且生成了DCU.所以文件已编译完毕.
在之前的帖子中(我的程序永远不会释放内存.为什么?)我表明FastMM可以缓存(读取为自身保持)相当大的内存.如果您的应用程序刚刚在RAM中加载了大量数据集,则在释放数据后,您将看到令人印象深刻的RAM未释放回内存池.
我环顾四周,似乎调用SetProcessWorkingSetSize API函数会将缓存"刷新"到磁盘.但是,我无法决定何时调用此函数.我想在执行RAM密集型操作的按钮上的OnClick事件结束时调用它.但是,有些人说这可能会导致AV.
如果有人成功使用此功能,请告诉我(我们).
非常感谢.
编辑:
1.释放数据集后,程序仍然需要大量的RAM.调用SetProcessWorkingSetSize后,大小返回到几MB.有人争辩说什么都没有被释放.我同意.但是内存占用现在很小,并且在正常使用程序后不会增加(例如,在执行不涉及加载大型数据集的正常操作时).不幸的是,没有办法证明交换到磁盘的内存被装回内存,但我认为不是.2.我已经证明了(我希望)这不是内存泄漏:
我的程序永远不会释放内存.为什么?
如何说服内存管理器释放未使用的内存
我觉得Delphi XE非常稳定可用.然而,有一个"功能"让我疯了!IDE以特殊颜色突出显示当前行.无论是在那条线上,它都会得到相同的颜色.有任何注册表调整来禁用这种恼人的行为?
delphi ×10
dll ×2
autoresize ×1
c# ×1
checkbox ×1
delphi-xe ×1
delphi-xe7 ×1
fastmm ×1
firemonkey ×1