delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks

#

大家帮帮忙,看看这句话怎么优化 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061221153924184.html
insert   into   mdb..tbnv   (counter_sno,in_no,trn_date,curr_no,item_no,account_no,trn_amt)select   isnull(counter_sno,true_sno),isnull(in_no,0),'20061206',isnull(curr_no,0),isnull(item_no,0),isnull(account_no,0) from   (select   *   from   sqlsrv.tbAc.dbo.tblsz_ht06   where   trn_date   =   '20061206')   a   right   join   (select   distinct(true_sno)   from   sqlsrv.tbJD.dbo.tbocrresult   where   trn_date='20061206'and   packfile   =   '2006120601'   and   len(true_sno)=12)   b   on   counter_sno   =   true_sno  
   
   
  其中mdb..tbnv   是用设置远程服务器的Access表,所有字段都不允许为空也没有默认值,sqlsrv.tbAc.dbo.tblsz_ht06和sqlsrv.tbJD.dbo.tbocrresult   都是另外服务器上的SQLServer表,其中记录数在300万左右,现在运行需要大概2分半时间,希望大家帮帮忙看看是否能把时间缩短到1分钟啊,其中表的索引我都已经加了不用考虑了,主要看看这句话什么地方还能优化的,谢谢大家

提前

一大堆,没仔细看,  
  简单的把你的代码改成这种伪代码  
  insert   into   tablename(c_name1,cname2,cname3...cname_N)第一部分  
  select   c_name1,cname2,cname3...cname_N   from       第二部分  
  一个由关联查询得到的新结果集合                                 第三部分  
   
  但如果不改表结构以及索引这些硬性的东西,单纯依靠从语句的修改来提升性能,那么唯一可以改的就是语句中的第三部分,即关联查询的那一部分,不了解的表,但要改,以就是根据你的表结构看看关联查询部分的性能提升

select   *   与distinct(true_sno)   优化不了       基本上没有什么可优化的了     300万数据也不少啊!

想办法把你的isnull去掉,列上尽量不要用函数

isnull是对结果的操作,用函数不会影响速度;  
  将select   *   换成select   字段列表

谢谢大家,这句话问题不大,我数据库连到了备份机上去了,所以才慢的,大家辛苦了

posted @ 2008-12-11 10:08 delphi2007 阅读(89) | 评论 (0)编辑 收藏

fastreport中动态创建series Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061221151613185.html
在fastreport的chart中动态创建多个series但预览时不显示,怎么解决.  
 
posted @ 2008-12-11 10:08 delphi2007 阅读(256) | 评论 (0)编辑 收藏

一个语法错误 ,但可通过编译 /// Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061221151440186.html
大家好,刚学DElphi遇如下问题  
    用ADoConnection,ADOquery,Datasource   ,Dbgrid   连接了一个SQLserver数据库Store后  
  用Button来触发一个查询操作,       代码如下:  
  StoreAll   为数据库store中的表  
  Combobox1中的items为表StoreAll中的ProductName   ProductNum   字段  
  Combobox2中的items为〉,=   ,  
   
       
  procedure   TForm3.Button1Click(Sender:   TObject);  
  var  
      STRis:string;  
  begin  
      if(Combobox1.Text='')and(Combobox2.Text='')and(edit1.Text='')  
      then   showmessage('请选择查询条件')  
      else  
      begin  
          STRis:='select   *   from   StoreAll   where   '+Trim(combobox1.Text)+  
          trim(combobox2.Text)+''''+Trim(edit1.Text)+'''';  
          if   Combobox1.Text='ProductNum'   then  
                STRis:='select*   from   StoreAll   where'+Trim(combobox1.Text)+  
                Trim(Combobox2.Text)+Trim(Edit1.Text);  
          with   ADOquery1   do  
          begin  
              close;  
              SQL.Clear;  
              SQL.Add(STRis);  
              open;  
          end;  
      end;  
   
  end;  
   
  这些代码可以通过编译   但是运行时   出现   第一行:‘   ’运行时有语法错误   。  
   
  反复试很多边   也找不到错误   ,恳请各位高手指点。。  
 

procedure   TForm3.Button1Click(Sender:   TObject);  
  var  
      STRis:string;  
  begin  
      if(Combobox1.Text='')   or   (Combobox2.Text='')   or   (edit1.Text='')  
      begin  
          showmessage('请选择查询条件')  
          exit;  
      end;  
   
          STRis:='select   *   from   StoreAll   where       '+Trim(combobox1.Text)  
                        +trim(combobox2.Text)+Quotedstr(Trim(edit1.Text));  
          if   Combobox1.Text='ProductNum'   then  
                STRis:='select*   from   StoreAll   where     '+Trim(combobox1.Text)  
                              +Trim(Combobox2.Text)+Trim(Edit1.Text);  
          with   ADOquery1   do  
          begin  
              close;  
              SQL.Clear;  
              SQL.Add(STRis);  
              open;  
          end;  
      end;  
  end;

if(Combobox1.Text='')   or   (Combobox2.Text='')   or   (edit1.Text='')     then   //少了一个then   不好意思  
      begin  
          showmessage('请选择查询条件')  
          exit;  
      end;

 
  STRis:='select   *   from   StoreAll   where   '+Trim(combobox1.Text)+  
          trim(combobox2.Text)+''''+Trim(edit1.Text)+'''';  
  是否这些个‘Text’之间缺少连接字?如where   '   +   Trim(combobox1.Text)   +   '='   +   .......   and(or)   ......

这是SQL语句的问题,建议你通过F8来查看STRis值,或者把STRis显示出来看看SQL语法有无问题!在解决!

posted @ 2008-12-11 10:08 delphi2007 阅读(178) | 评论 (0)编辑 收藏

高手帮忙!看看这是什么错误啊!我疯了!急急! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061221131048187.html
self.Query2.Close;  
  self.Query2.SQL.Clear;  
  self.Query2.SQL.Text:='insert   into   CJB(教师姓名,学时,金额)   values(:教师姓名,:学时,:金额)';  
  self.Query2.ParamByName('教师姓名').AsString:=(self.JSXMDBLookupComboBox.Text);  
  self.Query1.Params[0].AsString:='李令';  
  self.Query1.Params[1].AsString:='100';  
  self.Query1.Params[2].AsString:='100';  
  self.Query2.Open;  
  错误提示!  
  "Project1.exe   raised   exception   class   EListError   with   message   'List   index   out   of   bound(1)'.Pross   stopped   Use   Step   or   Run   to   conntinue"

应该对Query2.Params赋值,怎么对Query1赋值呢?

错误显示这一句的下标1超范围  
  self.Query1.Params[1].AsString:='100';

注意:  
      切莫用中文作为数据表的字段名与SQL语句的参数名称!!

楼上有理,建议以后编程都用英文,这个也是编程规范

一会query2,一会query1,  
  楼上正解   ,参数别弄汉字

楼主有待进一步提高代码的规范性,不过还好,比较整齐   呵呵!   还有数据集对象的使用没看到,怎么冒出个1来了!

posted @ 2008-12-11 10:08 delphi2007 阅读(90) | 评论 (0)编辑 收藏

大家说说,做一个在两个数据库之间同步数据的接口需要几天? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061221122557188.html
工作内容大概是5张表,分三种查询条件,把位于局域网的数据库中的数据,同步到另一台机器的数据库中。  
  做这个功能大概需要几天时间哪?

用Delphi开发,目标数据库插入数据用存储过程,源数据库查询数据可以用存储过程,也可以写SQL语句

前几天忙不过来,公司刚外包了这么一个功能^_^

SQLServer?  
   
  写直接在SQLServer里写DTS   啊,     一天搞定

这还要一天啊  
  半天就可以了

楼上的不厚道.  
  程式员薪资底都是你么搞坏的.  
  一天的事情要分成一个星期做.  
  要写代码,要测试,要泡妞,要赚钱.  
  你两分钟就做完谁会愿意给钱.  
    做好了也要放一放,懂不懂

gangjh(阿飛)你的良心的大大的坏了,你的良民的不是。我的3个月的搞定的,哟西!

楼上的,不生气.  
  我提提需求,你考虑下大概每阶段需要多少人工时.每阶段文档文档有多少.  
   
      1.   交付可行性报告.  
      2.   提交解决方案与评估.  
      3.   系统事物流程图.  
      4.   系统程序接口与代码规范.  
      5.   编码.   白盒测试.   同行审计.  
      6.   黑盒测试.  
      7.   客户教导与测试.  
      9.   交付与项目实施追踪.  
      10.   结案.  
 

posted @ 2008-12-11 10:08 delphi2007 阅读(336) | 评论 (0)编辑 收藏

动态生成复选框问题,数据更新问题? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061221122525189.html
问题1、我想让dbgrid最左边一列,也就是id旁边动态生成一列复选框,点复选框时也就选中了对应的记录,可以对本记录进行删除,修改等操作?  
  问题2、dbgrid中,我用   label1.caption:=inttostr(ADOQuery1.RecordCount);(放在formcreat中)来得到grid   中共有多少记录,但是当我插入一行新记录时,却不实时更新,如何处理?是不是应放到其它响应事件里啊?  
  请各位帮忙!!!

Query的afteropen事件中

posted @ 2008-12-11 10:08 delphi2007 阅读(185) | 评论 (0)编辑 收藏

ECOIII里怎么设置两个类( 表)的主外键关系?谢谢了!刚接触ECOIII Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061221122337190.html
ECOIII里怎么设置两个类(   表)的主外键关系?谢谢了!刚接触ECOIII

