17. 06.

Delphi建议将exit procedure写成exit procedure 链,但为保证链的完整,在把exitproc指向你的exit procedure前要先保存当前的exitproc的内容,同时你的exit procedure的第一条语句必须是reinstall exitproc。
var
  exitproc : Pointer;

procedure MyExit;
begin
  exitproc := exitsave;
  …
end;

begin
  exitsave := exitproc;
  exitproc := @MyExit;
  …
end.

何苦要先把exitproc赋给exitsave,然后exitsave再赋给exitproc,这两部时exitproc的内容一样吗?


17. 06.

如何把文本文件转换为Unicode文件呢?

顺便问一下,记事本中的Unicode编码类型是不是uft-16??

谢谢

notepad可以存utf-16 le/be,在保存或者另存的时候注意一下编码,unicode就是utf-16 little-endian,unicode big endian就是utf-16 big-endian

引用 2 楼 Seamour 的回复:
notepad可以存utf-16 le/be,在保存或者另存的时候注意一下编码,unicode就是utf-16 little-endian,unicode big endian就是utf-16 big-endian

楼上说的对。另外用UltraEdit32也可以。

广泛意义上来说,Unicode是一种国际字符集编码标准。具体的实现格式有UTF-8,UTF-16 (LE/BE),UTF-32(LE/BE)。目前Windows 2000及以上OS内核使用的都是UTF-16 LE(字节顺序和处理器相关)。

如果使用Delphi 2009及以上,你可以参考SysUtils.TEncoding类,转换非常方便。


17. 06.

我用ADOCONNECTION连到了excel文件,
我想在DBGrid中显示某个工作表,但是我要怎么知道这个EXCEL文件中有哪些工作表呢?

简单说就是怎么样获取工作表名,
使用ADOCONNECTION,ADOquery,

连接后,可以用ADOConnection1.GetTableNames()试试,能否获得列表,每个sheet就好像是一个table

sl:= tstringlist.create;
ADOConnection1.GetTableNames(sl,true);
showmessage(sl.text);

个人建议用cxGrid 你会发现 方便

学习了

自己写代码实现吧


17. 06.

使用的BDE 是不是说 编程序时文件夹在哪个目录就得安装到哪个目录?如不是,请推荐个安装程序
如是 请问怎么可以 实现安装在哪个文件夹都可以的功能
谢谢

我用的就是肥猫 可是安装到不带DELPHI的机器后 打开文件时显示错误

比如 我的原代码等文件在A电脑的D盘X文件下
我的问题是 是不是 安装到B电脑时 也要安装到 D盘的X文件夹下

如果必须这样的 话 我怎么才能使程序可以安装到 B电脑的 C盘X文件夹下

看你写程序是是否用了绝对路径(就是说调用文件是固定路径的),相对路径不存在你说的问题,bde可以安装到任意目录的
,相对路径例如ExtractFilePath(Application.ExeName);

我用的是绝对路径 
您的意思是 在 FORM CREATE的时候给TABLE等付值?》

引用 3 楼 emp 的回复:
看你写程序是是否用了绝对路径(就是说调用文件是固定路径的),相对路径不存在你说的问题,bde可以安装到任意目录的
,相对路径例如ExtractFilePath(Application.ExeName);

绝对路径,那就要安装到指定的目录了;
相对路径,安装在任何目录下都可以;BDE的连接方式还要配置ODBC才可以,建议选择ADO+相对路径,方便一些。

把绝对路径改成相对路径,不然指定A电脑的D盘X文件下,安装在B电脑,路径要一样的,你用的什么数据库?程序中动态配置数据库,路径用相对路径,就能达到(原代码等文件在A电脑的D盘X文件下
使程序可以安装到 B电脑的 C盘X文件夹下)这个目的
http://www.enet.com.cn/article/2004/0320/A20040320296087.shtml

引用楼主 lzhlovehdm 的帖子:
使用的BDE 是不是说 编程序时文件夹在哪个目录就得安装到哪个目录?如不是,请推荐个安装程序
如是 请问怎么可以 实现安装在哪个文件夹都可以的功能
谢谢

用installshield就可以的,制作安装文件过程中有些设置配好了就行了

使用delphi自带的installshield就可以把bde数据引擎打包,安装在program files目录即可

引用楼主 lzhlovehdm 的帖子:
使用的BDE 是不是说 编程序时文件夹在哪个目录就得安装到哪个目录?如不是,请推荐个安装程序
如是 请问怎么可以 实现安装在哪个文件夹都可以的功能
谢谢

