Delphi 2006的TImage并不完全支持PNG.为了在我的表单上具有alpha透明度的图像,我必须在运行时加载它们.我可以在设计时加载它们但它们不能存活,我认为因为PNG没有保存在DFM文件中.我确信这在最新的Delphi中都是笨拙的,但我现在无法升级.
无论如何,我在运行时加载它们:
Image1.Picture.Assign (PngImageCollection1.Items [0].PNGImage) ;
Run Code Online (Sandbox Code Playgroud)
PNGImageCollection组件包含各种大小的PNG(这些PNG在设计时创建和加载),我将它们分配给FormCreate事件中的相应TImages.
这个工作正常,直到我遇到一个问题,我试图在表单上使用它之后在其他地方重用其中一个图像.我发现分配TPicture的行为已将其设置为由于Assign而导致的空图像.这发生在例程TPicture.ForceType中,AFAICT检查FGraphic的类型,如果它不是所需类型,它将释放FGraphic并创建所请求类型的新实例.
好.所以在经过一番搔痒之后,我发现也许我应该这样做:
Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ;
Run Code Online (Sandbox Code Playgroud)
这就是诀窍,因为Assign没有破坏图像,但现在图像显示半透明位不透明,即:

代替:

如何让此图像正确显示alpha透明位?(和补充问题:是Image1.Picture.Bitmap.Assign正确的方法吗?).
以下是更详细的代码:
在我有问题"重用"TImage的代码中,序列是:
在表单上创建:
LogoImage.Picture.Assign (PngImageCollection1.Items [0].PNGImage) ;
Run Code Online (Sandbox Code Playgroud)
(PNGIMage是公司徽标,LogoImage1是主要表格).
在打印报告标题上:
procedure PrintLogo (Report : TBaseReport) ;
var
X1, Y1, LogoHeightMM : Double ;
begin
with Report do
begin
LogoHeightMM := CalcGraphicHeight (LogoWidthMM, MainForm.LogoImage.Picture.Graphic) ;
X1 := PageWidth - MarginRight - LogoWidthMM ;
Y1 := SectionBottom - LogoHeightMM ;
PrintBitmapRect (X1, Y1, X1 + LogoWidthMM, Y1 + LogoHeightMM, MainForm.LogoImage.Picture.Bitmap) ;
end ;
end ;
Run Code Online (Sandbox Code Playgroud)
第一次打印徽标的例程被调用时,它会毫无错误地执行,但是在调用PrintBitmapRect之后,LogoImage …
我在工作的组件上Delphi 7和Delphi 2006,在那里我使用,我需要添加到一个单元.dpr上的组件自动删除该项目的文件.就像Eureka Log自动将单元'ExceptionLog'添加到项目文件中一样:

当我将组件放在项目中的任何表单上时,有人能告诉我如何以编程方式将单元添加到项目文件中吗?
我有一个 Android 应用程序使用 Indy 10 TIdHttpServer(Delphi 2006 附带)与 Delphi 2006 Web 服务应用程序进行通信。Delphi 应用程序生成一个大的 XML 文件并为其提供服务。XML 生成可能持续超过 5 分钟。
如果持续时间GenerateXml()超过大约 5 分钟 (*),TIdHTTPResponseInfo.WriteContent如果在 Delphi IDE 中运行,我会检测到错误 10053:
Socket Error # 10053 Software caused connection abort.
Run Code Online (Sandbox Code Playgroud)
然而,在 android 端没有检测到任何内容,并且HttpGet-call 会永远持续。
我的问题是:
1.) 为什么会收到错误 10053 以及如何避免它?看起来像android超时连接,但http.socket.timeout设置为无限。
和
2.) 我能做些什么来检测客户端的此类错误(除了设置超时,该超时必须太大而无用)?我可以在 TIdHttpServer.OnException 中做一些事情吗?
这是我的代码。Android - 下载函数,在 AsyncTask 内运行:
protected static HttpEntity downloadEntity(String url) throws IOException {
HttpClient client = new DefaultHttpClient();
//Check because of Error 10053: but …Run Code Online (Sandbox Code Playgroud) 为了防止新创建的模态窗口隐藏在其模态父窗口下,我习惯于PopupParent在调用时始终进行设置ShowModal(如此处,此处和此处所建议):
function TMyForm.ShowModal(ParentForm: TCustomForm): Integer;
begin
PopupParent := ParentForm;
Result := inherited ShowModal;
end;
Run Code Online (Sandbox Code Playgroud)
但是,当进行调试时(在FormCreate中设置表单时丢失了表单放置的问题),我意识到设置PopupParent会导致对的调用ReCreateWindow,从而破坏并重新创建基础的Windows屏幕对象。
我的问题:
PopupParent-可能导致什么问题?是否存在可行的替代方案?编辑:
我认为以上所有链接的问题都可以解决相同的问题,第三个链接可以最好地描述这个问题:
[使用ShowModal打开一个窗体],此窗体使用ShowModal打开另一个窗体,因此我们已堆叠了模态窗体。有时存在一个问题,当我们以新形式调用ShowModal时,它将隐藏在以前的形式之后,而不是显示在顶部。按alt + tab后,表单返回顶部[...]
我需要使用使用.NET框架创建的DLL.此DLL使COM可见.
我想在使用Delphi 2006创建的应用程序中使用此DLL.我已按照以下步骤操作:
使用Delphi IDE导入类型库.它创建了_TLB.pas文件.签名是在TLB文件中创建的.
function TValidationRequest.Process(var meterBSN: WideString; var NICSerial: WideString;
var partNumber: WideString; var otherConfig: WideString;
out returnMessage: WideString): Smallint;
begin
Result := DefaultInterface.Process(meterBSN, NICSerial, partNumber, otherConfig, returnMessage);
end;
我尝试使用以下代码片段调用该方法.
procedure TForm1.buttonClick(Sender: TObject);
var
valReq: TValidationRequest;
s1, s2, s3, s4, s5: WideString;
o: WideString;
begin
valReq := TValidationRequest.Create (Self);
try
valReq.Process (s1, s2, s3, s4, o);
MessageDlg(o, mtInformation, [mbOK], 0);
finally
valReq := nil;
end;
end;
但是在调用Process方法时出现以下错误. alt text http://i41.tinypic.com/2daf1ix.png
请问您能提出任何解决方案吗?
我正在重构现有Delphi 2006(非.NET)客户端使用的现有C#.NET Web服务.我不想重建/重新部署客户端.我的目标是保持WSDL相同,以便代理类不会改变.
我使用了一个工具(Regionerate)来区域化,并根据我们当前的标准对方法/属性进行排序.这改变了WSDL中的标签排序.
我可以使用XML diff工具来比较文件并忽略排序,但我不确定这是否会影响客户端.Web方法或(to-be-proxy)类属性的顺序是否相关?
我有一个由于错误条件而弹出的对话框.我希望对话框保持打开状态至少30秒,并在收到最后一个用户输入(鼠标或键盘)后关闭30秒.
我可以通过检查GetLastInputInfo返回的值并在超过30秒之前关闭对话框来实现这一点,但是如果当用户没有使用鼠标或键盘30秒时弹出对话框,则GetLastInputInfo测试通过立即,对话框立即再次关闭.我可以用另一个计时器做到这一点,但我认为在对话框打开之前模拟鼠标移动或者发出一个(无害的)按键要简单得多.它也可能具有将系统从屏幕保护程序中踢出的优点.
什么是最简单的1行Delphi代码片段来实现这一目标?
我正在开发AA成分delphi 7和delphi 2006,组件使用.pas (不矿)文件这需要一个DLL文件是存在于应用程序目录.
可以将DLL文件嵌入到组件中,这样当用户将其放在表单上或在运行时创建它时,DLL它将被放在应用程序目录中吗?
目前
1)我告诉用户将DLL文件放在应用程序目录中.
2)DLL在参考资料中添加文件,这样在创建时,我可以将其DLL放入应用程序目录中?来自delphidabbler_embed_resource.我已经完成了使用
{Drop the Resource..!!!}
procedure DropDllToApplicationDirectOry(applicationPath : string);
var
RS: TResourceStream;
begin
// Create resource stream
RS := TResourceStream.CreateFromID(HInstance, 100, RT_RCDATA);
try
// applicationPath : example c:\MyTestProject Lee\
if DirectoryExists(applicationPath) then RS.SaveToFile(applicationPath+'myDllFileWhichIsNeeded.dll')
finally
// Free the stream
RS.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
这DropDllToApplicationDirectOry 把资源从{$RmyDllFileWhichIsNeeded.dll.RES}和drope带到了位置但是
DropDllToApplicationDirectOry当我将组件放在表单上时,如何调用此方法?
我尝试initialization了组件但DLL没有复制,所以我得到错误

编辑 对 …
有一些我一直在努力的东西,我真的没有用Delphi程序解决,并想知道是否有人可以指导我.正如主题所说,你如何做正确的灾难性错误处理?例如:
// is file necessary for the program present?
if not FileExists(FilePath1) then
begin
raise Exception.Create(FilePath1 + ' does not exist and is required for this program to function.');
// I obviously need to do something here to make the program QUIT and not have
// any more code run.
Application.Terminate;
Abort;
end;
Run Code Online (Sandbox Code Playgroud)
我也可以在那里使用异常单元并抛出异常,但程序继续像以前一样.我过去曾经使用过停止呼叫,但它似乎没有进行任何清理等等,所以我最终制定了一个大程序,通过近距离和免费调用我所做的一切就是为了确保(即使那时我我不确定任何幕后的东西.
那么处理这类事情的正确方法是什么?
编辑:为了澄清,我想知道如何让程序做它需要做的清理,然后立即退出而不做任何其他代码.
我需要将字符串拆分为具有固定长度子字符串的TStringList.
目前我使用:
procedure StrToStringList(ASource: string; AList: TStrings; AFixedLen: Integer);
begin
Assert(Assigned(AList));
while Length(ASource) > AFixedLen do
begin
AList.Add(LeftStr(ASource, AFixedLen));
Delete(ASource, 1, AFixedLen);
end;
AList.Add(ASource);
end;
Run Code Online (Sandbox Code Playgroud)
这有效,但似乎很慢.有更好/更快的想法吗?
编辑:结果分析:
速度提升令人印象深刻.以下是我(主观)剖析的结果.
数据大小:290KB,FixedLen:100:
数据大小:2805KB,FixedLen:100: