Delphi----心得04

98-11-1 1:48
嘿嘿,今天找到了Windows95的“浏览文件夹”对话框的调用方法
竟然简单得很:用SHBrowseForFolder。同时还找到了另外几个有用
的API,SHGetDesktopFolder,SHChangeNotify,SHAddToRecentDocs,
SHFileOperation,SHGetFileInfo,SHGetInstanceExplorer等等。

98-10-28 21:04
多线程里有文章
我编的金手指(Webmoney)运行得挺好,只有一点:拨号后常常
会发生“非法指令”错,导致中途退出。这个中原因也很不易
找。但我发现在Dialup过程中,产生了第二条Thread,心念一
动,在DialStatusDlg里的Dial成功后,并不立即关闭这一Form,
增加了一段延时(2秒),此后拨号功能使用起来就一切完全正
常,这说明,很可能是拨号完成后,立即关闭产生拨号过程的
Form,会造成拨号Thread完成返回时找不着“北”,极易发生
上述的“非法指令”错。

98-10-28
我的介绍RXLib的文章《中国计算机报》上发表了。在这里介绍一
安装过程。(仅对2.50版而言)

运行RXLib.zip里的rxlib250.zip里的rxinst.exe,它自动释放到Delphi
下的RX子目录里。运行Delphi,选择File->Open...,打开unit里的
DCLRXCTL.dpk,点击 Install,不一会,RX Controls元件组就装好
了。关闭这个Package窗口,打开DCLRXDB.dpk,再Install,装上
RX DBAware。关闭这个Package窗口,打开DCLRXTLS.dpk,Install,
出现错误提示;注意到Code 窗口里有一Dclrx4的页,关闭这一页,
再Install,OK。

到这一步,安装已经算是完成了。下面打开RX/Demo/RXDemo.dpr,运
行一下。哼!一点都不Cool…… 但别忙下结论,好好看一下,是不是
每一项新功能都极其实用呢?

98-10-26
今天在maillist上抓到两个有用的例程
unit Tools;

interface

uses
Windows,
WinSock,
SysUtils;

function LocalIP : string;
function LocalComputerName : string;

implementation

{$R *.DFM}
function LocalIP : string;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
I : Integer;
GInitData : TWSADATA;

begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while pptr^[I] <> nil do begin
result:=StrPas(inet_ntoa(pptr^[I]^));
Inc(I);
end;
WSACleanup;
end;

function LocalComputerName : string;
var
Buffer : pchar;
I : Integer;
begin
getmem(buffer,100);
i:=99;
GetComputerName(Buffer,i);
Result := string(Buffer);
freemem(buffer);
end;

98-10-25
在调试GameMenu时,每当我在Delphi集成环境里第二遍或第三遍运行的
时候,就会出现莫名其妙的死机现象,最后系统会不稳定,还总是会出
现蓝底白字的提示画面。总是找不到原因,只要不在集成环境里运行,
重复多少遍都没问题。后来我一步一步地单步执行,发现在
  SmallImages.Handle := ShGetFileInfo('*.*', 0, SHFileInfo,
  SizeOf(SHFileInfo), SHGFI_SMALLICON or SHGFI_ICON or SHGFI_SYSICONINDEX);
处程序会自动分成两个线程同时运行。这说明ShGetFileInfo调用是一
个线程级的系统调用。后来又发现,在集成环境中如果在上次运行结束
后等好几秒钟再运行,就没有死机现象再发生。看来Delphi有一套自己
的管理线程的机制,在多线程环境里,程序结束后,有的线程并没有结
束,如果立即再次运行,往往会造成系统崩溃。

98-10-23
INI文件注意事项
INI文件的优点显而易见:它是文本文件,能够直接查看和编辑;Delphi
提供了对INI文件的极其方便的过程和函数。在使用中,应该注意,如
果运行下面语句,那么将在Windows子目录中打开这一INI文件:
    ini:=tinifile.create('myapp.ini');
如想打开当前工作目录里的myapp.ini,应该这样写:
    ini:=tinifile.create('./myapp.ini');

98-10-20
“金手指”由于使用了Net Manage公司的控件THTML,造成必须同时安
装NM*.dll和好几个.ocx文件才能运行。都怪我只顾低头编程,没有测
试安装方面的问题。THTML还有一个缺点就是当一个请求超时或找不到
对方地址时,会产生难以控制的异常,并退出程序。到处找THTML的替
代控件也找不到,问了一位网上高手也没有帮助,真愁人啊!

想起ACTIVE-X。在菜单里找到并选中Import ActiveX Control,出现
所有Delphi能够安装的ActiveX组件。在各式各样的组件里,我找到了
描述为“Microsoft Internet Controls(Version 1.1)”,文件路径为
c:/windows/system/shdocvw.dll的ActiveX控件。(这名字可够怪,是不是
微软害怕别人看出这就是他的杀手锏:IE4?)

安装(Install),选OK,下面的对话框询问要不要现在就Rebuild,选yes。
结束后,将在ActiveX组里出现三个新增组件:Webbrowser_V1,
Webbrowser和ShellFolderViewOC。关闭当前Package窗口,并保存。

