DelforEx 2.5.4 for Delphi XE 修改版发布

DelForEx 是Delphi IDE的代码格式化工具,可快捷整理当前编辑的pas,dpr文件的代码格式。

修改记录:

添加Delphi XE 支持

修改默认快捷键为Ctrl+Shift+D ,防止快捷键冲突

image

image

 

【下载】

dropbox:http://dl.dropbox.com/u/1813734/DelForEx_2.5.4.zip

dbank: http://dl.dbank.com/c00xij3inr

 

 

需要源码的,留言。

delforexp和gexperts的一些资源链接

DelforExp

看起来像是官网,有提供原始版本的下载,甚至是之前说是不开源的delfordll的源码

http://www.aew.wur.nl/UK/Delforexp/

delforex for gexpert的集成

http://www.dummzeuch.de/delphi/gexperts/english.html

另外GExperts的网站

http://www.gexperts.org/

可惜,没找到源码下载链接

几个有用的Delphi网站

About Delphi
Delphi Feeds
Delphi Basics
Delphi Wiki

Delphi for Fun
Jedi Project
Torry’s Delphi Pages

delphi 2010 调试时没响应问题

最近的项目,一个工程组里面,包含有十几个的项目,如果打开项目组进行编辑,调试的时候,总会使Delphi 2010的ide失去响应,cpu占用50%,双核的。如果是单个exe项目的话,就不会。

 

解决办法:

用Delphidistiller ,把 component toolbar ide package的包去掉,即可。

image

 

ps:

参考:Component Toolbar slows down RAD Studio 2010

可知,可以加快code和design切换的速度~~

isapi 数据流长时间没返回的一个bug

用Delphi2010+intraweb开发,利用

response.contentstream:=astream;

response.sendresponse;

返回数据流到客户端。

先发现一个问题:

exe中运行正常。而编译成isapi的dll后,从firebug可以看到,数据一直没有到,最后超时。

跟踪断点进去,发现代码都已经执行完成了,甚至返回了,可是,还是等待数据超时。

解决办法:

生成astream后,设置astream.position:=0,也就是把要返回的流复位。

delphi 调试isapi dll的方法

一般Delphi中,写isapi的方法都是,先建立一个cgi的工程,编程,调试,程序调试完成后,再修改成isapi的工程,重新编译成dll,然后部署到iis上。但是,这样有个问题,有时候cgi和isapi的处理方式还是有些区别的,这样,某些问题就无法发现。比如说,在cgi的exe中,post的数据和url中的参数数据,就可以用contentfields和queryfields获取,而isapi中,就必须严格按照,参数用queryfields,而post的数据用contentfields获取。

设置isapi的方法,就是利用调试时的attach to process的方法,把dll调试进程attach到iis的可执行程序w3wp.exe进程,网上有些文章说是inetsrv.exe,是错误的。

image

继续阅读

intraweb编译的isapi在IIS6 上乱码问题

新装的win2003,原来在xp上跑的好好的intraweb 编译的isapi 的dll,出现了一堆乱码。

查看页面的源代码,就是