简要回答一下吧。  
  一般地,在两个类间连一个Association,设置好Association的两个AssociationEnd就行。  
  关于AssociationEnd的属性设置,一要注意Embeded,二要注意Multiplicity。

posted @ 2008-12-11 10:08 delphi2007 阅读(111) | 评论 (0)编辑 收藏

请问在Delphi里如何用ADO连接数据库,请大哥们讲解详细点 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061221115650191.html
请问在Delphi里如何用ADO连接数据库并返回数据,请大哥们讲解详细点,小弟感谢

你的問題太初級。沒人愿意回答。  
  這種問題在任何一本關於Delphi的書上都有。  
   
  如果看了書還是不會!那就說明你可以不用再編程了!

不帮就不要说风凉话  
  你建一个数据模块datamodule   加入adoconnection组件,  
  设置其属性connectionstring  
  例如:connectionstring:=“Provider=SQLOLEDB.1;Persist   Security   Info=False;User   ID=sa;Initial   Catalog=JLXH;Data   Source=WINXKM”  
  然后加载ADoDataSet   其connection属性全部指向adoconnection,   这样你就可以通过ADODATASET或其它数据集组件来操作数据库了!

用adoconnection建立连接  
   
  然后用adoquery,返回数据,其connection指向adoconnection  
   
  用datasource   连接感应控件(dbgrid等),其dataset指向adoquery

不帮就不要说风凉话  
  你建一个数据模块datamodule   加入adoconnection组件,  
  设置其属性connectionstring  
  例如:connectionstring:=“Provider=SQLOLEDB.1;Persist   Security   Info=False;User   ID=sa;Initial   Catalog=JLXH;Data   Source=WINXKM”  
  然后加载ADoDataSet   其connection属性全部指向adoconnection,   这样你就可以通过ADODATASET或其它数据集组件来操作数据库了!  
   
   
   
  别提   MD自己刚完成个程序就忘了用datamodule   搞的那都是ADO控件哈

ADOConnection,ADODataSet,DataSource,DbGrid

我来问Delphi只是为了工作需要,我本身不是学Delphi的,感谢各位大哥热心解答,鄙视一楼的垃圾,哎~~~一般这样的人技术都很菜,我见多了

posted @ 2008-12-11 10:08 delphi2007 阅读(256) | 评论 (0)编辑 收藏

我疯啦!快帮帮我吧!高手帮忙!怎么将数据库中的sum(合计)的值取出来?高手帮忙谢谢! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061221102432192.html
下面这段程序!  
  self.Query1.Close;  
  self.Query1.SQL.Clear;  
  self.Query1.SQL.Text:='select   distinct   sum(合计)   from   GZLB';  
  self.Query1.Open;  
  请问高手怎么能将sum(合计)合算的结果值取出来?放到一个变量里?  
  高手帮忙!帮忙!

self.Query1.Close;  
  self.Query1.SQL.Clear;  
  self.Query1.SQL.Text:='select   distinct   sum(合计)   from   GZLB';  
  self.Query1.Open;  
  mysum:=self.Query1.Fields[0].AsFloat;

同意楼上的`~也可以用别名  
   
  SQL.Text:='select   distinct   sum(合计)   as   SUM1   from   GZLB';  
  edit1.text   :=Query1.Fieldbyname('SUM1').asstring;  
 

解决!

大家都习惯了不结贴切了

接分.

我不是很及时的结帖了吗?

posted @ 2008-12-11 10:08 delphi2007 阅读(218) | 评论 (0)编辑 收藏

怎样刷新字段信息 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061221094459193.html
本人现在想在网格中,加入字段信息,  
  但设datafield属性时,总是提示   登录失败的错误,  
  数据库连接是用动态的,写在一个文本文件内。  
   
  我要怎么做才不会有这种错误~~  
   
  多给意见   谢谢各位给意见~~  
 

贴出代码和错误信息`~

错误信息就是'administrator登录失败'  
  就是一个很普通的连接,只是connectstring写在文本文件中  
  连接没问题,只是想选择一部分字段在网格中显示,设grid下的datafield属性就会有上面的错误

posted @ 2008-12-11 10:08 delphi2007 阅读(130) | 评论 (0)编辑 收藏

怎样判断ADOQuery数据集中的记录数是否为空,也就是判断数据集中是否有数据? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061221094018194.html
rt

ADOQuery.Open;  
  if   ADOQuery.Eof   then  
      数据为空  
 

ADOQuery1.Open;    
    if   ADOQuery1.IsEmpty   then

ADOQuery1.Open;    
    if   ADOQuery1.RecordCount<=0   then     数据为空  
 

ADOQuery1.Open;    
    if   ADOQuery1.IsEmpty   then  
  正解  
   
  不能以RecordCount为判断条件

if   ADOQuery.Eof   then  
  与  
  if   ADOQuery1.IsEmpty   then  
  这两个哪个更好一些?

if   ADOQuery1.IsEmpty   then   这个把握大些,不会出错。不依赖于其它的状态,只要ADOQuery1打开了就可以。Is译为是,Empty对为空,联系起来是:是空。    
  ADOQuery.Open;  
  //如果在AfterOpen事件里进行了操作,可能会导致判断不准确。  
  if   ADOQuery.Eof   then

1、ADOQuery1.RecordCount   是否为0  
  2、ADOQuery1.IsEmpty   是否为true  
  3     if   ADOQuery.bof=ADOQuery.eof   then   没记录  
        else   有!

posted @ 2008-12-11 10:08 delphi2007 阅读(892) | 评论 (0)编辑 收藏

这到底是怎么回事呀? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061221085732195.html
怎么我写了一段程序,删除满足条件的记录!  
  怎么运行起来老是提示:   Table   is   read   only   !  
  我已经把RequestLive属性设计有True   ;怎么回事!!!  
  哪位大虾帮下忙!!非常感谢!!!  
   
   
  下面是程序的一小段代码:  
  //按栋删除学生!  
      if   RadioButton6.Checked   =   true   then  
      begin  
          if   edit6.Text   =   ''   then  
          begin  
              showmessage('请输入栋号!')   ;  
              abort   ;  
          end   ;  
          i   :=   0   ;  
          query1.Close   ;  
          query1.SQL.Clear   ;  
          query1.SQL.Add('select   *   from   building   ,   house   ,   bed')   ;  
          query1.SQL.Add('   where   building.building_no   =   house.building_no     AND   house.house_no   =   bed.house_no   ')   ;  
          query1.SQL.Add('   AND   building.building_no   =   :para_building_no')   ;  
          query1.ParamByName('para_building_no').AsString   :=   trim(edit6.Text)   ;  
          query1.Open   ;  
          if   query1.RecordCount   >=   1   then  
          begin  
              while   Not   query1.Eof   do  
              begin  
                  if   query1.FieldByName('s_no').AsString   <>   ''   then  
                  begin  
                      s_no[i]   :=   query1.fieldByName('s_no').AsString   ;  
                      i   :=   i   +   1   ;  
                      query2.Close   ;  
                      query2.SQL.Clear   ;  
                      query2.SQL.Add('select   *   from   bed   where   s_no   =   :para_s_no')   ;  
                      query2.ParamByName('para_s_no').AsString   :=   query1.fieldByName('s_no').AsString   ;  
                      query2.Open   ;  
                      if   query2.RecordCount   >=   1   then  
                      begin  
                          query2.Edit   ;  
                          query2.FieldByName('s_no').AsString   :=   ''   ;  
                          query2.FieldByName('bed_state').AsString   :=   '不到'   ;  
                          query2.Post   ;  
                      end   ;  
                  end   ;  
                  query1.Next   ;  
              end   ;  
              i   :=   i   -   1   ;  
              while   i   >=   0   do  
              begin  
                  query1.Close   ;  
                  query1.SQL.Clear   ;  
                  query1.SQL.Add('select   *   from   student   where   s_no   =   :para_s_no')   ;  
                  query1.ParamByName('para_s_no').AsString   :=   s_no[i]   ;  
                  query1.Open   ;  
                  if   query2.RecordCount   >=   1   then  
                  begin  
                      query1.Edit   ;  
                      query1.Delete   ;  
                      query1.Post   ;  
                  end   ;  
                  i   :=   i   -   1   ;  
              end   ;  
              showmessage('删除操作成功!共删除'   +   inttostr(i+1)   +   '条记录!')   ;  
          end  
          else  
              showmessage(edit6.text   +   '栋不存在!')   ;  
    end   ;

query1.Edit   ;  
            query1.Delete   ;  
            query1.Post   ;  
   
   
  Delete   后不用POST

谢谢!  
  但是还是出现同样的错误!!!  
  奇怪,到底是哪里出现的问题?  
  真是找不出???   哪位大峡帮下???急呀!!!

query的readonly   的属性设为false看看  
 

query有readonly属性吗?  
  还是不行!

但是还是出现同样的错误!!!  
  奇怪,到底是哪里出现的问题?  
  真是找不出???   哪位大峡帮下???急呀!!!

你的数据库是只读的吧?  
  或者连接数据的用户名没有权限删除这个表.

应该不是这的原因!  
  我按照别的(比如说按照学号)就可以删除,所以不是你所说的那个原因!!!  
  真的不知道是什么缘故???  
  ??

怀疑是query1中的语句得到的视图,在你删除它中记录时,无法判断该删除的记录,所以会提示说只读的,你换一下方法,将你要删除的表放到query1中,其他的字段另想办法吧

怎么还是不行呀?  
  这是怎么回事呀?真搞不懂!!!

建议你的删除语句也用SQL语句写,这样就可以不必理会数据集的状态了。

我用了SQL语句写了,还是不行!!  
  哎!这是咋的?

如果用SQL语句写了都不行,应该是数据库自身的原因。

还是没有解决????

query1.RequestLive   设置为true   !

posted @ 2008-12-11 10:08 delphi2007 阅读(72) | 评论 (0)编辑 收藏

有用MyDAC连MySQL的Text或BLOB遭遇32KB文本超大难题的吗? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061221030445196.html
编一个资料库系统,客户强调采用UTF-8编码。  
  以配合以后的Web系统。  
  结果发现只有MyDAC支持UTF-8和Unicode。  
  但是在开发过程中发现,Memo或RichEdit中,  
  超过32KB的文本,无法存入MySQL数据库,  
  字段类型无论采用Text,Longtext,blob,longblob都不成。  
  怀疑是MyDAC本身的问题,用其附带的Text例子,也一样不能超出32KB。  
  特征解决方案。

试试最新版本的

我试过没问题  
  1.建表:  
      Create   table   t1   (a   longtest);  
  2.写数据:  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
        with   mySQLQuery1   do  
        begin  
              SQL.Text:='insert   into   t1   values(:ltext)';  
              Params.ParamByName('ltext').LoadFromFile('D:\t.txt',ftMemo);   //t.txt为82K文本文件  
              ExecSQL;  
        end;  
  end;  
   
  3.读数据:  
  var  
      t:TMemoryStream;  
  begin  
        t:=TMemoryStream.Create;  
        with   mySQLQuery1   do  
        begin  
              SQL.Text:='select   *   from   t1';  
              Open;  
              (FieldByName('a')   as   TMemoField).SaveToStream(t);  
              t.Position:=0;  
              Memo1.Lines.LoadFromStream(t);  
        end;  
        t.Free;  
  end;

我采用的是Table.Append,结果就是没有通过。没想到去试Query。  
  因为columns太多了,用query太麻烦。  
  用的MyDAC是MySQL   Data   Access   Components   4.4  
  不是Scibit   MyComponent,  
  Scibit   MyComponent对UTF-8支持不行。

用Query还是一样啊,  
  Access   violation   at   address   00403287   in   module   'DBMan.exe',   Read   of   address   001338B4

PS.  
   
  MySQL   Server是   5.0版的,测试服务器是Win32版本的,  
  会不会有问题?

应该与版本没关系(我也用5.0的).  
  开发C/S结构,除桌面数据库以外(fox/access等)尽量不要用table的方法.要用sql来对数据库操作,对于longtext/blob字段,要用Stream方式  
  你的  
  Access   violation   at   address   00403287   in   module   'DBMan.exe',   Read   of   address   001338B4  
  错,要查你的程序是否有内存溢出  
  另外,你可先写一段测试程序(如我上面的)看看是否为控件的问题  
 

我只用Table作Append,  
  Update和Del都用Query。  
  因为column太多了。  
   
  试过了,也一样。  
  看来是控件的问题。  
  MySQL   Data   Access   Components   4.4  
  自带的Demos,  
  用DBGrid+DBNav,写入也是一样的错误。  
   
  Demo源码:  
   
  Main.dfm  
   
  object   fmMain:   TfmMain  
      Left   =   245  
      Top   =   151  
      Caption   =   'MySQL   Data   Access   Demo   -   TEXT   fields'  
      ClientHeight   =   410  
      ClientWidth   =   593  
      Color   =   clBtnFace  
      Font.Charset   =   DEFAULT_CHARSET  
      Font.Color   =   clWindowText  
      Font.Height   =   -11  
      Font.Name   =   'MS   Sans   Serif'  
      Font.Style   =   []  
      OldCreateOrder   =   True  
      Position   =   poScreenCenter  
      PixelsPerInch   =   96  
      TextHeight   =   13  
      object   Splitter1:   TSplitter  
          Left   =   0  
          Top   =   233  
          Width   =   593  
          Height   =   2  
          Cursor   =   crVSplit  
          Align   =   alTop  
      end  
      object   DBGrid:   TDBGrid  
          Left   =   0  
          Top   =   25  
          Width   =   593  
          Height   =   182  
          Align   =   alTop  
          DataSource   =   DataSource  
          TabOrder   =   0  
          TitleFont.Charset   =   DEFAULT_CHARSET  
          TitleFont.Color   =   clWindowText  
          TitleFont.Height   =   -11  
          TitleFont.Name   =   'MS   Sans   Serif'  
          TitleFont.Style   =   []  
      end  
      object   ToolBar:   TPanel  
          Left   =   0  
          Top   =   0  
          Width   =   593  
          Height   =   25  
          Align   =   alTop  
          TabOrder   =   1  
          object   ToolButton1:   TToolButton  
              Left   =   362  
              Top   =   2  
              Width   =   16  
              Caption   =   'ToolButton1'  
              Style   =   tbsSeparator  
          end  
          object   btOpen:   TButton  
              Left   =   0  
              Top   =   2  
              Width   =   70  
              Height   =   22  
              Caption   =   'Open'  
              TabOrder   =   0  
              OnClick   =   btOpenClick  
          end  
          object   btClose:   TButton  
              Left   =   70  
              Top   =   2  
              Width   =   69  
              Height   =   22  
              Caption   =   'Close'  
              TabOrder   =   2  
              OnClick   =   btCloseClick  
          end  
          object   DBNavigator:   TDBNavigator  
              Left   =   139  
              Top   =   2  
              Width   =   220  
              Height   =   22  
              DataSource   =   DataSource  
              TabOrder   =   1  
          end  
          object   btCreate:   TButton  
              Left   =   451  
              Top   =   2  
              Width   =   69  
              Height   =   22  
              Caption   =   'Create'  
              Font.Charset   =   DEFAULT_CHARSET  
              Font.Color   =   clWindowText  
              Font.Height   =   -9  
              Font.Name   =   'MS   Sans   Serif'  
              Font.Style   =   [fsBold]  
              ParentFont   =   False  
              TabOrder   =   3  
              OnClick   =   btCreateClick  
          end  
          object   btDrop:   TButton  
              Left   =   520  
              Top   =   2  
              Width   =   70  
              Height   =   22  
              Caption   =   'Drop'  
              Font.Charset   =   DEFAULT_CHARSET  
              Font.Color   =   clWindowText  
              Font.Height   =   -9  
              Font.Name   =   'MS   Sans   Serif'  
              Font.Style   =   [fsBold]  
              ParentFont   =   False  
              TabOrder   =   4  
              OnClick   =   btDropClick  
          end  
      end  
      object   meComments:   TDBMemo  
          Left   =   0  
          Top   =   235  
          Width   =   593  
          Height   =   175  
          Align   =   alClient  
          DataField   =   'TextField'  
          DataSource   =   DataSource  
          MaxLength   =   65535  
          ScrollBars   =   ssBoth  
          TabOrder   =   2  
      end  
      object   ToolBar1:   TToolBar  
          Left   =   0  
          Top   =   207  
          Width   =   593  
          Height   =   26  
          ButtonHeight   =   24  
          EdgeInner   =   esNone  
          EdgeOuter   =   esNone  
          TabOrder   =   3  
          object   btLoad:   TButton  
              Left   =   0  
              Top   =   0  
              Width   =   75  
              Height   =   24  
              Caption   =   'Load   from   file'  
              TabOrder   =   0  
              OnClick   =   btLoadClick  
          end  
          object   btSave:   TButton  
              Left   =   75  
              Top   =   0  
              Width   =   75  
              Height   =   24  
              Caption   =   'Save   to   file'  
              TabOrder   =   1  
              OnClick   =   btSaveClick  
          end  
          object   ToolButton2:   TToolButton  
              Left   =   150  
              Top   =   0  
              Width   =   25  
              Caption   =   'ToolButton2'  
              Style   =   tbsSeparator  
          end  
          object   btClear:   TButton  
              Left   =   175  
              Top   =   0  
              Width   =   75  
              Height   =   24  
              Caption   =   'Clear'  
              TabOrder   =   2  
              OnClick   =   btClearClick  
          end  
      end  
      object   MyConnection:   TMyConnection  
          Database   =   'test'  
          IsolationLevel   =   ilSerializable  
          Options.UseUnicode   =   True  
          Options.Charset   =   'utf8'  
          Options.KeepDesignConnected   =   False  
          Username   =   'root'  
          Password   =   'xcvuht8m98qy'  
          Server   =   'localhost'  
          ConnectDialog   =   ConnectDialog  
          LoginPrompt   =   False  
          Left   =   344  
          Top   =   32  
      end  
      object   DataSource:   TDataSource  
          DataSet   =   Query  
          Left   =   440  
          Top   =   32  
      end  
      object   ConnectDialog:   TMyConnectDialog  
          DatabaseLabel   =   'Database'  
          PortLabel   =   'Port'  
          SavePassword   =   True  
          Caption   =   'Connect'  
          UsernameLabel   =   'User   Name'  
          PasswordLabel   =   'Password'  
          ServerLabel   =   'Server'  
          ConnectButton   =   'Connect'  
          CancelButton   =   'Cancel'  
          Left   =   376  
          Top   =   32  
      end  
      object   Query:   TMyQuery  
          SQLInsert.Strings   =   (  
              'INSERT   INTO   MYDAC_Text'  
              '     (MYDAC_Text.Name,   MYDAC_Text.TextField)'  
              'VALUES'  
              '     (:Name,   :TextField)')  
          SQLDelete.Strings   =   (  
              'DELETE   FROM   MYDAC_Text'  
              'WHERE'  
              '     UID   =   :Old_UID')  
          SQLUpdate.Strings   =   (  
              'UPDATE   MYDAC_Text'  
              'SET'  
              '     Name   =   :Name,   TextField   =   :TextField'  
              'WHERE'  
              '     UID   =   :Old_UID')  
          SQLRefresh.Strings   =   (  
              'SELECT   MYDAC_Text.Name,   MYDAC_Text.TextField   FROM   MYDAC_Text'  
              'WHERE'  
              '     MYDAC_Text.UID   =   :Old_UID')  
          Connection   =   MyConnection  
          SQL.Strings   =   (  
              'SELECT   *   FROM   MYDAC_Text')  
          FetchAll   =   True  
          Left   =   408  
          Top   =   32  
      end  
      object   OpenDialog:   TOpenDialog  
          Left   =   240  
          Top   =   259  
      end  
      object   SaveDialog:   TSaveDialog  
          Left   =   272  
          Top   =   259  
      end  
      object   sqCreateTable:   TMyCommand  
          Connection   =   MyConnection  
          SQL.Strings   =   (  
              'CREATE   TABLE   MYDAC_Text   ('  
              '     UID   INT   NOT   NULL   AUTO_INCREMENT   PRIMARY   KEY,'  
              '     Name   VARCHAR(50),'  
              '     TextField   BLOB'  
              ')')  
          Debug   =   True  
          Left   =   344  
          Top   =   68  
      end  
      object   sqDropTable:   TMyCommand  
          Connection   =   MyConnection  
          SQL.Strings   =   (  
              'DROP   TABLE   MYDAC_Text')  
          Debug   =   True  
          Left   =   380  
          Top   =   68  
      end  
  end  
 

