我的程序中有一个主线程和一个单独的线程.如果单独的线程在主线程之前完成,它应该自动释放.如果主线程首先完成,它应该释放单独的线程.
我知道FreeOnTerminate,我读过你必须小心使用它.
我的问题是,以下代码是否正确?
procedure TMyThread.Execute;
begin
... Do some processing
Synchronize(ThreadFinished);
if Terminated then exit;
FreeOnTerminate := true;
end;
procedure TMyThread.ThreadFinished;
begin
MainForm.MyThreadReady := true;
end;
procedure TMainForm.Create;
begin
MyThreadReady := false;
MyThread := TMyThread.Create(false);
end;
procedure TMainForm.Close;
begin
if not MyThreadReady then
begin
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud) 我正在使用Delphi 7.我不仅熟悉使用画布和绘制文本到画布,还使用TCanvas.TextHeight等.当我想实现Word Wrap时出现问题.我不仅需要以最佳方式将文本绘制到画布并使其自动换行到给定的宽度约束,而且还需要知道它被包装后的高度(或多少行).我需要在绘制文本之前准备另一个图像,这个图像需要足够大才能放置包装好的文本.这是尝试复制iPhone如何显示SMS消息,屏幕两侧的气球在可变高度滚动框中(TScrollingWinControl是我的基础).
我最近一直在处理FTP,我不确定Indy组件的安全性TIdFTP.这就是为什么我创建了一些我希望与您分享的测试,以便您可以对最佳实践及其完成方式提出自己的看法.
首先,我使用Object Inspector在组件中添加了用户名和密码:

并创建了一个很好的简单连接:
procedure TForm1.FormActivate(Sender: TObject);
begin
try
FTP.Connect();
ShowMessage ('Connection success');
except
ShowMessage ('Connection failure');
end;
end;
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于,如果您使用像Resource Hacker这样的简单工具,您可以立即看到所有数据:
Host = 'ivstefano.com'
Password = 'testpass'
Username = 'testuser'
Run Code Online (Sandbox Code Playgroud)
然后,我决定通过从OI中删除它并将其插入代码中,就像其他人一样:
FTP.Host:= 'ivstefano.com';
FTP.Username:= 'testuser';
FTP.Password:= 'testpass';
Run Code Online (Sandbox Code Playgroud)
如果有人更聪明,他可以轻松使用像Hex编辑器这样的工具,看看在exe中编译的是什么:

所以我最终做的是使用OTP(One Time Pad Wiki)创建一个加密工具,你可以从这里下载Sample OTP工具:

