delphi2007 教程

delphi2007 教程

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

#

大家帮忙.谢谢!..(急急急急急) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218224617231.html
procedure   TForm1.Button4Click(Sender:   TObject);  
  var  
        P   :   pstring;  
        i,   j   :   integer;  
  begin  
        GetMem(p,   sizeof(string)   *   200);  
        i   :=   1;  
        j   :=   2;  
        GetMem(p,   sizeof(string)   *   200);  
        p^   :=   'Edit'   +   inttostr(i)   +   '.Text   +   Edit'    
                +   inttostr(j)   +   '.Text';  
        freemem(p);  
  end;  
   
        Edit1.Text   :=   20   Edit1.Text   :=   30  
  怎样才能得到这两个的值.  
  为了方便.这里的   i   和   j   特指某个值.  
   
  急啊.请大家帮忙.马上给分.小弟先谢了...

我水平不行,没看懂,不知道楼主要干什么,请楼下高手看看!

Edit1.Text   :=   20    
  Edit2.Text   :=   30  
   
  怎样得到   Edit1.Text   +   Edit2.Text   的值

var  
      v:   Integer;  
  begin  
      v   :=   StrToInt(Edit1.Text)   +   StrToInt(Edit2.Text);  
  end;  
 

不是这个意思   .这样做我倒是会.不过先谢谢你了.  
   
  我的意思是有   n   个edit   应怎样才能得到他们的值呢.  
   
  var  
        i   :   integer;  
  begin  
        i   :=   1;  
        while   i   <=   n   do  
        begin  
               
        end;  
   
  用指针读取怎样做才能得到他们的值呢

var  
      i,   v:   Integer;  
  begin  
      v   :=   0;  
      for   i   :=   0   to   ControlCount   -   1   do  
          if   Controls[i]   is   TEdit   then  
              v   :=   v   +   StrToInt(TEdit(Controls[i]).Text);  
  end;

var  
        I,iCount         :   integer;  
        AddEditText   :   string;  
  begin  
        AddEditText   :=   '';   //此处用AddEditText这个字符串,把符合条件的Edit的Text累加起来  
        for   I   :=   1   to   5   do  
                For   iCount:=self.ComponentCount-1   downto   0   do  
                        if   self.Components[iCount]   is   TEdit   then  
                              if   UpperCase((self.Components[iCount]   as   TEdit).Name)   =   'EDIT'+inttostr(I)   then  
                                    AddEditText   :=   AddEditText   +   (self.Components[iCount]   as   TEdit).Text;  
        showmessage('符合条件的Edit的Text合并为:'+AddEditText);  
  end;  
   
  //阿发伯的代码并没有错,只是因为我已经写出来了,所以就回个贴吧。  
  //楼主,那你这样,就只能把Edits的Name叫做EditXXX了....

我主要是用在数据库上.  
    在一个字符串中有一个公式.   str   :=   'FieldValues['TS1']   +   FieldValues['TS2']   +   FieldValues['TS3']   +   (FieldValues['TS4']   +   FieldValues['TS5'])   *   FieldValues['TS6']'  
   
  怎样取得这个地址去得到他们的值.  
 

相信楼主只要把上面我们给出的代码读懂了,就会自行解决了  
  (楼主面对问题可能很苦恼,然而试图理解你的话的人同样苦恼)

楼主想要的估计是控件数组.不过DELPHI里这方面没有什么好的办法.  
   
  俺一直是一个一个的加的,呵呵,  
   
  IF   EDIT1.TEXT<>''   THEN   ...  
  IF   EDIT2.TEXT<>''   THEN   ...  
   
  对于控件数组,我知道的有两个方法,一个是用TAG属性,一个是继承TEDIT   不过俺在程序的调试是经常出错,所以只好一个一个的加啦  
   
  呵呵,好怀念VB呀

办法还是很多的  
   
  理解深了,就能通用了~~  
   
  和大家努力学习吧~~冲~~~~~~~~

谢谢各位了......

结分...怎么给分没反应呢?

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

用BDE连接SQL SERVER 2000在应用程序界面登录时出错,是怎么回事啊? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218213005232.html
我用BDE连接SQL   SERVER   2000在应用程序界面登录时出错,提示如下:  
  [Microsoft][ODBC   SQL   Server   Driver][SQL   Server]用户'(null)'登录失败。原因  
  未与信任SQL   Server连接相关联。  
  哥位高手,到底是怎么回事啊。登陆按钮的代码如下:  
  procedure   TLoginForm.Button1Click(Sender:   TObject);  
      var  
          aname,apassword:string;  
  begin  
          aname:=trim(Edit1.Text);  
          apassword:=trim(Edit2.Text);  
          Table1.Open;  
          Table1.SetKey;  
          Table1.Fields[0].AsString:=aname;  
          if   Table1.GotoKey   then  
                if   Table1.Fields[1].AsString=apassword   then  
                      if   Table1.Fields[2].AsString='内部管理员'   then  
                            begin  
                                  Table1.Close;  
                                  LoginForm.hide;  
                                  ManageForm.show  
                            end  
                      else  
                            begin  
                                  Table1.Close;  
                                  LoginForm.hide;  
                                  ServeingForm.show  
                            end  
                else  
                      begin  
                          MessageDlg('您不是合法的用户,请退出!',mtInformation,[mbOk],0);  
                          Table1.Close;  
                          LoginForm.Close;  
                      end;  
  end;  
  谢谢指导。

TDataBase中的Params没赋值,  
  DataBase:='User   Name=sa   Password=密码'就可以了

数据库在本地还是在另外机子?有没有访问数据库的权限?访问数据库时要添加用户名和密码的,,

没有设置访问数据库的用户与密码,设置就OK了

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

delphi中ado如何动态连接数据库 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218205039233.html
delphi中ado如何动态连接数据库?

 
  var  
      s:   String;  
  begin  
      s   :=   PromptDataSource(Handle,   ADOConnection1.ConnectionString);  
      if   CompareText(s,   ADOConnection1.ConnectionString)   <>   0   then  
          ADOConnection1.ConnectionString   :=   s;  
  end;  
 

var  
      s:   String;  
  begin  
      s   :=   PromptDataSource(Handle,   ADOConnection1.ConnectionString);  
      if   CompareText(s,   ADOConnection1.ConnectionString)   <>   0   then  
      begin  
          ADOConnection1.Connected   :=   False;  
          ADOConnection1.ConnectionString   :=   s;  
          ADOConnection1.Connected   :=   True;  
      end;  
  end;

如果处于连接状态,ConnectionString比较是不准确的,还是应该先断开连接,修改如下:  
   
  var  
      s:   String;  
  begin  
      ADOConnection1.Connected   :=   False;  
      s   :=   PromptDataSource(Handle,   ADOConnection1.ConnectionString);  
      if   CompareText(s,   ADOConnection1.ConnectionString)   <>   0   then          
          ADOConnection1.ConnectionString   :=   s;  
      ADOConnection1.Connected   :=   True;  
  end;

直接传个ADOConnection对象不就完了?如果在多个窗口像这样写那要生成多少个连接?

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

50分,再求兩個BCB轉delphi的問題,非常感謝! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218201812234.html
下面兩段代碼如何轉成   delphi   的,多謝  
   
  1.  
   
  int   Command,   i;  
      AnsiString   Name,Desc;  
      TLocateOptions   Opts;  
      Opts.Clear();  
      Opts   <<   loCaseInsensitive;  
   
      for   (i   =   0;   i   <   ComponentCount;   i++)  
          {  
          if   (dynamic_cast<TMenuItem*>(Components[i]))  
                {  
                if   (!MENUENABLEDataSet->Locate("MENU",dynamic_cast<TMenuItem*>(Components[i])->Name,Opts))  
                    {  
                      dynamic_cast<TMenuItem*>(Components[i])->Enabled   =   false;  
                    }  
                }  
            }  
   
   
  2.  
   
        int   i,Command;  
        AnsiString   Name,Desc;  
        for   (i=0;i<ComponentCount;i++)  
                {  
                  if   (dynamic_cast<TMenuItem*>(Components[i]))  
                      {         //<指標   void*   定義過的類別>     (指標   參考)  
                          Command   =   dynamic_cast<TMenuItem*>(Components[i])->Command;  
                          Desc   =   dynamic_cast<TMenuItem*>(Components[i])->Caption;  
                          Name   =   dynamic_cast<TMenuItem*>(Components[i])->Name;  
                          MENUDataSet->InsertRecord(ARRAYOFCONST((Command,Name,Desc)));  
                      }  
                }  
        ShowMessage("菜單重置完成!");  
 

unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   DB,   DBTables,   Menus;  
   
  type  
      TForm1   =   class(TForm)  
          MENUENABLEDataSet:   TTable;         //测试用  
          MENUDataSet:   TTable;                     //测试用  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
          procedure   Proc1;  
          procedure   Proc2;  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  //uses   DB;  
   
  {$R   *.dfm}  
   
  {   TForm1   }  
   
  procedure   TForm1.Proc1;  
  var  
      i:   Integer;  
      Opts:   TLocateOptions;  
  //     Name,   Desc:   string;  
  begin  
      Opts   :=   [];  
      Include(Opts,   loCaseInsensitive);  
      for   i   :=   0   to   ComponentCount   -   1   do  
      begin  
          if   Components[i]   is   TMenuItem   then  
                if   not   MENUENABLEDataSet.Locate('MENU',   TMenuItem(Components[i]).Name,   Opts)   then  
                      TMenuItem(Components[i]).Enabled   :=   False;  
      end;  
  end;  
   
  procedure   TForm1.Proc2;  
  var  
      Command,   i:   Integer;  
      Name,   Desc:   string;  
  begin  
      for   i   :=   0   to   ComponentCount   -   1   do  
      begin  
          if   Components[i]   is   TMenuItem   then  
          begin  
                              //<指標   void*   定義過的類別>     (指標   參考)  
                          Command   :=   TMenuItem(Components[i]).Command;  
                          Desc   :=   TMenuItem(Components[i]).Caption;  
                          Name   :=   TMenuItem(Components[i]).Name;  
                          MENUDataSet.InsertRecord([Command,Name,Desc]);  
          end;  
      end;  
      ShowMessage('菜單重置完成!');  
  end;  
   
  end.  
 

注意,前面2个TTable元件只是为求代码通过加上去的,如果使用它们会出错;过程名称随便取的;只是直接将代码移植过来,其它未加考虑。

 
  還沒空測試,先買單,多謝了!

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

关于delphi中,ado的几个简单应用? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218185832235.html
我的程序如下  
  begin  
      ADOQuery1.SQL.Clear;  
      ADOQuery1.Close;  
      if   combobox2.Text:=   '资料ID'   then  
        //begin  
      ADOQuery1.sql.Text:='select   *   from   业务资料库   where   '  
      +'资料ID'+'   =   '+''''+'%'+edit1.text+'%'+'''';  
        //else  
      ADOQuery1.sql.Text:='select   *   from   业务资料库   where   '  
      +ComboBox2.text+'   like   '+''''+'%'+edit1.text+'%'+'''';  
      ADOQuery1.Active:=true;  
        //end;  
          end;  
    我用的是adoquery,以下问题能给出例子的最好能给出例子,不胜感激。  
  问题1、上面的程序有三行屏蔽了,否则不能运行,为什么?  
          2、=   和like这两个命令的标准格式到底是啥?使用时要注意啥,我老用不对!  
          3、用资料id查询时如果edit1为空,如何让grid显示全部记录?  
          4、怎样实现当前是第_条记录,跳转到_条?当我添加一条记录时,怎样让共有_条记录也实时更新?  
          5、   panel   groupbox等控件如何让其透明,因为我最后放它,却老是覆盖其它控件?  
    6、好多控件的autosize怎么用?还有indexname?  
    7、怎样让edit中只能输入数字,当输入其它时弹出一提示对话框?  
    8、请给出一个提示是否真的退出的例子?  
    9、怎样做界面啊?我的界面现在丑的要死!郁闷!!!  
    10、如何实现,选中一复选框之后就选中了grid中的一条记录?  
  注:我是新手,我的邮箱是bearzmc@163.com。我会非常感谢您!

第一:仔细看一下程序    
  if()   then    
  begin  
  else  
  end;  
  语法有问题,应该是    
  if   ()   then    
  begin    
  end    
  else    
  begin    
  end;  
  第二:  
  SQL里面   =   是精确匹配   like   是模糊匹配

第三:可以加个判断  
  if   edit1.text   =   ''   then    
  ADOQuery1.sql.Text:='select   *   from   业务资料库    
  else  
  ADOQuery1.sql.Text:='select   *   from   业务资料库   where   '  
      +'资料ID'+'   =   '+''''+'%'+edit1.text+'%'+'''';  
   
  第四:用While遍历整个记录集  
  第五:Visible属性可以控制是否显示

第六:AutoSize是用在界面大小发生变化时,是否自动变化的  
  第七:在Edit的OnkeyPress事件中加限制  
  第八:用MessageBox  
  if   MessageBox(0,'你真的要退出吗?','警告',MB_OKCANCEL+MB_ICONWARNING)=IDOK   then  
            begin  
                      close;  
            end;  
  第九:这个没办法  
  第十:在复选框的OnClick事件中做处理

回答有点简单,不过还是多谢你了,有没有人能给个例子什么的,第四个还不明白怎么用?谢谢

哇,你的问题不少啊,都是基础问题.最后多看看书....  
  这个得给个完整的小程序你,你就明白了.

基础书多看下  
  procedure   TForm1.Edit1KeyPress(Sender:   TObject;   var   Key:   Char);  
  begin  
        if   key   in['0','1','2','3','4','5','6','7','8','9']   then  
            Edit1.Text:=Edit1.Text+key  
        else  
        exit;  
  end;

