98.5.24
INI文件的操作要点
(1)在interface关键字后的uses子句中加入
uses ...,inifiles;
(2)设置变量:var inifile:=TIniFile;
(3)使用前,一定要先做:
inifile:=TIniFile.Create(inifilename);
我在这里绕了个弯子,写成
inifile.Create(inifilename);
TShiftState用来检测CTRL,ALT,Shift,以及鼠标按键的状态,
常常用在键盘或鼠标的事件处理程序之中。
DCU文件(编译的库单元)的重用
(1)在interface里的uses子句中引用。如Windows,Dialogs,
等等,要求被引用的DCU一定要放在Delphi 3/Lib子目录中。
(2)在implementation里的uses子句中引用。如果是自行编写的
DCU文件,应采用这一方式,并将被引用的DCU文件放入当前
工程所在的子目录中。
executefile函数(在FmxUtils.DCU中定义)不能用在FormCreate
事件中。真奇怪......
内置的版本号控制功能
在Project Options中的VersionInfo项里,有版本信息的定制,
包括一个有趣的版本号自动增加功能(Auto-increment build
number),即每Build一次,版本号中的Build Number加1。选中
Include version information in project,编译,用资源管
理器里找到生成的.exe文件,点右键,查看“属性”一项,就
会看到在属性中多了一页“版本”,里面就是你刚才输入的各
项内容。
98.5.17
定制Speedbar
右键点击左上角的加速键条(speedbar),选中Properties,
在列表框中找到你想要加入speedbar的命令按钮,将它拖到
speedbar上的合适位置即可。如果speedbar上没有多余的空间
来容纳新的按钮,可把鼠标在speedbar右框处变为双向箭头的
形状,向右拖动一段距离,就可腾出空间。如想删除speedbar
上的某个按钮,可简单地把它拖出speedbar的范围,就能删除。
98.5.13
计算出的字段
在写一个程序时,我要在DBGrid中显示出一个memo的部分信息,当我把那个
memo字段放进去后,运行时只能显示出“(memo)”字样。从书上找到计算字
段的用法后,我在TTable中增加一个计算字段MemoHeader,宽度为40,在此
TTable的OnCalcFields事件中输入:
with MyTable do
FieldByName('memoheader').asstring:=FieldByName('memo').asstring;
在DBGrid中放入MemoHeader,运行,OK!
字段编辑器
解决了上面的问题后,我继续学习字段编辑器的作用。原来,DELPHI通过字
段编辑器,近乎完美地实现了数据库的字段级的控制,这包括:
1)字段在DBGrid中标题、宽度、能否可见;
2)字段的显示格式和编辑时输入的过滤条件;
3)字段是否只读;
4)字段的类型:数据字段/计算字段/查询字段/内部计算字段;
5)字段的显示/赋值/修改等事件的定制。
Delphi真的...很强哟!
98.5.7
设计Form时的快捷键
Del 删除所选组件
Esc 选择当前组件的容器(通常是Panel,Group或Form)
F11 在Form或Unit和对象检查器之间切换
F12 在Form和代码编辑器间切换
Ctrl-F12 显示“查看Unit”对话框
Shift-F12 显示“查看Form”对话框
TAB 下一个组件
Shift-TAB 上一个组件
方向键 选中此方向上最近的组件
Ctrl-方向键 将所选组件移动一个点
Shift-方向键 将所选组件改变一个点的大小
Ctrl-Shift-方向键 将所选组件移动一个格
Shift-click 按住Shift键再用鼠标点击组件,可以选择多个组件。
--= 下面这条是我摸索出来的 =--
Ctrl-drag 按住Ctrl键在一个容器组件(如Panel,QReport,Groupbox等)
里拖动鼠标,可强制选择鼠标拖过的矩形框中的所有属于此容
器的可视组件但不包括该容器组件。
98.5.5
使用QReport的若干经验
1)QuickRep1.DataSet:=query1
不然无输出结果
2)从qrpt2man.doc中查知,格式化输出结果的方法是:
在QRDBText.Mask中设为.00;0,将使输出带两位小数。
3)设置Group时,先加入一个QGroup,再加入一个QRBand,将QGroup的
FooterBand设为刚才的QRBand,就可将其联系起来。
4)在Group中打印的合计数,其ResetAfterPrint设为True,可实现分组合计。
98.5.4
看了《中国计算机报》4月30日软件与应用版的《Delphi中创建Splash窗口》,
心里又是高兴又是惋惜。高兴的是我已经知道了这个方法(说明我水平不低:)
惋惜的是我应该写一篇同类的稿件,说不定...
(见我在4月16日的专题)
98.4.30
今天新学了个format函数,对给定的字符串格式化,返回结果字符串:
format('%*.*f',[8,2,123.456]); //等价于format('%*8.2f',[123.456])
format('%d %d %0:d %d'[10,20]);
取得系统信息
GetSystemInfo
98.4.29
(以下TIPS取自DelphiTI.zip)
播放一个wav文件
use mmsystem;
SndPlaySound('hello.wav',SND_FILENAME or SND_SYNC)
优化WIN95下的ORACLE连接
在[ORA_HOME]/NETWORK/ADMIN/SQLNET.ORA中增加一行
AUTOMATIC_IPC=OFF
(据说可将连接时间从15秒缩短至3秒!不过我试过似乎没啥改变...)
设置WIN95的墙纸
var s:string;
s:='c:/windows/athena.bmp';
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,Pchar(s),0);
InputBox,InputQuery和ShowMessage函数的威力
uses dialogs;
var s,s1:string;
b:boolean;
begin
s:=trim(Inputbox('NewPassword','Password','masterkey'));
b:=s<>'';
s1:=s;
if b then
b:=InputQuery('Confirm Password','Password',s1);
if not b or (s1<>s) then
ShowMessage('Password Failed');
end; // 试试吧!
使你的form适应不同的显示分辨率
假设你在800*600的分辨率下设计的form,第一步:
inplementation
const
ScreenWidth: LongInt = 800; {I designed my form in 800x600 mode.}
ScreenHeight: LongInt = 600;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
scaled := true;
if (screen.width <> ScreenWidth) then
begin
height := longint(height) * longint(screen.height) div ScreenHeight;
width := longint(width) * longint(screen.width) div ScreenWidth;
scaleBy(screen.width, ScreenWidth);
end;
end;
下一步,要让每个子控制的字体改变到合适的大小:
type
TFooClass = class(TControl); { needed to get at protected }
{ font property }
var
i: integer;
begin
for i := ControlCount - 1 downto 0 do
TFooClass(Controls[i]).Font.Size :=
(NewFormWidth div OldFormWidth) *
TFooClass(Controls[i]).Font.Size;
end;
98.4.27
用raise引发一个错误处理例程
示例:先给出下面的定义
type EPasswordInvalid=class(Exception);
这样你就可以随时引发一个"password invalid"的例外:
if Password<>CorrectPassword then
raise EPasswordInvalid.Create('Increect Password entered');
运行后,出现信息框
Project Project1.exe raise exception class EPasswordInvalid
with message 'Incorrect Password entered'. Process stopped.
Use step or run to continue.
再按Run按钮,出现一个信息框:
Incorrect Password entered.
1998.4.26
从DEMO例程中学到的若干小技巧
在demo/internet/http/webbrows/main.pas中,
procedure TForm1.DocumentSourceClick(Sender:Tobject);
begin
with DocSourceForm do
begin
show; // 显示HTML源码的FORM
Memo1.lines.clear; // 清空memo1中内容
Memo1.lines.add(HTML1.SourceText); // 植入源码
Memo1.SelStart:=0 // ***
SendMessage(Memo1.Handle, // Memo1的窗口句柄
EM_ScrollCaret //将Edit Control中的caret光标滚动到视野中
0,0 //这两个参数暂不使用
end;
end;
(此SendMessage系一WinAPI调用,给一个或一组窗口发送消息,直到
相应窗口处理此消息后才有返回值。相似的另一函数为PostMessage,
它将消息放入消息队列中后立即返回。)
*** 清空当前选择并将光标移动到指定字符(0代表第一个字符)。如同时
设memo1.sellength为一非0值,可选择一段文本。
1998.4.23
几个有关子目录的操作的过程:
MkDir(str);
ChDir(str);
GetDir(DriveID,str);
SetCurrentDir(str);
IOResult --上面几个过程调用成功即返回0值
1998.4.16 在demo/db下有一MastApp,演示了如何在启动一个大程序前期显示一个小小封面 splash.pas: begin SplashForm:=TsplashForm.Create(Application); SplashForm.show; SplashForm.update; //这一句强制调用WinAPI的UpdateWindow函数 ... ... end. 另一种在函数中返回值的方法: Function MyFunc(...):integer; begin ... ... MyFunc:=8; //只要对函数名赋值,函数立即返回。 end;
几个常用函数 MessageBeep --播放Windows标准声音文件 MessageBox --显示一个信息对话框 TWinControl类: SetFocus 设置为当前输入焦点 AsString 比 AsInteger 在表间字段互相赋值时更有效,更不易出错。 Application.Message('errtext','errcaption',mb_OK);弹出一对话框,按OK确定。
1998.4.15 用ExecuteFile执行一外部程序 uses ShellAPI; // 提供 ShellExecute 函数在demos/doc/filmanex目录下,有一FMXUtils中提供各种文件操作增强函数, 其中Function ExecuteFile(filename,params,WDir,SW_SHOW) 可运行外部程序。
1998.4.10 连入远程ORACLE服务器(续) 今天我发现,只需在TDatabase元件中,设DriverName为ORACLE,在Parms中加入 Server Name=orac, 照样能连入远程的ORACLE服务器,根本不需要设置BDE alias。
1998.4.9 发布自己的应用程序 今天使用DELPHI自带的Install Shield,做了一个安装程序。在没有装DELPHI的 机器上安装我做的数据库应用程序。开始系统提示找不到别名,最后我运行了一 下Bdeadmin.exe,增设一个别名,OK!
1998.4.8 连入远程ORACLE服务器 今天使用BDE设置oracle, OK。Net Protocol:TNS/ServerName=orac
1998.4.6 自动登录远程数据库 Database.Parms的内容如下: user name=[yourname] Database.Parms[1]:='password=yourpass' 再把Login Prompt一项设为False,其它的就不用再说了吧?
1998.4.1 在Win95 的 ORACLE client 中增加ODBC驱动 进入ORACLE 32-bit Adminstrator,选System DSN,Add,选择Oracle73(已在Easy Install中设好): Data Source Name: orac Description:My Oracle 7.3 ODBC SQL*Net Connect String:tns:orac --OK!