我用它用关键字'lemon'加密我的密码'testpass'.然后我用ASCII码加密的字符串(#25+#2+#3+#7+#117+#19+#31+#6)和密钥(#108+#101+#109+#111+#110),都是ASCII字符总和,并在我的主ftp连接程序中使用它们再次使用OTP解密它们:
function opt(text, key: String): String;
var i: Integer;
begin
SetLength(Result, length(text));
for i:= 1 to length(text) do
Result[i]:= Char(Byte(text[i]) xor (i + Byte(key[i mod length(key)])));
end; …Run Code Online (Sandbox Code Playgroud) 我有一些图像文件存储在一个文件中(某种存档).那个文件看起来像这样:

好吧,它分为两个部分 - 标题和数据段.标题(绿色)包含各种信息,例如专辑名称,位置,日期/时间,描述,相册中的照片数量等.数据段(蓝色和橙色)结构简单,包含N x JPEG照片.我可以将"imagedata"段提取到新的TMemoryStream对象中,现在我想使用TImage来显示它.
我可以使用TMemoryStream的SaveAsFile方法,设置一些临时文件名,从TImage加载该文件,然后删除临时文件.这是有效的,但我想知道是否有任何方法可以使用temp将该流发送到TImage中.文件.
当然,我可以编写代码来提取硬盘上的所有文件,但问题是我有很多这样的档案,只是想写应用程序来阅读那些"专辑",而不是在我的硬盘上有20,000多张照片.
简而言之,我想要的只是进行以下程序工作(没有使用临时文件)
procedure ShowImageFromStream(data: TStream; img: TImage);
begin
...
end;
Run Code Online (Sandbox Code Playgroud)
提前致谢.
在其他语言(如C++)中,有些运算符可以执行plus-equals或or-equals类型的操作来添加其他样式/标志.Delphi中有相同的东西吗?
现在我有一些代码,如:
label1.Font.Style := label1.Font.Style + [fsBold];
label2.Font.Style := label2.Font.Style + [fsBold];
Run Code Online (Sandbox Code Playgroud)
但是,如果可能的话,我希望能够简化一些简化,而不会在赋值运算符的两边复制标签名称,这可能是:label1.Font.Style += [fsBold];或者label1.Font.Style := self + [fsBold];
可以这样做吗?还是没那么多?
我有一个应用程序将程序设置写入Windows注册表是绝对必要的.存储到文件不是一个选项.
为了简化这一点,我想提供一个"管理员权限"唠叨屏幕,而不是试图解释如何右键单击程序文件/捷径.
我找到了一篇相当不错的文章,但是在为清单添加自己的资源文件后,我收到了重复的资源错误.
这应该是由于与内部清单冲突并解决问题我看到很多评论建议在项目选项中禁用"启用运行时主题".我已经浏览了所有菜单,但找不到它,我现在被告知它可能在Delphi 7中不可用并且在以后的版本中引入.
我如何添加自己的清单?
我有一个特定的图标文件,它由PNG压缩图像组成,当我尝试加载它并添加到a时TImageList,Out of system resources会引发异常.
图标文件位于:https://www.dropbox.com/s/toll6jhlwv3cpq0/icon.ico?m
以下是代码,它使用常见类型的图标,但无法使用PNG图像图标:
procedure TForm1.Button1Click(Sender: TObject);
var
Icon: TIcon;
begin
try
Icon := TIcon.Create;
Icon.LoadFromFile('icon.ico');
ImageList1.AddIcon(Icon);
Caption := IntToStr(ImageList1.Count);
finally
Icon.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
为什么PNG图像图标格式无法加载Out of system resources异常?如何将这种图标添加到图像列表?
有没有办法只刷新Detail DataSet而不重新加载所有主数据集?
这是我到目前为止所尝试的:
DM.ClientDataSet2.Refresh;
DM.ClientDataSet2.RefreshRecord;
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
DM.ClientDataSet1.Refresh;
Run Code Online (Sandbox Code Playgroud)
但是上面的方法会刷新整个Master数据集,而不仅仅是当前记录.
现在,以下代码似乎做了什么:
DM.ClientDataSet1.RefreshRecord;
Run Code Online (Sandbox Code Playgroud)
是否有解决方法或正确的方法来做我想要的?(也许是插入......)
附加信息:
ClientDataSet1 =主数据集
ClientDataSet2 = Detail DataSet,如下:*
object ClientDataSet2: TClientDataSet
Aggregates = <>
DataSetField = ClientDataSet1ADOQuery2
FetchOnDemand = False
.....
end
Run Code Online (Sandbox Code Playgroud)
提供者属性:
object DataSetProvider1: TDataSetProvider
DataSet = ADOQuery1
Options = [poFetchDetailsOnDemand]
UpdateMode = upWhereKeyOnly
Left = 24
Top = 104
end
Run Code Online (Sandbox Code Playgroud) 在一个帖子中,如果我使用,是否有区别
Coinitialize(nil)
Run Code Online (Sandbox Code Playgroud)
代替
CoInitializeEx(0, COINIT_MULTITHREADED);
Run Code Online (Sandbox Code Playgroud)
我使用Delphi 7,但我认为其他编程语言可以保留这个问题感谢您的帮助.
我花了很多时间尝试在GExperts中使Delphi 6/7 IDE的Tools/Environment Options对话框变得相当大.一切似乎工作正常,直到我发现将窗体的BorderStyle更改为bsSizable关闭并重新创建窗体的句柄,并在此过程中丢失调色板配置的列表框的内容.(之后Items项属性为空.)
更改表单的大小(通过设置高度和宽度)可以正常工作,但允许用户调整大小会遇到上述问题.
有没有办法在不改变BorderStyle的情况下使Delphi表格变得相当大?