procedure   TForm1.Edit2KeyPress(Sender:   TObject;   var   Key:   Char);  
  begin  
  if   (not   (Key   in   ['0'..'9']))   and   (not(key   in['.']))and   (key<>#8)     then  
            Key   :=#0;  
  end;  
   
  这样比较好.

问题一:   因为你的if   条件   then   后面的语句  
      ADOQuery1.sql.Text:='select   *   from   业务资料库   where   '  
      +'资料ID'+'   =   '+''''+'%'+edit1.text+'%'+'''';      
      最后这个分号要去掉.  
   
      if   条件1   then  
          执行的程序段,如果只是一句,则后面不加要分号,否则用begin   程序段   end   (也没有分号)  
      else     begin   //此处同理  
      end;  
  问题二:   =   是精确查询     like是模糊查询     like   '%查询条件%'     可以加前后%,查一下数据库的资料  
  问题三:在查询时,需要拼SQL语句,如果   trim(edit1.text)<>''   时,你把id的查询条件加上,否则不加  
  问题四:这个没太清楚你的问题  
  问题五:可以将其点右键,   control->send   to   back就在最后了  
  问题六:autosize是自动调节控件大小,indexname具体没注意过  
  问题七:      
  在   onkeypress事件中加入如下代码(可以自己确定想让它能输入什么):  
  if   not(Key   in   ['0'..'9',#8,'-'])   then   Key   :=   #0;  
  问题八:application.Terminate   而且没明白你指的真正退出是什么   ,一般只要主窗体close了,整个进程就关了,相当于程序退出了  
  问题九:界面自己多看看相关的程序  
  问题十:这个看我用什么控件

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

高手帮忙啊!关于插入数据库的问题!急急!菜鸟提问! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218182608236.html
高手帮忙!我要向一个表中插入数据!要求的规则是这个的!  
  需要向表中手工插入姓名,所在单位和年龄!需要用年龄算出一个系数,40的系数为1,每增加4,系数增加0.05.年龄的最低值为32,系数为0.9!请问高手,需要自动插入系数,不能手工输入,这个该怎么做啊!帮忙啊!

用触发器  
  或者在设计表的时候,把系数字段设为和年龄关联的公式

先定义好最低年龄和系数,设有Edit_NL   Edit_XS  
  ZXNL   =   32;     //最小年龄  
  XS   =   0.9;       //系数基数  
  var   NL:   integer;  
  if   (NL   :=   StrToInt(Edit_NL.Text))>=ZXNL   then  
      if   (NL   -   32)   mod   4   then  
          Edit_XS   :=   IntTo(XS   +   0.05);  
  这样就OK了.

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

請各位delphi前輩將如下這段BCB防重開同一窗口的代碼轉成delphi,我試了好久都不成功,對delphi認識太少,多謝了。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218170853237.html
//防重開窗口  
  bool   OpenForm(TForm   *WForm)  
    {  
      int   i;  
      bool   FormExist;  
      if   (WForm==NULL)  
            return   false;  
      FormExist=false;  
      for   (i=0;i<Screen->FormCount;i++)  
          if   (Screen->Forms[i]->ClassType()==WForm->ClassType())  
                {  
                  FormExist=true;  
                  break;  
                }  
      if   (FormExist==false)  
                  return   FormExist;  
      if   (WForm->WindowState==wsMinimized)  
                  ShowWindow(WForm->Handle,SW_SHOWNA);  
      if   (!WForm->Visible)  
                  WForm->Visible=true;  
      WForm->BringToFront()   ;  
      WForm->SetFocus();  
      return   true;  
    }  
 

function   OpenForm(WForm:   TForm):   Boolean;  
  var  
      i:   Integer;  
  begin  
      Result   :=   False;  
      if   WForm   =   nil   then  
          Exit;  
      for   i   :=   0   to   Screen.FormCount   -   1   do  
          if   Screen.Forms[i].ClassType   =   WForm.ClassType   then  
          begin  
              Result   :=   True;  
              Break;  
          end;  
      if   not   Result   then   Exit;  
      if   WForm.WindowState   =   wsMinimized   then  
                  ShowWindow(WForm.Handle,   SW_SHOWNA);  
      if   not   WForm.Visible   then  
                  WForm.Visible   :=   True;  
      WForm.BringToFront;  
      WForm.SetFocus;  
      Result   :=   True;  
  end;  
 

非常感謝,我把這段代碼寫在   private   下,編譯不通過,為什么???

非常感謝,我把這段代碼寫在   private   下,編譯不通過,為什么???  
  =================================================================================  
  要把函数加在TForm1的private,必须改上面代码为  
   
  function   TForm1.OpenForm(WForm:   TForm):   Boolean;

unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs;  
   
  type  
      TForm1   =   class(TForm)  
      private  
          {   Private   declarations   }  
          function   OpenForm(WForm:   TForm):   Boolean;  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
   
  {   TForm1   }  
   
  function   TForm1.OpenForm(WForm:   TForm):   Boolean;  
  var  
      i:   Integer;  
  begin  
      Result   :=   False;  
      if   WForm   =   nil   then  
          Exit;  
      for   i   :=   0   to   Screen.FormCount   -   1   do  
          if   Screen.Forms[i].ClassType   =   WForm.ClassType   then  
          begin  
              Result   :=   True;  
              Break;  
          end;  
      if   not   Result   then   Exit;  
      if   WForm.WindowState   =   wsMinimized   then  
                  ShowWindow(WForm.Handle,   SW_SHOWNA);  
      if   not   WForm.Visible   then  
                  WForm.Visible   :=   True;  
      WForm.BringToFront;  
      WForm.SetFocus;  
      Result   :=   True;  
  end;  
   
  end.  
 

 
  這種情況在函數在delphi里聲明在   private   、public   或   直接和   procedure   寫一起有什么區別??

private私有的,只能类自己或者同单元的其他类使用  
  public公有的,都可。。。  
   
  这种函数直接和procedure写一起,大家都可用,和public的区别在于不需要通过类实例访问。

建议你买或者网上当一本入门书看看。  
 

 
  多謝,結貼。  
  分有點少了,各位大哥笑納。

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

fastreport3.15, 先御览打印一条数据,但再调用装载fr3文件时会失败,程序直接退出? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218161536238.html
...  
      if   frxReport.LoadFromFile(FileName)   then     《-   此句  
      begin  
          frxReport.ShowReport();  
  ...  
   
  第一次进入执行时一切正常。  
  不退出程序,马上再御览报表,执行这一句装入文件就会失败而退出。不知道为什么?如何解决,谢谢!

真的没人碰到过这个情况吗?

单步跟踪一下,看看第二次文件名是否正确,或在前加一句frxReport.Clear;试试

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

delphi中三层结构怎样设计?一个管理软件的应用服务器端需要建多少个Remote Data Module? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218143848239.html
一个三层管理软件的应用服务器端需要建多少个Remote   Data   Module?  
  每个数据库表对应一个Remote   Data   Module  
  然后每个Remote   Data   Module中包括一个ADOConnection、DatasetProvider多个ADOQuery  
  再对应客户端一个SocketConnection、ClientDataset、DataSource、DBGrid  
  我这样设计合理吗

这样不行  
   
  一个Remote   Data   Module就行了

Remote   Data   Module本身是多线程的,同一时刻,每个访问者都使用独立的线程,因此一般一个就够了。另外,ADOConnection不要放在Remote   Data   Module上,放在本地Data   Module或者应用服务器的Form上,Remote   Data   Module上的DataSet如ADOQuery.Connection设置为ADOConnection,也就是说,所有线程的数据访问公用一个ADOConnection。

晕了,那Remote   Data   Module上都放哪些控件?  
  我看delphi自带的midas例子好像每个小功能(小模块)都对应了一个Remote   Data   Module,这是怎么回事?

ADOConnection不要放在Remote   Data   Module上,放在本地Data   Module或者应用服务器的Form上,Remote   Data   Module上的DataSet如ADOQuery.Connection设置为ADOConnection,也就是说,所有线程的数据访问公用一个ADOConnection。  
   
  --------------------  
  纯粹乱说,   你这样做很容易线程锁死的.  
 

纯粹乱说,   你这样做很容易线程锁死的.  
  ===============================================================================  
  你才乱说呢!

觉得阿发伯说的没错阿   我的程序就是那样的   线程锁死?为什么

要多个的...

那程序中可能用到几十个ADOQuery控件,这几十个ADOQuery控件也放到应用服务器的同一个Remote   Data   Module中?

那程序中可能用到几十个ADOQuery控件,这几十个ADOQuery控件也放到应用服务器的同一个Remote   Data   Module中?  
  ===============================================================================  
  正确!

ADOConnection如果放在Remote   Data   Module上,意味着每个线程都必须对数据库做一次连接,在用户少的情况下,问题不大,当客户量很大时,容易造成数据库服务器负担过重,且执行效率低。公用一个连接,应用服务器可一次性连接数据库,效率自然是不言而喻,我都是这么做的,从没听说因公用连接而线程锁死的

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

高手请进,关于word的问题,高分奉送 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218135544240.html
我做了一个word文档的模版,里面有一个表格,如何才能把word打开,并把数据库的内容插到word表格里面去啊,怎么样才能插进去啊?高手指教!!!!!给20分

uses  
      Word2000;  
   
  var  
    _Cell:   Cell;  
    Idx:   Integer;  
    Row:   Integer;  
    Col:   Integer;  
   
  begin  
    ...........  
    ADOQuery.Open;  
    for   Row   :=   1   to     ADOQuery.RecordCount   do  
    begin  
        for   Col   :=   1   to     ADOQuery.FieldCount   do  
        begin  
            _Cell   :=   WordDocument.Tables.Item(Idx).Cell(Row,   col);  
            _Cell.Range.Text   :=   ADOQuery.Fields[Col   -1].Value;  
        end;  
        ADOQuery.Next;  
    end;  
  .............

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

头一次遇到这么奇怪的事,百思不得其解! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218134924241.html
用两个变量存double型的值,相乘后的值保留三位小数,问题是:用变量的时候得到的值不能四舍五入,而用数的时候就可以,例子如下,很奇怪,大家可以试一下:  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var   xs,yg,z:double;  
  begin  
            xs:=0.022;  
            yg:=1.25;  
            z:=round(xs*yg*power(10,3))/power(10,3);  
            showmessage(floattostr(z));  
  end;    
   
  这个得到是0.027  
   
  \\\\\\\\\\\\\\\\\\\\\\\\\  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var   z:double;  
  begin  
            z:=round(1.25*0.022*power(10,3))/power(10,3);  
            showmessage(floattostr(z));  
  end;    
   
  这个得到是0.028

哪位老大帮帮我?

这个问题可能是Round浮点数计算精度问题,估计用常数时自动分配的变量精度比double高的缘故。可是搂住使用的变量都是double,为什么要在运算中间作个四舍五入呢,去掉Round,2个运算表达式结果是一样的0.0275

可是我需要保留三位小数呀大侠,咋办?

这个是由于double的精度引起的,改用extended就可以了

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

焦头烂额一个上午还是搞不定,跪地相求大家,朋友帮忙啊。。。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218121845242.html
library   MYDLL;  
   
  uses  
      sharemem,  
      SysUtils,  
      StdCtrls;  
  var  
      fjmain   :   TADODataSet;  
   
      type  
          Tps   =   Record  
                    sno:   integer;    
                    fjcode:pchar;  
                    fjname:pchar;//  
      End;  
      Tp=array   of   Tps;  
   
  {$R   *.RES}  
   
  function   Select(transmode:pchar;var   PResult:Tp):integer;   export;   stdcall;  
  var  
      fjcode,t1,t2:pchar   ;  
        totalnum:integer;  
  begin  
      fjmain:=   TADODataSet.Create(nil);  
      ADO配置过程......(OK的)  
      fjmain.Connection   :=   ADOConnection;  
      try  
          fjmain.Close;  
          fjmain.CommandText:=   'Select   *   From   fjmain   order   by   fjid';  
          fjmain.Open;  
          t1:=pchar(fjMain.fieldbyname('fjcode').asstring);      
          t2:=pchar(fjMain.fieldbyname('fjname').asstring);            
          while   not   fjmain.eof   do  
          begin  
              if   (满足条件)   then  
              begin  
                  totalnum:=totalnum+1;  
                  setlength(PResult,totalNum);  
                  PResult[totalNum-1].sno:=totalnum;  
                  PResult[totalNum-1].fjcode:=t1;  
                  PResult[totalNum-1].fjname:=t2;  
              end;  
              fjmain.next;  
          end;  
          Result   :=   totalnum;  
      finally  
          fjmain.Free;  
          CoUnInitialize;  
      end;    
  end;  
   
  exports  
      Select;  
   
  begin  
   
  end.  
   
  以上是我的代码,现在的问题是  
  第一:我在fjmain表循环的时候,有很多满足条件的记录,我看了结果仅仅最后一条记录中的fjcode,fjname字符串是正确的,其他的都是乱78糟的字符,或者是字符的前几个字母后面的字母是乱码,为什么呢?  
  第二:当我连续两次调用该DLL的时候,会出现内存错误,难道我什么地方没有释放字符串PCHAR变量,就是t1,t2变量么?  
   
  这个问题我已经搞了一个上午了,反复的换pchar,string来试,结果还是有内存问题,大家帮我看看程序的什么地方有问题呢?

totalnum的初始数值是多少

应该不是这个问题,初始值是0   啊

array   of   是Delphi特有的开放数组  
  作为DLL的接口,恐怕有问题的

直接使用fieldbyname().value试试?

totalnum的初始数值?

初始值我说了是0啊,我前面有这样语句的,我的问题还是在于STRING使用上的问题,因为我一旦去掉                 setlength(PResult,totalNum);  
                  PResult[totalNum-1].sno:=totalnum;  
                  PResult[totalNum-1].fjcode:=t1;  
                  PResult[totalNum-1].fjname:=t2;这几句,怎么运行都不会出问题的。

1、totalnum的初始值?  
  2、t1,t2是PChar类型,Pchar是指针,不能用来保存数据,当fjmain.Next后,应该指向了无效地址空间。  
  3、array   of   是Delphi特有的开放数组,作为DLL的接口,肯定有问题的。  
  4、在循环中反复使用setlength(PResult,totalNum);分配内存空间,可能造成前面已经赋值的记录数据丢失,造成乱码

谢谢以上各位兄弟们的关心和回答,尽管我问题还没有完全处理掉,但给我了很好的思路,先结帖,顺便关于下面的这个问题,问下大哥:  
  3、array   of   是Delphi特有的开放数组,作为DLL的接口,肯定有问题的。  
  (我ARRAY   OF只在函数中单独定义单独使用,不作为DLL程序和外界程序的接口,可以使用么?)  
 

我ARRAY   OF只在函数中单独定义单独使用,不作为DLL程序和外界程序的接口,可以使用么?  
  ===================================================================================  
  那应该没问题的,另外需要指出的是,输出记录地址最好由程序调用Dll函数前分配,不要在Dll中分配

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

Delphi 安装程序的生成 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218115413243.html
我在用InstallShieldExpress生成安装程序的时候为什么连不上数据库    
  用户名和密码都是admin  
  可不可以帮帮我  
  我把程序上传到邮箱里了xjmy163@sina.com   密码:19850203  
  一定要帮我啊,谢谢!!!!!!!!!!!!!

没有人回复?!!

不明白,  
   
  你想用   InstallShieldExpress   来连数据库了

mark

是说用InstallShieldExpress生成的安装程序在运行后显示无法连接数据库.

收藏。

"收藏"什么意思?

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

如何让Delphi编译Package后不产生~bpl文件? (D7) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218114136244.html
如题

~这个是自动备份的,不管也没所谓

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

DBGrid的刷新问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218110558245.html
我是一个新手,有一个问题,就是在一数据库中添加纪录后(ADOQuery),显示在DBGrid中,但是添加显示以后不是追加到最后,而是清空了以前的纪录,并只加一条纪录,不能显示已经添加过的纪录,我用了刷新命令也不行,我看到有人说ADOQuery不支持刷新,还有人说再open/close可是我用了还是不行,是不是我用的不对,能不能给我个简单的解释啊,谢谢了。。。。  
  新手求助。。。

添加操作要用ADOQUERY.EXECSQL.所以你OPEN后并没有刷新.  
   
  建议你用两个ADOQUERY.第一个专门用来插入,另一个专门用来显示DBGRID,DBGRID和第二个ADOQUERY连接.  
  第二个close-OPEN后就可以刷新啦.

欧了。。。。很感谢上面的朋友啊。。。两个就可以,非常的感谢,呵呵,开心。。。。。

一个也可以  
  但是execsql之后还要重新读取数据  
  open  
  select   *   from   表名  
  close  
  才可以的。数据集保存的是刚刚通过SQL语句来获得的数据

给了分才算真感谢.  
  楼上那位说的也对,但是语句写错顺序了  
  close  
  select   *   from   tablename  
  open  
 

ADOQUERY.EXECSQL好象好些

ADOQUERY.EXECSQL   的做法是重新加载数据集,不知道你的添加记录的方式是什么样的,如果是insert   into   table方法   就如你说的情况一样,如果是用ADOQUERY.append   或   ADOQUERY.insert就不会有这个问题,这是在现有的数据集基础上操作的!   注意   要想通过ADOQUERY这样的方式操作写数据库

其实只要添加一条记录用post就可以直接的刷新了

adoquery1.Close;  
      adoquery1.SQL.Clear;  
      adoquery1.SQL.Add(str);  
      adoquery1.ExecSQL;  
   
      adoquery1.Close;  
      adoquery1.SQL.Clear;  
      adoquery1.SQL.Add('select   *   from   toone');  
      adoquery1.open;  
  就可以了  
  adoquery1.open;  
  如用到返回数据集的语法   Select   不包括DELETE、UPDATE、INSERT等语法  
  相当于将Query的Active属性设为True;  
  adoquery1.ExecSQL;  
  对于不返回数据集的语法DELETE、UPDATE、INSERT等语法时使用;

二楼的朋友,我不知道怎么给你分啊?呵呵,我到是真想给你。。。。  
   
  其他的朋友也谢谢了昂。。。。

但是这样的刷新DBGRID就会回到表格第一行了。如何可以让表格定位在原来的位置呢,比如我对一个在第2000行的数据修改了,应该在修改并刷新后再定位在2000行的位置上吧。

adoquery1.open  
  后加一条    
  adoquery1.Last;

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

急!三层,先通过clinetdataset从服务器端取得数据,修改后提交到服务器端,准备在服务器端写一个更新数据函数,但更新数据需要主键,现 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218091417246.html
三层,先通过clinetdataset从服务器端(中间层)取得数据,修改后提交到服务器端,准备在服务器端写一个更新数据函数,但更新数据需要主键,现在问题是怎么自动得到主键字段名?  
   
  我的想法是:在取得数据的时候就能得到数据库表的主键,这样当数据表结构有改变的时候,也不会出错!   clientdataset能得到主键吗?

当然可以,在ClientDataSet/DataSetProvider的几个事件里控制着取数据之前,中间层和客户端能够进行信息交流,在事件中有一个核心参数,叫做OwnerData就是干这个的,你需要从服务器端传到客户端什么信息,都可以通过该参数。  
  但是,你的问题好像还不必这么复杂。因为服务器端的和DataSetProvider控件连接的DataSet控件的字段(TField)的ProviderFlags属性中,如果将主键字段的pfInKey属性设为True,并把Provider的UpdataMode设定为WhereKeyOnly,即可达到用主键定位的效果。

能说详细点吗?在什么事件中?

我用的都是无状态对象,都是临时创建的,怎么写事件呀?  
 

最好不要用临时创建。你为什么非得AQuery:=TQuery.Create(nil)呢?你为什么不大大方方的把一个Query控件放到DataModule上面呢?这样做不是自己给自己找麻烦吗?  
  ClientDataSet的BeforeGetRecords

在DataSetProvider的BeforeGetRecords事件里面接收。BeforeGetRecords是对服务器端的Query初始化用的。而AfterGetRecords就是你想要的事件。在DataSetProvider的该事件中打包要告诉客户端的信息,而在ClientDataSet的AfterGetRecords里面接收该信息

另外纠正一点,你这不叫做“无状态对象”,你好好查一下相关资料,弄清楚“无状态对象”是什么意思。你这种情况叫做“动态创建控件对象”。

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

delphi怎么连接oracle(服务器在本地IP:127.0.0.1) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218083334247.html
如题。  
  找了些远程服务器的文档来看,可怎么也不对呀  
  SID:myoracle

你用ADO还是用ODAC连接oracle数据库呀  
  用ADO:  
  第一步:要在本机装一个oracle的客户端,然后用net   manager   建立一个与服务器连接的服务名  
  第二步:用ADO进行连接即可  
   
  用ODAC:  
  这个不用装oracle客户端就能连接上,比较简单,你可以去下载一个odac的控件  
   
  用BDE也需要装oracle客户端,现在很少用BDE了.  
 

数据库在本机,还要装客户端吗?  
  BDE,ADO用什么都行,只要能连上就OK了。。。

可以考虑用DOA啊  
  或者用ODBC来连  
  还是用ODBC方便

可以使用ADO,自动生成字符串

首先用Net   Assisant建立一个Oracle   Net服务名,连接到本机,IP地址和Sid在配置这个服务名过程中指定;  
  Delphi中使用ADO控件,设置使用Microsoft   Oracle   Provided驱动连接到Oracle数据库,其中设置连接字符串的Data   Source(窗口配置里面说得是服务器),设置为你配置的Net服务名就可以了。当然还要制定好连接的用户名和密码。

跟连SQL没什么区别吧

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

一个程序出错,请高手帮帮忙! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061218082820248.html
我想根据用户所选数据类型从数据项目表中提取对应的数据编号插入到数据记录表中的数据编号段,可提示不能插入数据集的错误,若改用循环怎么做呢?  
  procedure   Tsjxmzlr.cb_lxChange(Sender:   TObject);  
  begin  
          with   ADOQ_sjz   do  
            begin  
            ADOQ_sjz.Close;  
            ADOQ_sjz.SQL.Clear;  
            ADOQ_sjz.SQL.Add('insert   into   ysjlrb(phid)   select   phid   from   hymcb   where   lxmc='''+cb_lx.Text+'''');  
            ADOQ_sjz.Open;  
            end;  
  end;  
  下面的一个循环又出现这样的错误?是不是我的机子的问题呢?  
  procedure   Tsjxmzlr.CBB_bdChange(Sender:   TObject);  
  begin  
            ADOQ_sjd.Close;  
            ADOQ_sjd.SQL.Clear;  
            ADOQ_sjd.SQL.Add('select   sjd   from   sjb   where   bd='''+CBB_bd.Text+'''');  
            ADOQ_sjd.Open;  
            CB_sjd.Clear;  
            while   not   ADOQ_sjd.Eof   do  
                  begin  
                        CB_sjd.Items.Add(ADOQ_sjd.此处不出现FieldByname,为什么?我想用FieldByname来获取字段值,还有其它办法吗?  
                        ADOQ_sjd.Next;  
                  end;  
  end;

如果循环的话,我还是建议你使用存储过程来写,此外数据库中是不是有完整性约束呢??比如哪些字段必须不为空,哪些不能重复等等

procedure   Tsjxmzlr.cb_lxChange(Sender:   TObject);  
  begin  
          with   ADOQ_sjz   do  
            begin  
            ADOQ_sjz.Close;  
            ADOQ_sjz.SQL.Clear;  
            ADOQ_sjz.SQL.Add('insert   into   ysjlrb(phid)   select   phid   from   hymcb   where   lxmc='''+cb_lx.Text+'''');  
            ADOQ_sjz.ExecSQL;  
            end;  
  end;  
 

procedure   Tsjxmzlr.cb_lxChange(Sender:   TObject);  
  begin  
          with   ADOQ_sjz   do  
            begin  
            ADOQ_sjz.Close;  
            ADOQ_sjz.SQL.text   :=   'insert   into   ysjlrb(phid)   select   phid   from   hymcb   where   lxmc=:lxmc';  
            ADOQ_sjz.Parameters.ParamByName('lxmc').Value   :=   trim(cb_lx.Text);    
            //最好按上面的这样绑定变量的形式效率高一些   
            //ADOQ_sjz.Open;   此处错误  
            ADOQ_sjz.ExecSql;  
            end;  
  end;  
 

你的循环那段代码也有点问题,你试一下这样看行不行:  
            //取数据信息  
            ADOQ_sjd.Close;  
            ADOQ_sjd.SQL.text   :=   'select   sjd   from   sjb   where   bd=:bd';  
            ADOQ_sjz.Parameters.ParamByName('bd').Value   :=   trim(CBB_bd.Text);  
            ADOQ_sjd.Open;  
            //开始循环  
            while   not   ADOQ_sjd.Eof   do  
            begin  
                CB_sjd.Close;  
                CB_sjd.text   :=   '   insert   into     ysjlrb(phid)   values   (:phid)';  
                CB_sjd.Parameters.ParamByName('phid').Value   :=   ADOQ_sjd.FieldByName('sjd').AsString;  
                CB_sjd.ExecSql;  
                ADOQ_sjd.Next;  
            end;  
 

不好意思上面有点错误:   CB_sjd.text       改成   CB_sjd.sql.text

谢谢大家!我都给分!!

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

请教高手问题,急?? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061217233102249.html
小弟不才,delphi新手。  
  当edit控件不输入数据时,edit.text的值为'';  
  我怎么样才能使edit控件在不输入数据时edit.text的值为null。  
  谢谢

又是小罗  
   
  function   StrToVar(const   ADefault:   string):   Variant;  
  begin  
      if   ADefault   =   ''   then  
          Result   :=   null  
      else  
          Result   :=   ADefault;  
  end;  
 

嘿嘿,老冯,你不常上QQ吗?上次那个问题我解决了。

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

Report Machine 的问题 补充!!! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061217232734250.html
看了     Report     Machine     的Demo     感觉     很好,可是Report     Machine     要     900     大洋         王大仙也太狠了     不知     CSDN     网友谁有,能不能发我一个学习学习啊,小弟还是学生,没有经济实力,非常感谢啊!!!分数全部送上了!!!     我的   Mail   :yhnewbag@163.com

你下一个3.0,3.0是免费的。

3.0安装   有很多错误   郁闷

不知道谁有   5.0的注册版   能发我一下吗     有条件的话也可以啊

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

如何判断一个变量是否等于很多值中的一个? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061211105425201.html
变量temp,  
  如何判断temp是否等于   {1,2,3,4,7,8,11,12,45,58,56,94,54,5,48,321,123,456,789,951,423,956,957}  
  中的一个?  
  要最简单的方法

if   temp   in   [1,2,3,4,7,8,11,12,45,58,56,94,54,5,48,321,123,456,789,951,423,956,957]   then   存在   else   不存在

if   temp   in     [1,2..20,50,60]   then   ;

jf

posted @ 2009-02-11 16:50 delphi2007 阅读(492) | 评论 (0)编辑 收藏

在Delphi7 报表如果横向打印,在线等! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061211082954202.html
如题!

看你用什么做打印了,quickreport,fastreport还是其他?

横向打印与报表打印软件关系不大吧!应该在打印机设置里面调整,包括页面大小、横向或者纵向打印等

posted @ 2009-02-11 16:50 delphi2007 阅读(280) | 评论 (0)编辑 收藏

请教去除一个几万行的文本文件数据重复的算法 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061211021429203.html
有一个几万行数据的文本文件,一行为一个数据,请问用什么算法去掉重复的数据才最有效率呢,自己弄的好慢,谢谢各位帮助。

顶上去,继续请教

只会笨办法。  
   
  1:放在数据库里,让数据库帮你去掉重复  
   
  2:先排序,然后在一次循环找出重复的。至于排序的方式则有很多的选择。

对,先排序,后排除

排序就是例如放到一个   TSTRINGLIST里吗?

select   distanct

排序然后排出比较简单,算法复杂度O(N*Log(N))  
  (不知道重复率有多大?)  
   
  利用Hash值来进行快速排出,算法复杂度接近O(N):  
  1.建立一个TNode数组(大小与不重复的数据量相当,或大些也可以)   TNode=record     Str:Pchar   PNext   :   ^TNode   end;     (单向链表)  
  2.计算每个数据S的Hash值,映射到数组元素I,   如果I.PChar=nil,则I.PChar=s;   否则对比这个单向链表的所有字符串值,看S是否已经有了,没有的话添加到I的最后面;  
 

同意楼上  
  Hash+排序

procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      AInput     :   TStringList;  
      AOutput   :   TStringList;  
      iLoop       :   Integer;  
      sTemp       :   String;  
  begin  
      AInput   :=   TStringList.Create;  
      try  
          AInput.LoadFromFile('C:\Input.TXT');  
          AOutput   :=   TStringList.Create;  
          try  
              for   iLoop   :=   0   to   AInput.Count   -   1   do  
              begin  
                  sTemp   :=   AInput.Strings[iLoop];  
                  if   AOutput.IndexOf(sTemp)   <   0   then   AOutput.Add(sTemp);  
              end;  
              AOutput.SaveToFile('C:\Outpt.TXT');  
          finally  
              AOutput.Free;  
          end;  
      finally  
          AInput.Free;  
      end;  
  end;

jadeluo(秀峰)   的算法比较容易直接实现  
   
  Hash   算法最快但比较麻烦  
   
  推荐jadeluo(秀峰)

var  
    myl,mym:TStringList;  
    mys:string;  
    myi:integer;  
  begin  
    myl:=TStringList.create;  
    mym:=TStringList.create;  
    myl.LoadFromFile('input.txt');  
    myl.Sort;  
    mys:='';  
    for   myi:=0   to   myl.Count-1   do  
      if   mys<>myl.Strings[myi]   then  
        begin  
          mym.Add(mys);  
          mys:=myl.Strings[myi];  
        end;  
    mym.SaveToFile('out.txt');  
    myl.Free;  
    mym.Free;  
  end;  
   
  这个方法效率如何?

别用tstring做,用sql做最快,先建一个表,然后用bcp导入到这个表里,bcp的语法里有去除重复的功能,然后在用bcp的命令给引出来。  
   
  tstring处理行数较小的还成,几万行以上,只sort一下就慢死了。  
   
  另一个方法:  
  用存盘的方法(建个临时目录),把一行数据当成一个文件名,放硬盘上存,如果重名了就不存,这样只从头到尾走一次就够了,执行完后,在用dir命令存成一个文件就成了!

把油箱告诉我,我给你解决方法,不用数据库,性能特特别快。

808886@gmail.com  
   
  谢谢各位拉

我做了一个算法,10万行查重复,用15M。我的机器是双核3.5G

我做了一个算法,10万行查重复,用15秒。我的机器是双核3.5G,不知道是否达到要求

加上一行Sort,可以提高不少速度。  
  关于TStringList类的Sort和IndexOf函数,Delphi中提供了源代码的。其中,Sort使用的是快速排序,IndexOf在有Sort的情况下为二分法查找,否则为顺序查找。  
  效率应该不低的。  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      AInput     :   TStringList;  
      AOutput   :   TStringList;  
      iLoop       :   Integer;  
      sTemp       :   String;  
  begin  
      AInput   :=   TStringList.Create;  
      try  
          AInput.LoadFromFile('C:\Input.TXT');  
          AInput.Sort;  
          AOutput   :=   TStringList.Create;  
          try  
              for   iLoop   :=   0   to   AInput.Count   -   1   do  
              begin  
                  sTemp   :=   AInput.Strings[iLoop];  
                  if   AOutput.IndexOf(sTemp)   <   0   then   AOutput.Add(sTemp);  
              end;  
              AOutput.SaveToFile('C:\Outpt.TXT');  
          finally  
              AOutput.Free;  
          end;  
      finally  
          AInput.Free;  
      end;  
  end;

我的算法是拿内存换时间。

unit   uCheckDup;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,  
      Dialogs,   StdCtrls;  
   
  procedure   StartCheckDup;  
  function   CheckDup(AStr:   string):   boolean;  
   
  implementation  
   
  var  
      StrListArray:   array   of   TStringList;  
   
  const  
      BufSize   =   65536;//     64K  
   
  procedure   StartCheckDup;  
  var  
      I:   integer;  
  begin  
      SetLength(StrListArray,   BufSize);  
      for   I   :=   0   to   BufSize   -   1   do  
          StrListArray[I].Clear;  
  end;  
   
  function   CheckDup(AStr:   string):   boolean;  
  type  
      TWordArray   =   array   of   word;  
  var  
      Key:             word;  
      I,   L:           integer;  
      AStrList:   TStringList;  
  begin  
      Key   :=   0;  
      L       :=   length(AStr);  
      if   L   =   1   then  
          Key   :=   Ord(AStr[1])  
      else  
          for   I   :=   (L   shr   1)   -   1   downto   0   do  
              Key   :=   Key   +   TWordArray(PChar(AStr))[I];  
   
      if   (L   and   1)   <>   0   then  
          Key   :=   Key   +   Ord(AStr[L]);  
   
      AStrList   :=   StrListArray[Key];  
      if   (AStrList.Count   =   0)   or   (AStrList.IndexOf(AStr)   <   0)   then  
      begin  
          AStrList.Append(AStr);  
          Result   :=   False;  
      end  
      else  
          Result   :=   True;  
  end;  
   
  procedure   GenerateArray;  
  var  
      I:   integer;  
  begin  
      SetLength(StrListArray,   BufSize);  
      for   I   :=   0   to   BufSize   -   1   do  
          StrListArray[I]   :=   TStringList.Create;  
  end;  
   
  procedure   FreeArray;  
  var  
      I:   integer;  
  begin  
      for   I   :=   0   to   BufSize   -   1   do  
          FreeAndNil(StrListArray[I]);  
  end;  
   
  initialization  
      GenerateArray;  
  finalization  
      FreeArray;  
  end.  
 

使用方法:procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      ATick:   DWord;  
      I:           integer;  
  begin  
      ATick   :=   GetTickCount;  
      StartCheckDup;  
      sl2.Clear;  
      for   I   :=   0   to   sl.Count-1   do  
      begin  
          if   not   CheckDup(sl[I])   then  
              sl2.Append(sl[I]);  
          Caption   :=   IntToStr(I);  
      end;  
      ShowMessage('Time:'   +   IntToStr(GetTickCount   -   ATick)  
          +   'ms,Remains:'   +   IntToStr(sl2.Count));  
  end;  
 

up

实用算法大讨论,好贴.  
 

//十万行,双核1.6G耗时1.2   秒  
   
  var  
      I:   Integer;  
      vTickCount:   Longword;  
  begin  
      Randomize;   //   test  
      with   TStringList.Create   do   try  
          //LoadFromFile('input.txt');   //载入文件  
          for   I   :=   1   to   100000   do   Add(IntToStr(Random(MaxInt)));   //   产生十万行文本  
   
          vTickCount   :=   GetTickCount;  
          Sort;   //排序  
   
          for   I   :=   Count   -   1   downto   0   do  
              if   (I   >=   1)   and   (Strings[I]   =   Strings[I   -   1])   then  
                  Delete(I);  
          Caption   :=   IntToStr(GetTickCount   -   vTickCount);   //   输出用时  
      finally  
          Free;  
      end;  
  end;  
 

应该这样,规定字符串的长度为某个固定值比较好。我推荐20。测试数据:  
  var  
      I:   integer;  
  begin  
      Randomize;  
      sl.BeginUpdate;  
      sl.Clear;  
      for   I   :=   0   to   100000   do  
      begin  
          sl.Append('test'   +   format('%.11d',   [random(50000)]));  
          Caption   :=   IntToStr(I);  
      end;  
      sl.Sort;  
      sl.EndUpdate;  
 

我发现了,Caption   :=   IntToStr(I);是个速度杀手,我把它关闭之后,我的算法处理10万条数据速度达到了2秒!好像比zswang(伴水清清)(专家门诊清洁工)   的慢。但是我怀疑zswang(伴水清清)(专家门诊清洁工)   采用的数据应该是具有大致1半重复数据(也就是10万次调用random(50000)),看看性能如何?

破最新纪录:我修改了一下算法,使zswang的for   I   :=   1   to   100000   do   Add(IntToStr(Random(MaxInt)))产生的10万条数据在我这里仅用了0.3秒查完重复。针对我自己产生的高重复数据,10万条的处理我用了2.3秒!  
  搂主感谢我吧。注意:本次算法函数返回值调整了一下,无重复返回true,和以前相反。  
  unit   uCheckDup;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,  
      Dialogs,   StdCtrls;  
   
  procedure   StartCheckDup;  
  function   CheckDup(AStr:   string):   boolean;  
   
  implementation  
   
  const  
      BufSize   =   65536;//     64K  
   
  var  
      StrListArray:   array   of   TStringList;  
      Crc16Tab:           array[0..$FF]   of   word   =  
          ($00000,   $01021,   $02042,   $03063,   $04084,   $050a5,   $060c6,   $070e7,  
          $08108,   $09129,   $0a14a,   $0b16b,   $0c18c,   $0d1ad,   $0e1ce,   $0f1ef,  
          $01231,   $00210,   $03273,   $02252,   $052b5,   $04294,   $072f7,   $062d6,  
          $09339,   $08318,   $0b37b,   $0a35a,   $0d3bd,   $0c39c,   $0f3ff,   $0e3de,  
          $02462,   $03443,   $00420,   $01401,   $064e6,   $074c7,   $044a4,   $05485,  
          $0a56a,   $0b54b,   $08528,   $09509,   $0e5ee,   $0f5cf,   $0c5ac,   $0d58d,  
          $03653,   $02672,   $01611,   $00630,   $076d7,   $066f6,   $05695,   $046b4,  
          $0b75b,   $0a77a,   $09719,   $08738,   $0f7df,   $0e7fe,   $0d79d,   $0c7bc,  
          $048c4,   $058e5,   $06886,   $078a7,   $00840,   $01861,   $02802,   $03823,  
          $0c9cc,   $0d9ed,   $0e98e,   $0f9af,   $08948,   $09969,   $0a90a,   $0b92b,  
          $05af5,   $04ad4,   $07ab7,   $06a96,   $01a71,   $00a50,   $03a33,   $02a12,  
          $0dbfd,   $0cbdc,   $0fbbf,   $0eb9e,   $09b79,   $08b58,   $0bb3b,   $0ab1a,  
          $06ca6,   $07c87,   $04ce4,   $05cc5,   $02c22,   $03c03,   $00c60,   $01c41,  
          $0edae,   $0fd8f,   $0cdec,   $0ddcd,   $0ad2a,   $0bd0b,   $08d68,   $09d49,  
          $07e97,   $06eb6,   $05ed5,   $04ef4,   $03e13,   $02e32,   $01e51,   $00e70,  
          $0ff9f,   $0efbe,   $0dfdd,   $0cffc,   $0bf1b,   $0af3a,   $09f59,   $08f78,  
          $09188,   $081a9,   $0b1ca,   $0a1eb,   $0d10c,   $0c12d,   $0f14e,   $0e16f,  
          $01080,   $000a1,   $030c2,   $020e3,   $05004,   $04025,   $07046,   $06067,  
          $083b9,   $09398,   $0a3fb,   $0b3da,   $0c33d,   $0d31c,   $0e37f,   $0f35e,  
          $002b1,   $01290,   $022f3,   $032d2,   $04235,   $05214,   $06277,   $07256,  
          $0b5ea,   $0a5cb,   $095a8,   $08589,   $0f56e,   $0e54f,   $0d52c,   $0c50d,  
          $034e2,   $024c3,   $014a0,   $00481,   $07466,   $06447,   $05424,   $04405,  
          $0a7db,   $0b7fa,   $08799,   $097b8,   $0e75f,   $0f77e,   $0c71d,   $0d73c,  
          $026d3,   $036f2,   $00691,   $016b0,   $06657,   $07676,   $04615,   $05634,  
          $0d94c,   $0c96d,   $0f90e,   $0e92f,   $099c8,   $089e9,   $0b98a,   $0a9ab,  
          $05844,   $04865,   $07806,   $06827,   $018c0,   $008e1,   $03882,   $028a3,  
          $0cb7d,   $0db5c,   $0eb3f,   $0fb1e,   $08bf9,   $09bd8,   $0abbb,   $0bb9a,  
          $04a75,   $05a54,   $06a37,   $07a16,   $00af1,   $01ad0,   $02ab3,   $03a92,  
          $0fd2e,   $0ed0f,   $0dd6c,   $0cd4d,   $0bdaa,   $0ad8b,   $09de8,   $08dc9,  
          $07c26,   $06c07,   $05c64,   $04c45,   $03ca2,   $02c83,   $01ce0,   $00cc1,  
          $0ef1f,   $0ff3e,   $0cf5d,   $0df7c,   $0af9b,   $0bfba,   $08fd9,   $09ff8,  
          $06e17,   $07e36,   $04e55,   $05e74,   $02e93,   $03eb2,   $00ed1,   $01ef0);  
   
  function   CRCValue(AStr:   string):   Word;  
  var  
      i:   integer;  
  begin  
      Result   :=   0;  
      for   i   :=   Length(AStr)   downto   1   do  
          Result   :=   Hi(Result)   xor   CRC16Tab[byte(AStr[i])   xor   Lo(Result)];  
  end;  
   
  procedure   StartCheckDup;  
  var  
      I:   integer;  
  begin  
      SetLength(StrListArray,   BufSize);  
      for   I   :=   0   to   BufSize   -   1   do  
          StrListArray[I].Clear;  
  end;  
   
  function   CheckDup(AStr:   string):   boolean;  
  begin  
      with   StrListArray[CRCValue(AStr)]   do  
      begin  
          Result   :=   (Count   =   0)   or   (IndexOf(AStr)   <   0);  
          if   Result   then  
              Append(AStr);  
      end;  
  end;  
   
  procedure   GenerateArray;  
  var  
      I:   integer;  
  begin  
      SetLength(StrListArray,   BufSize);  
      for   I   :=   0   to   BufSize   -   1   do  
          StrListArray[I]   :=   TStringList.Create;  
  end;  
   
  procedure   FreeArray;  
  var  
      I:   integer;  
  begin  
      for   I   :=   0   to   BufSize   -   1   do  
          FreeAndNil(StrListArray[I]);  
  end;  
   
  initialization  
      GenerateArray;  
  finalization  
      FreeArray;  
  end.  
 

谢谢各位的热情帮助,特别是   yangfl(yangfl)   jadeluo(秀峰)   zswang(伴水清清)  
   
 

posted @ 2009-02-11 16:50 delphi2007 阅读(530) | 评论 (0)编辑 收藏

很奇怪的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061211004332204.html
我用idhttp控件的get方法得到一个网页的源码,存成一个string类型,可是当我在里边用pos函数查找一个子串时,发现每次得到的字串位置都不一样,我感到很困惑。是不是使用长字符串造成的呢?想不通啊,希望大虾指点

码不同!

posted @ 2009-02-11 16:50 delphi2007 阅读(93) | 评论 (0)编辑 收藏

VC与Delphi中的数组问题及VC写的DLL与Delphi兼容性问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061210224541205.html
问题1:我想问一下vc中的2维char*数组与Delphi中的2维pchar数组结构是否相同?  
  问题2:还有C++可以有动态的2维char*数组吗?  
  问题3:我记得DLL好像不可以创建属于自己的内存空间,那如果我传递一个结构体的指针,然后让Dll创建多个结构体连起来可以吗?  
  结构体如下:  
  type   tx   =   packed   record  
  data   :   pointer;  
  nextx   :   pointer;  
  end;  
   
  总之我要用vc写的Dll返回一个二维char*数组给delphi写的主程序,然后将其成功释放,如果不能回答以上问题,指点我一下实现这个的方法也可以。

我希望能在明天中午之前就放分...

没人?

不要char了,全部改用xml作于参数就可以了,而且和语言没关系了

问题1:我想问一下vc中的2维char*数组与Delphi中的2维pchar数组结构是否相同?  
   
  ~_~:可以把二维数组变成一维的........如:  
  char   chararr_2[2][3]={0};  
  char   chararr_1[6]={0};  
   
  问题2:还有C++可以有动态的2维char*数组吗?  
   
  你可以动态分配内存......还是用上面的办法试试.  
  char   *parr=(char*)realoc(N*sizeof(char));//N:数组元素个数  
   
  问题3:我记得DLL好像不可以创建属于自己的内存空间,那如果我传递一个结构体的指针,然后让Dll创建多个结构体连起来可以吗?  
   
  在DLL中做全局变量吧.....  
   
  仅供参考........^_^

-_-!!,语法错误,更正下.....  
  char   *parr=(char   *)malloc(N*sizeof(char));  
  parr=(char*)realloc(parr,N_2*sizeof(char));//N_2:新数组元素个数

同意楼上的

to   yi10000()    
  xml?我觉得没必要吧?  
   
  to   dinglinger(红辣椒)    
  我就是觉得一维数组调用麻烦...以前的dll是导出一维数组的我想把一维数组转为二维数组再传给delphi...

不要用Pchar,用Byte

to   lextm(LeLe)  
  什么意思?请举个例子

我昨天晚上写了写代码发现vc和delphi多维数组中元素的排列方式不一样...

不知不同的C++编译器是否一样

posted @ 2009-02-11 16:50 delphi2007 阅读(564) | 评论 (0)编辑 收藏

取表的最大编号 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061210224437206.html
为什么我查出来都是没有值的....请大家指点...

请把你的语句贴出来,好吗?

query3.SQL.Add('select   max(id)   as   maxid   from   userload');  
  query3.Open;  
  t:=query3.FieldValues['maxid']   ;  
   
  这是关键的部分,然后我赋值给其余变量都说我是空值...但是,表内有一条记录的时候不出错,没记录就出错~

query3.SQL.Add('select   max(id)   as   maxid   from   userload');  
  query3.Open;  
  if     not   query3.SQL.empty   then    
  t:=query3.FieldValues['maxid']   ;

这样不能解决本质问题啊~那如果表内没有记录~不是还是错的!?

var  
  a,b:string;  
  b:=formatdatetime('yyyymmdd',date);  
   
   
  query5.SQL.Add('select   max(docID)   as   maxid   from   doctor');  
      query5.SQL.Add('where   docID   like   :docID');  
      query5.ParamByName('docID').AsString:=s+'%';  
        query5.Open;  
        a:=query5.fieldbyname('maxid').AsString;  
        if   a=''then  
          b:=b+'1'  
          else  
              begin  
        b:=b+inttostr(strtoint(trim(a))+1);  
        system.Delete(b,1,2);  
   
  doctor.Append;  
  doctor.Fields[0].AsString:=b;  
  我现在改成这样了.怎么第一条可以,加第二条有错?

若表中没有记录,则查询到的是空,你可以这样判断,  
  if   query3.fieldbyname('maxid')=''   then           //表中没有记录  
  //  
  else      
  //

我自己解决了~是我提取当前时间之后直接加了最大编号.再截字段,造成主键重复了~  
  还是谢谢大家

结贴啦~~真是~

posted @ 2009-02-11 16:50 delphi2007 阅读(133) | 评论 (0)编辑 收藏

fft信号分析的实例 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061210220741207.html
求delphi实现fft信号分析的实例?谢谢!急急急急急急急急急急急急急急急急急急急!
posted @ 2009-02-11 16:50 delphi2007 阅读(195) | 评论 (0)编辑 收藏

我们的程序有一个框架, Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061210191221208.html
我们的程序有一个框架,  
   
  综合管理信息系统维护及参数配置  
  这个程序下,有一个“菜单项定义表”窗口;  
  窗口上有一个表,其字段台如下;  
   
  菜单项代码                       菜单项名称             调用类型             调用包名             调用form   名  
   
  如以下:  
   
  HY_HD_CLXX             查询作业车                 外部                           PKHDMAIN         frmHdClxx  
   
  以上是别编的,可以用;我也编了如下的包,和form  
   
  XC_CH_PMLR               品名录入                       外部                       Pk_PMLR             FrmPMLR  
   
  但是在另一个程序中,我调用“品名录入”这个菜单项时,鼠标显示在执行,却不出现我想要的窗口FrmPMLR,我是把窗口打包在包Pk_PMLR.bpl   中的,并且把这个包Pk_PMLR.bpl放在winxp   系统下的   c:\windows\system32\     下的呀!  
   
  请高手帮我分析:问题出在哪?  
   
  是我包编的有问题,还是什么别的原因?  
   
  另外,如何通过菜单项来调用包?  
   
  在程序怎么调用包呀?  
   
   
 

LoadPackage('my.bpl');

但是在另一个程序中,我调用“品名录入”这个菜单项时,  
  鼠标显示在执行,却不出现我想要的窗口FrmPMLR;  
   
  --------------------------------------------------  
  以上有朋友讲:   要在包中注册   form   ,    
  使包中的多个   form   在内存中有各自唯一的键值;  
  但是我的包中只包含一个   form   ,    
   
  另外,还想问如何在一个包中注册,说明一个窗口   form   呀!  
   
   
 

posted @ 2009-02-11 16:50 delphi2007 阅读(120) | 评论 (0)编辑 收藏

FFT算法实现 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061210124307209.html
type     TComplexData   =   record   //自定义复数类型  
            vReal,vImaginary:   Double;  
  end;  
  TComplexDataArray   =   array   of   TComplexData;   //实数数组    
  TExtendedArray   =   array   of   Extended;   //复数数组  
   
  function   ComplexAdd(c1,c2:TComplexData):TComplexData;               //复数相加  
  function   ComplexMinus(c1,c2:TComplexData):TComplexData;           //复数相减  
  function   ComplexMultiply(c1,c2:TComplexData):TComplexData;     //复数相乘  
  procedure   ComplexArrayWrap(var   a1,a2:TComplexDataArray);         //复数数组互换  
  procedure   DoFFT(TD:TExtendedArray;   var   FD:TExtendedArray;   r:Integer);  
   
  procedure   Tmainform.DoFFT(TD:TExtendedArray;   var   FD:TExtendedArray;   r:Integer);  
  var  
                  i,j,k   :   Integer;   //循环变量  
                  bfsize,p   :   Integer;   //中间变量  
                  angle   :   Double;   //角度  
  begin  
                  count:=   1   shl   r;   //傅立叶变换点数  
                  //   分配运算所需存储器  
                  SetLength(W,   count   div   2);  
                  SetLength(X1,count);  
                  SetLength(X2,count);  
                  //   计算加权系数  
                  for   i:=0   to   count   div   2   -1   do  
                  begin  
                                  angle   :=   -i   *   PI   *   2   /   count;  
                                  W[i].vReal   :=   cos(angle);  
                                  W[i].vImaginary   :=   sin(angle);  
                  end;  
                  //   将时域点写入X1  
                  for   i:=0   to   count-1   do  
                  begin  
                                  X1[i].vReal:=TD[i];  
                                  X1[i].vImaginary:=0;  
                  end;  
                  //   采用蝶形算法进行快速傅立叶变换    
                  for   k:=0   to   r-1   do  
                  begin  
                                  for   j:=0   to   (1   shl   k)-1   do  
                                  begin  
                                                  bfsize:=   1   shl   (r-k);  
                                                  for   i:=0   to   bfsize   div   2   -1   do  
                                                  begin  
                                                                  p   :=   j   *   bfsize;  
                                                                  X2[i+p]:=ComplexAdd(X1[i+p],X1[i+p+bfsize   div   2]);  
                                                                  X2[i+p+bfsize   div   2]:=ComplexMultiply(  
                                                                  ComplexMinus(X1[i+p],X1[i+p+   bfsize   div   2]),  
                                                                  W[i*(1   shl   k)]);  
                                                  end;  
                                  end;  
                                  ComplexArrayWrap(X1,X2);  
                  end;  
                  //   重新排序    
                  Setlength(Fd,count   div   2);  
                  for   j:=0   to   count   div   2   -   1   do  
                  begin  
                                  p   :=   0;  
                                  for   i:=0   to   r-1   do  
                                  begin  
                                                  if   (j   and   (1   shl   i))>0   then  
                                                                  p:=p+(1   shl   (r-i-1));  
                                  end;  
                                  FD[j]:=X1[p].vReal;  
                  end;  
                  //   释放内存    
                  Setlength(W,0);  
                  Setlength(X1,0);  
                  Setlength(X2,0);  
  end;  
  上面是fft的算法实现代码,但是我在调用的时候,发现TD,FD输入参数有些问题,  
  我原始数据是一个桥梁检测的信号,一个分量是频率,一个分量是幅值,我要如何通过FFT算法,把这个信号图,分解成为频率图和幅度图?  
  请教各位高手,谢谢!

网上有很多快速傅立叶变换的例子.   有DELPHI实现的算法库

有源码库的

噢   来凑个热闹

现在的问题是不知道怎么初始化参数,也就是TD和FD,有没有这方面的实例?谢谢!  
  我的Email是:chenamo5776@126.com

posted @ 2009-02-11 16:50 delphi2007 阅读(466) | 评论 (0)编辑 收藏

RvQueryconnection连接问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061209230255210.html
RvQueryconnection怎么用,连接Rave报表的代码怎么写。谢谢各位~

就是对用QUERY查询出来的内容进行报表打印  
  各位帮帮忙啊

顶的起

很容易的哦  
  根本不需要手动处理这个控件的  
  具体自己下载Rave官方文档去的

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

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