DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: a1871584487
今日帖子: 11
在线用户: 5
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 merlinfang (merlinfang) ★☆☆☆☆ -
盒子活跃会员
2003/5/24 16:51:48
标题:
[转贴]Delphi初学者乱入,个人经验之谈--》我觉得写的不错哦 浏览:3833
加入我的收藏
楼主: Delphi初学者乱入,个人经验之谈

偶现在算是一个标准的Delphi程序员,天天RAD。从学到负责项目,算来也就一年时 ----- 一年的Delphi程

序员。所以偶现在说的,都是这一年里的一些经验,相信很多初学者都会遇到。本贴专为联盟而创,为了发扬

光大我们的程序员队伍。我们不是为了生活而写程序,是为了乐趣而写程序,这样想,这样做,终究有一天,

偶相信我们国家的程序员水平,会让世界刮目相看...

PS:仅仅是杂乱谈些个人的想法,希望水平更高的高手能不吝赐教,同时也希望对那些想做程序、在学校里的

朋友、刚开始接触delphi甚至还想问“delphi、vc、c#、j ava...哪个更有前途”的mopers有帮助 ^-^




1、我怎么看待delphi的优势


这个不是照搬书上讲的,什么“菜鸟用vb,高手用vc,聪明人用delphi”。如果就编程来比较,我个人认为对于大部分桌面应用程序、数据库应用、一般的网络应用,delphi有相当快速的开发优势。而且出来的代码易读(相对于vb、vc),本身运行速度也令人满意(桌面应用来说)。打个比方,最初我用vb来转换一个数10W条的数据库(有些查询比较运算),后来改用delphi来做类似的工作。程序结构大体相同,vb做完需要以10分钟计...经常我运行着就去吃午饭了...而且还常常算到中间就死在那里了 :( 用delphi,还挂了一个grid显示,也就2、3分钟,后来把grid都去了,直接运算,也就几十秒。从那时起,我再也不用vb了。熟练delphi之后,RAD的速度是相当快的,因为VCL把底层都封好了,只用填好属性执行方法...再说VCL的速度做得相当不错,如果用vb和delphi做比较,我觉得microsoft是完全没有胜算的

但是vc就不太好比较了,应该是各有各的需求,毕竟delphi是专门针对RAD的。但delphi和vb不一样,如果水平够高,仍然可能接触到底层。你说用消息的概念来理解delphi可以吗?我告诉你绝对可以,你可以自己重载、接收绝大多数windows消息,可以从很基础的类继承,做自己的类似vc的视图/文挡体系。我觉得vc的很多思想与delphi是可以结合和互补的。当然可能没有必要用delphi来自己写消息、自己写底层,但是如果你需要的话,在相当程度上是可行的。这个话就说远了,对初学者没有什么意义,我建议大家有兴趣可以研究很多国外的优秀的控件代码,或者VCL的源码,可以发现很多类似c的风格 ---- 或者说,很好的对象结构,很复杂的数据类型,很高明的windows调用,从某种意义上来说,vc做得出来的东西,delphi同样做得出来。所以一个高明的c程序员,有时用用delphi也是有利的 ----- 快速学习、快速开发、稳定性,何乐不为呢?同样delphi的时候多多借鉴vc的经典,对提高也是相当大的。

说到这里,我想那些学校里的师弟们,应该了解为什么有句话叫“编程不局限于具体的开发语言,学习的只是编程的一种思维”

至于ASP、JSP、J AVA、C#,在我认为和delphi的交差性不是太大。delphi很多时候还是用来开发桌面应用,比如MIS...网络、分布式结构的应用只是一个方面。虽然这方面的应用会变得越来越多,不过不用担心的是,delphi本身的发展趋势还是向这些方面靠拢的。从6、7这两个版本引进的新VCL,比如Web Server/SOAP等等,都可以看出delphi还是紧跟趋势的。《程序员》李维的采访,也可以听出borland会更多的提供这方面的支持

。软件都是有生命周期的,delphi这类开发软件同样如此。不必拘泥于未来怎样,谁都不能说什么语言可以吃一辈子程序饭



2、delphi有些问题

现在说些我已经感觉到的问题:delphi的兼容性不是太好,如果开发层次比较高,使用了特定的引用等等,不能保证低版本(比如4、5)的代码能在6、7上不出问题。

delphi在编译上本身可能会有些问题。比如有一次我重载了一个类的destory

destructor TGcinfo.Destroy;
begin
inherited;

FBzsm.Free;
end;

destructor TGcinfo.Destroy;
begin
FBzsm.Free;

inherited;
end;

大家注意一下区别。inherited是继承父方法、FBzsm是个对象。没有例外应该是第二种写法,至少C是这样规定的,先释放自己重载的对象,才能释放父类。在这里FBzsm是个比较复杂的对象,还封装了一些消息处理。

结果我执行所谓的正确代码却运行常常出错!!!昏迷了很久,必须写成第一种,才没有问题 ---- 居然要先释放掉父类,而且即使这样,自身的对象释放仍然可行!!!如果我先FBzsm.Free;再inherited;居然会依旧触发FBzsm的消息,但这时FBzsm已经不存在了,所以出错..................

再举一个例子,我曾写了一个看图的程序玩。里面生成缩略图的代码如下:

procedure TLoadPicThread.Execute;
var
i:integer;
PicFile:PFileEntry;
Picture:TPicture;
begin
while not Terminated do begin
//生成所有未生成的缩略图
with MainForm do begin
Picture := TPicture.Create;
try
for i:= 6 to MainForm.PicFileList.Count - 1 do begin
//
PicFile := PicFileList[i];
if not(PicFile.LoadFlag) then begin
PicFile.Bitmap := TBitmap.Create;
try
Picture.LoadFromFile(PicFile.Path + PicFile.Name);
//如果不是位图格式则转换成位图
if not (Picture.Graphic is TBitmap) then begin
with PicFile.Bitmap do begin
PixelFormat := pf24Bit;
Width := Picture.Width;
Height := Picture.Height;
Canvas.Draw(0, 0, Picture.Graphic);
end;
Picture.Bitmap.Assign(PicFile.Bitmap);
end;
RescaleImage(Picture.Bitmap, PicFile.Bitmap, False);
//取图片属性
PicFile.Width := Picture.Width;
PicFile.Height:= Picture.Height;
case Picture.Bitmap.PixelFormat of
pf1bit: PicFile.Depth := 1;
pf4bit: PicFile.Depth := 4;
pf8bit: PicFile.Depth := 8;
pf15bit: PicFile.Depth := 15;
pf16bit: PicFile.Depth := 16;
pf24bit: PicFile.Depth := 24;
pf32bit: PicFile.Depth := 32;
else
PicFile.Depth := 0;
end;
//设置生成标记
PicFile.LoadFlag := true;
except
//忽略所有残缺或错误的图形文件
end;
end;
//
end;
finally
Picture.Free;
end;
end;
LoadPicThread.Terminate;
end;
end;

这段代码中with MainForm do begin ... end的部分,执行效果是什么...如果在线程里面执行这段,生成的时候你动动鼠标啊,拖拖窗口啊,会发现程序运行时产生了严重的内存泄露!也就是说,我单步调试这段代码,哪怕生成100张jpg的缩略图,内存使用都很正常的。可是一旦直接运行,什么都不动的话 ---- 还是很正常
;可是同时执行其他操作,问题就出来了 ---- 内存不断被使用而不能释放,100张jpg一load完,内存使用往往达到数百M,恐怖啊~~~ 到今天我都不知道为什么,现在这段代码被写在主线程里面正常使用着。但是我不敢在玩线程了,感觉上delphi的线程或多或少的有点问题,编译执行没有问题,但不稳定


3、一些给初学者的...


我不知道该怎么形容,去csdn查了查自己参与的问题,发现学会了一些小技巧。整理了部分出来,希望对初学者有帮助。以下大部分代码是我自己写的,可能时间比较早了,在命名上代码规范上 ---- 希望大家多多包涵




标准的文件搜索:

参数是目录名,搜索扩展名(以,或;间隔的串,比如‘jpg,bmp,gif;psd’)是否搜索子目录标志,传出值是一个列表
procedure SearchFileInFolder(const FolderName , SearchAttr : string ;
const SubFolderFlag : boolean; out FileList : TStringList);
var
FindFile: TSearchRec;
AttrList: TStringList;
s1 , s2: string;
count : integer;
begin
AttrList := TStringList.Create;
try
//解析扩展名到列表
s1 := SearchAttr;
if rightStr(s1,1)<>';' then
s1 := s1 + ';';
if (pos(';',s1)>0) or (pos(',',s1)>0) then begin
while (pos(';',s1)>0) or (pos(',',s1)>0) do begin
count := pos(';',s1);
if (pos(',',s1)0) then
count := pos(',',s1);

s2 := copy(s1,1,count - 1);
if leftStr(s2,1)<>'.' then s2 := '.' + s2;
s2 := LowerCase(s2);
delete(s1,1,count);

AttrList.Add(s2); 
end;
end
else begin
s1 := LowerCase(s1);
AttrList.Add(s1);
end;
s1 := ';
s2 := ';
AttrList.Sort;

//开始查找
s1 := FolderName;
if rightStr(s1,1)<>'\' then s1 := s1 + '\';
if DirectoryExists(s1) then begin
if FindFirst(s1 + '*.*', faAnyFile, FindFile) = 0 then begin
repeat
if FindFile.Attr <> faDirectory then begin
//比较扩展名
s2 := ExtractFileExt(FindFile.Name);
s2 := LowerCase(s2);
if AttrList.Find(s2,count) then
FileList.Add(s1 + FindFile.Name);
end
else begin
//目录则嵌套自身
if SubFolderFlag and (FindFile.Name <> '.')
and (FindFile.Name <> '..') then
SearchFileInFolder(s1+FindFile.Name,SearchAttr,SubFolderFlag,FileList);
end;
until FindNext(FindFile) <> 0;
FindCLose(FindFile);
end;
end; 
finally
AttrList.Free;
end;
end;





动态建立菜单项目的例子:

procedure TMainForm.AddMenuItemClick(Sender: TObject);
var
i : integer;
s : string;
begin
if Sender is TMenuItem then begin
i := TMenuItem(Sender).Tag - 100;
s := GetIni.ReadString(MySection,'OpenedFile' + inttostr(i),');
s := lowerCase(s);
if fileExists(s) or (copy(s,1,7)='http://&#39;) then begin
PlayList.Clear;
PlayList.Add(s);
PlayIndex := 0;
self.Play(PlayList[0]);
end;
end;
end;






一个关于窗体判断对象的例子
:刚进公司的时候学会的第一个东东
procedure TForm1.CheckBox1Click(Sender: TObject);
var
s:string;
ed:Tedit;
begin
s:=tCheckBox(sender).name;
s:=copy(s,length(s),1);
if TcheckBox(sender).checked then
//TEdit(findComponent('edit'+s)).enabled:=true
begin
ed:=findComponent('edit'+s) as TEdit;
ed.enabled:=true;
end
else
//TEdit(findComponent('edit'+s)).enabled:=false;
begin
ed:=findComponent('edit'+s) as TEdit;
ed.enabled:=false;
end

end;






传入外部启动参数的例子:


//外部启动参数
outerParamFlag := false;
for i := 0 to ParamCount() do begin
if AnsiEndsStr('.swf',ParamStr(i)) then begin
if fileExists(ParamStr(i)) then begin
PlayList.Add(ParamStr(i));
outerParamFlag := true;
end;
end
else
if AnsiEndsStr('.fls',ParamStr(i)) then begin
StrReadForFile(ParamStr(i),PlayList);
outerParamFlag := true;
end;
if outerParamFlag then self.Play(PlayList[0]);
end;

同时这里有个问题,获得程序安装路径的一个方法是:
MyPath := ExtractFilePath(Application.ExeName);
但要注意的是,如果是从快捷方式启动的程序,这个路径将是快捷方式的




标准的托盘:

{托盘演示程序}
{
Shell_NotifyIcon(dwMessage:DWORD;lpData:PNotifyIconData):UINT;stdcall
dwMessage: NIM_ADD新增;NIM_DELETE删除;NIM_MODIFY修改
TNotifyIconData
uses StdCtrls,ShellApi
}
unit trayUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus,StdCtrls,ShellApi;

const
WM_TRAYICON=WM_USER+1; //定义鼠标消息

type
TtrayForm = class(TForm)
PopupMenu1: TPopupMenu;
PMShow: TMenuItem;
PMExit: TMenuItem;
MainMenu1: TMainMenu;
MMFile: TMenuItem;
MMHide: TMenuItem;
MMStayOnTop: TMenuItem;
MMExit: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure PMShowClick(Sender: TObject);
procedure PMExitClick(Sender: TObject);
procedure MMHideClick(Sender: TObject);
procedure MMStayOnTopClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
//接收鼠标消息
procedure WMTrayIcon(var Message:Tmessage);message WM_TRAYICON;
//封装的shell-NotifyIcon代码
procedure ModifyTrayIcon(dwMessage:DWORD;ico:TIcon;Tip:String);
end;

var
trayForm: TtrayForm;

implementation

{$R *.dfm}

procedure TtrayForm.WMTrayIcon(var Message:Tmessage);
var
P:TPoint;
begin
{message.LParam 判断是否按下鼠标左键、右键、双击}
if message.LParam = WM_RBUTTONDOWN then begin
//mouse右键
if not(self.Visible) then PMShow.Caption:='显示(&S)'
else PMShow.Caption:='隐藏(&H)';
//使主窗体成为当前窗体,否则有时会出现弹出菜单不会消失的情况
SetActiveWindow(Handle);
//避免弹出菜单被任务栏挡住的情况
SetForegroundWindow(Handle);
//
GetCursorPos(P);
PopupMenu1.Popup(P.X,P.Y);
end;
if message.LParam = WM_LBUTTONDOWN then begin
//mouse左键

end;
if message.LParam = WM_LBUTTONDBLCLK then begin
//mouse左键双击

end;
end;

procedure TtrayForm.ModifyTrayIcon(dwMessage:DWORD;ico:TIcon;Tip:String);
var
nid:TnotifyIconData;
begin
with nid do begin
cbSize:=sizeof(TnotifyIconData); //结构大小
Wnd:=Handle; //接收消息的窗口句柄
uID:=0; //自定义tray icon序号
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
//包含NIF_ICON表示hicon可用
//NIF_MESSAGE表示uCallbackMessage可用
//NIF_TIP表示ssTip可用
uCallbackMessage:=WM_TRAYICON; //消息传递鼠标事件
hIcon:=ico.Handle; //显示在tray的图标
StrPCopy(szTip,Tip); //提示文字,不超过64哥ASCII字符
end;
Shell_NotifyIcon(dwMessage,@nid);
end;

procedure TtrayForm.FormCreate(Sender: TObject);
begin
ModifyTrayIcon(NIM_ADD,Application.Icon,'this write title word');
end;

procedure TtrayForm.PMShowClick(Sender: TObject);
begin
self.Visible:=not self.Visible;
end;

procedure TtrayForm.PMExitClick(Sender: TObject);
begin
self.Close;
end;

procedure TtrayForm.MMHideClick(Sender: TObject);
begin
ModifyTrayIcon(NIM_ADD,Application.Icon,Application.Title);
self.Hide;
end;

procedure TtrayForm.MMStayOnTopClick(Sender: TObject);
begin
MMStayOnTop.Checked:=not MMStayOnTop.Checked;
if MMStayOnTop.Checked then self.FormStyle:=fsStayOnTop
else self.FormStyle:=fsNormal;
end;

procedure TtrayForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ModifyTrayIcon(NIM_DELETE,Application.Icon,'this write title word');
Application.Terminate;
end;

end.

相关链接:http://www.mopsite.com/txt/311113197826530403.htm

(发帖时间:2003-04-24 17:59:31)

---oldproJ
回复(1):关于压缩 Zlib和ZIP:



Zlib使用delphi自带的单元,在delphi6的安装盘上可以找到
//文件加密压缩,这里的加密是自己的东东,仅供参考。压缩的代码比网上给的通用代码少用了一个流,大家有兴趣可以去找来比较一下区别
function TGetJJB.BuildZipFile(sFile , zipFile , key: String) : boolean;
const
FileFlag = 'TjbDataFile';
var
memReadStream , memDestStream : TMemoryStream;
ZipStream : TCompressionStream;
ZipCount: integer;
begin
Result := false;
//
memReadStream := TMemoryStream.Create;
memDestStream := TMemoryStream.Create;
try
//文件流读入内存
memReadStream.LoadFromFile(sFile);
ZipCount := memReadStream.Size;
//加密头信息
memDestStream.WriteBuffer(FileFlag, 12);
memDestStream.WriteBuffer(ZipCount,SizeOf(ZipCount));
//压缩至memDestStream
ZipStream := TCompressionStream.Create(clMax,memDestStream);
try
memReadStream.SaveToStream(ZipStream);
finally
ZipStream.Free;
memReadStream.Clear;
end;
//加密尾信息
memDestStream.WriteBuffer('DataFileEnd', 12);
//加密
setKey(key);
Blowfish_ECBEncrypt(Pointer(Integer(memDestStream.Memory)+12), memDestStream.Size-12);
//输出至文件
memDestStream.SaveToFile(zipFile);
Result := true;
finally
//关闭文件、临时文件
memReadStream.Free;
memDestStream.Free;
end;
end;

//压缩文件解压
function UnZip(ZipFile,DestFile : string): boolean;
const
FileFlag = 'TjbDataFile';
var
memDestStream , SourceFileStream: TMemoryStream;
UnZipStream : TDecompressionStream;
ZipCount : integer;
Buffer : PChar;
S : string;
begin
Result := false;
memDestStream := TMemoryStream.Create;
SourceFileStream := TMemoryStream.Create;
try
SourceFileStream.LoadFromFile(ZipFile);
//解密 
SetLength(s, 12);
SourceFileStream.ReadBuffer(s[1], 12);
SourceFileStream.Position := 0;
if s = FileFlag + #0 then begin
setkey(mainForm.EditKey.Text);
Blowfish_ECBDecrypt(Pointer(Integer(SourceFileStream.Memory)+12), 

SourceFileStream.Size-12);
SourceFileStream.Position := 12;
end
else
raise Exception.Create('错误的文件格式');

//获得原始流大小
SourceFileStream.ReadBuffer(ZipCount,SizeOf(ZipCount));
GetMem(Buffer,ZipCount);
//解压
UnZipStream := TDecompressionStream.Create(SourceFileStream);
try
UnZipStream.ReadBuffer(Buffer^,ZipCount);
memDestStream.WriteBuffer(Buffer^,ZipCount);
memDestStream.Position := 0;
memDestStream.SaveToFile(DestFile);
Result := true;
finally
FreeMem(Buffer);
UnZipStream.Free;
end;
finally
SourceFileStream.Free;
memDestStream.Free;
end;
end;

ZIP一般使用VCLZip,这是一个共享控件,在网上可以找到,以下这段代码是CSDN转贴的,自己改的那个有太多限制,不利于理解:
function Zip(ZipMode,PackSize:Integer;ZipFile,UnzipDir:String):Boolean; //压缩或解压缩文件
var ziper:TVCLZip;
begin
//函数用法:Zip(压缩模式,压缩包大小,压缩文件,解压目录)
//ZipMode为0:压缩;为1:解压缩 PackSize为0则不分包;否则为分包的大小
try
if copy(UnzipDir, length(UnzipDir), 1) = '\' then
UnzipDir := copy(UnzipDir, 1, length(UnzipDir) - 1); //去除目录后的“\”
ziper:=TVCLZip.Create(application); //创建zipper
ziper.DoAll:=true; //加此设置将对分包文件解压缩有效
ziper.OverwriteMode:=Always; //总是覆盖模式
if PackSize<>0 then begin //如果为0则压缩成一个文件,否则压成多文件
ziper.MultiZipInfo.MultiMode:=mmBlocks; //设置分包模式
ziper.MultiZipInfo.SaveZipInfoOnFirstDisk:=True; //打包信息保存在第一文件中
ziper.MultiZipInfo.FirstBlockSize:=PackSize; //分包首文件大小
ziper.MultiZipInfo.BlockSize:=PackSize; //其他分包文件大小
end;
ziper.FilesList.Clear;
ziper.ZipName := ZipFile; //获取压缩文件名
if ZipMode=0 then begin //压缩文件处理
ziper.FilesList.Add(UnzipDir+'\*.*'); //添加解压缩文件列表
Application.ProcessMessages; //响应WINDOWS事件
ziper.Zip; //压缩
end else begin
ziper.DestDir:= UnzipDir; //解压缩的目标目录
ziper.UnZip; //解压缩
end;
ziper.Free; //释放压缩工具资源
Result:=True; //执行成功
except
Result:=False;//执行失败
end;
end;



以下是转贴的内容
BDE的打包发布:


精简Delphi数据库应用系统-定制BDE驱动程序 

Delphi程序员都知道,在数据库应用程序开发完成后,要发布程序需要同时发布BDE(Borland Database 

Engine),否则会引起错误“A Error occurred while attempingto initilize Borland Database 

Engine(Error $2109)”。当觉得程序太大而辛辛苦苦精简自己的程序到满意时,却发现BDE管理程序器需要9M

之巨,不由感到沮丧,真有点自己的努力被糟蹋的感觉。不过也不必太沮丧,只要肯尝试,还是有办法来精简

BDE的。 

---- 首先来看看BDE目录中的文件,所有文件确实有近9M大吧。不过有些可能是用不到的,关键文件的作用可

参见Bde32.HLP中“Introduction to Borland Database Engine”下的“Core BDE Files”,其中列出了BDE

的关键文件及其作用,可以以此作为依据来尝试精简BDE驱动程序。下面是各个文件的作用: 

---- 一、不可缺少的文件 

---- Blw32.dll:语言驱动函数库。 

---- Idapi32.dll:BDE基本函数库。 

---- Fareast.bll、Usa.bll:远东语言及美国语言驱动程序,对中文软件不可缺少。 

---- Idr20009.dll:错误信息库。 

---- 二、数据库驱动程序(根据需要选择一个或多个) 

---- Idasci32.dll:Ascii文本数据库驱动程序函数库,如果不用Ascii文本数据库,可以不要。 

---- Iddao32.dll:Access数据库驱动程序函数库,如果不用Access数据库,可以不要。 

---- Iddbas32.dll:dBase数据库驱动程序函数库,如果不用dBase数据库,可以不要。 

---- Idodbc32.dll:ODBC数据库驱动程序函数库,如果不用ODBC数据库,可以不要。 

---- Idpdx32.dll:Paradox数据库驱动程序函数库,如果不用Paradox数据库,可以不要。 

---- 三、其它驱动程序和配置文件(根据需要选择一个或多个) 

---- Idbat32.dll:批操作驱动程序函数库,如果不用TBatchMove控件或DbiBatchMove类函数,可以不要。 

---- Iddr32.dll:Data Repository驱动程序函数库,如果不用Data Repository功能,可以不要。 

---- Idprov32.dll:BDE DataSet provide驱动程序函数库,如果不用TProvider控件,可以不要。 

---- Idqbe32.dll:QBE驱动程序函数库,如果不用Query By Example,可以不要。 

---- Idsql32.dll:SQL查询驱动程序函数库,如果不用TQuery进行查询,可以不要。 

---- Idapi32.cfg:BDE配置文件,如果程序中没有特殊要求,可以不要。也可以在BDE管理器中设置正确后再

分发。 

---- 四、其它文件(一般不用) 

---- BDE32.HLP、BDE32.CNT:BDE帮助文件,可以不要。 

---- BdeAdmin.exe、BdeAdmin.HLP、BdeAdmin.CNT:BDE管理器及帮助文件,如果不会发生要求软件用户自己

配置BDE的情况时,可以不要。 

---- 其它*.BLL:其它国家和地区的语言驱动程序,可以不要。 

---- DataBump.EXE、DataBump.HLP、DataBump.CNT:数据库数据转移工具及帮助文件,可以不要。 

---- Localsql.HLP、Localsql.CNT:SQL查询语句帮助文件,可以不要。 

---- Sqllnk32.HLP、Sqllnk32.CNT:SQL连接帮助文件,可以不要。 

---- 在根据需要选择文件后,还要写注册表文件。这个应该不成问题,可以手工设置,但最好在程序中设置

,在发现注册表中没有相应键值时写入,用TRegFile对象用不了几行代码的。需要设置的注册表键值有(在调

用数据库操作前需要有正确的键值存在): 

---- 数据驱动程序所在目录的设置: 

---- HKEY_LOCAL_MACHINE\Software\Borland\Database Engine\DLLPATH(字符串值) 

---- 语言驱动程序所在目录的设置: 

---- HKEY_LOCAL_MACHINE\Software \Borland\BLW32\BLAPIPATH(字符串值) 

---- 语言驱动程序文件名:HKEY_LOCAL_MACHINE\ Software\Borland\BLW32\LOCALE_LIB#(字符串值) 

 其中#为编号,按顺序为0、1、2、3......如:
 HKEY_LOCAL_MACHINE\Software\Borland\
BLW32\LOCALE_LIB0="fareasst.bll"
 HKEY_LOCAL_MACHINE\Software\Borland
\BLW32\LOCALE_LIB1="usa.bll"

---- 就这些了,按此办法即可有效减少BDE驱动程序的大小,例如只用TTable控件操作Paradox数据库,则只

要Idapi32.dll、Blw32.dll、Idr20009.dll、Fareast.bll、Usa.bll、Idpdx32.dll六个文件即可。 

---- 这些文件可放在任何一个目录,只要在注册表指明即可。OK,BDE由9M多减到不到2M,ZIP一下就700多K

了,比原来的应用系统减少了不少吧。

----------------------------------------------
欢迎进入mop.6to23.com
作者:
女 123 (猪猪) ★☆☆☆☆ -
盒子活跃会员
2003/5/24 18:18:08
1楼: 我看过的按此在新窗口浏览图片
----------------------------------------------
-
作者:
男 merlinfang (merlinfang) ★☆☆☆☆ -
盒子活跃会员
2003/5/24 18:47:08
2楼: 看过的好了不起按此在新窗口浏览图片
说笑的
----------------------------------------------
欢迎进入mop.6to23.com
作者:
男 zjan521 ( ) ★☆☆☆☆ -
盒子活跃会员
2003/5/25 0:13:20
3楼: 呵呵,这篇文章的题目倒是很贴切的
没能够读完,读到了线程那一块,
是呀,什么呀,哪里能这样用线程呢,大部分VCL本身就是非线程安全的嘛
不要怪Delphi,需要查一下TThread的帮助按此在新窗口浏览图片
----------------------------------------------
-
作者:
男 hawkwyz (wyz) ★☆☆☆☆ -
普通会员
2003/12/20 0:42:06
4楼:
---oldproJ
回复(1):关于压缩 Zlib和ZIP:
段落中,有
//加密
setKey(key);
Blowfish_ECBEncrypt(Pointer(Integer(memDestStream.Memory)+12), memDestStream.Size-12);
但是文章中没具体说明,楼主能不能将实现过程详细说明一下,谢谢!
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行85.9375毫秒 RSS