<html><head><script>
function IWTop(){
  if ((parent != self) && (parent != null) ) {
    try {
      return parent.IWTop();
    } catch (e) {
      return window;
    }
  } else {
    return window;
  }
}
IWTop().document.writeln('?佄呃偙?瑨汭倠?????????堠呈?ㄠ?吠慲獮瑩潩慮???∠瑨灴?眯睷眮?牯?剔砯瑨汭?呄?桸浴?琭慲獮瑩潩慮?瑤≤??瑨汭砠汭獮∽瑨灴?眯睷眮?牯???砯瑨汭??格慥??洼瑥?瑨灴攭畱癩∽敒牦獥?挠湯整瑮∽?甠汲???潌楧?汤????洼瑥?瑨灴攭畱癩∽潃瑮湥?祔数?潣瑮湥?琢硥?瑨汭※档牡敳?呕?????楴汴????????楴汴??猼祴敬琠灹?琢硥?獣? ̄?挣湥整???潰楳楴湯愺獢汯瑵??眊摩桴??硰※?敬瑦?┰※?潴????稊椭摮硥?※?慢正牧畯摮挭汯牯????※?慭杲湩氭晥???硰?琊硥?污杩?散瑮牥?昊湯?敷杩瑨?戠汯??潢摲牥?硰猠汯摩???敦?洊牡楧?潴??瀲????????猯祴敬 ̄??敨摡??潢祤??楤?摩∽散瑮牥??搼癩猠祴敬∽慰摤湩??硰???楤?瑳汹?昢湯?楳敺?瀲??敓獳潩?螿鳦?搯癩??牨????瑳汹?挢汯牯????昻湯?楳敺?瀲??臥芦???覜蟨???????苧?愼栠敲????潌楧?汤????貇????????楤???楤???潢祤??栯浴??

已经设置了脚本和运行权限了。

后来,写了另外一个小的dll,才发现

原来是临时目录的权限不对,临时目录是在C:windowsTemp

解决办法:

右键C:windowsTemp,共享和安全

image

添加everyone用户,设置权限为可修改和写入

重启iis即可。

Delphi下选择目录对话框

选择文件的对话框,就经常用,发现选择目录的对话框倒是用的少,经常有看到网上在问的

其实,有两个函数实现,在filectrl单元,记得uses

function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload;

function SelectDirectory(const Caption: string; const Root: WideString; var Directory: string; Options: TSelectDirExtOpts = [sdNewUI]; Parent: TWinControl = nil): Boolean; overload;

两个都是叫selectdirectory,重载的。

1.function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload;

options可参考帮助。

最重要的是用法,帮助有示例:

效果如图:

image

就是说,是老式的,win95的样式。

2.function SelectDirectory(const Caption: string; const Root: WideString; var Directory: string; Options: TSelectDirExtOpts = [sdNewUI]; Parent: TWinControl = nil): Boolean; overload;

参数说明:

caption:对话框标题

root:对话框显示的可选择根目录

directory:选择结果保存的变量

options:选项,参考filectrl.pas源码,有以下选择项可组合

parent:父窗体

默认有个[sdNewUI]的选项

效果,就是我们现在常见的,下图,添加了sdNewFolder的选项

image

所以说呢,要实现目录选择对话框,还是要用新的比较好。

Self-Delete程序存疑

标  题: Self-Delete程序之Delphi版本,终于搞定了。
发信站: BBS 水木清华站 (Mon Jun  4 20:50:42 2001)
到Borland的论坛去问了问,确实跟laoduan说得一样,要自己GetProcAddress。代码如下:

program Project1;

{$APPTYPE CONSOLE}
uses
  SysUtils,
  Windows;

procedure DeleteSelf;
var
  hModule: THandle;
  buff: array[0..255] of Char;
  hKernel32: THandle;
  pExitProcess, pDeleteFileA, pUnmapViewOfFile: Pointer;
begin
  hModule := GetModuleHandle(nil);
  GetModuleFileName(hModule, buff, sizeof(buff));
  CloseHandle(THandle(4));
  hKernel32 := GetModuleHandle('KERNEL32');
  pExitProcess := GetProcAddress(hKernel32, 'ExitProcess');
  pDeleteFileA := GetProcAddress(hKernel32, 'DeleteFileA');
  pUnmapViewOfFile := GetProcAddress(hKernel32, 'UnmapViewOfFile');
  asm
         LEA         EAX, buff
         PUSH        0
         PUSH        0
         PUSH        EAX
         PUSH        pExitProcess
         PUSH        hModule
         PUSH        pDeleteFileA
         PUSH        pUnmapViewOfFile
         RET
  end;
end;

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    DeleteSelf;
  except
    on E: Exception do
    begin
       Writeln(E.Classname, ': ', E.Message);
    end;
  end;
end.

现在有一点比较古怪,那就是必须把代码放在一个Procedure里,

继续阅读