BDE 安裝系統文件夾即可,就不用再考慮路徑的問題了。


17. 06.

比较大的库,用sql server,不是那种小的桌面型的。
是否会利用本地表,效率如何?
如果用,如何将本地表的数据提交到数据库,包括多表提交

一般不会吧?这不是自己给自己增加麻烦吗???

通常不会,可以在服务器上实现为何要用本地表呢

难道大型的数据库的功能还及不上本地表?

没必要,除非你想保留一些个性化的数据

如果不考虑网络不正常的情况,用不到本地数据库

谢各位,我也这么认为。但是无法说服项目负责人,他一定要用本地表,说和数据库交互频繁影响性能
我现在属于知其然不知其所以然,急切需要进一步提高,希望各位有什么好想法说说

引用 7 楼 westuser 的回复:
谢各位,我也这么认为。但是无法说服项目负责人,他一定要用本地表,说和数据库交互频繁影响性能
我现在属于知其然不知其所以然,急切需要进一步提高,希望各位有什么好想法说说

兄弟這誰說得清啊。
項目負責人如果是技術出生就應該有他的確切理由。

如果某些數據量大的基本資料放在本地那肯定效率要高很多。這要看情況的

git为什么好于cvs/svn
但是,也需要看具体的需求:跨地区,有分中心服务器。。。。。。。


16. 06.

DBGridEh 排序之后,每次排序焦点都会自动指定到第一行,排倒序时,焦点会自动跟随第一行到最后。

怎么能让 DBGridEh 排序时 不自动把焦点落到第一行, 或者在排倒序的时候把焦点落到最后一行在排序。

应该是当前排序列的第一行吧.不知你想要怎样.

恩,比如我按标题栏之后,光标在第一行,再按一下之后,光标就到最后一行,DBGridEh 也显示最后的几行。。。

我就是想在排序按下标题按钮时不让DBGridEh自动把焦点放上去。这样DBGridEh就只会只显示最上面的几行,而不是光标在哪里,DBGridEh 就自动跟随显示到哪里。

哪位大哥帮帮小弟

周六也没人?

先取后当前行的主键值,排序之后locate

先取得排序前光标当前字段值
然后
Locate(列名,字段值,[loCaseInsensitive]) ;

对哦,排序后再LOCATE

引用 3 楼 rentiantang520 的回复:
恩,比如我按标题栏之后,光标在第一行,再按一下之后,光标就到最后一行,DBGridEh 也显示最后的几行。。。

我就是想在排序按下标题按钮时不让DBGridEh自动把焦点放上去。这样DBGridEh就只会只显示最上面的几行,而不是光标在哪里,DBGridEh 就自动跟随显示到哪里。

即时用了locate后,你的光标在哪,DBGridEh的焦点也会跟随你的光标

这个无法解决!!你点击了什么控件,那它肯定获得焦点,获得焦点,那它必定停在有记录的头行中

除非程序控制停在某一行上

要么你就要用BookMark,原来停在哪一行就再定位回哪一行


16. 06.

一个bitbtn 一个richedit,一个 opendialog
按钮的单击事件:OpenDialog1.Execute;

opendialog 的filter属性设置:txt|*.txt

我想把打开后的文本导入到richedit中并且richedit只能支持下面的格式

例:
adsflkj544645 adkljwn454

中间的空格为Tab 键!

但说导入是很简单的,直接RichEdit1.Lines.LoadFromFile('文件路径')即可
如果还要限制导入的文本格式,那就先读文本,然后逐行判断是否符合要求,符合则添加
也可以一次性导入到RichEdit,然后逐行删除不符合格式的行

两个richedit,一个用来判断,一个用来显示,如楼上所说

引用楼主 chxgzs 的帖子:
一个bitbtn 一个richedit,一个 opendialog
按钮的单击事件:OpenDialog1.Execute;

opendialog 的filter属性设置:txt|*.txt

我想把打开后的文本导入到richedit中并且richedit只能支持下面的格式

例:
adsflkj544645 adkljwn454

中间的空格为Tab 键!

你這沒什麼格式吧。只是#9 Tab  那你載入時遍曆下不可見字符除了#10#13#9 其它都是非法。

可能是我说的还不够详细吧, 一个 按钮 单击事件 完成 打开文本,指定格式添加到richedit1里面