Demo源码:  
  Main.pas  
   
  unit   Main;  
   
  interface  
   
  uses  
  {$IFNDEF   LINUX}  
      Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,  
      DBCtrls,   ExtCtrls,   Grids,   DBGrids,   StdCtrls,   ToolWin,   ComCtrls,   MyDacVcl,  
  {$ELSE}  
      SysUtils,   Types,   Classes,   QGraphics,   QControls,   QForms,   QDialogs,   QStdCtrls,  
      QDBCtrls,   QComCtrls,   QExtCtrls,   QGrids,   QDBGrids,   MyDacClx,  
  {$ENDIF}  
      DBAccess,   MyAccess,   DB,   MemDS;  
   
  type  
      TfmMain   =   class(TForm)  
          MyConnection:   TMyConnection;  
          DBGrid:   TDBGrid;  
          DataSource:   TDataSource;  
          ToolBar:   TPanel;  
          btOpen:   TButton;  
          DBNavigator:   TDBNavigator;  
          btClose:   TButton;  
          ConnectDialog:   TMyConnectDialog;  
          meComments:   TDBMemo;  
          Query:   TMyQuery;  
          Splitter1:   TSplitter;  
          ToolBar1:   TToolBar;  
          btLoad:   TButton;  
          btSave:   TButton;  
          OpenDialog:   TOpenDialog;  
          SaveDialog:   TSaveDialog;  
          ToolButton1:   TToolButton;  
          btClear:   TButton;  
          ToolButton2:   TToolButton;  
          sqCreateTable:   TMyCommand;  
          sqDropTable:   TMyCommand;  
          btCreate:   TButton;  
          btDrop:   TButton;  
          procedure   btOpenClick(Sender:   TObject);  
          procedure   btCloseClick(Sender:   TObject);  
          procedure   btLoadClick(Sender:   TObject);  
          procedure   btSaveClick(Sender:   TObject);  
          procedure   btClearClick(Sender:   TObject);  
          procedure   btCreateClick(Sender:   TObject);  
          procedure   btDropClick(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      fmMain:   TfmMain;  
   
  implementation  
   
  {$R   *.dfm}  
   
  procedure   TfmMain.btOpenClick(Sender:   TObject);  
  begin  
      Query.Open;  
  end;  
   
  procedure   TfmMain.btCloseClick(Sender:   TObject);  
  begin  
      Query.Close;  
  end;  
   
  procedure   TfmMain.btLoadClick(Sender:   TObject);  
  begin  
      if   Query.Active   and   OpenDialog.Execute   then   begin  
          if   Query.State   =   dsBrowse   then  
              Query.Edit;  
   
          TBlobField(Query.FieldByName('TextField')).LoadFromFile(OpenDialog.FileName);  
      end;  
  end;  
   
  procedure   TfmMain.btSaveClick(Sender:   TObject);  
  begin  
      if   not   Query.EOF   and   SaveDialog.Execute   then  
          TBlobField(Query.FieldByName('TextField')).SaveToFile(SaveDialog.FileName);  
  end;  
   
  procedure   TfmMain.btClearClick(Sender:   TObject);  
  begin  
      if   Query.Active   then   begin  
          if   Query.State   =   dsBrowse   then  
              Query.Edit;  
          Query.FieldByName('TextField').Clear;  
      end;  
  end;  
   
  procedure   TfmMain.btCreateClick(Sender:   TObject);  
  begin  
      sqCreateTable.Execute;  
  end;  
   
  procedure   TfmMain.btDropClick(Sender:   TObject);  
  begin  
      sqDropTable.Execute;  
  end;  
   
  end.  
 

很奇怪,我用MySQLFont写入的Longtext,读出没问题。  
  可是就是写入就Fail出那个内存溢出的错。  
  用UTF-8+Unicode的选项。  
 

posted @ 2008-12-11 10:08 delphi2007 阅读(452) | 评论 (0)编辑 收藏

DELPHI 7 用ADO里的ADOQUERY做主从表,总是报错 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220215617197.html
exhiStr:='SELECT   a.enterpid   as   enterpid,   a.enterpname,   a.enterpaddr,   a.enterpzip,   a.enterptel,   a.enterpfax,   '   +  
                  'a.enterpemail,a.enterpweb,a.enterptype,   a.enterpsize,   a.enterpnature,   a.enterpmemo,   a.prid,   '   +  
                  'a.prname,   a.cldid,   a.cldname,   a.personid,   a.personname,   a.personjobs,   b.prjenterpid,   b.prjid,   '   +  
                  'b.userid,   b.enterpimp,   b.prjenterpinsdate,   b.prjenterpupddate,   b.personmain,   c.prjname'   +  
                  '   FROM   venterpandperson   a,   prjenterpinfo   b,   projectinfo   c   '   +  
                  '   WHERE   (((a.enterpid   =   b.enterpid)   AND   (b.prjid   =   c.prjid))   AND   (a.personid   =   b.personid))';  
          RzDBGrid1.DataSource:=DM.DSListEnterp;  
          {DM.DSListEnterp.DataSet:=DM.DQListEnterp;}  
          DM.DQListEnterp.Close;  
          DM.DQListEnterp.sql.clear;  
          DM.DQListEnterp.SQL.Add(exhiStr);  
          DM.DQListEnterp.Open   ;  
          {enterpStr:=;}  
          DM.DQenterpmore.DataSource:=DM.DSListEnterp;  
          DM.DQenterpmore.Close;  
          DM.DQenterpmore.SQL.Clear;  
          DM.DQenterpmore.SQL.Add('select   enterpid,enterpname   from   enterpinfo   where   enterpid   =:enterpid');  
          DM.DQenterpmore.Prepared   :=true;  
          DM.DQenterpmore.Open;  
   
  上面这样的代码,总是报parameter   object   is   improperly   defined的错误

请问是什么原因导致的这样的错误呢?

没有人碰到过这种情况吗.

主从表不是这样做的,Delphi的Demo中有例子,可先看看

你的错误在这一行,设置了:enterpid参数,却没给参数赋值,就打开Query,所以报错了  
   
  DM.DQenterpmore.SQL.Add('select   enterpid,enterpname   from   enterpinfo   where   enterpid   =:enterpid');  
 

DEMO里是用ADODATASET来做的,用ADOQUERY不可以吗?

{DM.DSListEnterp.DataSet:=DM.DQListEnterp;}  
   
  老大,   这句话   为什么   注释掉?  
   
  拿掉后,   应该   就可以了。

我记得主从表很好做的,对ADOQUARY的SQL语句写完整后,设置一个主面一个从面就可以了

DM.DQenterpmore.SQL.Add('select   enterpid,enterpname   from   enterpinfo   where   enterpid   =:enterpid');  
  这句,设了参数,后面赋值

posted @ 2008-12-11 10:08 delphi2007 阅读(410) | 评论 (0)编辑 收藏

mdichildform子窗体显示如何自动隐藏主窗体的工具栏??? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220145944198.html
mdichildform子窗体显示如何自动隐藏主窗体mdiform的工具栏???

???

每个子窗体作上工具栏。  
  这样最大化后子窗体的工具栏显示在主窗体最上面了。。。  
   
  要不然你用寻找同名Action的方式也可以作到。  
  举个示例代码:  
  //     当主窗体的主工具栏按钮按下时去寻找子窗体中同名的Action并执行  
  procedure   TfrmMain.BindActiveFormExecute(Sender:   TObject);  
  var  
      ActiveForm:   TForm;  
      Action:   TAction;  
  begin  
      Action   :=   nil;  
   
      //     判断当前页是否有停靠窗口  
      if   (PageControl1.PageCount   >   0)   and  
          (PageControl1.ActivePage.ControlCount   >   0)   and  
          (PageControl1.ActivePage.Controls[0]   is   TForm)   then  
      begin  
          ActiveForm   :=   PageControl1.ActivePage.Controls[0]   as   TForm;  
   
          //     寻找当前Action  
          if   Sender   is   TAction   then   Action   :=   FindSameAction(ActiveForm,   Sender   as   TAction);  
      end;  
   
      //     执行绑定过程  
      if   Assigned(Action)   then   Action.Execute;  
  end;  
   
   
  //     更新主窗体的Action的Enabled有效性  
  procedure   TfrmMain.BindActiveFormUpdate(Sender:   TObject);  
  var  
      ActiveForm:   TForm;  
      MainAction,   Action:   TAction;  
  begin  
      Action   :=   nil;  
   
      //     寻找当前快捷菜单的Active  
      if   (PageControl1.PageCount   >   0)   and  
          (PageControl1.ActivePage.ControlCount   >   0)   and  
          (PageControl1.ActivePage.Controls[0]   is   TForm)   then  
      begin  
          ActiveForm   :=   PageControl1.ActivePage.Controls[0]   as   TForm;  
          Action   :=   FindSameAction(ActiveForm,   Sender   as   TAction);  
      end;  
   
      if   Assigned(Action)   then  
      begin  
          Action.Update;  
          MainAction   :=   (Sender   as   TAction);  
   
          //     设置Action属性  
          MainAction.Enabled   :=   Action.Enabled;  
          if   Action.Caption   <>   MainAction.Caption   then   Action.Caption   :=   MainAction.Caption;  
          if   Action.ShortCut   <>   MainAction.ShortCut   then   Action.ShortCut   :=   MainAction.ShortCut;  
      end   else   (Sender   as   TAction).Enabled   :=   False;  
  end;  
   
  //     在子窗体中寻找同名的Action  
  function   TfrmMain.FindSameAction(Form:   TForm;   Action:   TAction):   TAction;  
  var  
      ActionList:   TActionList;  
      i,   j:   Integer;                           //临时增加  
      frmSub:   TForm;                           //临时增加  
  begin  
      Result   :=   nil;  
      ActionList   :=   nil;  
   
      //ActionList   :=   TActionList.Create(nil);     //     基本没用  
      try  
          //     循环枚举窗口上的所有元素  
          for   i   :=   0   to   Form.ComponentCount   -   1   do  
          begin  
              //     判断是否是子窗口  
              if   Form.Components[i]   is   TForm   then  
              begin  
                  frmSub   :=   (Form.Components[i]   as   TForm);                 //记录窗体子元件  
   
                  //     循环查找子窗口中的TActionList  
                  for   j:=0   to   frmSub.ComponentCount   -   1   do  
                  begin  
                      if   frmSub.Components[j]   is   TActionList   then  
                      begin  
                          ActionList   :=   frmSub.Components[j]   as   TActionList;  
                          Break;  
                      end;  
                  end;  
              end;  
   
              //     判断寻找到的控件是否是TActionList  
              if   Form.Components[i]   is   TActionList   then  
              begin  
                  ActionList   :=   Form.Components[i]   as   TActionList;  
                  Break;  
              end;  
          end;  
   
          //     没有找到退出过程  
          if   Assigned(ActionList)   then  
          begin  
              //     循环查找对应的Action  
              for   i   :=   0   to   ActionList.ActionCount   -   1   do  
              begin  
                  if   (ActionList[i]   as   TAction).Name   =   Action.Name   then  
                  begin  
                      Result   :=   ActionList[i]   as   TAction;  
                      Break;  
                  end;  
              end;  
          end;  
      finally  
          //ActionList.Free;             //     基本没用  
      end;  
  end;  
  主窗体里的ActionList里的Action的onExecute   绑定BindActiveFormExecute函数,那当子窗体打开后点主窗体的工具栏就会去找同名的action执行它的onexecute  
  而Onupdate应该绑定BindActiveFormUpdate过程,这样实现主窗体的工具栏按钮有效性跟据子窗体同名action来进行。

posted @ 2008-12-11 10:08 delphi2007 阅读(268) | 评论 (0)编辑 收藏

日期字段转星期,各位来帮帮忙吧. Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220145356199.html
数据库里只有日期这个字段没有星期,客户要求显示星期几.用select   datename(weekday,日期)   from   table在SQL可以实现但是在delphi说datenane没有定义,请问各位有没有办法将日期字段生成一个日期字段

沉得太快了~~~快点来人帮忙一下啊~

case   dayofweek(date)   of  
          1:result:='星期日';  
          2:result:='星期一';  
          3:result:='星期二';  
          4:result:='星期三';  
          5:result:='星期四';  
          6:result:='星期五';  
          7:result:='星期六';  
      end;

to:ron_xin(星雨)  
  这个我知道,我是说在数据库存查询的时候将本来已有的日期转为星期.问题我表达得不够清楚吗?

with   adoquery1   do  
  begin  
      close;  
      sql.clear;  
      sql.text   :=   'select   datename(weekday,日期)     week   from   table   ';  
      open;  
      showmessage(fieldbyname('week').asstring);  
  end;  
 

to:47522341(睡到8:30)  
  一开始我也是使用这种方法,但是delphi执行的时候提示datename未定义,你的可以运行吗?你是怎么处理的?

我用的是ACCESS数据库

dayofweek(date)

那应该是别名的问题~`  
  select   datename(weekday,日期)   as   datenane   from   table

我用的是ACCESS数据库!会不会不支持datename??因为我用另外一个SQL数据库表可以执行

在Access里建一个查询,在Delphi里调用这个查询  
   
  Access用的函数用在查询里

to:skertone()  
  可以举个例子吗?

ACCESS不支持吧`~并非SQL所有的函数都能在Access里用的`~

三种方法  
  1、根据   DATEPART('W',日期)   取出当天是星期几,然后通过IIF转换,反正就是7层  
   
  select   日期,IIF(DATEPART('W',日期)=1,'星期天',IIF(DATEPART('W',日期)=2,'星期一','根据IIF继续写下去'))   FROM   表  
   
  2、根据   DATEPART('W',日期)   取出当天是星期几,在Delphi中通过建立查找字段完成,当然得建立另外一个表保存那个数字对应星期几  
   
  3、Delphi通过格式化字段完成  
   
 

是啊,就是因为datename在access不支持才麻烦.有没有什么好的办法查询的时候显示星期呢?

to:Hank(星星农场)    
  可以格式化一整个字段的吗?可不可以说明的一下

Hank,你那个IIF是什么意思,delphi总是提示语法错误

俺实在是佩服你  
   
  第一种方案是纯SQL的东西,必须在TADOQuery中执行,不知你怎么在Delphi中用的  
   
  第三种方法是通过DisplayValue属性设置

哈哈,新手是麻烦点,不好意思.  
  我是在DAOQuery下执行的,但好像认不了IIF

终于可以通过编译了,看一下数据对不对

Hank(星星农场)你的第一种方法,不是生成了7列??

●function   DayOfWeek(Date:   TDateTime):   Integer;  
   
  Description  
   
  DayOfWeek   returns   the   day   of   the   week   of   the   specified   date   as    
  an   integer   between  
  1   and   7,   where   Sunday   is   the   first   day   of   the   week   and    
  Saturday   is   the   seventh.  
   
  Note:   DayOfWeek   is   not   compliant   with   the   ISO   8601   standard,    
  which   defines   Monday  
  as   the   first   day   of   the   week.   For   an   ISO   8601   compliant    
  version,   use   the   DayOfTheWeek  
  function   instead.  
   
  描述:  
  按照给定的TDateTime类型的参数Date,DayOfWeek   函数得到一周中的第几天,从1到7。  
  这里   星期日   是一周的第一天,而   星期六   是第七天。  
 

先取出日期,然后再delphi中转变

posted @ 2008-12-11 10:08 delphi2007 阅读(137) | 评论 (0)编辑 收藏

如何防止输入同样的编号到数据库中(30分) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220141428200.html
我在面板上放置了Edit1.Text,Edit2.Text.用来输入数据到数据库中.  
  其中Edit1.Text用来输入产品编号.Edit2.Text用来输入产品信息.要如何防止Edit1.Text输入同样的编号到数据库中?  
  例如:Edit1.Text输入的数据在添加到数据库中是,系统提示有重复编号.否则成功将Edit1.Text和Edit2.Text的内容输入到数据库中.  
   
  谢谢大家提供方法!!!!

建立唯一索引。

谢谢楼上的.还有别的方法吗?  
 

用自动编号,或自动生成.像你这种就插入的时候select一下数据库存看有没有值相同的

在update前,查一下数据库里面有没有相同的编号,有就提示一下。

查数据库最好,因为既然要用户来输,一般就不会是自编号.我一直用这样办法,先查数据库,如果有相同的,showmessage();没有,update  
 

把编号设置为主键  
  想输都输不进去

数据库设主键.程序中用插入或更新之前查询一下数据库中有没有这一产品编号了,有就提示后exit,没有就允许操作.

进错地方了,抽自己一下

谢谢大家!!!  
   
  语句具体什么写?

select   *   from   表   where   编号='''+Edit1.Text+'''  
  if   not   eof   then  
  showmessage('编号已存在')  
  else  
  .....  
   
  给点分我吧,我也有问题要问,没有分了,惨~

建主键是最实际的办法,否则太多麻烦,因为  
   
  1、发现重复值后,你到底是如何处理?改另外一个号还是更新数据?  
  2、同理,如果存在更新问题,那么这个时候判断数据库有重复值将更加罗嗦。

楼上的楼上正解

Hank(星星农场)   (   )   信誉:115         Blog     2006-12-22   12:58:59     得分:   0      
     
     
        建主键是最实际的办法,否则太多麻烦,因为  
   
  1、发现重复值后,你到底是如何处理?改另外一个号还是更新数据?  
  2、同理,如果存在更新问题,那么这个时候判断数据库有重复值将更加罗嗦。  
       
     
   
   
  谢谢!!!  
   
  才插入数据后,发现有重复的,showmessage('编号已存在')。不需要革新新的数据。要求用户重新编号,只到无重复为止。  
 

取得edit的值去数据库查下  
  with   adoquery   do  
  begin  
  close;  
  sql.clear;  
  sql.add('select   *   from   表   where   编号='''+Edit1.Text+''');  
  open;  
  if   not   eof   then  
  showmessage('编号已存在')  
  else  
   
 

delphi   学习群:31469235  
  加入请注明   csdn   字样  
  让我们共同提高  
   
  由于刚刚创立,请大家踊跃参加。

帮帮我~~~~~~~

帮帮我~~~~~~~

实现的方法很多,楼主为什么就不自己动动手,尝试着按照别人说的做一下看看结果是什么样的。。。。。

一般来说有三种方法  
  1在数据库的相应的字段上建立唯一约束  
   
  2在数据库的相应的字段上建立主键  
   
  3自己去检索是不是已经存在  
 

十分佩服楼主

谢谢大家,  
   
   
  with   adoquery   do  
  begin  
  close;  
  sql.clear;  
  sql.add('select   *   from   表   where   编号='''+Edit1.Text+''');  
  open;  
  if   not   eof   then  
  showmessage('编号已存在')  
  else  
   
  下面怎么写?

else  
      beign  
          sql.clear;  
          sql.text:='insert   into   表(编号,信息)   VALUES     ('''+Edit1.Text+''','''+Edit2.Text+''')';  
          ExecSQL;  
   
      end;

else  
      beign  
          close;  
          sql.text:='insert   into   表(编号,信息)   VALUES     ('''+Edit1.Text+''','''+Edit2.Text+''')';  
          ExecSQL;  
   
      end;  
 

真是晕,自己在网上一搜一筐。

posted @ 2008-12-11 10:08 delphi2007 阅读(210) | 评论 (0)编辑 收藏

动态连接库中的函数,解释后出现问题,求救!!! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061129092530151.html
我有个动态连接库,还有c的头文件,我把翻译成Delphi的时候出现了点问题,大家帮忙看看啊:  
  LONG   WINAPI   XPosition(ULONG   iIndex);    
  float   XReadOut(ULONG   iIndex);    
   
  这两个函数,C的头文件里面的,翻译成D的函数后如下:  
  function     XPosition(iIndex   :   Longword)   :   longint;stdcall;external   'CardDLL.dll';  
   
  function     XReadOut(iIndex   :   Longword)   :   Single;stdcall;external   'CardDLL.dll';    
   
  不知道这样翻译有没有问题?    
   
  因为我现在遇到这样的情况,凡是C中函数名前有WINAPI的,翻译成D的函数后都好用,凡是没有WINAPI的,都出现内存读取错误???

是调用惯例上的差异,你把不带WINAPI的调用惯例改成cdecl

function     XReadOut(iIndex   :   Longword)   :   Single;stdcall;external   'CardDLL.dll';    
  改为  
  function     XReadOut(iIndex   :   Longword)   :   Single;cdecl;external   'CardDLL.dll';    
   
  ......说明  
   
  cdecl:       c\c++缺省的参数传递方式        
  stdcall:   WinAPI的参数传递方式

DELPHI   HELP:  
   
  The   cdecl   convention   is   useful   when   you   call   functions   from   shared   libraries   written   in   C   or   C++,

刚才查了查,什么参数传递方式的问题,修改后就好了,谢谢!

posted @ 2008-11-27 21:13 delphi2007 阅读(216) | 评论 (0)编辑 收藏

程序中如何取得当前ie中已经安装的证书? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061128155914152.html
假设当前的ie中已经安装了几个证书,我需要调用一个对话框,列出当前ie中安装的证书的列表供选择,目前尚不知道如何读到当前ie中已经安装的证书,请大家指教。

up,  
  初步估计   是注册表吧

当然是注册表,我查了很多资料,始终不知道在那里能够获取这些信息,知道的兄弟不吝赐教啊!!!

我不知道,也不知道你想干什么

希望知道的不吝赐教,不知道的还是关注不要发言了,免的浪费大家的时间

使用CAPICOM1.2  
  以下是VB代码,自己转成Delphi的吧  
  Dim   mvarStore   As   New   Store    
  mvarStore.Open   CAPICOM_CURRENT_USER_STORE,   "My",   CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED  
  //Store的Certificates就是当前证书的集合  
  mvarStore.Certificates.Count  
  ......  
  好了应该足够了

posted @ 2008-11-27 21:13 delphi2007 阅读(425) | 评论 (0)编辑 收藏

全局变量的简单问题!急 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061128151126153.html
现在有主窗体Main和单元OopsTelnet  
  在单元OopsTelnet中声明:  
  TOopsTelnet   =   class(TWinControl)  
  private  
      FCaretStyle:   TCaretStyle;  
      ……  
  published  
      property   CaretStyle:   TCaretStyle   read   FCaretStyle   write   SetCaretStyle;  
      ……  
  在主窗体中引用:  
  OopsTelnet.CaretStyle:=csLine;  
   
  编译时会报错:Undeclared   identifier:'CaretStyle'  
   
  这还是下载的源代码?请问是哪里需要设置吗?还是声明的位置错了

CaretStyle   要把它定义成一个枚举类型   比如  
   
  CaretStyle   =   (csLine,csstyle);   随你自己定义

把TCaretStyle   定义成一个枚举类型。

posted @ 2008-11-27 21:13 delphi2007 阅读(180) | 评论 (0)编辑 收藏

一个困扰我几天的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061128134457154.html
郁闷啊!下面这段代码是dll中的键盘钩子的回调函数,想在这个回调函数中打开  
  dll中的窗体!但是现在连编译都过不了。  
   
   
   
  这是drhook   工程文件:  
   
  library   drHook;  
   
  {   Important   note   about   DLL   memory   management:   ShareMem   must   be   the  
      first   unit   in   your   library's   USES   clause   AND   your   project's   (select  
      Project-View   Source)   USES   clause   if   your   DLL   exports   any   procedures   or  
      functions   that   pass   strings   as   parameters   or   function   results.   This  
      applies   to   all   strings   passed   to   and   from   your   DLL--even   those   that  
      are   nested   in   records   and   classes.   ShareMem   is   the   interface   unit   to  
      the   BORLNDMM.DLL   shared   memory   manager,   which   must   be   deployed   along  
      with   your   DLL.   To   avoid   using   BORLNDMM.DLL,   pass   string   information  
      using   PChar   or   ShortString   parameters.   }  
   
  uses  
      SysUtils,  
      Classes,  
      Forms,  
      Unit2   in   'Unit2.pas',  
      Unit1   in   'Unit1.pas'   {Form1};  
   
   
  {$R   *.res}  
   
  exports  
      CreateKeyboardHook,  
      DestroyKeyboardHook;  
  begin  
      hNextHookProc   :=   0;  
      procSaveExit   :=   ExitProc;  
      ExitProc   :=   @KeyboardHookExit;  
  end.  
   
  这是dll中的键盘钩子:  
   
   
  unit   Unit2;  
   
  interface  
   
  uses  
      Windows,   SysUtils;  
  var  
      hNextHookProc:   HHook;  
      procSaveExit:   Pointer;  
   
  function   KeyboardHookProc(code:   Integer;   wparam:   WPARAM;  
      lparam:   LPARAM):   LRESULT   stdcall;   export;  
  function   CreateKeyboardHook:   BOOL;   stdcall;   export;  
  function   DestroyKeyboardHook:   BOOL;   stdcall;   export;  
  procedure   KeyboardHookExit;  
   
  implementation  
   
  var  
      GameSwitch:   Word;         //程序热键  
   
  function   KeyboardHookProc(code:   Integer;   wparam:   WPARAM;  
      lparam:   LPARAM):   LRESULT;  
  const  
      _KeyProcessMask   =   $80000000;  
  begin  
      Result   :=   0;  
      if   code   <   0   then  
      begin  
          Result   :=   Windows.CallNextHookEx(hNextHookProc,   code,   wparam,   lparam);  
          Exit;  
      end;  
      if   ((lparam   and   _KeyProcessMask)   =   0)   and   (wparam   =   GameSwitch)   then  
      begin  
          Application.Handle   :=   GetForegroundWindow;     //返回当前窗口句柄  
          Result   :=   1;  
      end;  
  end;  
   
  function   CreateKeyboardHook:   BOOL;  
  begin  
      Result   :=   false;  
      if   hNextHookProc   <>   0   then  
          exit;  
      hNextHookProc   :=   Windows.SetWindowsHookEx(WH_KEYBOARD,   @KeyboardHookProc,  
          hInstance,   0);  
      Result   :=   hNextHookProc   <>   0;  
  end;  
   
  function   DestroyKeyboardHook:   BOOL;  
  begin  
      if   hNextHookProc   <>   0   then  
      begin  
          Windows.UnhookWindowsHookEx(hNextHookProc);  
          hNextHookProc   :=   0;  
      end;  
      Result   :=   hNextHookProc   =   0;  
  end;  
   
  procedure   KeyboardHookExit;  
  begin  
      if   hNextHookProc   <>   0   then  
          DestroyKeyboardHook;  
      ExitProc   :=   procSaveExit;  
  end;  
   
  Initialization  
      GameSwitch   :=   VK_HOME;  
   
  end.  
   
  这是那个窗体文件,啥都没有,就一个空窗体,我就想让他显示。。。  
  困扰好久了。。。。比较菜  
   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs;  
   
  type  
      TForm1   =   class(TForm)  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
   
   
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
   
  {$R   *.dfm}  
   
   
  end.  
   
   
  希望那位大哥能指点指点,小弟先谢谢了。。。。  
 

uses  
      Windows,   SysUtils,   Forms;   //   add   Forms  
   
   
  Application声明在Forms单元中,难道你没有看帮助?

zswang(伴水清清)   谢谢你!  
   
  我知道这点,但是加上forms后   那个窗体就调不出来了。。。  
   
  好郁闷。。

posted @ 2008-11-27 21:13 delphi2007 阅读(185) | 评论 (0)编辑 收藏

当u盘插上后会触发什么事件 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061128123758155.html
在xp中插上u盘后会弹出窗口询问打开或者播放或者不操作,当u盘插上后会触发什么消息?如何截获?

WM_DEVICECHANGE

http://www.2ccc.com/article.asp?articleid=3333

去LY的网站上找找   http://lysoft.g4soft.net  
   
  他上面应该有个usb插上后的列子~~~

学习

WM_DEVICECHANGE  
  呵呵~  
  监控Shell事件就可以啦~  
  ^_^

http://community.csdn.net/Expert/topic/4827/4827987.xml?temp=.8389398

posted @ 2008-11-27 21:13 delphi2007 阅读(333) | 评论 (0)编辑 收藏

难道这又是个未解之谜?--- 关于DLL中使用ADODATASET出错的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061128102336156.html
搜索了之前的贴子,未找到有用的信息.  
   
  MD,搞了一天,头都大了,仍然找不到原因:  
  我在DLL中声明了全局ado:TADODataSet;  
  DLL装载时也有  
      CoInitialize(nil);  
      ado:=TADODataSet.Create(nil);  
  但是在读取记录时,  
        ado.CommandText:='select   text   from   Menus   where   id='+inttostr(MenuID);  
        ado.Open;  
        n:=ado.recordcount;    
      或   ado.recno:=1;    
   
  主程序调用此DLL时,走到最后两条这里有时就报内存地址错误,   但有时又没有.   有错误时,严重时会令主程序退出!!!  
  改用DataMoudle,问题依旧!!!  
  百思不得其解,到底为什么???

可以要用   ShareMem,   放在用到   dll   和   dll   的第一   use   顺序处

同意楼上,另外,如果不是多线程,没有必要加CoInitialize(nil);这句,也容易造成地址错误。

帮顶

早就过ShareMem.  
  没用.  
   
  不用CoInitialize(nil)这句,编译都通不过.

没有那么多的迷呀   LZ   F1帮助   可解决LZ一切问题~~    
   
 

而且这个异常出现的很奇怪,   有时甚至打开QQ对话框,   也会导致它出错!  
  或打开其它一个软件或文件,   也导致其出那个错误,   而且错误都发声在访问ADO对象时!!!!  
  难解之谜啊

LZ这么写   把   ado:=TADODataSet.Create(nil);创建的时候写到异常里面去捕捉  
   
  ado:=TADODataSet.Create(nil);  
  try  
      执行ado要读取数据的代码  
  finally  
      ado.free;  
  and;  
 

晕...拜托你看看题目再答吧,兄弟!!  
  创建对象时根本无任何问题,何况有时也能正常工作?

可能是dll中的ado连接的ADOConnection的问题,如果ADOConnection是放在数据模块中,而数据模块也是放在dll中,则这样使用肯定出错,如果是这种情况,你必须在装载dll时显式创建数据模块。

给你作了一个完整的DEMO,连续测试了1000次,OK。  
   
  uses  
      SysUtils,  
      Activex,  
      ADODB,  
      Classes;  
   
  {$R   *.res}  
   
  function   DataExport:   integer;  
  var  
      ADOConnection:   TADOConnection;  
      ADODataSet   :   TADODataSet;  
  begin  
      CoInitialize(nil);  
      ADOConnection   :=   TADOConnection.Create(nil);  
      ADOConnection.ConnectionString   :=   'Provider=SQLOLEDB.1;Persist   Security   Info=False;User   ID=sa;Initial   Catalog=WANGS;Data   Source=.';  
      ADOConnection.LoginPrompt   :=   False;  
      ADODataSet:=   TADODataSet.Create(nil);  
      ADODataSet.Connection   :=   ADOConnection;  
      try  
          ADODataSet.Close;  
          ADODataSet.CommandText:=   'Select   *   From   TWangs_UserInfo   ';  
          ADODataSet.Open;  
          Result   :=   ADODataSet.RecordCount;  
      finally  
          ADODataSet.Free;  
          ADOConnection.Free;  
          CoUnInitialize;  
      end;  
  end;  
   
  exports  
      DataExport;  
   
  begin  
  end.

老冯:  
  1.一定得用   ADODataSet.Connection吗?   这是不是那问题的症结所在?  
  2.可以将其它的ADO对象换成全局的吗?

1.一定得用   ADODataSet.Connection吗?   这是不是那问题的症结所在?   (没有测试过)  
   
  2.可以将其它的ADO对象换成全局的吗?   可以(测试过)

1.一定得用   ADODataSet.Connection吗?   这是不是那问题的症结所在?   可以   (刚刚测试过)  
   
  问题症结应该在  
   
  CoUnInitialize;

不过我建议就按我上面的规格办。我所有的系统涉及这些元件我都是这样办的。久经沙场的。呵呵呵呵

CoUnInitialize;  
  我试过N次了,   加不加这个东西,都一样会有时报错

posted @ 2008-11-27 21:13 delphi2007 阅读(291) | 评论 (0)编辑 收藏

问一个关于指针的小问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061128091338157.html
如果仅仅声明一个指针   p   但未进行new(p)操作    
  然后让p指向一个TList(里面有内容)   然后对p进行操作    
  这样会不会有问题  
 

没问题

posted @ 2008-11-27 21:13 delphi2007 阅读(161) | 评论 (0)编辑 收藏

关于在dll内部建立线程,释放线程的问题? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061128091220158.html
请问能否在dll内部函数里建立线程,执行完线程后再释放线程,然后函数返回相应值?在这种情况应该如何建立、执行和释放线程?  
  我的部份代码如下:  
  问题1:执行时主窗口会无法操作(按理线程就是可以避免此类现象的),cpu100%,  
          2:释放时出错;  
   
  主窗口:  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      Return:Integer;  
  begin  
      Return:=   ReadData();//调用dll的读函数  
      ...//根据返回值来处理  
  end;  
   
  动态库dll:  
  var  
      ReadDataThread:TReadDataThread;//线程声明  
   
  ReadData():Integer;stdcall;  
  begin  
      ReadThread:=   TReadDataThread.Create(False);//建立线程马上执行  
      ReadThread.WaitFor;//等待执行完毕;  
      ReadThread.Free;//释放  
  end;  
   
  线程单元:  
  type    
      TReadDataThread   =   class(Thread)  
      procedure   Read;  
      private  
      protected  
          procedure   Execute;override;  
      end;  
   
  var  
      time:Integer;  
   
  implementation  
   
  {   TReadDataThread   }  
   
  procedure   TReadDataThread.Read;  
  begin  
      time:=   0;  
      while   Ture   do  
      begin  
          if   9999   <   time   then   exit;//到9999则退出  
          Inc(time);//递增1  
      end;  
  end;  
   
  procedure   TReadDataThread.Execute;  
  begin  
      {   Place   thread   code   here   }  
      Synchronize(A);  
  end;  
   
  end.

procedure   TReadDataThread.Execute;  
  begin  
      {   Place   thread   code   here   }  
      Synchronize(A);  
  end;  
  -------->看看你执行了什么?线程的执行体就是把事件抛给主线程来处理?!  
  你重新编写线程类代码,这里写的有点乱乱的.  
  TThread类线程释放的时候调用Terminate过程结束线程。Terminate过程只是简单地设  
  置线程类的Terminated标志,让Execute方法执行完毕,然后Destroy。

Synchronize(A);  
   
  不会执行到dll里面的A过程,因为Synchronize是给主线程来处理,也就是dll的属主程序。

谢谢xjjrocker(了无痕)和Dlwxn(Dlwxn)    
  我想问一下,那能否在dll函数里创建线程,再由dll函数释放呢?应该怎么写呢?谢谢各位了。

如果不考虑与主进程同步Synchronize。  
   
  dll里面的线程和主程序里面的线程一样的写法。  
  在线程的执行或者创建时候,FreeOnTerminate   :=   True;,这样当线程终止时候,线程事例就会自动销毁。  
  如果手动干预线程终止,就不能   FreeOnTerminate   :=   True.  
  这些前提是dll静态调用,或者dll动态调用不马上是否dll句柄。否则线程没有执行完毕,dll就被你释放了。

这些前提是dll静态调用,或者dll动态调用不马上释放dll句柄。否则线程没有执行完毕,dll就被你释放了。

我的想法应该这样啊:  
          主程序调用dll的Read函数,进入Read函数,在Read函数里建立线程,这个线程是用来读数据的,是用条件循环的方式,条件成立就退出循环,释放线程,再返回到Read函数里建立线程的下一条语句继续执行,通过线程里读到的数据进行下一步的处理。直到Read函数退出。那我的调用dll函数的主程序再通过Read函数的返回值作处理。  
          这样主程序在调用Read函数时,就不至于由于Read里的循环而导致主调无法移动等窗口操作  
          就这样一个过程。  
   
          希望各位大侠帮忙!!!谢谢

再返回到Read函数里建立线程的下一条语句继续执行  
   
  ---------------------你这是同步吧。要线程有什么用?

DLL中函数A创建线程,传入系统主窗体的HANDLE,执行操作,完成后给主窗体发送消息B  
   
  主程序调用A。  
  主程序处理消息B  
   
  用线程就是异步的。

posted @ 2008-11-27 21:13 delphi2007 阅读(364) | 评论 (0)编辑 收藏

有点难度,关机查询。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061128044645159.html
系统在关机时,会一个一个应用程序处理。  
  我希望在程序中,可以用API或别的方式查询,当前是否进入关机过程中。虽然我的程序还没有收到关机的通知,因为还在处理别的程序。

关机时有些程序会出现结束任务,取消的提示对话框  
  我想应该是处理系统关机消息,结束本程序处理工作,相当于结束一个服务

没有明白你的意思。  
  关机是有消息的,你的程序可以在接收到关机消息时候,如果不想关机,可以处理这个消息不让关机。

嘿嘿   师傅就是师傅~~   上次不是我做的那个也是关机的么   既然处理消息获取不到的话   那就按你上次做的那样   用关机特权来强制处理   不可以么~~

关机或Logff后,Windows会传依序送出WM_QUERYENDSESSION的信息给每个Process,如果中间有一个Process不能顺利结束(例如:Word修改后未存档,而出现是否存档,但我们按取消),这时该信息执行的结果会传回False(0),这时Windows也就不再继续送WM_QUERYENDSESSION给下一个Proccess。反之,如果所有的Process都可以顺利结束(也就是每个送出的WM_QUERYENDSESSION都传回True),那才代表以以顺利结束。

关机是会收到消息。  
   
  可是我希望在收到消息之前能够提前检测到,而不是等待消息到来。  
   
  注意:我并不想阻止关机。

因为运行程序较多的时候,关机过程很慢,特别是有的程序可能在结束时会大量占用CPU时间,也许要好几秒以后我的程序才会收到消息。

如果能解决,另贴送200分。

可是我希望在收到消息之前能够提前检测到,而不是等待消息到来。  
   
  -----------------------------  
   
  觉得这个可能比较难,因为在关机消息来之前,除非电脑操作的人知道要不要关机(意外情况除外)。  
   
  我觉得可以通过变通的方法解决:接收到关机消息,先阻止,不让关机,先处理你程序,等处理完成后,由你的程序负责强制关机。  
   
  不知道还有没有其它办法,看看楼下的怎么解决。

 
     
   
   
   
  大哥...你这个....  
   
   
  违背了消息机制吧??

楼上说的还在理  
   
  还有可能实现  
   
   
  LZ的想法....  
   
   
  不可能....晤.....应该是不可能的

无解。

posted @ 2008-11-27 21:13 delphi2007 阅读(207) | 评论 (0)编辑 收藏

各位老大,谁肯指教一下呢!如果点鼠标同时选中多个文件时,该用什么函数把全部文件调入程序呢? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061127214337160.html
在点击鼠标右键的时候,调出程序的同时也就把这些文件调入程序。在没点击鼠标右键时,程序是没有打开的。怎么样才能判断鼠标选中了几个文件,而文件名又分别是什么呢?      
 

for   i:=1   to   ParamCount   do  
        if   FileExists(ParamStr(i))   then   CheckOpenFile(ParamStr(i));

通过ParamCount可以得到参数的数目,使用方法如下所示:  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  var  
      i:   Integer;  
  begin  
      for   i:=1   to   ParamCount   do  
      begin  
          Caption   :=   Caption   +   '-'   +   ParamStr(i);  
      end;  
  end;  
   
  函数function   ParamCount:   Integer;可让你知道选择了多少个文件(ParamCount-1个文件)同时函数function   ParamStr(Index:   Integer):   string;可以让你得到选择文件的  
  文件名   ParamStr(0)返回你的可执行文件名(即Application.ExeName,ParamStr(1)返回  
  选择的第一个文件,依次类推。  
      其实很多东西是操作系统完成的。比如说,你选择了很多文件,并点击右键菜单,操作系统则负责打开你的关联程序,并把所选择的文件作为参数传给你,你就可是通过上述的两个函数来处理。

老大们,你们的方法我都试过了,   ParamStr只能得到几个文件中的一个文件的路径名字,其他的都得不到。到底怎样才能得到这几个文件得路径和名字?

posted @ 2008-11-27 21:13 delphi2007 阅读(275) | 评论 (0)编辑 收藏

如何让两个表单处于不同的线程中 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061127213210161.html
本人遇到一个问题,A表单上有定时器和一线程,B表单上有一定时器。A表单通过B.show调用B表单,但点住B表单的关闭按钮不松开时发现A表单上的定时器和线程均暂停总作,松开关闭按钮就又正常工作了  
  这是否意味着A,B表单处于同一线程中  
  如何才能使B表单进行任何操作时不影响A表单的运行  
  望指教,谢谢

多线程

如何个多线程法,我知道该用多线程,但不知道表单间如何用多线程  
 

没看明白你的定时器、线程、AB表单是怎么协调工作的,所以没法回答你,等高手来吧

点住关闭按钮不放就是B表单的OnClose时间一直在执行没有停止,如何让B表单的OnClose执行时不影响其他任何表单的运行,望指教,谢谢

UP

posted @ 2008-11-27 21:12 delphi2007 阅读(186) | 评论 (0)编辑 收藏

创建进程的参数问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061127195036162.html
CreateProcess(pchar('d:\temp.exe'),nil,nil,nil,true,NORMAL_PRIORITY_CLASS,nil,pchar('d:\'),   StartupInfo,ProcessInfo)   ;  
  这个句子可以通过;  
  可是这个temp.exe带有参数,一个参数是   'wo   shi',还有个参数是'111',上面的修改成  
  CreateProcess(pchar('d:\temp.exe   wo   shi   111'+fenqu),nil,nil,nil,true,NORMAL_PRIORITY_CLASS,nil,pchar('d:\'),   StartupInfo,ProcessInfo);  
  这样怎么就不行呢?>?  
  改怎么带参数啊!!!

CreateProcess(pchar('d:\temp.exe'+'"'+'wo   shi   111'+'"   '+'   fenqu'),nil,nil,nil,true,NORMAL_PRIORITY_CLASS,nil,pchar('d:\'),   StartupInfo,ProcessInfo);  
   
  没测试过   不知道行不行~~~~  
 

参数   lpApplicationName    
  类型及说明   String,要执行的应用程序的名字。可设为vbNullString;在这种情况下,应用程序的名字应在lpCommandLine参数的起始处出现    
 

不行啊

CreateProcess(pchar('d:\temp.exe   wo   shi   111'+fenqu),nil,nil,nil,true,NORMAL_PRIORITY_CLASS,nil,pchar('d:\'),   StartupInfo,ProcessInfo);  
   
  把第一和第二个参数互换就可以  
   
 

还上不行啊,没有任何提示

可能你前面的代码就有错,我贴个例子你看看,找开记事本并装载1.txt文件  
   
  var  
      SI:   TStartupInfo;  
      PI:   TProcessInformation;  
  begin  
      FillChar(SI,   SizeOf(SI),   #0);  
      CreateProcess(nil,PChar('c:\windows\notepad.exe   c:\1.txt'),nil,nil,True,  
          NORMAL_PRIORITY_CLASS,nil,nil,SI,PI);  
  end;

谢谢,呵呵,搞明白了  
  结贴

posted @ 2008-11-27 21:12 delphi2007 阅读(204) | 评论 (0)编辑 收藏

使用CreateOleObject时报错--'无效的类别字符串' Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061127173640163.html
我在使用函数CreateOleObject(Purchasing.COM)时报如下的错误。在执行该语句之前,我已经用Registerdll注册了该路径下的DLL文件了啊。哪位大侠能帮忙解决下啦,谢谢!  
   
  ---------------------------  
  Debugger   Exception   Notification  
  ---------------------------  
  Project   Drive.exe   raised   exception   class   EOleSysError   with   message   '无效的类别字符串'.   Process   stopped.   Use   Step   or   Run   to   continue.  
  ---------------------------  
  OK       Help        
  ---------------------------  
 

CreateOleObject方法需要的参数是com组件的progid,虽然你注册了dll,但你的progid可能不正确导致出错。

posted @ 2008-11-27 21:12 delphi2007 阅读(1667) | 评论 (0)编辑 收藏

仅列出标题
共34页: First 17 18 19 20 21 22 23 24 25 Last