﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-叽哩咕噜-随笔分类-DELPHI</title><link>http://blogjava.net/wangxunhua/category/49382.html</link><description>君子如玉,上善若水</description><language>zh-cn</language><lastBuildDate>Tue, 01 Mar 2016 11:48:43 GMT</lastBuildDate><pubDate>Tue, 01 Mar 2016 11:48:43 GMT</pubDate><ttl>60</ttl><item><title>FileStream 类实现日志</title><link>http://www.blogjava.net/wangxunhua/archive/2011/08/24/357167.html</link><dc:creator>叽哩咕噜</dc:creator><author>叽哩咕噜</author><pubDate>Wed, 24 Aug 2011 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/wangxunhua/archive/2011/08/24/357167.html</guid><wfw:comment>http://www.blogjava.net/wangxunhua/comments/357167.html</wfw:comment><comments>http://www.blogjava.net/wangxunhua/archive/2011/08/24/357167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxunhua/comments/commentRss/357167.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxunhua/services/trackbacks/357167.html</trackback:ping><description><![CDATA[FileStream类几乎可以处理所有的文件操作.<br /><br />以下为一个日志类,除了配置不太灵活外,挺好用的.<br /><div><div>type<br />&nbsp; TBuffer = array [0..2000] of char;<br />&nbsp; <br />&nbsp; TGameLogFile = class<br />&nbsp; private<br />&nbsp;&nbsp;&nbsp; FFullPath:string;//完整路径,用这个路径来判断当前的打开的日志的大小.<br />&nbsp;&nbsp;&nbsp; FileDate:TDateTime;<br />&nbsp;&nbsp;&nbsp; FFileParth: string; //路径<br />&nbsp;&nbsp;&nbsp; FText: Text;<br />&nbsp;&nbsp;&nbsp; FLogFileStream:TFileStream; <br />&nbsp;&nbsp;&nbsp; FIsCreateToNew: boolean; //是否是每次启动程序都创建新的记录文件 否则就是当天只会有1个文件<br />&nbsp;&nbsp;&nbsp; FIsControlFileSize:Boolean;//是否控制文件大小,true,超出文件大小时,重新创建一个log文件<br />&nbsp; public<br />&nbsp;&nbsp;&nbsp; {带入日志文件存放的目录位置}<br />&nbsp;&nbsp;&nbsp; constructor Create(Iparth: string);<br />&nbsp;&nbsp;&nbsp; destructor Destroy; override;<br />&nbsp;&nbsp;&nbsp; {写入内容即可自动记录}<br />&nbsp;&nbsp;&nbsp; procedure init(Iparth: string);<br />&nbsp;&nbsp;&nbsp; procedure AddLog(Icon: string; const LogLevel: Integer = 0);<br />&nbsp;&nbsp;&nbsp; property IsCreateToNew: boolean read FIsCreateToNew write FIsCreateToNew;<br />&nbsp; end;</div><div>implementation<br />uses StdCtrls;<br />const<br />&nbsp; {分割符号}<br />&nbsp; CSplitStr = '===============================================================';<br />&nbsp; ClogFileName = '.log';<br />{ TGameLogFile }</div><br /><br />procedure TGameLogFile.AddLog(Icon: string; const LogLevel: integer = 0);<br />var<br />&nbsp; txt:string;<br />&nbsp; buffer:TBuffer; //开一个2K的缓存<br />begin<br />&nbsp; try<br />&nbsp;&nbsp;&nbsp; if FIsCreateToNew then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if Date - FileDate &gt;= 1 then&nbsp;&nbsp;&nbsp; //超过一天.强制换掉日志文件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloseFile(FText);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init(FFileParth);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br /><br />&nbsp;&nbsp;&nbsp; if FIsControlFileSize then<br />&nbsp;&nbsp;&nbsp; begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if FLogFileStream.Size &gt; 3 * 1000 * 1000 then&nbsp;&nbsp;&nbsp; //这里的单位是M,有时间改成可配置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init(FFileParth); //重新切换一个日志<br />&nbsp;&nbsp;&nbsp; end;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; StrCopy(buffer,PChar(Icon));<br />&nbsp;&nbsp;&nbsp; FLogFileStream.Write(buffer,Length(Icon));//如果直接write(Icon,Length(Icon)),会产生乱码.<br />&nbsp; except<br />&nbsp;&nbsp;&nbsp; IOResult;<br />&nbsp; end;<br />end;<br /><br />constructor TGameLogFile.Create(Iparth: string);<br />begin<br />&nbsp; FIsCreateToNew := false;<br />&nbsp; FIsControlFileSize := not (FIsCreateToNew xor False);&nbsp; //当FIsCreateToNew为true时,此变量为假<br />&nbsp; FFileParth := Iparth;<br />&nbsp; init(FFileParth);<br />end;<br /><br />//在这里创建一个日志文件<br />procedure TGameLogFile.init(Iparth: string);<br />var<br />&nbsp; Ltep: string;<br />begin<br />&nbsp;if not DirectoryExists(FFileParth) then<br />&nbsp;&nbsp;&nbsp; if not CreateDir(FFileParth) then begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise Exception.Create('错误的路径，日志类对象不能被创建');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit;<br />&nbsp;&nbsp;&nbsp; end;<br />&nbsp; if FIsCreateToNew then begin<br />&nbsp;&nbsp;&nbsp; Ltep := FormatDateTime('yyyymmddhhnnss', Now);<br />&nbsp;&nbsp;&nbsp; FileClose(FileCreate(FFileParth + ltep + ClogFileName));<br />&nbsp; end<br />&nbsp; else<br />&nbsp;&nbsp;&nbsp; Ltep := FormatDateTime('yyyymmddhhnnss', Now);<br />&nbsp; if not FileExists(FFileParth + ltep + ClogFileName) then<br />&nbsp;&nbsp;&nbsp; FileClose(FileCreate(FFileParth + ltep + ClogFileName));<br />&nbsp; FileDate := Date;<br />&nbsp; FFullPath := FFileParth + ltep + ClogFileName;<br />&nbsp; //此处改用TFileStream用来控制Log日志文件的大小&nbsp; 2011年8月24日9:28:25 ddz<br />&nbsp; //AssignFile(FText, FFileParth + ltep + ClogFileName);<br />&nbsp; if Assigned(FLogFileStream) then<br />&nbsp;&nbsp;&nbsp;&nbsp; FLogFileStream.Free;<br />&nbsp; //新建日志文件.<br />&nbsp; FLogFileStream := TFileStream.Create(FFullPath,fmCreate&nbsp;&nbsp; &nbsp;or fmShareDenyNone);<br />&nbsp; FLogFileStream.free;<br />&nbsp; //读写日志文件<br />&nbsp; FLogFileStream := TFileStream.Create(FFullPath,fmOpenReadWrite&nbsp;&nbsp; &nbsp;or fmShareDenyNone);<br />end;<br /><br />destructor TGameLogFile.Destroy;<br />begin<br />&nbsp; try<br />&nbsp;&nbsp;&nbsp; if Assigned(FLogFileStream) then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FreeAndNil(FLogFileStream);<br />&nbsp; except<br />&nbsp; end;<br />&nbsp; inherited;<br />end;<br />end.<br /></div><img src ="http://www.blogjava.net/wangxunhua/aggbug/357167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxunhua/" target="_blank">叽哩咕噜</a> 2011-08-24 10:52 <a href="http://www.blogjava.net/wangxunhua/archive/2011/08/24/357167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>delphi 进程间通信的两种方法</title><link>http://www.blogjava.net/wangxunhua/archive/2010/08/31/330446.html</link><dc:creator>叽哩咕噜</dc:creator><author>叽哩咕噜</author><pubDate>Tue, 31 Aug 2010 10:31:00 GMT</pubDate><guid>http://www.blogjava.net/wangxunhua/archive/2010/08/31/330446.html</guid><wfw:comment>http://www.blogjava.net/wangxunhua/comments/330446.html</wfw:comment><comments>http://www.blogjava.net/wangxunhua/archive/2010/08/31/330446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxunhua/comments/commentRss/330446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxunhua/services/trackbacks/330446.html</trackback:ping><description><![CDATA[<br />
<br />
WIN下面进程间通信的最常用办法就是消息了.<br />
<br />
下面记录两种消息通信的方式:<br />
&nbsp;--------------------------------------------------------------------------------------------<br />
一.第一种办法,利用注册Windows全局的消息.并覆盖wndProc过程来监听消息处理.<br />
1. <br />
&nbsp;&nbsp;&nbsp; 发送消息方:<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strWM:Cardinal;&nbsp;&nbsp;//定义一个局部变量<br />
&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;proccedure Form1.Create(sender:TObject);<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strWM:= RegisterWindowMessage('newspopMessage'); //注册一个windows全局消息,通过这个消息与其它进程通信<br />
&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp;&nbsp;procedure Form1.Button1Click1(Sender:TObject);<br />
&nbsp;&nbsp;&nbsp;&nbsp;var<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h:Cardinal;<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//通信的步骤得先找到要通信的信息窗口Handle<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h:=findWindow('目标进程窗口类名','窗口Caption');&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送消息消息类型为自定义的strWM<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(h,strWM,0,0);&nbsp;&nbsp;//这里同样可以带参数.wParam,lParam.但我传一个PChar,读取的时候总报错.不知道为啥<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
2.&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;接收消息方:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strWM:Cardinal;&nbsp;&nbsp;//定义一个局部变量<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure wndProc(var msg:Tmessage);override; //覆盖这个方法,可以监听所有的Windows消息<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 24px; font-family: arial; font-size: 14px; font-weight: bold" class="Apple-style-span">回调函数</span></span>&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proccedure Form1.Create(sender:TObject);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strWM:= RegisterWindowMessage('newspopMessage'); //注册一个windows全局消息,这个相当于暗号<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procecure form1.wndProc(var msg:TMessage);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在这里处理这个消息就行了<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showmessage(strpas(PChar(mes.lparam)));&nbsp;//这样写会报错的.但可以处理其它无参数的事情<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
<br />
<br />
----------------------------------------------------------------------------------------------<br />
二.第二种办法,发送一个WM_COPYDATA的消息.并且可以带一个TCopyDataStruct的结构类型参数.<br />
<br />
&nbsp;1.&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;发送消息方:<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<p>&nbsp;</p>
<p>&nbsp;&nbsp;procedure TMainForm.CallAgent(msg: string);<br />
&nbsp;&nbsp;var<br />
&nbsp;&nbsp;&nbsp; HlAgent:HWND;<br />
&nbsp;&nbsp;&nbsp; ds:TCopyDatastruct;&nbsp;&nbsp;&nbsp; //定义一个TCopyDatastruct结构体变量<br />
&nbsp; begin<br />
&nbsp;&nbsp;&nbsp; AgentMsg := msg;<br />
&nbsp;&nbsp;&nbsp; ds.cbData := Length(msg)+1; //结构体的第一个元素: 长度cbData&nbsp;<br />
&nbsp;&nbsp;&nbsp; GetMem(ds.lpData,ds.cbData); //分配内存,结构体的第二个参数:&nbsp; 数据的指针lpDATA<br />
&nbsp;&nbsp;&nbsp; StrCopy(ds.lpData,PChar(msg)); //复制值到结构指针</p>
<p>&nbsp;&nbsp;&nbsp; HlAgent :=FindWindow('TmsgpopMainCaller','调用者');&nbsp; //查找目标窗体的Handle<br />
&nbsp;&nbsp;&nbsp; if&nbsp; HlAgent &lt;&gt; 0 then<br />
&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ShowMessage('主' + IntToStr(Cardinal(@ds)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SendMessage(HlAgent,WM_COPYDATA,0,Cardinal(@ds));&nbsp;&nbsp; //发送WM_COPYDATA消息,并带上参数 @ds<br />
&nbsp;&nbsp;&nbsp; end;<br />
&nbsp;&nbsp;&nbsp; FreeMem(ds.lpData); //释放数据内存<br />
&nbsp; end;</p>
<p>2.<br />
&nbsp;&nbsp;&nbsp;&nbsp;接收方程序:<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; procedure MyMessage(var m:TWmCopyData);message WM_CopyData;&nbsp;&nbsp; //定义一个消息响应过程,并传入一个TWmCopyData的参数<br />
&nbsp;&nbsp;&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp;&nbsp;procedure TmsgpopMainCaller.MyMessage(var m: TWmCopyData); //实现响应<br />
&nbsp;&nbsp;&nbsp;&nbsp;var<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg:string;<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg :=StrPas(m.CopyDataStruct^.lpData);&nbsp;&nbsp;&nbsp; //获取参数数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessageForm := TShowMessageForm.Create(self,msg);&nbsp; //处理<br />
&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
&nbsp;</p>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br /><img src ="http://www.blogjava.net/wangxunhua/aggbug/330446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxunhua/" target="_blank">叽哩咕噜</a> 2010-08-31 18:31 <a href="http://www.blogjava.net/wangxunhua/archive/2010/08/31/330446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>