我想检测文件日期何时更改并更新用作Tdatasource的DevX TdxMemData,然后在使用它的TDBGrid中看到它.
我发现了一些使用ReadDirectoryChangesW的代码,但对于我的简单需求似乎相当复杂.
我正在考虑使用TTimer并每五秒钟关闭一次.(这对我而言足够准确.)
这样做有什么警告吗?我已经读过Threads对VCL访问等有各种各样的限制.同样的事情适用于TTimer事件吗?
在Timer事件中调用FileAge和更新DevEx TdxMemData对象时,我需要注意什么?我的主应用程序会看到这些更新吗?
当Timer事件得到控制时,有没有办法检测程序的"状态",这样我可以避免出现问题?
或者我在考虑使用TTimer时打开了一大堆蠕虫?
工作了一段时间后,我的D2010帮助系统坏了.
突出显示TStringList之类的关键字并点击F1会产生消息"找不到上下文的帮助".
将光标放在属性编辑器中的属性字段(如ModalResult)中并点击F1会显示一个沙漏,这就是全部.
单击IDE的主菜单"帮助",然后单击"Delphi帮助".我可以在搜索字段中键入TStringList(在显示的Microsoft Document Explorer中,加载"What's New - Embarcadero RAD Studio")并获得适当的结果.
任何人有任何关于如何解决此问题的建议?
我正在尝试使用从这里改编的代码在两个Delphi表单之间发送一个字符串:http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm.
接收器显示的字符串部分是垃圾.我怀疑这是因为当我使用Windows API与Delphi 2010进行通信时,我会发出Unicode.
我希望能够在可能的情况下处理Unicode.
我一直无法弄清楚下面代码中的哪个演员是错误的.有帮助吗?
发送形式:
procedure TForm1.gridDetailsDblClick(Sender: TObject);
var
StringToSend : String;
CopyDataStruct : TCopyDataStruct;
begin
StringToSend := StringGrid1.Cells[0, StringGrid1.Row];
CopyDataStruct.dwData := 0;
CopyDataStruct.cbData := 1 + Length(StringToSend) ;
CopyDataStruct.lpData := PChar(StringToSend) ;
SendDataToAppearanceForm(copyDataStruct) ;
end;
procedure TForm1.SendDataToAppearanceForm(const CopyDataStruct: TCopyDataStruct) ;
var
ReceiverHandle : THandle;
begin
ReceiverHandle := FindWindow(PChar('TForm2'), nil);
if (ReceiverHandle <> 0) then
SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle), Integer(@CopyDataStruct)) ;
end;
Run Code Online (Sandbox Code Playgroud)
接收表单:(这导致编辑框包含字符串的一部分,但随后是垃圾.)
procedure TForm2.WMCopyData(var Msg: TWMCopyData);
var
S: String;
begin
edText.Text := PChar(Msg.CopyDataStruct.lpData); …Run Code Online (Sandbox Code Playgroud) 这已经在这里讨论过了,但没有详细讨论.
我试图让非模态子表单自身关闭时遇到麻烦.我让它通知父母,但我得到了抽象错误和其他异常.我究竟做错了什么?父母是否必须释放非模态形式,或者永远不再尝试通过该变量访问它?
主要形式:
NonModal := NonModalTForm.Create(Self);
NonModal.Callback := Callback;
NonModal.Show;
Procedure TForm.Callback; // called by non-modal form when closing
begin
FreeAndNil(NonModal); // or should this just be NonModal := nil so I don't try to access a dangling pointer?
end;
Run Code Online (Sandbox Code Playgroud)
在NonModal.pas
procedure NonModalTForm.FormClose;
begin
Callback; // calls parent
end;
Run Code Online (Sandbox Code Playgroud) 我是一个应用程序的作者,在打开Excel工作簿之前,删除并重新创建一些工作表,例如下面示例中的"Sheet1".
同一工作簿中的其他工作表(比如Sheet2)可能具有引用替换工作表的公式,如下所示:
=IF('Sheet1'!A9="","",'Sheet1'!A9)
Run Code Online (Sandbox Code Playgroud)
不幸的是,当更换纸张时,上述公式中对Sheet1的引用被破坏了
=IF(#Ref!A9="","",#REF!A9)
Run Code Online (Sandbox Code Playgroud)
任何人都可以想到一种编码这个公式的方法,这样它就不会失败吗?例如,它可以从Sheet2中的隐藏单元格中获取工作表的名称或其他内容?
我对Excel公式知之甚少,不知道可能性是什么.
TIA
我必须将Cardinal打包并解压缩为四个单字节字段(在Delphi 2010中).
我在大图像的所有像素上做这个,所以我需要它快!
谁能告诉我如何写这两个功能?(const和out关键字只是为了清楚.如果它们干扰内联汇编,那么我可以删除它们.)
procedure FromCardinalToBytes( const aInput: Cardinal;
out aByte1: Byte;
out aByte2: Byte;
out aByte3: Byte;
out aByte4: Byte); inline;
function FromBytesToCardinal( const aByte1: Byte;
const aByte2: Byte;
const aByte3: Byte;
const aByte4: Byte):Cardinal; inline;
Run Code Online (Sandbox Code Playgroud) 我想在我的应用程序中使用滚动条或轨迹栏控件,允许我的用户在图形中缩放y轴值.
例如,图表可能是峰值为1.0的正弦波.通过拖动滚动条,用户应该能够将峰值增加到2.0,200,或者将其减小到0.5等.
所以,我想使用滚动条位置创建一个乘法因子,我应用于曲线上的每个y点.
我不太清楚这里的数学.我担心控件的操作对用户来说不是平滑或直观的.这里有指数或日志的东西,不存在吗?滚动条的中间部分不会被标记为1.0,其值高于步进(以日志间距为单位),低于1.0,是否会降低?
我记得大约四十年前从我的对数/指数数学经验中得到的零.
我的语言是Delphi,但伪代码中的一些代码片段会有所帮助.
TIA
PS请随意为此问题添加其他标签,以帮助最适合的观众看到它...
在Inno安装脚本中,我通过添加条目来设置环境变量:
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment.
Run Code Online (Sandbox Code Playgroud)
我希望我的用户能够运行新安装的应用程序而无需重新启动(通常需要在环境中看到上述更改.)
我打算让安装程序使用dll来调用SendMessageTimeOut,如下所述:从Delphi(Win32)设置环境变量.
Delphi XE2报告此API已弃用.
上面的StackOverflow线程建议使用SendNotifyMessage来避免长时间等待.我不知道如何构建那个电话.
谁能告诉我语法?它也被弃用了吗?
有关更好方法的任何建议吗?
汤姆
我在大型大学的一个用户(我想,大学IT部门一般在他们的计算机上具有积极的安全设置)正在获取Windows XP为CSIDL_COMMON_APPDATA或CSIDL_PERSONAL返回的空字符串.(我不确定其中哪一个返回空字符串,因为我还没有检查他的电脑,看看他是如何安装软件的,但我很确定它是COMMON_APPDATA ...)
有没有人遇到这个或有关于如何处理这个的建议?
这是我用来检索值的Delphi代码:
Function GetSpecialFolder( FolderID: Integer):String;
var
PIDL: PItemIDList;
Path: array[0..MAX_PATH] of Char;
begin
SHGetSpecialFolderLocation(Application.Handle, FolderID, PIDL);
SHGetPathFromIDList(PIDL, Path);
Result := Path;
end; { GetSpecialFolder }
ShowMessage(GetSpecialFolder(CSIDL_COMMON_APPDATA)); <--- This is an empty string
Run Code Online (Sandbox Code Playgroud)
编辑:
弄清楚这个API让我觉得我正在追逐我的尾巴 - 我试图寻找合适的电话.据说这种方法和其它类似的方法被微软推荐(以及此问题的早期海报(@TLama?)后来删除了帖子.)但是,我们大多数人,包括我,似乎经常并安全地忽略该状态.
在我的搜索中,我在一段时间之前在SO上找到了一个很好的答案,包括非弃用的方法的示例代码:导致此错误的原因是"无法写入应用程序file.ini".
我需要在Delphi 7程序中捕获所有非单元初始化异常,这样我就可以将异常写入文件,并可能向用户显示一条消息.
读到这一点,我认为全局异常处理程序会很麻烦,而我所需要的只是捕获DPR级别的所有异常.但是,我无法获得下面的代码来访问dpr中的ShowMessage.
为什么下面的Raise Exception实际上会导致屏幕上显示异常,而不是弹出到.dpr的except子句?也许全局异常处理程序会是更好的方法吗?
dpr中紧接下面的代码不应该捕获表单中的所有异常吗?
在DPR中:
begin
Application.Initialize;
try
Application.CreateForm(TForm1, Form1);
Application.Run;
except
On E: Exception do
ShowMessage('In dpr except. Exception is: ' + E.Message);
end;
end.
Run Code Online (Sandbox Code Playgroud)
通知:
Function TForm1.DoSomething( out aErrm: String):boolean; // force a failure for testing
begin
Result := FALSE;
aErrm := 'Failed in DoSomething';
end;
procedure TForm1.FormShow(Sender: TObject);
begin
try
fOk := DoSomething(fErrm);
except
fOk := FALSE;
Errm := 'Unexpected exception'
end;
if (NOT fOk) then
Raise Exception.Create(Errm) // why does this pop-up an exception …Run Code Online (Sandbox Code Playgroud)