小编Rob*_*ank的帖子

任何关于使用TTimer来监控文件日期和更新屏幕的gottcha?

我想检测文件日期何时更改并更新用作Tdatasource的DevX TdxMemData,然后在使用它的TDBGrid中看到它.

我发现了一些使用ReadDirectoryChangesW的代码,但对于我的简单需求似乎相当复杂.

我正在考虑使用TTimer并每五秒钟关闭一次.(这对我而言足够准确.)

这样做有什么警告吗?我已经读过Threads对VCL访问等有各种各样的限制.同样的事情适用于TTimer事件吗?

在Timer事件中调用FileAge和更新DevEx TdxMemData对象时,我需要注意什么?我的主应用程序会看到这些更新吗?

当Timer事件得到控制时,有没有办法检测程序的"状态",这样我可以避免出现问题?

或者我在考虑使用TTimer时打开了一大堆蠕虫?

delphi

3
推荐指数
2
解决办法
628
查看次数

如何在Delphi 2010的IDE中修复损坏的上下文敏感帮助

工作了一段时间后,我的D2010帮助系统坏了.

突出显示TStringList之类的关键字并点击F1会产生消息"找不到上下文的帮助".

将光标放在属性编辑器中的属性字段(如ModalResult)中并点击F1会显示一个沙漏,这就是全部.

单击IDE的主菜单"帮助",然后单击"Delphi帮助".我可以在搜索字段中键入TStringList(在显示的Microsoft Document Explorer中,加载"What's New - Embarcadero RAD Studio")并获得适当的结果.

任何人有任何关于如何解决此问题的建议?

delphi delphi-2010

3
推荐指数
1
解决办法
4645
查看次数

使用SendData会在收到时导致损坏的字符串

我正在尝试使用从这里改编的代码在两个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)

delphi

3
推荐指数
1
解决办法
1428
查看次数

如何在Delphi中关闭非模态表单

这已经在这里讨论过了,但没有详细讨论.

我试图让非模态子表单自身关闭时遇到麻烦.我让它通知父母,但我得到了抽象错误和其他异常.我究竟做错了什么?父母是否必须释放非模态形式,或者永远不再尝试通过该变量访问它?

主要形式:

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)

delphi

2
推荐指数
3
解决办法
1万
查看次数

删除和替换工作表时如何保留公式对工作表的引用?

我是一个应用程序的作者,在打开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

excel worksheet-function

2
推荐指数
1
解决办法
2万
查看次数

将红衣主教打包并打包成四个字节

我必须将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)

delphi bit-manipulation delphi-2010

2
推荐指数
3
解决办法
1963
查看次数

如何使用滚动条平滑地缩放图形或图像

我想在我的应用程序中使用滚动条或轨迹栏控件,允许我的用户在图形中缩放y轴值.

例如,图表可能是峰值为1.0的正弦波.通过拖动滚动条,用户应该能够将峰值增加到2.0,200,或者将其减小到0.5等.

所以,我想使用滚动条位置创建一个乘法因子,我应用于曲线上的每个y点.

我不太清楚这里的数学.我担心控件的操作对用户来说不是平滑或直观的.这里有指数或日志的东西,不存在吗?滚动条的中间部分不会被标记为1.0,其值高于步进(以日志间距为单位),低于1.0,是否会降低?

我记得大约四十年前从我的对数/指数数学经验中得到的零.

我的语言是Delphi,但伪代码中的一些代码片段会有所帮助.

TIA

PS请随意为此问题添加其他标签,以帮助最适合的观众看到它...

delphi graphics scaling

2
推荐指数
1
解决办法
1188
查看次数

在安装程序中使用SendNotifyMessage

在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来避免长时间等待.我不知道如何构建那个电话.

谁能告诉我语法?它也被弃用了吗?

有关更好方法的任何建议吗?

汤姆

delphi winapi inno-setup

2
推荐指数
1
解决办法
956
查看次数

为什么COMMON_APPDATA在Windows XP上作为空字符串返回

我在大型大学的一个用户(我想,大学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 winapi

2
推荐指数
1
解决办法
860
查看次数

如何在dpr中捕获表单的异常

我需要在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)

delphi

2
推荐指数
1
解决办法
1098
查看次数