把一个Webbrowser放入Form里,属性窗口即出现它的长串的属性。找
了许久,也没有找到自己料想的“URL”属性。难道我弄错了?我不愿
就此放手,因为已没有别的选择。增加一个按钮Button1,双点进入它
的onClick事件,输入Webbrowser1,又键入一个点,很快,Webbrowser
的属性、事件、方法都显示出来了。(Delphi3的Code Insight真好用。)
我逐个翻找,发现了:Navigate: procudure(CONST:UTL...一看有门,我
按照函数原形,在前面定义:var ov:olevariant;然后输入代码:
webbrowser1.Navigate('http://default/afg/index.htm',ov,ov,ov,ov);
运行,硬盘哗哗地响了一段时间,出现了我的主页!效果和使用IE4一
模一样!!看看办公室没别人,我哈哈大笑了两声。

素闻Delphi3拥有对ActiveX的绝好支持,今日方始亲身体会得到。信手
得来的别人的控件,Delphi象用自己的一样随心所欲。选取View|Browser,
在对象浏览器里查看新增的Webbrowser等控件的各项属性,哇噻!
简直是把整个IE4浏览器搬进来了。

98-10-17
经历了5个不眠之夜,终于写完了“金手指”(Webmoney)。呼!
累惨了。今天为它申请了一个免费域名http://webmoneys.yeah.net
把它放在963个人主页站上。

98-10-13
正当我为编程拨号发愁时,在32 Bit Delphi 深度历险发现
一个好控件:Dialup。安装后,用起来简直好极了,看了demo
后我知道,我需要的90%以上的拨号功能都能用它实现。我越来越
喜欢Delphi,有了开放的控件,编起程序来用上别人做的现成的
好东西,方便极了。

值得一提的是32 Bit Delphi 深度历险这个站点,看来已有两
三个月没有更新过了,但仍有很大的参考价值,速度也比较快。这
里的控件是我所见过的中文站点中最多、最全的建议朋友们如果想
找控件的话,就到这里来找找。
98-10-12 1:15
上月调试GameMenu时,出现了莫名其妙的系统故障,结果再次打
开Gamemenu.dpr时,竟然连续出现错误,大体是什么VCL30.dpr,
什么"Access violation" "FFFFFFFF",还有
  Error reading FileList.columns: Stream read error.

等等。把子目录下的内容完全拷贝到另一台好机器上,同样错误
再次出现。一个多月前倒是有个备份,可那以后我又改了好多……
真的不想重新来过!只好想想办法。在资源管理器里双点main.dfm,
Delphi现身出来把它打开成为一个文本文件(用Notepad等工具
是不成的。)记得有一个错误信息是关于“ListView”的。找到
ListView那行:
    object FileList: TListView
      Left = 0
      Top = 0
      Width = 246
      Height = 329
      Align = alClient
      ColumnClick = False
      OnClick = FileListDblClick
      Columns = <
        item
          Caption = '文件名'
          Width = 450
        end
        item
          Caption = '大小'
        end
        item
          Caption = '文件类型'
          Width = 150
        end
        item
          Caption = '文件日期'
          Width = 130
        end>
        ... (略去12行)
    end
看来这个ListView的Column属性可能不大对。试着把Columns=
到end>和它们之间的行删掉,save,再打开Gamemenu.dpr,行
了!!!

但在进一步调试时,存盘后又出现了同样的错误。我增加了一
个ListView,各项属性调成和FileList一样,删除FileList,
把就增元件改名为ListView,这回彻底解决了问题。

这可是我自学Delphi以来解决的影响最大的困难。我想回头再
仔细看一下到底是哪一行出的毛病,但就是找不着了。虽然有
一点点莫名其妙,但仍值得大书特书。
1998-10-10
正在编写一个简易浏览器,在自动拨号上网部分遇到了一点麻烦:
  shellexecute(self.handle,'connect',
               'C:/WINDOWS/Start Menu/Internet/169.lnk','','',sw_show);
运行到此,会出现熟悉的拨号窗口,但要等待按回车。怎样才能自动拨号呢?
(又:怎样得到当前IP地址?)
1998-10-10
昨天上《中国计算机报》站点一看,简直要打心眼里乐出来:这期发表了两篇!不
错嘛。可惜这两个星期忙着搬家,几乎都荒废了Delphi的学习。今天上网,又找
到许多中文Delphi站点。看到网上的朋友个个功力非凡,我心忐忑;下载了几个
好东西,我意踌躇。革命尚未成功,同志仍需努力!

98-10-10 23:14
定制 Code Insight
在编制Delphi程序时,有一个小小的细节老是处理不好:输入
begin ... end 语句对,有人为了减少出错的机会,喜欢这样
做:输入“begin”,回车,回车,“end;”,再用光标键回
到begin下方继续输入内容;有人为减少击键次数,直接输入
begin,内容,end。对我来说,这两种方法都有可取之处。用
Code Insight试试吧。在主菜单里选 Tools -> Environment,
找到 Code Insight 一栏,点击“Add”,“Shortcut Name”
为 begin,“Description”输入“begin ... end”。最后在
下方的文本框里输入:

begin
  |
end;

OK。回到熟悉的编辑窗口,输入begin,按Ctrl-J,真爽!不知
这个小小的改动,将会带来多少方便。

98-10-10 2:07
延时:
procedure WinDelay( Duration : Longint );
var
  Start : Longint;
begin
  Start := GetTickCount;
  while GetTickCount - Start <= Duration do
    Application.ProcessMessages;
end;

98-09-15 15:14
我又发表了一篇稿件,但是...
这次的稿件在《中国计算机报》的9月7日D14版上。题目中“我和Delphi和故事”。
可我看完之后,一点也乐不起来。因为我把整个“开发心得”的内容都整理在里面
了。发表的部分只是其中我认为最微不足道的。而且还包括了半个月前的“Delphi
使用经验四则”里的两条!真难为情。

98-09-01 15:49
Delphi的一个“小”故障
今天在用Delphi时,发现Query组件的属性无法编辑了。当我试图打开一个已有的
Query的SQL属性时,Delphi提示:
  RichEdit line insertion error.
这是一个奇怪的错误信息。开始,我想重装一遍Delphi。这样问题一定可以解决。
接着,我改变了主意。也许正好能做一下试验。我打开光盘上的Delphi文件夹下的
把RUNIMAGE/DELPHI30/BIN下的所有文件复制到我的Delphi 3/bin下。不行……
这真是出乎我的意料。对了,想一下那句提示:RichEdit...,正好我的Win98里面
没有安装写字板,而写字板也是能做RichEdit处理的软件。于是在控制面板里选择
安装/删除程序,安装了Win98的写字板组件,再次启动Delphi,OK!

98-8-28 0:09
在程序中调用Win95的“请选择文件夹”对话框
这真是一个困扰我多日的难题。但今晚偶然查看RX元件包里的Fileutil.pas时,却
有种“踏破铁鞋无觅处,得来全不费功夫”的感觉。源码太难,怎么也看不懂……
不管它,先试试再说。我先点击“Add file to project”按钮,在对话框中选择
RX/Units/Fileutil.pas,再在Form1的uses子句里加上fileutil,在Form1上增加
一个按钮,双击它,输入如下语句:
  BrowseDirectory(s,'abc',0);
  showmessage(s);
运行,单击按钮,盼望已久的对话框终于出现!随便选一个,按OK,接着显示出已
选的文件夹的全称。小意思!

这件事远未结束。我又找到了好几个很棒的函数/过程库,包括:Bdeutils.pas,
Apputils.pas,Dateutil.pas,Dbutils.pas,Strutils.pas。瞧这些名字!我逐个打
开它们,眼都看得花了。有的函数是我在编程中想到要用的,更多的都是些精致的、
“懒人”专用的函数库。这几个是用BDE API做的:
procedure SetIndex(Table: TTable; const IndexFieldNames: string);
procedure RestoreIndex(Table: TTable);
procedure PackTable(Table: TTable);
procedure ReindexTable(Table: TTable);
这几个多是用了WinAPI:
function FindForm(FormClass: TFormClass): TForm;
function FindShowForm(FormClass: TFormClass; const Caption: string): TForm;
function ShowDialog(FormClass: TFormClass): Boolean;
procedure SaveGridLayout(Grid: TCustomGrid; IniFile: TIniFile);
这些是各种各样的日期型函数:
function CurrentYear: Word;
function IsLeapYear(AYear: Integer): Boolean;
function DaysPerMonth(AYear, AMonth: Integer): Integer;
function FirstDayOfPrevMonth: TDateTime;
篇幅所限,无法一一列举。有机会我一定会好好研究的。
这次的情形好象我要找一匹千里马,结果不光如愿以偿,还找到了《内功心法》以及
《轻功秘笈》,能不高兴吗?

98-08-27 10:01
本地SQL中日期型数据的表示
因开发需要,我想对日期型的字段进行条件限制。在Database Desktop中输入SQL语句
  select * from acc a where a.'date'='98-07-27'
DBD显示:Type mismatch in expression
查遍了DBD的Help,也没有找到日期型数据的转换函数。试了各种表达方式,也做不出。
我急了,想起Delphi提供了一个功能强大的QBE(Query by example)。我选择File->
New->QBE Query,在接下来的对话框里选acc.db,窗口上出现了acc表的各字段名称的
列表。我在Date字段前打了个勾,并输入'today',按F8,结果出来了。我再按下“Show
SQL”按钮,哈哈,一个标准的SQL语句显示出来:
  SELECT DISTINCT "acc.DB"."Date"
  FROM "acc.DB" 
  WHERE
  ("acc.DB"."Date" = '08/27/1998')
  ORDER BY "acc.DB"."Date"
原来,Paradox是用“/”来分隔日期的。到此为止,真相大白。
查看联机帮助,要改变Paradox的日期格式,应使用BDE Administrator。我依言而行,
在BDE Administrator中选Configuration->System->Formats,将SEPERATOR由“/”改
为“-”,存盘。退出DBD,进入DBD,再次重复上面的查询……怎么?!还是08/27/1998!
也许Delphi在这里做得不够完善也未可知。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值