delphi2007 教程

delphi2007 教程

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

#

求一条sql语句~```` Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220134634201.html
我有三个表   aa.bdf     bb.dbf       cc.dbf  
  aa.dbf中的字段  
  jh             yc         yx         yxh  
  name1       ch         0.2       101.1  
   
  bb.dbf中的字段  
  jh             jd1           jd2  
  name1       100.1       200.1  
   
  cc.dbf中的字段  
  jh           年月               hs  
  name1     20061011       0.3  
   
  我想完成这样的查询:  
  我想首先为表aa添加一个字段sk,判断aa表中的yxh   字段的值   是否在   bb表中的   jd1   和jd2   之间   如果在sk的值就写   K   ,     不在就为空  
  我已经把   年月这个字段的值都添加到combobox   中  
  先在combobox中选择有个年月  
  找aa表中sk     字段的值为K的   和aa表中yx>=0.4   的   和cc表中hs   >=30%的  
   
  如何为aa表添加那个sk字段   如何写最后的那条查询语句  
 

--增加字段sk  
  alter   table   aa   add   sk   varchar(4)   null  
  go  
  --更新字段sk  
  update   aa   set   sk=   'K'   from   aa   a,bb   b   where   a.jb   =     b.jh   and   a.yxh   between   b.jd1   and   b.jd2  
  go  
  --查询  
  select   *   from   aa   a,cc   b   where   a.jh   =b.jh   and   a.sk='K'   and   a.yx>=0.4   and   c.hs>=0.3   and   c.年月=combobox中的值  
   
  在DELPHI中有个专门选择日期的控件DateTimePicker,比combobox更好

select   jh,yc,yx,yhx   from   (select   aa.*,   'sk'   =     case   when   aa.yxh   >=   bb.jd1   and   aa.yxh<=bb.jd2   then   'K',   else   ''   from   aa,   bb   where   aa.jh   =   bb.jh)   XXX,   cc   where   yx>=0.4   and   sk='k'   and   hs>=0.3

select   jh,yc,yx,yhx   from   (select   aa.*,   'sk'   =   case   when   aa.yxh   >=   bb.jd1   and   aa.yxh<=bb.jd2   then   'K',   else   ''   end   from   aa,   bb   where   aa.jh   =   bb.jh)   XXX,   cc   where   yx>=0.4   and   sk='k'   and   hs>=0.3  
  修改一下,少了个end

posted @ 2009-02-19 16:58 delphi2007 阅读(90) | 评论 (0)编辑 收藏

关于DELPHI使用ORACLE回滚段的问题(急) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220125734202.html
我写了一个DELPHI程序,程序中没有起事物,只是作了一个循环,大概25万条.  
  每条取出一个NO.传到一个ORACLE的PROCEDURE中.  
  这个过程包括三个表的插入,一个表的更新。  
  1、执行十几万的时候报错   ORA-01555   快照过旧  
        问:我觉的它应该是一条一提交啊,不存在使用回滚段问题。  
  2、我试着使用指定回滚段。  
        问:应该在事物前还是在事物后?  
  3、在事务的TRY中:  
        if   i   =   10000   then  
        begin  
            database1.commit;  
            query1.ExecSQL;  
        end;  
        query,内容如下  
        “set   transaction   use   rollback   segment   RBS2”  
        这么转回滚段对么?  
  4、查询打开后滚动占回滚段吗?  
  5、我打开的表,在过程中也更新它,有影响吗?  
  6、执行这25万条最好的办法是什么,有什么注意事项吗?

求助,各位大哥,帮帮我吧,本来程序是分段执行的,可用户非要一个按钮搞定.  
  我都快郁闷死了

事务

数据量较大,第一考虑使用事务!如果事务过大,就需要调整回滚段的大小,建议建立若干个小回滚段和几个大的回滚段以应付较大事务。

关注!

oracle   的解决方法:  
  回滚段太小,可以增加一个大的回滚段试一试520745598  
   
  主要是由于回滚段太小,可以为此事务指定一个大的回滚段,利用Set   Transaction   use   rollback   segment   seg_name   语句.如果数据库中没有较大的回滚段,那么应该新增一个,然后使它Online,再指定它.  
   
 

减少一次commit的量,应该也有好处,如:  
      if   i   =   10000   then  
        begin  
            database1.commit;  
   
  10000   改为   5000

posted @ 2009-02-19 16:58 delphi2007 阅读(202) | 评论 (0)编辑 收藏

怎样把本软件是否注册的标志加在程序里?(注:不想加在数据库里) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220125350203.html
本人公司做了一套软件,  
  并且需要注册才可以使用,  
  但是注册成功后不想把注册是否成功的标志保存在数据库、ini文件里,  
  想用更好的方法来做,  
  不知道各位有什么好办法?  
  多谢了,

把注册码放入注册表中,每次去比对。

有没有相关的源码,  
  没做过这些东西,  
  多指教,

没人保存注册是否成功的标志的  
  每次RUN都验证的

关注~帮顶.

三楼讲的对.  
   
  做法:   用户把本机硬件序列号提交给你,你经过运算得出注册码,交给用户注册使用.  
              而这个注册码具体放在哪里是无所谓的,哪怕就用一个TXT放在程序目录下也行,因为别的机器上此码无用.  
              程序每一次运行,都比对注册码与实际的注册码(亦是收集硬件序列号进行运算)是否一致.

多谢各位,  
  还有方法吗,  
  俺想今天揭帖,  
 

给你一个,不过是检测注册表中的值进行判断是否已经注册:  
  当然这程序中的注册码是随便写的...  
  procedure   TE_Mainf.FormCreate(Sender:   TObject);  
  var   re_id:   integer;  
      registerTemp:   TRegistry;  
      inputstr,get_id:   string;  
      dy,   clickedok:   boolean;  
      i:   double;  
  label   Y,   N;  
  begin  
      dy   :=   false;//软件是否已到注册期、及是否允许继续使用的标志,当值为FALSE是为允许使用  
      registerTemp   :=   TRegistry.Create;                 //准备使用注册表  
      with   registerTemp   do  
      begin  
          RootKey   :=   HKEY_LOCAL_MACHINE;                 //存放在此根下  
          if   OpenKey('Software\Microsoft\Windows\CurrentVersion\Mark',   True)   then   //   建一目录,存放标志值。当然也可以存放在已存在的目录下。  
          begin  
              if   valueexists('gc_id')   then                     //用gc_id的值作为标志,首先判断其存在否  
              begin  
                  re_id   :=   readinteger('gc_id');                       //读出标志值  
                  if   (re_id   <>   0)   and   (re_id   <>   100)   then     //若标志值为0,则说明已注册     ,若不为0且值不到100,说明虽未注册,但允许使用的次数尚未达到。  
                  begin  
                      re_id   :=   re_id   +   5;         //允许标志的最大值为100,每次加5,则最多只可用20次  
                      writeinteger('gc_id',   re_id);                     //将更新后的标志值写入注册表中  
                      i   :=   (100   -   re_id)   /   5;  
                      if   application.MessageBox(PAnsiChar('您使用的软件没有注册,还有   '   +   floattostr(i)   +   '   次使用次数,现在要注册吗?'),   '提示信息',   mb_yesno   +   mb_iconwarning)   =   idyes   then  
                      begin  
                          if   i   =   0   then  
                              application.Terminate  
                          else  
                              goto   y;  
                      end;  
                  end;  
                  if   re_id   =   0   then   goto   N;  
                  if   re_id   =   100   then   dy   :=   true;                     //若标志值已达到100,则应当注册  
              end  
              else  
                  Writeinteger('gc_id',   5);                                 //建立标志,并置初始标志值  
              re_id   :=   readinteger('gc_id');  
              i   :=   (100   -   re_id)   /   5;  
              if   Application.MessageBox(PAnsiChar('您使用的软件没有注册,还有   '   +   floattostr(i)   +   '   次使用次数,现在要注册吗?'),   '提示信息',   mb_yesno   +   mb_iconwarning)   =   idyes   then  
              begin  
                  if   i   =   0   then  
                      application.Terminate  
                  else  
                      goto   Y;  
              end;  
          end;  
          if   dy   then  
              Y:   begin                                 //若dy值为TRUE,则应提示用户输入注册码,进行注册  
              clickedok   :=   InputQuery('系统提示',   '请输入注册码:',   inputstr);  
              if   clickedok   then  
              begin  
                  get_id   :=   inttostr(83392582   *   2);   //注册码为166785164,够简单的......  
                  if   get_id   =   inputstr   then  
                  begin  
                      Writeinteger('gc_id',   0);         //若输入的注册码正确,则将标志值置为0,即已注册  
                      Application.MessageBox('恭喜你,软件注册成功!',   '提示',   MB_OK);  
                      CloseKey;  
                      Free;  
                  end  
                  else  
                  begin  
                      application.messagebox('注册码错误!请与作者联系!',   '警告',   mb_ok   +   mb_iconstop);  
                      CloseKey;  
                      Free;  
                      application.terminate;                                   //中止程序运行,拒绝让其继续使用  
                  end;  
              end  
              else  
              begin  
                  CloseKey;  
                  Free;  
                  application.terminate;                                       //中止程序运行,拒绝让其继续使用  
              end;  
          end;  
      end;  
      N:   datamodule1   :=   tdatamodule1.Create(self);  
      if   not   assigned(E_loginf)   then  
          E_loginf   :=   tE_loginf.Create(self);  
      E_loginf.ShowModal;  
      if   E_loginf.ModalResult   =   mrCancel   then//检查返回模式,如果是关闭或是取消,则中止运行  
      begin  
              Application.Terminate;  
              exit;  
      end;  
  不知有没达到你要求~~

posted @ 2009-02-19 16:58 delphi2007 阅读(175) | 评论 (0)编辑 收藏

一个关于不同WINDOWS用户连接SQLSERVER的问题... Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220125335204.html
服务器装了MSSQLSERVER2000数据库  
   
  客户端是一拖3   的瘦客户机(即一个主机连几部显视器的模式),  
  客户端按WINDOWS的不同用户登陆,以用户1进入安装了DELPHI的信息系统程序.  
   
  当以用户1   进入时,就可以正常连接到服务器的SQL数据库,而以用户2进入时,却连接不到服务器的SQL数据库.  
   
  这是什么原因,应如何解决呢?   谢了.

UP....   真的解决不了吗?

需要在服务器端进行混合用户登录验证,增加用户2名称

楼上,你好.这个增加用户2   名称在哪里添加呵?     是添加WINDOWS的用户吗?

关注

UP.如何解决这个问题呢?   谢了.

控制面板或你的服务器注册上点右键

能不能详细点,本人现在给客户催得很紧.   谢了.

你的服务器上SQLserver的允许访问数量是多少,第二个问题:服务器的系统版本是否是服务器版本的OS!

posted @ 2009-02-19 16:58 delphi2007 阅读(166) | 评论 (0)编辑 收藏

表的添加删除 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220115725205.html
新手提问,我现在有两张表p_info   和g_info   他们有三个相同的字段名   a,b,c,其他的不同,我想在表p_info中添加基本信息的同时,在表g_info中添加上他们相同的字段的内容,我用的Insert进行添加信息,不知怎么实现?  
  还有删除,也是,删除表p_info时,也同时删除g_info的内容。我有些笨办法,觉得不好,不知道有没有这样的语句或是联系方式,谢谢个位高手给我解答啊,在线等。。。  
  还有就是,表中,有相同的字段名,用不用给他们建立关系?  
   
   
  还有,我分不多,不知道怎么发给大家,顺便告诉我这个。。呵呵。。谢谢了。。。

你把那3个字段提出来,单独形成一个表,现在的2张表用一个外键关联它,不就没这么麻烦了  
 

有一点明白了,但是不是很清楚,能不能给列子说明,还要,要是我原来的方法,怎么进行添加啊,谢谢解答了。。。。

顶啊,帮忙啊。。。

posted @ 2009-02-19 16:58 delphi2007 阅读(96) | 评论 (0)编辑 收藏

如何用命令中斷for 語句的循環。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220114941206.html
我用一個stop按鈕中斷for語句如何做。  
  好像用goto語句可以實現。請做過的給個例子。

break

给你一个例子:  
   
  var  
      bStop   :   Boolean;  
   
  procedure   TForm1.btnStartClick(Sender:   TObject);  
  var  
      iLoop   :   Integer;  
  begin  
      bStop   :=   False;  
      for   iLoop   :=   1   to   1000000000   do  
      begin  
          Application.ProcessMessages;  
          if   bStop   then  
          begin  
              ShowMessage   (Format('Stop   at   %d!',   [iLoop]));  
              break;  
          end;  
      end;  
  end;  
   
  procedure   TForm1.btnStopClick(Sender:   TObject);  
  begin  
      bStop   :=   True;  
  end;  
 

Break/Goto   label

to:ly_liuyang(Liu   Yang   LYSoft   http://lysoft.7u7.net)    
  給個例子。

不想补充了

jadeluo(秀峰)     的例子也行。  
  謝謝。

posted @ 2009-02-19 16:58 delphi2007 阅读(228) | 评论 (0)编辑 收藏

table 修改了,怎么 form 的字段没有跟着变 ? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220114804207.html
我在delphi   的form   中读写一table内容,但是如果修改了   table   的定义,form中此表的字段定义还是原来的表定义,没有改变,不知如何更新   ?

?  
  table1.close;  
  table1.open;   //关闭后重新打开,也不行?  
   
  如果不行,那就关闭了adoconnection,再重新连接,肯定可以的

直接把tabel的Active属性改为false再改为true就可以了,意思是刷新下tabel。

是的  
  要手动刷新一下Table的  
  不然程序还是加载老的数据的

不行就重连,再不行就重新放个Table

posted @ 2009-02-19 16:58 delphi2007 阅读(83) | 评论 (0)编辑 收藏

求sql~~~view Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220104142208.html
有两个表:  
  id   field2  
  1       10  
  2       20  
  3       30  
  .  
  .  
  .  
  mid     field3  
  1           100  
  1           200  
  1           300  
  2           50  
  2           20  
  2           30  
  3           25  
  3           30  
  我想写sql建视图求出  
  id=1时,mid=1的field3的sum值  
  id=2时,mid=2的field3的sum值  
  .  
  .  
  .  
 

select   sum(field3)   as   sumfield3   from   表2   group   by   mid

select   id,sum_id=(select   sum(field3)   from   table2   where   table1.id=mid)  
  from   table1  
  group   by   id

id和mid是关联的吗?先写个视图:   select   a.id,a.field2,b.field3   from   table1   a   left   join  
  table2   b   on   a.id=b.mid,然后从这个视图分组查询就是了

jimcute()   你的方法可能不是很完美哦~  
   
  Nwing(BeyondNw)  
  thank  
  你的行得通,呵呵,努力中~~  
   
  wzxjh2000()  
  你的应该是可以的,多谢各位啦~~~  
   
 

posted @ 2009-02-19 16:58 delphi2007 阅读(49) | 评论 (0)编辑 收藏

如何把文件写入SQL? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220102347209.html
各位大侠:  
              怎么样才能把文件写入SQL   SERVER中?

用流,什么都可以装到数据库里面的。

能说的清楚点吗?我不能怎么使用流,谢谢   !

var  
      FStream:   TFileStream;  
      BStream:   TBlobStream;  
  begin  
      if   not   OpenDialog1.Execute   then   exit;  
      FStream   :=   TFileStream.Create(OpenDialog1.FileName,fmOpenRead);  
      Table1.Edit;  
      BStream   :=   TBlobStream.Create(Table1Doc,bmReadwrite);  
      BStream.CopyFrom(FStream,FStream.Size);  
      Table1.Post;  
      BStream.Free;  
      FStream.Free;  
  end;  
 

请继续关注!

恩,关注下。

posted @ 2009-02-19 16:58 delphi2007 阅读(149) | 评论 (0)编辑 收藏

表A中的记录随时变化,程序显示A数据的界面中如何自动也跟着刷新? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220095332210.html
表A中的记录随时变化,程序显示A数据的界面中如何自动也跟着刷新?除用定时器定时搜索外。定时搜索耗系统资源大吗?再说,定时搜索A的过程中,我恰在此时删除A中记录或添加、修改A中的记录,有冲突吗?

我之前的程序都是用定时器,开一个线程专门侦听表,想不到其它方法,关注

侦听表是什么意思?是不是就是close(),open()表一次?

呵呵,就是,close   和open一次就能刷新了。如果数据绑定了的话

寻求定时器以外的办法

数据不是通过数据集写入的,没绑定,想通过数据集的变化比较困难

定时器是最简单的办法,其他办法不好使。要么就监控数据库,不过这个想法好像太大了一点。或者如果都是你自己的程序,那么可以在程序之间的相互通信上面做一些办法。   不过为了实现这个小功能,似乎没有那么复杂的必要。

呵呵   同意楼上的,但是我做串口读取数据的时候是用的线程进行pooling的

posted @ 2009-02-19 16:58 delphi2007 阅读(167) | 评论 (0)编辑 收藏

一个程序出错,请高手帮帮忙!!急! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220090748211.html
我想从库中的数据表导到stringgrid,想做成比较直观一点的输入界面,把时间字段(sjd)作为行,把数据项目和数据编号字段作为两列输出,可是运行下面的程序时出错,原因是写到ADO_sjz时找不到fieldbyname,但我上次也是遇到这种情况我就照样写进去,结果就得了,可这次就是不得!请帮帮忙看一下哪里出错,若有怎么更好的更方便的更为直观的数据输入界面的控件请告诉我好吗?因为要做一个不同时段对同样的多条数据项目输入数据!要能让用户一眼就能看完各时段的数据和输入各时段的数据.以下是程序:  
  procedure   Tsjxmzlr.Button1Click(Sender:   TObject);  
  var  
        i:integer;  
        j:integer;  
  begin  
          with   ADOQ_sjz   do  
          begin  
            ADOQ_sjz.Close;  
            ADOQ_sjz.SQL.Clear;  
            ADOQ_sjz.SQL.Text   :=   'select   phid,sjmc   from   hymcb   where   lxmc=:lxmc';  
            ADOQ_sjz.Parameters.ParamByName('lxmc').Value   :=   trim(cb_lx.Text);  
            ADOQ_sjz.Open;  
            for   i:=0   to   ADOQ_sjz.RecordCount-1   do  
            begin  
              SG_sjz.Cells[0,i]   :=   ADOQ_sjz.fieldbyname('phid').AsString;  
              SG_sjz.Cells[1,i]   :=   ADOQ_sjz.fieldbyname('sjmc').AsString;  
              ADOQ_sjz.Next;  
            end;  
          end;  
              with   ADOQ_sjz   do  
                begin  
                  ADOQ_sjz.Close;  
                  ADOQ_sjz.SQL.Clear;  
                  ADOQ_sjz.SQL.Text   :=   'select   sjd   from   sjb   where   bd=:bd';  
                  ADOQ_sjz.Parameters.ParamByName('sjd').Value   :=   trim(CBB_bd.Text);  
                  ADOQ_sjz.Open;  
                  for   j:=0   to   ADOQ_sjz.RecordCount-1   do  
                    begin  
                      SG_sjz.Cols[j]   :=   ADOQ_sjz.fieldbyname('sjd').astring;//这里提示错误:[Error]   sjzlr.pas(118):   Incompatible   types:   'TStrings'   and   'String'  
                      ADOQ_sjz.Next;  
                    end;  
  end;

你这里With   do没什么用,你下面的程序试试  
  procedure   Tsjxmzlr.Button1Click(Sender:   TObject);  
  var  
        i:integer;  
        j:integer;  
  begin  
            ADOQ_sjz.Close;  
            ADOQ_sjz.SQL.Clear;  
            ADOQ_sjz.SQL.Text   :=   'select   phid,sjmc   from   hymcb   where   lxmc=:lxmc';  
            ADOQ_sjz.Parameters.ParamByName('lxmc').Value   :=   trim(cb_lx.Text);  
            ADOQ_sjz.Open;  
            for   i:=0   to   ADOQ_sjz.RecordCount-1   do  
            begin  
              SG_sjz.Cells[0,i]   :=   ADOQ_sjz.fieldbyname('phid').AsString;  
              SG_sjz.Cells[1,i]   :=   ADOQ_sjz.fieldbyname('sjmc').AsString;  
              ADOQ_sjz.Next;  
            end;  
            ADOQ_sjz.Close;  
            ADOQ_sjz.SQL.Clear;  
            ADOQ_sjz.SQL.Text   :=   'select   sjd   from   sjb   where   bd=:bd';  
            ADOQ_sjz.Parameters.ParamByName('sjd').Value   :=   trim(CBB_bd.Text);  
            ADOQ_sjz.Open;  
            for   j:=0   to   ADOQ_sjz.RecordCount-1   do  
            begin  
                SG_sjz.Cols[j]   :=   ADOQ_sjz.fieldbyname('sjd').astring;//这里提示错误:[Error]   sjzlr.pas(118):   Incompatible   types:   'TStrings'   and   'String'  
                ADOQ_sjz.Next;  
            end;  
  end;

也不行啊!

还是那个错误!

SG_sjz.Cols[j]   :=   ADOQ_sjz.fieldbyname('sjd').astring;//这里提示错误:[Error]    
   
  找到错误啦   应该是.ASSTRING;     你少打个S,   呵呵,不细心

提示说你的类型不对哦,你试一下把  
  SG_sjz.Cols[j]   :=   ADOQ_sjz.fieldbyname('sjd').astring;  
  改成:  
  SG_sjz.Cols[j]   :=   ADOQ_sjz.fieldbyname('sjd').Value

不对,我都试了还是不行!

主要是写到这里ADOQ_sjz时后面的不弹出fieldbyname,所以后面也就没有Value和asstring了!为什么呢?

我的也不弹出,但是写下去就行   DELPHI对ADO的技术支持不太好.但是后面能弹出Value和asstring

SG_sjz.Cols[j]   :=   ADOQ_sjz.fieldbyname('sjd').astring  
   
  property   Cols[Index:   Integer]:   TStrings;  
   
  两个类型不一致

可以了,是这里出错:SG_sjz.Cols[j]应该改为:SG_sjz.CELLs[j,0]这们就能运行,不过得来的界面不能输入数据,怎么办啊?我是想让用户在比较直观的界面上输入数据的!大家有怎么更好的办法吗?  
  比如:         1:30     2:00     2:30     3:00      
      项目一     20         30         20         30  
      项目二     20         30         10         30  
      项目三     20         50         10         20  
      项目四     54         30         90         10  
  在数据库中数据项目是一个字段,时间是一个字段,数据值是一个字段.  
  这种怎么做啊?  
 

应该是.asstring;而不是.astring;   你再好好看看你的程序

现在我是从数据库中取出形成了这样的一张表,但不能录入数据!怎么办!意思是说上面的程序只能显示个空表了?各位高手帮帮忙!

你用的是TStringGrid吧,这个是不能接受输入的  
   
  你可以在OnDblClick事件中获取当前选中的Cell,然后弹出输入对话框接受用户输入,然后重写Cells[i,j]的值,最后提交数据库时自己通过程序控制SQL  
 

要录入还是用DBGRID,  
  或者你另外再开一个EDIT的窗口,当用户点击STRINGGRID的一个单元格的时候,将单元格的值送到EDIT窗口中,在这个EDIT中修改,然后保存到数据库中,再回显.  
   
  procedure   TForm15.StringGrid1SelectCell(Sender:   TObject;   ACol,  
      ARow:   Integer;   var   CanSelect:   Boolean);  
  begin  
        stringgrid1.InstanceSize;  
        edit1.Text   :=stringgrid1.Cells[acol,arow];              
        a:=acol;  
        b:=arow;  
  end;  
   
   
  回显操作:strtofloat(stringgrid1.Cells[a,b]):=edit1.text   ;     //a,b是全局变量.

呵呵,告诉你不能弹出fieldbyname是因为没有在fields   editor里面加fields,TStringGrid吧,在options   里面把goediting   true就行了。

procedure   Tsjxmzlr.Button1Click(Sender:   TObject);  
  var  
        i:integer;  
        j:integer;  
  begin  
            ADOQ_sjz.Close;  
            ADOQ_sjz.SQL.Clear;  
            ADOQ_sjz.SQL.Text   :=   'select   phid,sjmc   from   hymcb   where   lxmc=:lxmc';  
            ADOQ_sjz.Parameters.ParamByName('lxmc').Value   :=   trim(cb_lx.Text);  
            ADOQ_sjz.Open;  
   
  //这里,习惯问题  
      ADOQ_sjz。First;  
   
   
            for   i:=0   to   ADOQ_sjz.RecordCount-1   do  
            begin  
              SG_sjz.Cells[0,i]   :=   ADOQ_sjz.fieldbyname('phid').AsString;  
              SG_sjz.Cells[1,i]   :=   ADOQ_sjz.fieldbyname('sjmc').AsString;  
              ADOQ_sjz.Next;  
            end;  
            ADOQ_sjz.Close;  
  //这里要清楚参数****************************************************  
        Query1.Params.Clear;  
   
   
            ADOQ_sjz.SQL.Clear;  
            ADOQ_sjz.SQL.Text   :=   'select   sjd   from   sjb   where   bd=:bd';  
            ADOQ_sjz.Parameters.ParamByName('sjd').Value   :=   trim(CBB_bd.Text);  
            ADOQ_sjz.Open;  
            for   j:=0   to   ADOQ_sjz.RecordCount-1   do  
            begin  
                SG_sjz.Cols[j]   :=   ADOQ_sjz.fieldbyname('sjd').astring;//这里提示错误:[Error]   sjzlr.pas(118):   Incompatible   types:   'TStrings'   and   'String'  
                ADOQ_sjz.Next;  
            end;  
  end;  
 

TString   类型,需要创建实例  
   
  SG_sjz.Cols[j].Add(ADOQ_sjz.fieldbyname('sjd').astring)

可DBGRID怎么实现这种表格形式录入呢?我是想用这种表格形式录入的!怎么办啊?有没有怎么控件直接支持这种呢?

如果像liu_yq(春风不语的)所说的那样做的话太麻烦了,这样用户输入上百条数据不是太麻烦!所以希望各位高手帮忙!

问题是你为什么一定要用STRINGGRID.而不用DBGRID.  
  我就是为了不编辑才用的STRINGGRID.

DbGrid有一定难度,不知道能实现不  
   
  像楼主这样用表格某字段的数据来做列的,不知道能否通过Grid自动更新  
   
  比如:         1:30     2:00     2:30     3:00      
      项目一     20         30         20         30  
      项目二     20         30         10         30  
      项目三     20         50         10         20  
      项目四     54         30         90         10  
   
  假设修改了第一个cell的数据,可能生成的SQL找不到1:30这个字段  
  我具体没试过这种方法,如果可行,就权当我上面说的是废话了,我也搬根凳子学习下

这种输入方式比较直观,就是因为我在一个软件里看到的,所以就想这样来做,若这些都不行的话,能不能用第三方控件来做呢?若能是哪种控件呢?大家有没有用过啊,有的话就告诉我啊??

将stringgrid的options里的goediting设成true就可以了。  
  对于不想让用户编辑的表格单元在StringGrid1SelectCell事件里  
  将canselect设成false

SG_sjz.Cols[0][j]   :=   ADOQ_sjz.fieldbyname('sjd').AsString;//显示在第一列j行

非常感谢jsqth()   的教导!可以实现了我的想法!也谢谢大家的指导!

posted @ 2009-02-19 16:55 delphi2007 阅读(100) | 评论 (0)编辑 收藏

应该这么写吗? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220090005212.html
我想获得表weixuclchild.tmoney和weixuwxchild.tmoney中的sum值  
   
  select   sum(weixuclchild.tmoney),sum(weixuwxchild.tmoney)    
  from   weixuclchild   inner   join   weixuwxchild    
  on   weixuclchild.mid=weixuwxchild.mid    
  and   weixuclchild.mid='8'    
  这样写怎么结果不对?

可能是你两边关联的时候记录有了重复,先把关联表的内容查出来看看

posted @ 2009-02-19 16:55 delphi2007 阅读(69) | 评论 (0)编辑 收藏

高手帮忙,菜鸟提问关于Query的基础问题!很急!就剩这些分了!好心人帮忙! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061220081946213.html
请问高手,我想用Query做一个查询,并将查询结果放到DBLookupComboBox中.用的是Access数据库,库中有两列值,我想把其中一列查询出来放到控件中,请问怎么做?  
   
      我刚接触Delphi,希望高手能够把详细的步骤给出,供我参考下!  
   
      我的书中没有这方面的介绍!我用的书是"Delphi程序设计实用教程"电子工业出版内社出版的!  
   
      谢谢高手!

使用Query时提示以下错误!  
  当为KeyField添加时提示  
  Circular   datalinks   are   not   allowed.  
  为什么啊?

这里是我做的一个程序,效果是和你的一样的,你参考一下吧!  
  procedure   Tsjxmzlr.CBB_bdChange(Sender:   TObject);  
  begin  
            ADOQ_sjd.Close;  
            ADOQ_sjd.SQL.Clear;  
            ADOQ_sjd.SQL.text   :=   'select   sjd   from   sjb   where   bd=:bd   order   by   id   asc';//这是按条件提取相应的值!  
            ADOQ_sjd.Parameters.ParamByName('bd').Value   :=   trim(CBB_bd.Text);这是条件值  
            ADOQ_sjd.Open;  
            CB_sjd.Clear;  
            while   not   ADOQ_sjd.Eof   do  
                  begin  
                        CB_sjd.Items.Add(ADOQ_sjd.fieldbyname('sjd').AsString);这是添加到COMBBOX里面的数据字段!  
                        ADOQ_sjd.Next;  
                  end;  
  end;

trim是什么东西啊?

trim是去除空格用的,trim(CBB_bd.Text)就是忽略CBB_bd.Text的空格

Circular   datalinks   are   not   allowed.                
   
  //检查下你的DataSet是不是不小心设置成环状了  
  //例如说DSet1->DSet2,   DSet2->DSet3,   DSet3->DSet1  
 

posted @ 2009-02-19 16:55 delphi2007 阅读(188) | 评论 (0)编辑 收藏

求教:根据我现在这种情况,如何较为简单的得到财务报表? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219223120214.html
我把所有二级科目放在一个表里(sub_list)  
  字段:  
      sub_id(二级科'目id),  
      sub_name(二级科目名称),  
      acc_id(所属上级科目id),  
      acc_name(所属上级科目名称),  
      debit(借额),  
      lender(贷额).  
  各科目各有多条记录  
   
  该如何得出如下报表:  
  上级科目1       借总额,贷总额,  
  二级科目1       借总额,贷总额,  
  二级科目2       借总额,贷总额  
            .....  
  上级科目2       借总额,贷总额,  
  二级科目1       借总额,贷总额,  
  二级科目2       借总额,贷总额  
 

老冯来帮助。霸占80分

Select   ACC_ID,   ACC_Name   Name,   Sum(Debit)   SUM_Debit,   Sum(Lender)   SUM_Lender   From   Sub_List   Group   By   ACC_ID,   ACC_Name  
   
  union  
   
  Select   ACC_ID,   Sub_Name   Name,   Sum(Debit)   SUM_Debit,   Sum(Lender)   SUM_Lender   From   Sub_List   Group   By   ACC_ID,   Sub_Name  
   
  Order   By   ACC_ID   ,   Name

Select   ACC_ID,   ACC_Name   Name,   K   =   1,   Sum(Debit)   SUM_Debit,   Sum(Lender)   SUM_Lender   From   Sub_List   Group   By   ACC_ID,   ACC_Name  
   
  union  
   
  Select   ACC_ID,   Sub_Name   Name,   K   =   2,   Sum(Debit)   SUM_Debit,   Sum(Lender)   SUM_Lender   From   Sub_List   Group   By   ACC_ID,   Sub_Name  
   
  Order   By   ACC_ID   ,   K,   Name

有点不明白,加上K是为了什么?排序?  
  个人认为吧,分2个查询吧,你实现不了上面的报表的结果的。用RM   好容易就实现的。

你实现不了上面的报表的结果的。  
   
  ----------------------------  
  实践是检验真理的唯一标准。

呵呵,谢谢老冯!我这几天电脑中了威金,tmd!在重装系统,等装完试一试!

posted @ 2009-02-19 16:55 delphi2007 阅读(79) | 评论 (0)编辑 收藏

运行一个组件出错,这是为什么?高手指点下我要怎么改? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219211358215.html
我用delphi和sql   sever做了一个试卷生成系统,用的BDE连接的,按F9运行都没问题,出现登陆界面后能正常登陆,但点试卷管理中的定制试卷就出现错误提示,但关闭这个提示就能出现后面的界面,我第二次点定制试卷就不会报这个错误  
  project   project1.exe   raised   exception   class   EDatabase   Error   with   message  
  Table_shijuan:cannot   perform   this   operation   on   a   close   dataset   process   stopped   use   step   or   run   to   continue.  
   
  如果我直接运行project1.exe   ,再点定制试卷,就会出这个提示  
  Table_shijuan   cannot   perform   this   operation   on   a   close   dataset  
   
  这个是unit10也就是定制试卷窗口的代码,会提示第四行newshijuanhao:=DataModule4.Table_shijuan.FieldValues['jno']+1;  
  出错,高手帮我看看  
   
   
   
  procedure   Tdefinepaperform.FormShow(Sender:   TObject);  
  begin  
  DataModule4.Table_shijuan.Last;  
  newshijuanhao:=DataModule4.Table_shijuan.FieldValues['jno']+1;  
  DataModule4.Table_shijuan.First;  
  end;  
   
  procedure   Tdefinepaperform.BitBtn1Click(Sender:   TObject);  
  begin  
            if   addshijuan   then  
            begin  
                if   checknewshijuan   then  
                begin  
   
                DataModule4.Table_shijuan.Post;  
                DataModule4.Table_shijuan.Close;  
                    DataModule4.Table_shijuan.Open;  
                showmessage('新试卷添加成功!');  
                 
                addshijuan:=false;  
                inc(newshijuanhao);  
            //     DataModule4.Table_shijuan.UpdateRecord;  
                DBNavigator1.CanFocus;  
                BitBtn3.Enabled:=true;  
              BitBtn4.Enabled:=true;  
                  end  
          else  
          exit;  
   
  end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit6Change(Sender:   TObject);  
  begin  
      sum1:=0;  
  if       (DBEdit3.Text<>'')and(DBEdit6.Text<>'')   then  
  begin  
  sum1:=sum1+strtoint(DBEdit3.Text)*strtoint(DBEdit6.Text);  
  DBEdit9.Text:=inttostr(sum1);  
  end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit7Change(Sender:   TObject);  
  begin  
      sum2:=0;  
  if       (DBEdit4.Text<>'')and(DBEdit7.Text<>'')   then  
  begin  
  sum2:=sum2+strtoint(DBEdit4.Text)*strtoint(DBEdit7.Text);  
  DBEdit10.Text:=inttostr(sum2);  
  end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit8Change(Sender:   TObject);  
  begin  
      sum3:=0;  
  if       (DBEdit5.Text<>'')and(DBEdit8.Text<>'')   then  
  begin  
  sum3:=sum3+strtoint(DBEdit5.Text)*strtoint(DBEdit8.Text);  
  DBEdit11.Text:=inttostr(sum3);  
  end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit13Change(Sender:   TObject);  
  begin  
      sum4:=0;  
  if       (DBEdit12.Text<>'')and(DBEdit13.Text<>'')   then  
  begin  
  sum4:=sum4+strtoint(DBEdit12.Text)*strtoint(DBEdit13.Text);  
  DBEdit14.Text:=inttostr(sum4);  
  end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit16Change(Sender:   TObject);  
  begin  
      sum5:=0;  
  if       (DBEdit15.Text<>'')and(DBEdit16.Text<>'')   then  
  begin  
  sum5:=sum5+strtoint(DBEdit15.Text)*strtoint(DBEdit16.Text);  
  DBEdit17.Text:=inttostr(sum5);  
  end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit17Change(Sender:   TObject);  
  begin  
  allsum:=0;  
  if   (DBEdit9.Text<>'')and(DBEdit10.Text<>'')and(DBEdit11.Text<>'')and(DBEdit14.Text<>'')and(DBEdit17.Text<>'')     then  
        begin  
        allsum:=allsum+sum1+sum2+sum3+sum4+sum5;  
            DBEdit2.Text:=inttostr(allsum);  
        end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit14Change(Sender:   TObject);  
  begin  
  allsum:=0;  
  if   (DBEdit9.Text<>'')and(DBEdit10.Text<>'')and(DBEdit11.Text<>'')and(DBEdit14.Text<>'')and(DBEdit17.Text<>'')     then  
        begin  
        allsum:=allsum+sum1+sum2+sum3+sum4+sum5;  
            DBEdit2.Text:=inttostr(allsum);  
        end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit11Change(Sender:   TObject);  
  begin  
  allsum:=0;  
  if   (DBEdit9.Text<>'')and(DBEdit10.Text<>'')and(DBEdit11.Text<>'')and(DBEdit14.Text<>'')and(DBEdit17.Text<>'')     then  
        begin  
        allsum:=allsum+sum1+sum2+sum3+sum4+sum5;  
            DBEdit2.Text:=inttostr(allsum);  
        end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit10Change(Sender:   TObject);  
  begin  
  allsum:=0;  
  if   (DBEdit9.Text<>'')and(DBEdit10.Text<>'')and(DBEdit11.Text<>'')and(DBEdit14.Text<>'')and(DBEdit17.Text<>'')     then  
        begin  
        allsum:=allsum+sum1+sum2+sum3+sum4+sum5;  
            DBEdit2.Text:=inttostr(allsum);  
        end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit9Change(Sender:   TObject);  
  begin  
  allsum:=0;  
  if   (DBEdit9.Text<>'')and(DBEdit10.Text<>'')and(DBEdit11.Text<>'')and(DBEdit14.Text<>'')and(DBEdit17.Text<>'')     then  
        begin  
        allsum:=allsum+sum1+sum2+sum3+sum4+sum5;  
            DBEdit2.Text:=inttostr(allsum);  
        end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit3Change(Sender:   TObject);  
  begin  
      sum1:=0;  
  if       (DBEdit3.Text<>'')and(DBEdit6.Text<>'')   then  
  begin  
  sum1:=sum1+strtoint(DBEdit3.Text)*strtoint(DBEdit6.Text);  
  DBEdit9.Text:=inttostr(sum1);  
  end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit4Change(Sender:   TObject);  
  begin  
      sum2:=0;  
  if       (DBEdit4.Text<>'')and(DBEdit7.Text<>'')   then  
  begin  
  sum2:=sum2+strtoint(DBEdit4.Text)*strtoint(DBEdit7.Text);  
  DBEdit10.Text:=inttostr(sum2);  
  end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit5Change(Sender:   TObject);  
  begin  
      sum3:=0;  
  if       (DBEdit5.Text<>'')and(DBEdit8.Text<>'')   then  
  begin  
  sum3:=sum3+strtoint(DBEdit5.Text)*strtoint(DBEdit8.Text);  
  DBEdit11.Text:=inttostr(sum3);  
  end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit12Change(Sender:   TObject);  
  begin  
      sum4:=0;  
  if       (DBEdit12.Text<>'')and(DBEdit13.Text<>'')   then  
  begin  
  sum4:=sum4+strtoint(DBEdit12.Text)*strtoint(DBEdit13.Text);  
  DBEdit14.Text:=inttostr(sum4);  
  end;  
  end;  
   
  procedure   Tdefinepaperform.DBEdit15Change(Sender:   TObject);  
  begin  
      sum5:=0;  
  if       (DBEdit15.Text<>'')and(DBEdit16.Text<>'')   then  
  begin  
  sum5:=sum5+strtoint(DBEdit15.Text)*strtoint(DBEdit16.Text);  
  DBEdit17.Text:=inttostr(sum5);  
  end;  
  end;  
   
  procedure   Tdefinepaperform.BitBtn3Click(Sender:   TObject);  
  var  
  i,j:integer;  
  begin  
      paperautoform.ProgressBar1.Position:=0;  
  for   i:=1   to   800   do  
  begin  
  paperautoform.thao[i]:=0;  
              paperautoform.havetake[i]:=0;  
              end;  
              for   j:=1   to   5   do  
              begin  
              paperautoform.diff[i]:=0;;  
              end;  
              paperautoform.Memo1.Text:='';  
  paperautoform.Show;  
  end;  
   
  procedure   Tdefinepaperform.BitBtn2Click(Sender:   TObject);  
  begin  
  DBNavigator1.BtnClick(nbCancel);  
  BitBtn3.Enabled:=true;  
    BitBtn4.Enabled:=true;  
  end;  
 

好像是DataModule4.Table_shijuan没打开

unit   Unit4;  
   
  interface  
   
  uses  
      SysUtils,   Classes,   DB,   DBTables;  
   
  type  
      TDataModule4   =   class(TDataModule)  
          Table_u:   TTable;  
          DataSource_u:   TDataSource;  
          DataSource_choose:   TDataSource;  
          DataSource_filltext:   TDataSource;  
          DataSource_judge:   TDataSource;  
          DataSource_readpro:   TDataSource;  
          Table_choose:   TTable;  
          Table_filltext:   TTable;  
          Table_judge:   TTable;  
          Table_readpro:   TTable;  
          DataSource_procedure:   TDataSource;  
          Table_procedure:   TTable;  
          Table_uID:   TStringField;  
          Table_umi:   TStringField;  
          Table_uqx:   TStringField;  
          Table_choosetno:   TIntegerField;  
          Table_choosetigan:   TMemoField;  
          Table_choosexa:   TStringField;  
          Table_choosexb:   TStringField;  
          Table_choosexc:   TStringField;  
          Table_choosexd:   TStringField;  
          Table_chooseanswer:   TStringField;  
          Table_choosescore:   TSmallintField;  
          Table_choosedifficulty:   TStringField;  
          Table_choosenote:   TStringField;  
          DataSource_shijuan:   TDataSource;  
          Table_shijuan:   TTable;  
          Table_papermanager:   TTable;  
          DataSource_papermanager:   TDataSource;  
          Database1:   TDatabase;  
          procedure   Table_chooseBeforeDelete(DataSet:   TDataSet);  
          procedure   Table_chooseAfterDelete(DataSet:   TDataSet);  
          procedure   Table_filltextBeforeDelete(DataSet:   TDataSet);  
          procedure   Table_judgeBeforeDelete(DataSet:   TDataSet);  
          procedure   Table_readproBeforeDelete(DataSet:   TDataSet);  
          procedure   Table_procedureBeforeDelete(DataSet:   TDataSet);  
          procedure   Table_filltextAfterDelete(DataSet:   TDataSet);  
          procedure   Table_judgeAfterDelete(DataSet:   TDataSet);  
          procedure   Table_readproAfterDelete(DataSet:   TDataSet);  
          procedure   Table_procedureAfterDelete(DataSet:   TDataSet);  
          procedure   Table_shijuanBeforeDelete(DataSet:   TDataSet);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      DataModule4:   TDataModule4;  
   
  implementation  
   
  uses   Unit3,   Unit6,   Unit7,   Unit8,   Unit9,   Unit11,   Unit10;  
   
  {$R   *.dfm}  
   
  procedure   TDataModule4.Table_chooseBeforeDelete(DataSet:   TDataSet);  
  begin  
          mainform.updateno:=0;  
   
  mainform.updateno:=chooseform.Query1.FieldValues['tno']   ;  
  //exit;  
  //DBNavigator1.BtnClick(nbCancel);  
  //showmessage('请选择一个章节点')   ;  
   
  //else  
  //     mainform.updateno:=table_choose['tno'];  
  end;  
   
  procedure   TDataModule4.Table_chooseAfterDelete(DataSet:   TDataSet);  
  begin  
  DataModule4.Table_choose.Close;  
  DataModule4.Table_choose.Open;  
  DataModule4.Table_choose.Active:=false;  
  DataModule4.Table_choose.Active:=true;  
   
  end;  
   
  procedure   TDataModule4.Table_filltextBeforeDelete(DataSet:   TDataSet);  
  begin  
  mainform.updateno:=0;  
  mainform.updateno:=filltextform.Query1.FieldValues['tno']   ;  
  end;  
   
  procedure   TDataModule4.Table_judgeBeforeDelete(DataSet:   TDataSet);  
  begin  
  mainform.updateno:=0;  
   
  mainform.updateno:=judgeform.Query1.FieldValues['tno']   ;  
  end;  
   
  procedure   TDataModule4.Table_readproBeforeDelete(DataSet:   TDataSet);  
  begin  
  mainform.updateno:=0;  
  mainform.updateno:=readproform.Query1.FieldValues['tno']   ;  
  end;  
   
  procedure   TDataModule4.Table_procedureBeforeDelete(DataSet:   TDataSet);  
  begin  
  mainform.updateno:=0;  
  mainform.updateno:=procedureform.Query1.FieldValues['tno']   ;  
  end;  
   
  procedure   TDataModule4.Table_filltextAfterDelete(DataSet:   TDataSet);  
  begin  
  DataModule4.Table_filltext.Close;  
  DataModule4.Table_filltext.Open;  
  DataModule4.Table_filltext.Active:=false;  
  DataModule4.Table_filltext.Active:=true;  
  end;  
   
  procedure   TDataModule4.Table_judgeAfterDelete(DataSet:   TDataSet);  
  begin  
  DataModule4.Table_judge.Close;  
  DataModule4.Table_judge.Open;  
  DataModule4.Table_judge.Active:=false;  
  DataModule4.Table_judge.Active:=true;  
  end;  
   
  procedure   TDataModule4.Table_readproAfterDelete(DataSet:   TDataSet);  
  begin  
  DataModule4.Table_readpro.Close;  
  DataModule4.Table_readpro.Open;  
  DataModule4.Table_readpro.Active:=false;  
  DataModule4.Table_readpro.Active:=true;  
  end;  
   
  procedure   TDataModule4.Table_procedureAfterDelete(DataSet:   TDataSet);  
  begin  
  DataModule4.Table_procedure.Close;  
  DataModule4.Table_procedure.Open;  
  DataModule4.Table_procedure.Active:=false;  
  DataModule4.Table_procedure.Active:=true;  
  end;  
   
  procedure   TDataModule4.Table_shijuanBeforeDelete(DataSet:   TDataSet);  
  begin  
  definepaperform.updatejno:=0;  
  definepaperform.updatejno:=table_shijuan['jno'];  
  end;  
   
  end.

上面的是unit4的代码,麻烦高手看看

unit4是设置连接数据库的模块

DataModule4.Table_choose.Close;                   //   第一套  
  DataModule4.Table_choose.Open;  
  DataModule4.Table_choose.Active:=false;   //   第二套  
  DataModule4.Table_choose.Active:=true;  
  类似这种代码用一套就行了。另一套删除

我删除了,没什么用,还是原来的问题

我删除了,没什么用,还是原来的问题  
  ============================================================  
  我的意思是说有些是多余的语句,你的问题还是那个DataSet没打开进行了操作引起的。你把源码贴上来也不起多大作用,你可以进行调试跟踪,看错误发生在那条语句。

newshijuanhao:=DataModule4.Table_shijuan.FieldValues['jno']+1;  
  就是这一行出了错  
  unit10中的,要怎么修改?

我估计应该是这句的上一句就出错了。表没有打开。你可在DataModule4.Table_shijuan.Last;前面加一句DataModule4.Table_shijuan.Active   :=   True;试一试,如果错误依然在这一句,说明错误在字段名或者字段类型上或者字段值为空。

高手,谢谢啊,问题解决了,就是少了这一句

posted @ 2009-02-19 16:55 delphi2007 阅读(143) | 评论 (0)编辑 收藏

为什么查询时总是点击查询按钮两次才会有结果,而以后只要点击一次就可以有查询结果了? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219170657216.html
我用Delphi做查询时,用的是TADOQuery,传递参数进行查询,可是,查询窗体刚打开时,为什么总是要点击“查询”两次才出结果,而以后击“查询”一次就可以显示结果了?  
   
   
  以下是代码,请高手们帮我分析一下,到底是怎么回事了,该怎么改掉这个错误!  
   
   
  //执行查询  
  procedure   TfrmBookFeeQuery.BitBtn2Click(Sender:   TObject);  
  begin                                   //执行查询  
      with   QueryDS   do  
      begin  
          close;  
          Parameters.Clear;  
          Parameters.CreateParameter('@V',ftstring,pdinput,20,Combobox1.Text);  
          if   RadioButton1.Checked   then  
                begin  
                    CommandText:='select   *   from   FeeHistory   where   [ClassName]=:V';  
                end  
          else  
                begin  
                    CommandText:='select   *   from   Departments   where   [DepartmentName]=:v';  
                end;  
   
          active:=true;  
   
      end;  
  end;

Open一下

open了也不行呀,还是一样

好明显TADOQuery是没有CommandText的,不提示你错误?

UP,我也遇到过

QueryDs是一个TADODataSet组件

posted @ 2009-02-19 16:55 delphi2007 阅读(310) | 评论 (0)编辑 收藏

bsSkinButtonsBar的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219165654217.html
我已经能把edit1的内容加入列表中  
  想知道点击列表的内容后   怎么把edit1也变成这个  
   
  还有   怎么样能判断重复的   不加入?

`````````````````````````````````````````````````````````````有人不

..........

posted @ 2009-02-19 16:55 delphi2007 阅读(150) | 评论 (0)编辑 收藏

一窗口却换不到另一个窗口中,不报错, Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219141750218.html
unit   z_login;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls;  
   
  type  
      Tf_login   =   class(TForm)  
          Edit1:   TEdit;  
          edit2:   TEdit;  
          Button1:   TButton;  
          Button2:   TButton;  
          Label1:   TLabel;  
          Label2:   TLabel;  
          procedure   Button1Click(Sender:   TObject);  
          procedure   Button2Click(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      f_login:   Tf_login;  
   
  implementation  
  uses   z_data,z_main;  
   
  {$R   *.dfm}  
   
  procedure   Tf_login.Button1Click(Sender:   TObject);  
  begin  
  if   edit1.Text=''   then  
              application.MessageBox('请输入用户名','提示',64)  
      else  
          if   edit2.Text=''   then  
              application.MessageBox('请输入密码','提示',64)  
                else  
   
                    with   Data1.q_login   do  
                        begin  
                            close;  
                            sql.Clear;  
                            sql.Add('select   *   from   t_user   where   user_no   =   :a   and   passwd   =   :b');  
                            parameters.ParamByName('a').Value:=trim(edit1.Text);  
                            parameters.ParamByName('b').Value:=trim(edit2.Text);  
                            open;  
                        end;  
                  if   Data1.q_login.RecordCount>0   then  
                          begin  
                                application.MessageBox('用户名或密码错误,请重新输入!','提示',64);  
                                edit1.Clear;  
                                edit2.Clear;  
                                edit1.SetFocus;  
                            end;  
   
  end;  
   
  procedure   Tf_login.Button2Click(Sender:   TObject);  
  begin  
  Application.Terminate;  
  end;  
   
   
  end.

1.   里面好像没写换哪个窗口.  
  2.   当Data1.q_login.RecordCount   =   0   时才报为用户名或密码错误  
 

我这个登录窗口是从z_main主窗口中  
  procedure   Tf_main.FormShow(Sender:   TObject);  
  begin  
  application.CreateForm(Tf_login,f_login);  
  f_login.ShowModal;  
  f_login.free;  
  end;  
  这样新建出来的

顶上去

当查询成功后close登录框就OK了

if   Data1.q_login.RecordCount>0   then  
                          begin  
                                application.MessageBox('用户名或密码错误,请重新输入!','提示',64);  
                                edit1.Clear;  
                                edit2.Clear;  
                                edit1.SetFocus;  
                            end;  
   
  Data1.q_login.RecordCount>0应该是查询成功吧  
  查询成功还用重新输入密码和用户名吗?  
   
              if   Data1.q_login.RecordCount>0   then  
                          begin  
                            f_login.close;  
                          end;  
 

问题以搞定

posted @ 2009-02-19 16:55 delphi2007 阅读(123) | 评论 (0)编辑 收藏

簡單問題,大家幫忙 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219140838219.html
請問tcxstylerepository是哪個控件包裡的控件.

能給個這個控件包的下載地址更好

呵,MSN上不知道...这里也不知道,帮顶...

posted @ 2009-02-19 16:55 delphi2007 阅读(52) | 评论 (0)编辑 收藏

给access文件加了密码,数据库就链接不上了 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219134533220.html
通过ACCESS的   工具->安全->设置数据库密码   来设置access数据库的密码,access提示要以独占的方式打开,我就用独占的方式打开了。  
   
  用独占的方式打开之后,可以通过   工具->安全->设置数据库密码   来设置密码。  
   
  设置完密码之后,用ADOConnection链接数据库的时候,就链接不上了,  
  提示:  
  测试链接失败,因为初始化提供程序时发生错误。无法启动应用程序,工作组信息文件丢失,或是已被其它用户以独占方式打开。  
   
   
  请问,我该如何正确的给access加密哪?

ADOConnection要重新设置的

我是第一次设置,第一次这样链接就连接不上

可惜这里不能贴图片,:(  
   
  是不是ADOConnection的属性需要设置还是别的什么哪?

没人知道如何解决吗?

在连接字串里加     Jet   OLEDB:Database   Password=你的密码

还是不行,真的不知道什么地方错了,晕死,弄了快1天了

百度一下吧  
  安全的ACCESS加密方法  
   
  -   中国WEB开发者网络   (http://www.webasp.net)  
  --   技术教程   (http://www.webasp.net/article/)  
  ---   安全的ACCESS加密方法   (http://www.webasp.net/article/19/18571.htm)  
  --------------------------------------------------------------------------------  
     
  --   作者:未知  
  --   发布日期:   2005-04-29    
     
   
  安全的ACCESS加密方法  
   
  徐长友  
   
   
              Microsoft的ACCESS数据库,是我们常用的桌面数据之一,大多中小企业的数据库管理系统都可以采用它,但其安全性一直令人担犹,试想,一套财务管理系统,用户直接打开数据库去更改数据,后果会如何?有些系统对ACCESS数据库可能只是更改扩展名,或加个密码,众所周知,破解ACCESS密码的方法和工具网上多的是!所以这样的加密一样令人担犹,下面介绍一个简单的方法,实现ACCESS数据的加密,供大家参考。  
   
        用UltraEdit打开MDB文件可以看到,文件前16个字节的内容:  
  00   01   00   00   53   74   61   6E   64   61   72   64   20   4A   65   74    
  现在随便更改几个,再用ACCESS打开,发现出现不同识别的文件格式错误,因为ACCESS前面保存的信息都是一些MDB文件的定义和口令,如果更改这些内容,别人就很难看出这个数据库的格式,无法打开它了,而且这样不会对数据库的内容作更改,不会破坏原有的数据。  
   
  下面就用Delphi作个简单的加密解程序:  
     
  用到的加密解函数如下:  
   
    const  
    titlestr:array[0..15]   of   byte=  
  ($00,$01,$00,$00,$53,$74,$61,$6E,$64,$61,$72,$64,$20,$4A,$65,$74)   ;//对应MDB文件的前16个字节  
    titlestr2:array[0..15]   of   byte=  
  ($48,$4A,$00,$58,$55,$43,$48,$41,$4E,$47,$59,$4F,$55,$00,$20,$20)   ;//更改后的MDB文件的前16个字节,自己随便写吧,比如写上自己公司的简称或自已的名  
  produce   EncrypMDB(filename:string);   //用titlestr2内容替换MDB前16个字节,以便实现加密的作用  
  var   F:TFileStream;  
  begin  
        if   not   fileExists(filename)   then     exit;  
        F:=TFileStream.create(filename,fmopenwrite);  
        try  
                F.seek($00,soFromBeginning);  
                F.Write(titlestr2,16);  
        finally  
                F.free;  
        end;  
  end;  
  produce   uncrypMDB(filename:string);   //还原MDB前16个字节  
  var   F:TFileStream;  
  begin  
        if   not   fileExists(filename)   then     exit;  
        F:=TFileStream.create(filename,fmopenwrite);  
        try  
                F.seek($00,soFromBeginning);  
                F.Write(titlestr,16);  
        finally  
                F.free;  
        end;  
  end;  
   
  我们知道打开ACCESS数据库后会出现一个锁定文件(.ldb文件),因为我们自己也要使用数据库,所以必须在使用时还原数据库。  
  如果还原后没有进行加密的话,用户同样可以复制MDB文件,然后用ACCESS或其它工具打开它,所以应该在数据打开前后都处于加密状态才能保证数据的安全。  
  用Delphi采用ADO连接数据库用以下方法可以实现:  
   
  //还原数据,以便自已使用数据库  
  copyfile(pchar(APP_path+'\data\account.db'),pchar(app_path+'data\temp.db'),false);   //app_path表示程序的当前目录,account.db是个更改了扩展名的MDB文件  
  uncrypMDB(App_path+'data\temp.db');  
  copyfile(pchar(App_path+'data\temp.db'),pchar(APP_path+'\data\account.db'),false);  
  adoconn.connectionstring:='provider=Microsoft.Jet.OLEDB.4.0;Data   Source='+App_path+'data\account.db;Persist   Security   Info=false';   //adocon是个TADOConnection组件  
  try  
      adoconn.connected:=true;  
  except  
      MessageBox(handle,'打开数据库出现致命的错误!!!','错误',MB_OK+MB_ICONERROR);  
  end;  
  //打开后马上对其加密  
  copyfile(pchar(APP_path+'\data\account.db'),pchar(app_path+'data\temp.db'),false);   //app_path表示程序的当前目录,account.db是个更改了扩展名的MDB文件  
  EncrypMDB(App_path+'data\temp.db');  
  copyfile(pchar(App_path+'data\temp.db'),pchar(APP_path+'\data\account.db'),false);  
  deletefile(App_path+'data\temp.db');  
  上面使用了两次临时文件,是因为数据库打开后再对MDB进行直接的写入会出现问题,而且你无法去确定多少个用户打开了程序。  
  整个程序共用一个TADOConnection,只在打开数据库连接的时候还原MDB文件,其它时间MDB文件一直都处于加密状态!用户复制了MDB文件一般很难知道它是什么!  
   
  打开数据库后会有一个.ldb文件,类型会出现ACCESS等字样,如果你不想让人看出是什么的话就修改注册表吧,如:  
  reg:=TRegistry.Create;  
  try  
      reg.RootKey:=HKEY_CLASSES_ROOT;  
      reg.OpenKey('.ldb');  
      reg.WriteString('','tempfile');  
  finally  
      reg.closekey;  
      reg.free;  
  end;  
  这样用户看到的文件类型是tempfile  
   
  注:以上所用数据库都是指ACCESS   2000,其它版本的我想应该大同小异,自己动手试试吧。大家如有什么更好的方法或建议,欢迎来信交流:yousoft@chinaren.com  
     
 

连接的时候可以按一下测试,如果测试通过的话应该没有问题。

在连接数据库的控件上加入用户与密码访问。

晕死了,还是没成功,:(  
 

在FormCreat中寫~~!

const  
      cn   =  
          'Provider=Microsoft.Jet.OLEDB.4.0;Data   Source=%Ssysdata.mdb;Persist   Security   Info=False;Jet   OLEDB:Database   Password=pc_7018491.1';  
   
  连接:  
      con1.ConnectionString   :=   format(cn,   [ExtractFilePath(ParamStr(0))]);

谢了,再去试试,否则,我的ACCESS就谁都可以看了啊,:(

sCon   ='Provider=Microsoft.Jet.OLEDB.4.0;'   +  
          'Persist   Security   Info=False;'   +  
          'Data   Source=%s;'+  
          'Extended   Properties="";'   +  
          'Jet   OLEDB:System   database="";'   +  
          'Jet   OLEDB:Registry   Path="";'   +  
          'Jet   OLEDB:Database   Password=%s';  
  adoCon.ConnectionString:=Format(sCon,   ['数据库文件名',   '密码']);

在电脑上新建一个   new.udl文件,用它用连ACEESS,连接成功后,用记事本打开这个文件  
  里面的内容就是你要的字符串了

adoconnection2.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data   Source='+DBQ+';Jet   OLEDB:Database   Password=fangyuanzls;';//Source   是ACCESS文件的路径,加文件名  
  如:DBQ=d:\方园自来水网络版\FYCBdata.mdb

楼主是手写连接串吗?我从来不手写。  
   
  如果不是手写,用Delphi   的属性编辑器,是可以设置连接串的密码的。  
  难道你从没发现。

ADOConnection的ConnectionString属性页里,在"连接"那一页的输入登录的数据库信息那里不用填密码,在最后一页("所有")的Jet   OLEDB:Database   Password双击,输入密码,再测试看看,成功的话你再看看连接串是怎样写的。

谢谢   koma2973()   的方法,^_^

posted @ 2009-02-19 16:55 delphi2007 阅读(297) | 评论 (0)编辑 收藏

简单数据库操作问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219132437221.html
请问操作ACCESS数据库时  
  如果数据库是  
  表   word  
  字段   name   字段   pass  
   
  读access把所有的name   加入combobox控件中   然后   点里面的内容就在edit1.text中显示对应的pass内容

1。  
  with   QDate   do  
      begin  
          open;  
          First;  
          Repeat  
              combobox.Items.Add(FieldByName('name').AsString);  
              Next;  
          until   EOF;  
          Close;  
      end;  
  end;  
   
  2。在combobox的OnChange  
  with   QDate   do  
      begin  
          close;  
              QDate.sql.clear;  
              QDate.sql='slect   *   from   word   where   [name]   ='+combobox.Text;  
          open;  
              edit1.text:=FieldByName('pass').AsString;  
          Close;  
      end;  
  end;  
 

呵呵,错了句  
  QDate.sql.add('slect   *   from   word   where   [name]   ='+combobox.Text);

路过.同学....

分点分给我吧

要用哪个控件呢..?

天啊,我用ADOQuery1,

能告诉我第2个人说的用的是什么控件写的么?

或者谁能告诉我个新的方法么..!   感谢

搞定了   可是方法不行啊  
  1。  
  with   QDate   do  
      begin  
          open;  
          First;  
          Repeat  
              combobox.Items.Add(FieldByName('name').AsString);  
              Next;  
          until   EOF;  
          Close;  
      end;  
  end;  
   
  这里就没指定是word表的啊?...

我晕   对   ADOQuery     初始化的时候在   SQL语句中不是写的很清楚了   from   word   吗   ?    
  然后才对ADOQuery进行操作啊。   如果   用   ADOTable则就在   Name中指定不就好了

3个问题。  
  1、name最好不要作为字段名,这是数据库的保留字,如果要使用请这样写[name]  
  2、遍历数据集记录,使用while比较正规,这样写:  
  with   AdoDataSet   do  
  begin  
        if   active   then   active:=false;  
        commandtext:='select   *   from   word';  
        active:=true;  
        combobox1.clear;   combobox2.clear;  
        while   (not   eof)   do  
        begin  
              combobox1.items.add(FieldByName('Name').asstring);  
              combobox2.items.add(FieldByName('pass').asstring);  
              Next;  
        end;  
        Close;  
  end;  
  3、实现你的功能,请在combobox1的onchange时间里写:  
        Edit1.text:=combobox2.items[combobox1.itemindex];

字段名,好像不能使用参数吧?

posted @ 2009-02-19 16:55 delphi2007 阅读(65) | 评论 (0)编辑 收藏

如何将数据表中俩个字段的记录放到一个动态数组中去? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219114601222.html
AdoQuery.Close;  
                  AdoQuery.SQL.Clear;  
                  AdoQuery.SQL.Add('Select   No,Name   from   stu');  
                  AdoQuery.Open;  
  将no,name的值放到一动态数组,总共40条记录左右,所以放在数组中进行,以免频繁访问数据库,我的想法对吗,请指教!

以前经常干的事情:  
  var  
      vPose   :   OleVariant;  
   
              //建立数据输出时定位的数组,   定位数据已在检查日报表数据时取得  
              vPose:=VarArrayCreate([0,AdoQueryTemp.RecordCount-1],VarVariant);  
              AdoQueryTemp.First;  
              for   i:=0   to   AdoQueryTemp.RecordCount-1   do  
              begin  
                  vPose[i]:=VarArrayof([AdoQueryTemp.FieldByName('指标名称').Value,  
                      AdoQueryTemp.FieldByName('目标行').Value,  
                      AdoQueryTemp.FieldByName('第二行').Value,  
                      AdoQueryTemp.FieldByName('目标列').Value]);  
                  AdoQueryTemp.Next;  
              end;  
   
  访问这个数组元素:vPose[i][j]  
 

VarArray是动态数组?

posted @ 2009-02-19 16:55 delphi2007 阅读(218) | 评论 (0)编辑 收藏

DBChart图如何导出到Excel ?? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219113848223.html
如题,现要求把DBChart图也要导出到EXCEL(不单单导数据)。  
   
  分不够再加

我也问过这样的问题,大家告诉我要保存图再把图片粘到excel中

使用ole吧  
  恶梦刚刚开始

楼上,可以详细一点不  
  谢啦

 
  使用ole吧  
  恶梦刚刚开始

同楼上,使用ole

dbchart   有拷贝到剪贴板的方法copyto*

拷贝到剪贴板?  
  又如何从剪贴板取到excel或者excel文件?

ole  
  开始的不仅仅是恶梦

posted @ 2009-02-19 16:55 delphi2007 阅读(402) | 评论 (0)编辑 收藏

数组指针问题,看起来简单做起来复杂,大家帮忙啊! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219113016224.html
我首先做了一个DLL   名字是“mydll”  
   
  library   MYDLL;  
   
  uses  
      sharemem,  
      SysUtils,  
      ExtCtrls,  
      StdCtrls;  
   
   
      type   Tps   =   Record  
                    sno:   integer;   //序列号  
                    fjcode:string[200];//代号  
      End;  
      Tp=array   of   Tps;  
      PTp   =   ^TP;  
   
  {$R   *.RES}  
   
  function   Select(var   PResult:PTp):integer;   export;   stdcall;  
  begin  
      try  
          new(PResult);  
          setlength(PResult^,2);  
          PResult^[0].sno:=1;    
          PResult^[0].fjcode:='大大';  
          PResult^[1].sno:=2;    
          PResult^[1].fjcode:='小小';  
          result:=1;  
      finally  
          dispose(PResult);  
      end;  
  end;  
   
  exports  
      Select;  
   
  begin  
   
  end.  
   
   
  然后我用DELPIH用以下程序调用  
  var  
      Form1:   TForm1;  
   
      type  
          Tps   =   Record  
                    sno:   integer;   //序列号  
                    fjcode:pchar;//系列代号,如DBF  
      End;  
      Tp=array   of   Tps;  
      PTp   =   ^TP;  
  implementation  
   
  {$R   *.DFM}  
  function   Select(var   PResult:PTp):integer;   export;   stdcall;  
                  external   'mydll.dll';  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var   presult:PTp;  
          i:integer;  
  begin  
      i:=Select(PResult);  
      showmessage(PResult^[0].fjcode);//为什么会在这行错误呢???  
      showmessage(PResult^[1].fjcode);  
  end;  
   
  现在的问题是我看了我的DLL应该是没有问题的!  
        为什么showmessage(PResult^[0].fjcode);显示不出‘大大’两个字,反而报错‘内存访问错误’!  
        我该如何查看调用了DLL后函数中输出值PResult的输出结果‘大大’这两个字呢?

帖子贴出来已经一个小时了,在线等了一个多小时了,好着急,高手帮忙啊!

http://community.csdn.net/Expert/topic/5238/5238067.xml?temp=.7243158  
 

maozefa(阿发伯)兄弟,因为我传进去的数组开多大是事先不知道的,所以必须在DLL中去动态setlength,我该怎么写呢?  
  另外象您将的先开好数组然后进去DLL赋值,那我又该做什么修改才能得到我的‘大大’这个输出结果呢?希望您不吝赤教啊,我水平不太好,又被逼到这个地步了,希望能得到您的指导!!!

首先,修改结构:  
  Tps   =   packed   Record  
          sno:   integer;   //序列号  
          fjcode:array[0..199]   of   char;  
  end;  
  其次,Dll中增加一函数,返回数组大小。应用程序中先调用该函数,然后分配内存。  
  用指针作为参数调用Dll的Select  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var    
          presult:Tps;  
          i,   Count:   integer;  
  begin  
      Count   :=   GetSelectCount;   //假设Dll增加的函数,返回数组个数。  
      SetLength(presult,   Count);  
      i:=Select(@PResult);  
      showmessage(PResult^[0].fjcode);  
      showmessage(PResult^[1].fjcode);  
  end;  
   
   
  没有测试,共参考。  
 

我按您的方法做了,就是先分配地址后调用DLL  
  可是按您的代码:  
   
      SetLength(presult,   Count);//有错误,应该是SetLength(presult^,   Count);//  
      i:=Select(@PResult);//这句执行的时候说实参和形参类型不一样的。  
   
  现在还没有完成调试,就是说还没有得到‘大大’两个字出来,兄弟帮忙啊。。。

 
  type  
  Tps   =   packed   Record  
          sno:   integer;   //序列号  
          fjcode:array[0..199]   of   char;  
  end;  
  PTp   =   ^Tps;  
  TpArray   =   array   of   Tps;  
   
  function   Select(PResult:PTp):integer;   export;   stdcall;  
  begin  
          TpArray(PResult)[0].sno:=1;  
          TpArray(PResult)[0].fjcode:='大大';  
          TpArray(PResult)[1].sno:=2;  
          TpArray(PResult)[1].fjcode:='小小';  
          result:=1;  
  end;  
   
  function   GetSelectCount:   Integer;   export;   stdcall;  
  begin  
      Result   :=   2;  
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
          presult:Ptp;  
          i,   Count:   integer;  
  begin  
      Count   :=   GetSelectCount;   //假设Dll增加的函数,返回数组个数。  
      GetMem(PResult,   sizeof(Tps)   *   Count);  
      try  
          i:=Select(PResult);  
          showmessage(TpArray(PResult)[0].fjcode);  
          showmessage(TpArray(PResult)[1].fjcode);  
      finally  
          FreeMem(PResult,   sizeof(Tps)   *   Count);  
      end;  
  end;  
 

我已经全面测试,没问题的:  
  library   Project2;  
   
  uses  
      SysUtils,  
      Classes;  
  type  
  Tps   =   packed   Record  
          sno:   integer;   //序列号  
          fjcode:array[0..199]   of   char;  
  end;  
  PTp   =   ^Tps;  
  TpArray   =   array   of   Tps;  
   
  function   Select(PResult:PTp):integer;   export;   stdcall;  
  begin  
          TpArray(PResult)[0].sno:=1;  
          TpArray(PResult)[0].fjcode:='大大';  
          TpArray(PResult)[1].sno:=2;  
          TpArray(PResult)[1].fjcode:='小小';  
          result:=1;  
  end;  
   
  function   GetSelectCount:   Integer;   export;   stdcall;  
  begin  
      Result   :=   2;  
  end;  
   
  {$R   *.res}  
  exports  
  Select,  
  GetSelectCount;  
   
  begin  
  end.  
   
   
   
  type  
  Tps   =   packed   Record  
          sno:   integer;   //序列号  
          fjcode:array[0..199]   of   char;  
  end;  
  PTp   =   ^Tps;  
  TpArray   =   array   of   Tps;  
   
  function   GetSelectCount:   Integer;   stdcall;   external   'Project2.dll';  
  function   Select(PResult:PTp):integer;   stdcall;   external   'Project2.dll';  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
          presult:Ptp;  
          i,   Count:   integer;  
  begin  
      Count   :=   GetSelectCount;   //假设Dll增加的函数,返回数组个数。  
      GetMem(PResult,   sizeof(Tps)   *   Count);  
      try  
          i:=Select(PResult);  
          showmessage(TpArray(PResult)[0].fjcode);  
          showmessage(TpArray(PResult)[1].fjcode);  
      finally  
          FreeMem(PResult,   sizeof(Tps)   *   Count);  
      end;  
   
  end;  
 

maozefa(阿发伯)   谢谢,按您的方法结果出来了!不过我想追问一个问题:  
  type  
  Tps   =   packed   Record  
          sno:   integer;   //序列号  
          fjcode:array[0..199]   of   char;  
  end;  
  PTp   =   ^Tps;  
  TpArray   =   array   of   Tps;  
   
  按您的这种方法定义和使用dll(就是ARRAY   OF   ...)其他语言调用我DELPHI写的DLL的时候会不会问题呢?  
  谢谢您的回复,您就是我的恩人啊。。。

没问题的,其他语言,比如C/C++的指针可以直接用下标的。  
  另外,把Dll中的function   Select(PResult:PTp):integer;   export;   stdcall;  
  改为function   Select(var   PResult:PTp):integer;   export;   stdcall;  
   
  就可直接用SetLength分配数组长度了  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
          presult:   array   of   Tps;  
          i,   Count:   integer;  
  begin  
      Count   :=   GetSelectCount;   //假设Dll增加的函数,返回数组个数。  
      SetLength(presult,   Count);  
      i:=Select(@PResult);  
      showmessage(PResult[0].fjcode);  
      showmessage(PResult[1].fjcode);  
  end;  
 

但是,程序中的函数说明不要改。  
  还是function   Select(PResult:PTp):integer;   stdcall;   external   'Project2.dll';

使用下面的定义,就是方便其他语言如c/c++定义结构的  
  Tps   =   packed   Record

实在太感谢了,有好多东西我还要边看边理解的!感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢

posted @ 2009-02-19 16:55 delphi2007 阅读(73) | 评论 (0)编辑 收藏

我用的是stringgrid连接数据库!关于提高性能的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219110009225.html
我有上万条的记录由于实际需要需要用到stringgrid控件!然而每次往里面添加纪录的时候都非常慢!  
  例如:  
  StringGrid1.Cells[1,i]:=ADOQuery1.FieldByName('aa').AsString;  
  。  
  。。。  
  有什么更好的其他办法可以提升速度呢?请高人指点!

分页来做吧~~~  
   
  否则真的太辛苦了

让记录在StringGrid中分页显示在Uses中加入:   ADOInt    
     
  //首先设定PageSize,取出PageCount  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      ADoquery1.Recordset.PageSize   :=spinedit1.Value;  
      Edit1.Text   :=   IntToStr(ADoquery1.Recordset.PageCount);  
      ShowData(spinedit2.Value);  
  end;    
     
  //然后将AbsolutePage的数据乾坤大挪移到StringGrid1中    
  procedure   TForm1.ShowData(page:integer);  
  var  
      iRow,   iCol,   iCount   :   Integer;  
      rs   :   ADOInt.Recordset;  
  begin  
      ADoquery1.Recordset.AbsolutePage:=Page;  
      Currpage:=page;      
      iRow   :=   0;  
      iCol   :=   1;  
      stringgrid1.Cells[iCol,   iRow]   :=   'FixedCol1';  
      Inc(iCol);  
      stringgrid1.Cells[iCol,   iRow]   :=   'FixedCol2';  
      Inc(iRow);  
      Dec(iCol);  
      rs   :=   adoquery1.Recordset;  
      for   iCount   :=   1   to   SpinEdit1.Value   do    
      begin  
          stringgrid1.Cells[iCol,   iRow]   :=   rs.Fields.Get_Item('FieldName1').Value;  
          Inc(iCol);  
          stringgrid1.Cells[iCol,   iRow]   :=   rs.Fields.Get_Item('FieldName1').Value;  
          Inc(iRow);  
          Dec(iCol);  
          rs.MoveNext;  
      end;  
         
  //上一页    
  procedure   TForm1.Button2Click(Sender:   TObject);  
  begin  
      If   (CurrPage)<>1   then  
          ShowData(CurrPage-1);  
  end;  
     
  //下一页  
  procedure   TForm1.Button3Click(Sender:   TObject);  
  begin  
      If   CurrPage<>ADoquery1.Recordset.PageCount   then  
          ShowData(CurrPage+1);  
  end;

posted @ 2009-02-19 16:55 delphi2007 阅读(295) | 评论 (0)编辑 收藏

quickreport 加急!!! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219105310226.html
用quickreport   显示第一条记录时有标题,当显示下一条记录时,标题栏没有显示,为什么?怎么办?

标题不放在Title上,改放在PageHeader上

楼上言中了...

posted @ 2009-02-19 16:55 delphi2007 阅读(254) | 评论 (0)编辑 收藏

触发哭的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219102436227.html
写一触发器  
  当表1更新时计算total值(number*price)  
  number在表1中,price在表2中  
  应该怎么写呀  
   
  多给意见~多谢

触发哭???????????????????  
   
   
  CREATE   TRIGGER   触发器名  
  on   表1  
  for   (插入   ,修改   删除   根据自己需要)  
   
  update   total   =   number   *   (Select   price   from   table2)   from   inserted

只是大概,根据自己需要改动

都把人触发哭了!

嘻嘻  
   
  不好意思哦,,  
   
  多谢前面两位大哥~~

posted @ 2009-02-19 16:55 delphi2007 阅读(44) | 评论 (0)编辑 收藏

inno setup如何打包internet快捷方式? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219101808228.html
因为internet快捷方式没有扩展名,inno   setup打包好像就有问题了.请问如何把internet快捷方式打包进去.谢谢

使用向导生成快捷方式的时候,会有提示,要不要生成该公司的网页快捷方式。。。仿照那个做就可以了。。。

posted @ 2009-02-19 16:55 delphi2007 阅读(395) | 评论 (0)编辑 收藏

取数据库中的日期,请教大家一条SQL语句 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219100404229.html
在数据库中有一表名为abc,其中有一个字段属性为日期时间型,我写一条语句能够查出今天的记录  
  也就是说   select   *   from   abc   where   riqi=今天  
   
  呵呵,在线等,请大家指教!

query.SQL.Add('select   *   from   abc   where   riqi='''+DateToStr(Date)+'''');  
  query.Open;

可是我的riqi里面存的可是日期和时间啊  
 

如果是SQL   SERVER的话,可以这样  
  select   *   from   abc   where   DATEDIFF(Day,   riqi,GETDATE())=0

谢谢了,呵呵

select   *   from   abc   where   riqi>a   and   riqi<b  
  设置参数a:=datetostr(now-1)  
  设置参数b:=datetostr(now)  
  因为我这没delphi所以没办法根据提示忘记了怎么写参数

大体是这样吧 我也给忘记了  
 

select   *   from   abc   where   riqi   =   convert(varchar(10),getdate(),120)

posted @ 2009-02-19 16:55 delphi2007 阅读(117) | 评论 (0)编辑 收藏

大家帮忙.谢谢!..(急急急急急) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061219001716230.html
在一个字符串中有一个公式.   str   :=   'FieldValues['TS1']   +   FieldValues['TS2']   +   FieldValues['TS3']   +   (FieldValues['TS4']   +   FieldValues['TS5'])   *   FieldValues['TS6']'  
   
  怎样取得这个地址去得到他们的值

大家看看吧。。。。

用   current:=pchar(str)可以取到他们的地址   
  你说要取他们的值我就不明白了  str不就是他们值吗  
 

posted @ 2009-02-19 16:55 delphi2007 阅读(39) | 评论 (0)编辑 收藏

仅列出标题
共34页: First 8 9 10 11 12 13 14 15 16 Last