二楼说的方法也可以,具体实现代码应该如何写呢?


16. 06.

各位大侠,我用 sqlserver语句备份数据库发现一个奇怪问题
语句如下:
qrystr:=' BACKUP DATABASE lsy TO disk='''+tempstr+''''+' with init,stats';

qrystr:='use master restore database lsy from disk='''+tempstr+''''+' with Replace ';
现在的问题是
我将 数据库lsy 备份好后
从数据库lsy 中删除一个表yz
然后恢复数据库,按道理数据库中应有表yz
但是没有,想不通
谢谢

不是

贴完整点的代码
才好分析

首先谢谢您的帮助
procedure Tsjwh.BitBtn1Click(Sender: TObject);
  var qrystr,tempstr:string;
begin
  if trim(bftx1.Text)=''
    then
      begin
        messagebox(handle,pchar('请先输入备份数据库目录!'),pchar('信息!'),64);
        bftx1.SetFocus;
      end
    else
      begin  //1
        qrystr:='';tempstr:='';
        tempstr:=trim(bftx1.Text);
        qrystr:=' BACKUP DATABASE lsy TO disk='''+tempstr+''''+' with init,stats';

        adotemp.Close;
        adotemp.SQL.Clear;
        adotemp.SQL.Add(qrystr);
        try
                  adotemp.ExecSQL;
                  messagebox(handle,pchar('数据库备份成功!'),pchar('信息!'),64);
                except
                  messagebox(handle,pchar('备份数据库失败!'),pchar('信息!'),64);
                end;
      end;//1

end;

procedure Tsjwh.BitBtn3Click(Sender: TObject);
  var qrystr,tempstr,tempstr1:string;
      len:integer;
      kg:integer;
begin
  kg:=0;
  kg:=messagebox(handle,pchar('您确定恢复数据库吗?'),pchar('是否恢复?'),mb_yesNo+mb_iconquestion+mb_defbutton2);

  if kg=6
    then
      begin //  恢复1
  if trim(hftx1.Text)=''
    then
      begin
        messagebox(handle,pchar('请先输入备份数据库的目录!'),pchar('信息!'),64);
        hftx1.SetFocus;
      end
    else
      begin  //1
        qrystr:='';tempstr:='';  tempstr1:='';
        tempstr:=trim(hftx1.Text);
        len:=0;
        len:=length(tempstr)-3;
        tempstr1:=copy(trim(hftx1.Text),len,4);
        if tempstr1 <>'.bak'
          then
            begin  //11
              messagebox(handle,pchar('请输入有效的数据库文件!'),pchar('信息!'),64);
              hftx1.SetFocus;
            end//11
          else
            begin  //22
                tempstr:=trim(hftx1.Text);
                qrystr:='use master restore database lsy from disk='''+tempstr+''''+' with Replace ';
                adotemp.Close;
                adotemp.SQL.Clear;
                adotemp.SQL.Add(qrystr);
                try
                  adotemp.ExecSQL;
                  messagebox(handle,pchar('数据库恢复成功、重新启动程序!'),pchar('信息!'),64);

  main.close;

                except
                  messagebox(handle,pchar('恢复数据库失败!'),pchar('信息!'),64);
                end;

            end;//22

      end;//1
    end;//恢复2

end;


15. 06.

我在使用virtualstringtree控件时,用到了它的指定单元格的edit功能,在createEditor后,进入编辑框内,但是在编辑时我想对键盘输入的字符进行过滤,不能输入类似"/,*,"等字符,该如何往下进行,希望大家多多指教,先谢了!

在你create的Editor的KEYDOWN和CHANGE事件中过滤啊

引用 2 楼 yuyuhaso 的回复:
在你create的Editor的KEYDOWN和CHANGE事件中过滤啊

谢谢楼上,但是创建的editor的keydown事件要自己写吗?我找不到这个。

很显然得要自己写


15. 06.

有没有那个API控制D3D渲染的帧数的?控制画面每秒帧数的…
有知道的朋友麻烦说下,,谢谢了

越多越好…一切相关的API

自己控制用Sleep,或者你建立设备前将D3DPRESENT_PARAMETERS.PresentationInterval设为D3DPRESENT_INTERVAL_ONE,这样每秒的帧数就等于显示器的刷新率,如果你的程序没有画大量的三角形的话。

不是的.~~我是想修改某软件画面每秒的刷新频率…不知道该从哪些API入手…

望指教

这个不懂了。