delphi2007 教程

delphi2007 教程

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

#

拄状图和饼状图 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061222091536202.html
我有个表  
  bh       xm     cj  
                      a  
                      a  
                      c  
                      c  
                      b  
                      b  
                      i  
                      i  
  cj字段下的值是不固定种类(4-13中情况)的,但一样种类的总是在一起的  
  就象上面就是4中情况的  
  我如何制作拄状图和饼状图,并把生成的图打印和保存  
 

你说的不固定是指字段列数不固定还是数据结果不固定?数据用group   by就行吧,不固定列得动态sql吧

就是cj   下的数据结果啊!!  
  有可能只有一种(刚刚忘了),  
  我想生成拄状图和饼状图!!  
 

谁有制作拄状图和饼状图的例子给我发点看看也行啊

用TChart或者TDBChart  
 

D:\Program   Files\Borland\Delphi7\Demos\TeeChart

用TChart或者TDBChart  
  D:\Program   Files\Borland\Delphi7\Demos\TeeChart  
  呵呵,同意楼上两位的

posted @ 2009-01-04 16:53 delphi2007 阅读(385) | 评论 (0)编辑 收藏

如何改变ListView中的子窗口ListColumns的颜色,它一直是灰色的 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061222091101203.html
我在C++ Builder中找到一个答案,说是要重画子窗口,但是我翻译成Delphi后调用没有成功。谁有用Delphi做的源代码,贴一下

给你一个关于自定义LISTVIEW风格的专题,   很不错的,有范例源码  
   
  http://www.delphidabbler.com/articles?article=16

那里给出的示例好像没有修改ListColumns颜色的呀,我想要将ListView的Columns的底色换一种颜色,比如蓝色之类的

FHeaderInstance:   Pointer;         //ListView   Colums的实例  
          FDefHeaderProc:   Pointer;     //ListView   Colums的主函数  
          FHeaderHandle:   HWND;   //句柄  
  ////////////////////  
  初始化:  
      FHeaderInstance   :=   Classes.MakeObjectInstance(HeaderWndProc);   //  
  //////////////  
  //把Columns   的主函数子类化到   FDefHeaderProc  
  procedure   TMyListView.WMParentNotify(var   Message:   TWMParentNotify);  
  begin  
      inherited;  
      with   Message   do  
      if   (Event   =   WM_CREATE)   and   (FHeaderHandle   =   0)   then  
      begin  
          FHeaderHandle   :=   ChildWnd;  
          FDefHeaderProc   :=   Pointer(GetWindowLong(FHeaderHandle,   GWL_WNDPROC));  
          SetWindowLong(FHeaderHandle,   GWL_WNDPROC,   LongInt(FHeaderInstance));  
      end;  
  end;  
  ////////////  
  消息处理  
  procedure   TFSSkinListView.HeaderWndProc(var   Message:   TMessage);  
   
      procedure   DefaultProc;  
      begin  
          with   Message   do  
              Result   :=   CallWindowProc(FDefHeaderProc,   FHeaderHandle,   Msg,   WParam,   LParam);  
      end;  
  begin  
      with   Message   do  
      begin  
          case   Msg   of  
              WM_ERASEBKGND:   Result:=1;  
              WM_LBUTTONDOWN:;  
              WM_LBUTTONUP:;  
              WM_MOUSELEAVE:;  
              WM_MOUSEMOVE:;  
              WM_PAINT:;  
                  begin  
                      在此进行你要的绘画.  
                  end;  
              HDM_LAYOUT:  
          end  
          else  
          DefaultProc;  
      end;  
  end;

procedure   TFSSkinListView.HeaderWndProc(var   Message:   TMessage);  
  ///////  
  更正  
  TMyListView.HeaderWndProc(var   Message:   TMessage);

只有重新创建新类才可以更换ListColumns的颜色吗,有没有其他的方法呀

posted @ 2009-01-04 16:53 delphi2007 阅读(566) | 评论 (0)编辑 收藏

没有焦点的控件如何响应ONEXIT事件? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061222090924204.html
 
  简单代码如下:  
  procedure   TForm1.Edit1Enter(Sender:   TObject);  
  begin  
    Panel1.Show;  
  end;  
   
  procedure   TForm1.Edit1Exit(Sender:   TObject);  
  begin  
    Panel1.Hide;  
  end;  
   
  如果点击其他有焦点的控件,Panel1会隐藏,但点击窗体,按纽等,Panel1不会隐藏  
  如果解决这个问题?  
 
posted @ 2009-01-04 16:53 delphi2007 阅读(301) | 评论 (0)编辑 收藏

用idhttp的put方法上传文件到网站的怪问题,请高手帮忙?只有20分了,全部奉上。 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221220322205.html
我用idhttp上传文件到网站(当然网站是有写权限的),我用循环方法上传目录下的多个文件,总是报告"http/1.1   201   created",我查了资料,该错误的意思是“服务器已经创建了文档,Location头给出了它的URL。”。问题还不仅仅是这些,如果目录下有多个文件(大于1个),当第一次点击“上传”按钮的时候,就报告"http/1.1   201   created"错误,在我的错误处理中认为没有上传成功,但是网站上的的确确已经有这个文件了,而且完全正确,第二次点击“上传”按钮的时候,第一个文件的上传却不报告错误,第二个文件报告该错误,但是同样第二个文件也已经传到了网站,依次类推。但是如果本地目录下只有一个文件的话,却不报告任何错误,一次就成功了。代码及解释如下  
  var   t:Tfilestream;  
          st:tstringlist;//本地目录下待上传的文件列表  
          i:integer;//控制循环次数  
  begin  
    for   i:=0   to   st.count-1   do  
    begin  
        t:=Tfilestream.create(st[i],fmopenread);  
      try  
        idhttp1.put(url+extractfilename(st[i]),t);//url是文件上传到网站的路径  
        t.free;  
        showmessage('成功');  
      exccept  
        showmessage('失败');  
        t.free;  
      end;  
    end;//循环结束  
   
  end;//过程结束  
 

upup,怎么没人回答啊?高手到哪里去了啊

"http/1.1   201   created"   这个看起来不是错误啊,应该是新建立文件,返回这个信息。如果原来有对应的文件,不会返回这个信息(因为不是create,而是rewrite)。  
   
  没做过是FTP上传,猜的。

代码写错了   t.free;   释放不该这么写    
  t.free   应该写到try   fianlly   end   保护中  
   
  var   t:Tfilestream;  
          st:tstringlist;//本地目录下待上传的文件列表  
          i:integer;//控制循环次数  
  begin  
    for   i:=0   to   st.count-1   do  
    begin  
        t:=Tfilestream.create(st[i],fmopenread);  
        try  
            try  
                idhttp1.put(url+extractfilename(st[i]),t);//url是文件上传到网站的路径      
                showmessage('成功');  
            exccept  
                showmessage('失败');  
            end;        
        finally  
            t.free;  
        end;  
    end;//循环结束  
   
  end;//过程结束

posted @ 2009-01-04 16:53 delphi2007 阅读(744) | 评论 (0)编辑 收藏

FastReport中,打印选中的记录 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221203712206.html
ADOquery,select   *   from   mytable  
  数据放在DbGridEh中,现在DbGridEh中的纪录有个选择字段,可以选中,如何FastReport只打印选中的纪录呢?(没有保存)

真是越省你事越懒了  
  你不会想点下鼠标出个程序吧...

顶,刚好我也遇到这个问题

呵呵,这个不大好实现

把选中的记录传给ADOX,再将ADOX传给FR。这样行啊。只是多了一层。

创建一个内存表,把选中的追加到内存表中,再传给FR。  
  //内存表建立:  
  function   CreateTableInMemory(const   AFieldDefs:TFieldDefs):TDataSet;  
  var  
    TempTable:TClientDataSet;  
  begin  
    TempTable:=nil;  
    Result:=nil;  
    if   AFieldDefs<>nil   then  
      begin  
        try  
          TempTable:=TClientDataSet.Create(Application);  
          TempTable.FieldDefs.Assign(AFieldDefs);  
          TempTable.CreateDataSet;  
          Result:=(TempTable   as   TDataSet);  
        except  
          if   TempTable<>nil   then   TempTable.Free;  
            Result:=nil;  
          raise;  
        end  
      end  
  end;  
   
  //打印:  
  procedure   TFrmMain.PrintBtnClick(Sender:   TObject);  
  var  
    ADataSet:TDataSet;  
    Over1,Reset1,Spare1:real;  
    Res:SearR;  
  begin  
   
    ADataSet:=TDataSet.Create(Application);  
    with   ADataSet.FieldDefs   do  
    begin  
      Add('Empid,ftString,10,False);  
      Add('EmpName',ftString,10,False);  
      Add('OverTime,ftFloat,0,False);  
      Add('Date',ftDate,0,False);  
    end;  
   
    with   RmDBDataSet1,Search   do  
    begin  
      DataSet:=CreateTableInMemory(ADataSet.FieldDefs);  
      DataSet.Open;  
      //在这里循环追加你DBGridEh选中的记录  
        begin  
              DataSet.InsertRecord([FieldByName('Empid').AsString,  
                                                          FieldByName('EmpName').AsString,  
                                                          Res.OverTime,  
                                                          Date  
                                                          ]);  
        end;  
    end;  
    ADataSet.Free;  
    Ds1.DataSet:=RmDBDataSet1.DataSet;   //传递给DataSource,也就是FR对应的  
  end;  
  //以上仅为参考,此程序需要Midas.dll库

posted @ 2009-01-04 16:53 delphi2007 阅读(465) | 评论 (0)编辑 收藏

进度条的困惑 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221194549207.html
用进度条显示载入文件的进度时,发现文件的载入速度比不用进度条时慢了很多,这时为什么啊?  
  有什么好的方法,即能显示进度,又不降低速度的?

线程  
 

进度条更新少几次啊,不要一点点就更新下

组件进行Update

对,频率太高

谢谢!以搞定!!

posted @ 2009-01-04 16:53 delphi2007 阅读(201) | 评论 (0)编辑 收藏

关于大图片分割后显示的问题,最好有示例代码,多谢 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221191712208.html
我有一个很大的图片,为了加快显示速度,我已经把它分割存贮成了若干个小图片  
  然后我如何显示呢,拖动的时候,缩小放大如何处理呢

这个问题其实很简单的,但写例子代码很麻烦,提点思路:  
  1、用一个Panel作图片容器,Panel的相对大小和大图片对应,即按一定比例缩放,小图片最好做成动态的,用一个List管理,响应Panel的OnResize事件,事件中按大图片和Panel的比例设置各小图片位置和大小,这个计算应该简单,因为你的小图片大小应该是一样大的吧。

先谢谢您,在BCB版也看到您的解答,但还是觉得不太好弄,小图片是一样大的  
  主要问题是鼠标拖动或者移动到边界的时候希望实现类似红警类游戏的那种效果

鼠标拖动或者移动到边界的时候希望实现类似红警类游戏的那种效果  
  ==============================================================================  
  你说的这个和大图片直接显示与分割显示无关,我所说的意思是把Panel当图片处理就行了,你可以先按这个思路实现类似红警类游戏的那种效果,显不显示图片无所谓,然后再处理图片分割显示问题,我说了,很简单。

红警类游戏的那种效果不过是如何鼠标拖动时控制滚动条移动的问题,在Panel的鼠标移动事件中可以判断处理的,不过因为和游戏的显示机制是不一样的,肯定闪动厉害。

posted @ 2009-01-04 16:53 delphi2007 阅读(377) | 评论 (0)编辑 收藏

程序执行的一些漏洞,错误如何避免? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221184952209.html
在程序运行时,经常因为程序员考虑不全面,而导致一些错误,但程序员却在设计期没有发现,例如:  
  在没有选中记录的时候却点击删除,会出现以下错误提示,,  
  projict   projict2.exe   raised   exception   class   edatabaseerrow   with   message'adoquery1:cannot   perform   this   operation   on   an   empty   dataset'.processstoped.use   step   or   run   to   contiune.  
                                          ok               help    
  储如此类错误如何避免,只要能使程序在运行过程中不会因为设计期的疏忽而中止跳出就行,大家一起探讨一下?

try..except..end   捕获异常情况,应该可以吧

这是基本的出错处理,如果没有记录就不允许点击删除.

posted @ 2009-01-04 16:53 delphi2007 阅读(107) | 评论 (0)编辑 收藏

关于ListView和TreeView的用法 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221154403211.html
有没有什么方式可以让,ListView中显示的数据,Caption是个树型的结构,可以展开合并,象树一样,如果不行,有什么方式可以实现这种效果,  
  功能有点类似于delphi的object   inspector   中的一样,大哥大姐帮帮忙啊

树装..你用treeview不就完了

to   wudi_1982(闲半年了,要挣点钱过年了!)  
   
      用树的话,每个结点是一条记录,记录时要有标题的阿,那标题显示在什么地方。  
   
  举个类似效果的例子:  
   
      班级     学号       姓名       性别  
  +     1  
  -     2  
            -       001       张三         男  
            -       002       李四         女  
   
  2折叠后效果同1,1也可展开同2;

班级     学号   姓名   性别  
                            +   1  
                            -   2  
                                      -   001   张三   男  
                                      -   002   李四   女  
      这种效果,001,002时2的下一级。

类似于资源管理器不行么?     左树右表

to   zhangl_cn(和尚-修行)  
      我想实现我说的这种效果,资源管理器那种不好。

那试试用组件listview,panel,button通过组合起来用visible或者是动态创建释放的方式..不过我想要这样   会很占资源的

使用VirtualTree.

To:xthmpro_cn([可人])    
        VirtualTree是什么控件,在什么地方?

posted @ 2009-01-04 16:52 delphi2007 阅读(628) | 评论 (0)编辑 收藏

ImageEn中,如果得到扫描的图片大小? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221150532212.html
1、如果判断图片为空  
  2、如何得到扫描进来的图片大小?

不用ImageEn好多------月

怎么都没有人来帮个小忙?

FT,送分都没人要,或者这么问,想知道存成JPG图片会有多大,不要告诉我先存成文件或Stream里,再去判断

晕死了,有人来没?随便进个人来拿分

hh

可以去到路径下去找有没有文件    
  如果有取出他的大小了      
  请问下你扫描     是做的多页连续扫的吗然后保存一个文件吗

posted @ 2009-01-04 16:52 delphi2007 阅读(630) | 评论 (0)编辑 收藏

如何在Excel中插入一行 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221143745213.html
请问用TExcelApplication、TExcelWorkbook和TExcelWorkSheet如何去操作Excel,使其可以在指定位置插入一行。以下为网上给出的办法,可是根本无法运行:  
   
  ExcelApplication1.ActiveSheet.Rows[2].Insert;   //在第二行处插入一空行  
   
  本人使用的环境为Delphi7+Office   2003。

 
  可以这样处理:  
  如想在第I   +   1   行插入一空白行  
  if   row   :=   i   +1   then    
  for   j   :=   0   to   lcol   do  
  TempWorkSheet.Cells[row,   J]   :=   '';  
   
  这样不就插入一空白行了吗?

樓主太小氣。。。只有5分。  
  插入一行或一列:  
  a.   ExcelApp.ActiveSheet.Rows[2].Insert;  
  b.   ExcelApp.ActiveSheet.Columns[1].Insert;  
  删除一行或一列:  
  a.   ExcelApp.ActiveSheet.Rows[2].Delete;  
  b.   ExcelApp.ActiveSheet.Columns[1].Delete;  
 

按照ghtghtmalone的方法,第i+1行的内容将会被清空,而maming2003得方法是目前网上普遍流行的方法,只可惜,Delphi7下根本无法编译。我目前最头疼的是不知如何将某一行或列作为一个对象返回。还请各位赐教。

不知道你想干吗?  
  if   row   :=   i   +1   then    
  for   j   :=   0   to   lcol   do  
  TempWorkSheet.Cells[row,   J]   :=   '';  
  EXCEL不就是一个二维数组吗?  
   
  把想插入的数据放在数组中不就可以赋值了?  
   
  你想插入的值直接用下面的语句不就行了?  
  TempWorkSheet.Cells[row,   J]   :=   arr[rol,j];

posted @ 2009-01-04 16:52 delphi2007 阅读(370) | 评论 (0)编辑 收藏

为什么我的日期判断得不到想要的结果 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221141022214.html
我做了一个判断日期的函数  
  //判断字符串是否是有效日期类型  
  function   isdate(s:string):boolean;  
  begin  
    result:=false;  
  try  
      strtodate(s);  
      result:=true;  
  except  
      on   econverterror   do  
      result:=false;  
  end;  
  end;  
   
  procedure   TForm2.Button1Click(Sender:   TObject);  
  begin  
  if   isdate(trim(edit1.Text))   =   false   then  
      begin  
          MessageDlg('日期输入不正确!',   mtWarning,   [mbOK],   0);  
          exit;  
      end;  
  end;  
  当调用返回时总是先弹出系统提示的错误:project   project2.exe   raised   exception   class   econverterror   with   message   "edit1'is   not   a   valid   date'.  
  process   stopped.use   step   or   run   to   contiue.  
  点击ok按钮后才弹出MessageDlg('日期输入不正确!',   mtWarning,   [mbOK],   0);  
  为什么不直接弹出这个提示?郁闷!!。。。。

你的另一贴:  
  http://community.csdn.net/Expert/topic/5246/5246644.xml?temp=.3406488  
 

正常啊,当你在IDE的调试环境运行时会在except   捕获之前Delphi给你个提示  
   
  不在开发环境中运行不会有这个提示滴  
   
  直接跑.exe试试看吧。。

这样比较通用,运行效果以直接运行exe为准  
  function   isdate(s:string):boolean;  
  begin  
    result:=false;  
  try  
  ///////  
      VarToDateTime(s);  
      result:=true;  
  except  
      on   econverterror   do  
      result:=false;  
  end;  
  end;  
 

调试状态才会出现这样的提示,运行时是根据你的异常处理来处理的.

试试我吧  
   
  var  
      TmpDate:   TDateTime;  
  begin  
  方法一:  
      TmpDate:=   StrToDateDef(   Edit1.Text,   0   );  
  方法二:  
      TmpDate:=   0;  
      if   TryStrToDate(   Edit1.Text,   TmpDate   )   then  
   
  end;

posted @ 2009-01-04 16:52 delphi2007 阅读(190) | 评论 (0)编辑 收藏

怎样求dbgrid里的某数据字段的和??? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221135025215.html
如题:  
  dbgrid里显示消费者的消费记录,我的问题是:  
  当查询到某一个人的消费信息时,怎样将其消费金额,剩余金额汇总后放到下面???  
  在dbgrid里显示为:  
  如:张三     第一次消费       消费100元,剩余900元  
          张三     第二次消费       消费200元   ,剩余700元  
   
   
  小计:张三   卡中原有1000元     消费300元,剩余700元

设计一个本地表,存放汇总结果,另外用一个DBGrid或者几个DBEdit显示即可  
 

本地表可用TClientDataSet  
 

posted @ 2009-01-04 16:52 delphi2007 阅读(223) | 评论 (0)编辑 收藏

2000,XP中显示器和系统匹配的问题? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221132856216.html
情况如下:  
      我的程序运行在     笔记本+XP,   笔记本+2K,   台式机+2K+液晶   时显示正常,    
  运行在   台式机+CRT(17纯平)+XP   时图片显示不全,   同时图片上的按钮错位,   分辨率均设为1024*768.  
  请问是什么问题?   如何解决?

应该是你的程序问题,不会是显示器原因

我做了小程序,里面就放了一个图片和几个按钮,结果还是错位.  
  本来图片和窗口是一样大的,但是在台式机+CRT上就变小了.  
  能给个解决方法也行,谢谢了!

不是做程序的   但肯定是你程序的问题   发到程序区   吧

应该是CRT的DPI设置为超过96,如120。  
   
  到桌面的显示属性-高级-常规下查看DPI设置。

posted @ 2009-01-04 16:52 delphi2007 阅读(128) | 评论 (0)编辑 收藏

Treeview的click事件中,如何知道当前点击的是子结点,并且如何获取子结点的标题? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221132407217.html
Treeview的click事件中,如何知道当前点击的是子结点,并且如何获取子结点的标题?  
 

看TreeView1.Selected.Level的值是否大于0   是则为字节点,不是则是最大根节点。  
  看选择的节点是否有子节点,通过   TreeView1.Selected.count来判断!  
  TreeView1.Selected.Text是所选择节点的标题,

posted @ 2009-01-04 16:52 delphi2007 阅读(1827) | 评论 (0)编辑 收藏

新手上路,关于程序运行时最大化最小化的问题? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221122345218.html
1、我使程序运行时最小化,也就是让windowstate:=wsmin;但是最小化后却在左下角,而不是在任务栏,如何改动?  
  2、如何让程序右上角的三个按扭(最小化,最大化,关闭)其中之一或其中之二变灰(失效)?

1,可以触发最小化事件  
  procedure   TForm1.FormResize(Sender:   TObject);  
  begin  
          if   WindowState=wsMinimized   then  
          Hide  
          else   self.show;  
  end;  
  2,修改属性   bordericons

posted @ 2009-01-04 16:52 delphi2007 阅读(272) | 评论 (0)编辑 收藏

关于QR中QRDBText的问题 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221122242219.html
我在quickrep中设置了detailband1并放了一个QRDBtext(dataset设置为query1;datafield设置为用query1创建的某张表的动态字段名)。在query1.sql中设置了"select...."语句,但是当我使用quickrep1.preview时;只看得到查询结果中的第一条记录并且显示(第一条记录)多行。百思不得其解。虽然分不多(主要是没分了)。但还是请各位帮我一把。谢谢!
posted @ 2009-01-04 16:52 delphi2007 阅读(531) | 评论 (1)编辑 收藏

点击“取消对”话框还提示的两个类示问题? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221122221220.html
一、  
  我的目的是想以任何方式退出程序时,有“是否真的退出”提示  
  if   MessageBox(0,'你真的要退出吗?','警告',MB_OKCANCEL+MB_ICONWARNING)=IDok   then  
            begin  
                      close;  
            end;    
  上面的程序放在一按纽响应事件中可以实现,但是我把它放在FormCloseQuery中时(目的是点右上角的x号时也提示),却出错,现象如下:点确定时程序不退出,messagebox也不退出,点取消时程序却退出?应如何改动?  
   
  二、  
  var  
      str:string;  
      i:integer;  
  begin  
          i:=0;  
      str:='';  
      while   str=''   do  
      begin  
          i:=i+1;  
          str:=inputbox('用户验证','请输入用户名:','');  
          if   str<>'bear'   then  
              if   i<3   then  
                  showmessage('密码错误,请重新输入。')  
              else  
              begin  
                  MessageDlgPos('密码严重错误,系统即将退出!',mtWarning,  
                                  [mbOK],0,300,200);  
                  close;  
                  break;  
              end  
          else  
          begin  
              MessageDlg('验证通过,请进入。',mtinformation,[mbOK],0);  
              label1.Caption:='密码正确,请通行';  
          end;  
      end;  
  end;  
  问题1、出错现象:点取消之后不退出对话框,还提示继续输入密码。  
          2、想验证通过时才显示form2,应将   form2.show加在哪里?  
          3、如何将3个form全加入工程,又如何选择启动窗体并不显示其它窗?。  
 

procedure   TForm1.FormCloseQuery(Sender:   TObject;   var   CanClose:   Boolean);  
  begin  
      CanClose   :=   MessageBox(Handle,   '你真的要退出吗?',   '警告',  
          MB_OKCANCEL   +   MB_ICONWARNING)   =   IDOK;  
  end;  
 

用InputQuery替换InputBox  
  如果按取消InputQuery会返回False

posted @ 2009-01-04 16:52 delphi2007 阅读(164) | 评论 (0)编辑 收藏

Tadodataset的paramcheck属性是什么意思,怎么用呀?? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221121644221.html
如题:  
  在access+delphi7.0里写adoquery的语句,有时要把它的paramcheck属性置为false才能通过,不知道为什么呀,看不懂delphi的帮助,请大侠指教!!!!!  
  请问这个属性什么时候用,有什么作用呀???????

检测SQL语句中是否存在参数!

posted @ 2009-01-04 16:52 delphi2007 阅读(374) | 评论 (0)编辑 收藏

如何设置comboBox下拉框的大小,并在下拉框中画上类式excel的表格??? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221121414222.html
今天面试出了这么一个题目考我。  
  1、设置combobox下拉框的宽度和高度(需要调用API)  
  2、在combobox下拉框中画上类似excel的表格,表格形式如下:  
      ID     学校     专业  
      01     北大     计算机应用  
      02     清华     数学  
      03     交大     英语  
   
  哪位大虾知道,出手帮忙一下啊,兄弟我不胜感激,在线等

Combox.height:=10;  
  ComBox.Width:=100;  
   
  ComBox.Items.add('ID'+#9+'学校'+#9+'专业')  
 

设置Item的高度?  
  ListBox.Style   :=   lbOwnerDrawFixed;  
  ListBox.ItemHeight   :=   50;  
  或  
  ListBox.Perform(LB_SETITEMHEIGHT,   0,   50);  
 

生成Tstring对象,赋值后传给Item即可

楼上几位感谢你们的帮忙,可你们误解了,combobox的Item就是我上面所说的表格

第一个问题,别人都说了  
   
  第二个问题,给你一段演示的代码  
   
  临时写的,自己看明白了,改改就可以了  
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls;  
   
  type  
      tTest=record  
          id   :string[2];  
          xx   :   string[4];  
          zy   :   string[4];  
      end;  
      TForm1   =   class(TForm)  
          ComboBox1:   TComboBox;  
          procedure   ComboBox1DrawItem(Control:   TWinControl;   Index:   Integer;  
              Rect:   TRect;   State:   TOwnerDrawState);  
          procedure   FormCreate(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          arrayTest   :   array[0..2]   of   tTest;  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
   
  procedure   TForm1.ComboBox1DrawItem(Control:   TWinControl;   Index:   Integer;  
      Rect:   TRect;   State:   TOwnerDrawState);  
  begin  
      with   (Control   as   TComboBox).Canvas   do  
      begin  
           
          TextOut(rect.Left   ,rect.Top,arrayTest[Index].id);  
          TextOut(rect.Left+30,rect.Top,arrayTest[Index].xx);  
          TextOut(rect.Left+70,rect.Top,arrayTest[Index].zy);  
          Pen.Color   :=   clBlack;  
          MoveTo(rect.Left,rect.Top);  
          LineTo(rect.Right,rect.Top);  
   
          MoveTo(rect.Left,rect.Bottom);  
          LineTo(rect.Right,rect.Bottom);  
   
          MoveTo(Rect.Left   +   26,Rect.Top);  
          LineTo(rect.Left+26,rect.Bottom);  
   
            MoveTo(Rect.Left   +   65,Rect.Top);  
          LineTo(rect.Left+65,rect.Bottom);  
      end;  
   
   
  end;  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
          ComboBox1.Items.Clear;  
          arrayTest[0].id   :=   '01';  
          arraytest[0].xx   :=   '北大';  
          arrayTest[0].zy   :=   'plmm';  
          ComboBox1.Items.Add('01');  
   
          arrayTest[1].id   :=   '02';  
          arraytest[1].xx   :=   '北大';  
          arrayTest[1].zy   :=   'make';  
          ComboBox1.Items.Add('02');  
   
          arrayTest[2].id   :=   '03';  
          arraytest[2].xx   :=   '烂校';  
          arrayTest[2].zy   :=   '**';  
          ComboBox1.Items.Add('03');  
   
          ComboBox1.ItemIndex   :=   0;  
  end;  
   
  end.  
 

下拉项是下面的表格形式:  
      ID     学校     专业  
      01     北大     计算机应用  
      02     清华     数学  
      03     交大     英语  
 

to:wudi_1982(闲半年了,要挣点钱过年了!)    
          第一个问题是设置item的宽度和高度,能让下拉框有上/下,左/右滚动条

上面的代码忘记了一句,你要做如下设置  
   
  ComboBox1.Style   :=   csOwnerDrawFixed;

我现在的问题只剩下,如何调用API可以设置ComBoBox下拉框的宽度和高度使之,有滚动条出现????

学习

 
            SetWindowPos(ComboBox1.Handle,   0,   0,   0,  
            200,//这里可以设置宽度  
            600,//高度    
            SWP_NOMOVE   or   SWP_NOZORDER   or   SWP_NOACTIVATE   or   SWP_NOREDRAW   or  
              SWP_HIDEWINDOW);  
   
  至于滚动条  
        垂直的,当你的列表内容大于总数的时候,就自动出现了  
      水平的,在基本的combobox上,不知道怎么加  
   
  如果像完全实现你的功能,从TCombobox类继承,写一个新组件,你可以参考一下VCL的源码.

UP了

posted @ 2009-01-04 16:52 delphi2007 阅读(2072) | 评论 (0)编辑 收藏

关于MEMO控件的问题,能不能再MEMO控件的添加表格啊? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221112815223.html
用MEMO输入后非常难看,能不能让其美观一些啊?

用richedit

posted @ 2009-01-04 16:52 delphi2007 阅读(207) | 评论 (0)编辑 收藏

如何設置TlistView行列值,以及動態獲得Combobox的選中項 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221111236224.html
如何設置TlistView 2行3 列值,以及動態獲得Combobox的選中項

2行3列  
  ListView1.Items[1].SubItems[2]   :=   'ABC';    
   
  Combobox1.ItemIndex   获得当前选中的Index  
  Combobox1.Text   获得Text  
   
 

小弟初學啊  
  Combobox1.ItemIndex   获得当前选中的Index  
  Combobox1.Text   获得Text  
  給出語句吧!  
  新人比較容易接受啊

比如說要在其它過程中,要得到當前先中項,用什麼句子

posted @ 2009-01-04 16:52 delphi2007 阅读(690) | 评论 (0)编辑 收藏

控件移动问题 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221110936225.html
我想将文字逐渐显示,所以在文字上加盖了一个shape,然后用timer使得shape.top:=shape.top+1;  
  但是结果是可以使文字逐渐显示,但是闪屏严重,请高手帮解决一下,谢谢!

直接在canvas里画  
  要么就用双缓冲

也可以通过定时器来触发作个例子给你!  
  var  
      Form1:   TForm1;  
      DisplayText:Widestring;  
  implementation  
   
  {$R   *.dfm}  
   
  procedure   TForm1.Timer1Timer(Sender:   TObject);  
  var  
    MidStr:widestring;  
  begin  
        MidStr:=Widestring(Label1.Caption);  
        if   Length(MidStr)<Length(DisplayText)   then  
        begin  
              MidStr:=MidStr+DisplayText[Length(MidStr)+1];  
              Label1.Caption:=MidStr;  
        end  
        else   Label1.Caption:='';     //写满了   从新循环写!  
  end;  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
          DisplayText:='打到小日本,我是龙的传人,上海教授去吃屎吧!'  
  end;  
   
  end.  
 

据说底下加个Panel   就不哪么闪了,

posted @ 2009-01-04 16:52 delphi2007 阅读(130) | 评论 (0)编辑 收藏

关于动态窗口的释放和ThemeEngine的问题 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221110256226.html
首先第一个问题  
          我有个动态查询窗口FORM3,当我在form1里按BUTTON1的时候,创建FORM3,并且把查询数据库的结果返回给FORM3上的STRINGGRID1中,当我点下form3的button1(fORM3.BUTTON1的MODALRESULT=MROK)时候,希望把结果返回到form1.edit1.text中,具体语句如下:  
  if   query.frmQuery.ShowModal=mrOk   then   begin  
              showmessage('123');  
              edit1.Text   :=trim(query.frmQuery.StringGrid1.Cells[GlobleJ-1,query.frmQuery.StringGrid1.Row]);  
          end;  
   
  如果在不在FORM3的close动作里写action:=cafree;       上面的语句就没问题,如果写了action:=cafree;,把showmessage去掉也没问题,但是加上showmessage就会报错,有点迷惑了,这里总是似懂非懂,请大家帮忙解释下为什么.  
   
  第2个问题,我上面的查询窗口没用ThemeEngine的时候使用正常,如果我把窗体全换成ThemeEngine的之后就会报错,错误提示如下:Project   project1.exe   raised   exception   class   ElistError   with   message   'list   index   out   of   bounds(-1)'   Process   stoped   USE   step   or   run   to   continue.  
  这个是为什么呢?

在两个对话框间使用消息通讯机制好了,安全些  
  或者showmessage改成Application.ShowMessage();

第二个是索引越界,检查一下list下标引用

加了action:=cafree会导致窗体关闭后,立即进行了释放,如果窗体关闭还要用它里面的内容,最好不要加释放语句。

LIST下標引用這裡能不能說的再詳細點呢?

如果frmQuery已经释放了,引用它里面的对象肯定不行了。  
  只要对象在,你可以调试一下呀,看看下标的范围,看一下是否引用已超出了这个范围

list里下标索引是基于0的,如list里有5个元素,下标从0到4

问题解决,谢谢楼上的两位。

posted @ 2009-01-04 16:52 delphi2007 阅读(296) | 评论 (0)编辑 收藏

VCLSkin皮肤在MDI窗体下的问题 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221110031227.html
我在程序里面使用了VCLSkin皮肤控件版本2.74  
  控件放在数据模块窗体里面属性设置为SkinFormType属性设置为sfMainform  
  然后MDI主窗体的Create事件这样写  
  procedure   TfrmMain.FormCreate(Sender:   TObject);  
  begin  
      DoubleBuffered:=True;  
   
      Left:=0;   Top:=0;  
   
      WindowState:=wsMaximized;  
   
      ImgContext.Picture.LoadFromFile(GetContextImgPath);   //装载背景图片    
   
      FClientInstance   :=   MakeObjectInstance(ClientWndProc);  
   
      FPrevClientProc   :=   Pointer(GetWindowLong(ClientHandle,GWL_WNDPROC));  
   
      SetWindowLong(ClientHandle,GWL_WNDPROC,   LongInt(FClientInstance));  
  end;  
   
  但是程序运行的时候主窗体不会最大化  
  为什么啊?  
  有用过这个控件的同道们看看

好象是BUG

那有解决的办法没的啊?  
  第一次用这玩意

解决起来难度不小,MDI模式是微软放弃的技术,就是因为里面有硬伤。  
  这类控件应用在MDI同样也存在硬伤,最终也没有全部解决。

难道要放弃MDI模式?>

我不用皮肤控件就是正常的啊  
  一加上这个皮肤控件就不行了

如果客户端是运行在XP以上的系统,可以不用这个皮肤控件了。

关键不都是在XP系统下的撒  
  而且按钮样式呢?

vclskin提供了几个解决办法,诸如运行时动态调整form的caption  
  最大化问题我也遇到过,是显示fastreport报表的时候,fr的窗体已经最大化了,但是显示起来还是正常状态,还要手动点一次,好像是把对话框拉到跟屏幕一样大小,下次再启动就正常了,你可以试试,怀疑vclskin将状态写到注册表了

不行啊!  
  我只要一加上皮肤文件就不行了  
  只放控件不加皮肤文件没的问题

你可以试下发送两次最小化窗体最大化消息

换一个皮肤控件板本。

..............

不会最大化是什么样的效果,是不是顶端会留有几毫米的缝,看起来像整个窗体往下移动了几毫米?

posted @ 2009-01-04 16:52 delphi2007 阅读(730) | 评论 (0)编辑 收藏

fastreport问题~~ VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221103102228.html
我以前很少用fr,最近这个项目中用到了,  
  我现在有个问题  
   
  我接手别人的一个项目  
  我没有动以前的报表,我现在在做总结,发现报表结果和以前的不同啦  
  最明显的是从数据库中取的数据都没有出来,不知道是怎么回事?  
  我到自定义模板里面去看,报表结构也是一样的,还是同一个模板文件。  
  只是发现以前用的好象是中文版的,我用的是英文版。(应该不是这个问题吧)  
   
  (其实我自己也不知道应该怎样才能说明白:))  
   
  各们有fr经验的大虾,多给点意见,让小弟顺利完成任务~~多谢

看看fr的dataset是否指定,fr3需要将dataset添加进enableddatasets集合中

楼上说的有道理

我装了两个fr   ,第一次是fr3,他的控件名前缀和fr2的不同,  
  所以我后又装了fr2,应该使用的是fr2吧

你是说的frReport的dataset属性吗  
  应该不能指定吧,因为它这有自定义报表,都是利用一个frReport  
  enableddatasets集合?不懂哦,可以说更清楚点吗?多谢啦~~

fr3不仅指定了frdatasert就行,还要  
  frxReport1.EnabledDataSets.Add(frxUserDataSet1);

posted @ 2009-01-04 16:52 delphi2007 阅读(299) | 评论 (0)编辑 收藏

apro语音应答系统,打入打出电话无法触发ApdTapiDevice1的connect事件,急盼高手指点! VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221103027229.html
我用apro做了一个语音应答系统,打入打出电话无法触发ApdTapiDevice1的connect等所有事件,不知道是怎么回事,我讲ApdTapiDevice1设置韦autoAnswer以后,打入电话每次都是听到moden的传真一样的声音,但是状态就是不能显示已经连接,然后过个10秒钟的样子通话连接就自动断掉了,  
  望做过的高手指点一二,本人刚开始搞此类开发,谢谢了!  
 

我用的笔记本自带的内置moden,不支持语音扩展功能的,这个不会对消息触发有影响吧??

posted @ 2009-01-04 16:52 delphi2007 阅读(193) | 评论 (0)编辑 收藏

我在做一个自定义组件,到处是错误? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221101039230.html
我在做一个自定义组件,到处是错误?  
  我还是照着书上来的!  
  那位高手,帮我看看!  
  unit   MyButton;  
   
  interface  
   
  uses  
      SysUtils,   Classes,   Controls,   StdCtrls,Graphics,Messages,Types;  
   
  type  
      TMyButton   =   class(TButton)  
      private  
          FColor:TColor;  
          FCanvas:TCanvas;  
          IsFocused:Boolean;  
          SetColor:TColor;  
          procedure   CNDrawItem(var   CMessage:   TWMDrawItem);   message   WM_DRAWITEM;  
          {   Private   declarations   }  
      protected  
          procedure   CreateParams(var   Params:   TCreateParams);   override;  
          procedure   SetButton(var   ADefault:Boolean);  
          {   Protected   declarations   }  
      public  
          procedure   Create(AOwner:TComponent);override;  
          procedure   Destroy;override;  
          {   Public   declarations   }  
      published  
          property   Color:TColor   read   FColor   write   SetColor   default   clWhite;  
          {   Published   declarations   }  
      end;  
   
  procedure   Register;  
   
  implementation  
  procedure   CNDrawItem(var   CMessage:   TWMDrawItem);   message   WM_DRAWITEM;  
  var  
      IsDown,   IsDefault:   Boolean;  
      ARect:   TRect;  
      Flags:   Longint;  
      DrawItemStruct:   TDrawItemStruct;  
      wh:TSize;  
  begin  
      DrawItemStruct:=CMessage.DrawItemStruct^;  
      FCanvas.Handle   :=   DrawItemStruct.hDC;  
      ARect   :=   ClientRect;  
      with   DrawItemStruct   do  
      begin  
          IsDown   :=   itemState   and   ODS_SELECTED   <>   0;  
          IsDefault   :=   itemState   and   ODS_FOCUS   <>   0;  
      end;  
   
      Flags   :=   DFCS_BUTTONPUSH   or   DFCS_ADJUSTRECT;  
      if   IsDown   then   Flags   :=   Flags   or   DFCS_PUSHED;  
      if   DrawItemStruct.itemState   and   ODS_DISABLED   <>   0   then  
            Flags   :=   Flags   or   DFCS_INACTIVE;  
   
      if   IsFocused   or   IsDefault   then  
      begin  
          //按钮得到焦点时的状态绘制  
          FCanvas.Pen.Color   :=   clWindowFrame;  
          FCanvas.Pen.Width   :=   1;  
          FCanvas.Brush.Style   :=   bsClear;  
          FCanvas.Rectangle(ARect.Left,   ARect.Top,   ARect.Right,   ARect.Bottom);  
          InflateRect(ARect,   -1,   -1);  
      end;  
   
      FCanvas.Pen.Color   :=   clBtnShadow;  
      FCanvas.Pen.Width   :=   1;  
      FCanvas.Brush.Color   :=   FColor;  
      if   IsDown   then   begin  
          //按钮被按下时的状态绘制  
            FCanvas.Rectangle(ARect.Left   ,   ARect.Top,   ARect.Right,   ARect.Bottom);  
            InflateRect(ARect,   -1,   -1);  
      end   else  
            //绘制一个未按下的按钮  
            DrawFrameControl(DrawItemStruct.hDC,   ARect,   DFC_BUTTON,   Flags);  
      FCanvas.FillRect(ARect);  
   
      //绘制Caption文本内容  
      FCanvas.Font   :=   Self.Font;  
      ARect:=ClientRect;  
      wh:=FCanvas.TextExtent(Caption);  
      FCanvas.Pen.Width   :=   1;  
      FCanvas.Brush.Style   :=   bsClear;  
      if   not   Enabled   then  
      begin   //按钮失效时应多绘一次Caption文本  
            FCanvas.Font.Color   :=   clBtnHighlight;  
            FCanvas.TextOut((Width   div   2)-(wh.cx   div   2)+1,  
                                            (height   div   2)-(wh.cy   div   2)+1,  
                                              Caption);  
            FCanvas.Font.Color   :=   clBtnShadow;  
      end;  
      FCanvas.TextOut((Width   div   2)-(wh.cx   div   2),(height   div   2)-(wh.cy   div   2),Caption);  
   
      //绘制得到焦点时的内框虚线  
      if   IsFocused   and   IsDefault   then  
      begin  
            ARect   :=   ClientRect;  
            InflateRect(ARect,   -4,   -4);  
            FCanvas.Pen.Color   :=   clWindowFrame;  
            FCanvas.Brush.Color   :=   FColor;  
            DrawFocusRect(FCanvas.Handle,   ARect);  
      end;  
      FCanvas.Handle   :=   0;  
   
  end;  
  procedure   SetButton(var   ADefault:Boolean);  
  begin  
      if   ADefault   <>   IsFocused   then  
      begin  
          IsFocused   :=   ADefault;  
          Refresh;  
      end;  
  end;  
  procedure   CreateParams(var   Params:TCreateParams);override;  
  begin  
    with   Params   do  
        Style=Style   or   BS_OWNERDRAW;  
  end;  
  procedure   Create(AOwner:TComponent);override;  
  begin  
      inherited;  
      FCanvas:=TCanvas.Create;  
  end;  
  procedure   Destroy;override;  
  begin  
      FCanvas.Free;  
      inherited;  
  end;  
  procedure   Register;  
  begin  
      RegisterComponents('MyLib',   [TMyButton]);  
  end;  
   
  end.  
 

而且在写的时候,没有智能提示?

你看的是什么书啊.稍稍看了一下,N多错,看不下去了,自定义控件很多书上有,换一本书吧  
  前面的几个错为:  
  public  
          procedure   Create(AOwner:TComponent);override;   //1  
          procedure   Destroy;override;   //2  
  1.   你的控件基于TButton,它的Create定义为构造函数,所以要定义为:  
  constructor   Create(AOwner:TComponent);override;  
  2.同理:  
    destructor   Destroy;override;  
  implementation  
  procedure   CNDrawItem(var   CMessage:   TWMDrawItem);   message   WM_DRAWITEM;   //3  
  3.CNDrawItem是你类中的函数.所以要写成  
  procedure   TMyButton.CNDrawItem(var   CMessage:   TWMDrawItem);  
  另外,message   WM_DRAWITEM;是函数申明时用,实现(定义)时不能有  
    DrawItemStruct:   TDrawItemStruct;  
  你的TDrawItemStruct在哪里定义的?  
  ...

TDrawItemStruct没有定义.它应该是一个系统中的变量吧?

TDrawItemStruct是WINDOWS中定义的.我加入了.  
  但是它提示:  
      IsDown   :=   (itemState)   and   (ODS_SELECTED   <>   0);  
      IsDefault   :=   (itemState)   and   (ODS_FOCUS   <>   0);  
  这个句出错.  
  提示:"Operator   not   applicable   to   this   Operand   type."

很简单,找个简单组件看一下就好了,如SPCOMM等,主要是继承自TComponent类,增加些属性方法,构造析构,然后Register注册组件

你看参考下vcl的源代码,   tbitbtn这个类是从tbutton继承过来的.  
  建议去看看windows程序设计.

tbitbtn这个类,应该很有参考价值。

编译完成了,并已安装了.在是在使用时出错,  
  system   error.   code:87  
  参数错误.  
   
  怎回事?

帮你改了一下,可以编译安装成功,至于能否达到你的要求,你可试一下:  
  unit   MyButton;  
   
  interface  
   
  uses  
      SysUtils,   Classes,   Controls,   StdCtrls,Graphics,Messages,Types,WINDOWS;  
   
  type  
      TMyButton   =   class(TButton)  
      private  
          FColor:TColor;  
          FCanvas:TCanvas;  
          IsFocused:Boolean;  
          SetColor:TColor;  
          procedure   CNDrawItem(var   CMessage:   TWMDrawItem);   message   WM_DRAWITEM;  
          {   Private   declarations   }  
      protected  
          procedure   CreateParams(var   Params:   TCreateParams);   override;  
          procedure   SetButton(var   ADefault:Boolean);  
          {   Protected   declarations   }  
      public  
          constructor   Create(AOwner:TComponent);override;  
        destructor   Destroy;override;  
          {   Public   declarations   }  
      published  
          property   Color:TColor   read   FColor   write   SetColor   default   clWhite;  
          {   Published   declarations   }  
      end;  
   
  procedure   Register;  
   
  implementation  
  procedure   TMyButton.CNDrawItem(var   CMessage:   TWMDrawItem);   //   message   WM_DRAWITEM;  
  var  
      IsDown,   IsDefault:   Boolean;  
      ARect:   TRect;  
      Flags:   Longint;  
      DrawItemStruct:   TDrawItemStruct;  
      wh:TSize;  
  begin  
      DrawItemStruct:=CMessage.DrawItemStruct^;  
      FCanvas.Handle   :=   DrawItemStruct.hDC;  
      ARect   :=   ClientRect;  
      with   DrawItemStruct   do  
      begin  
          IsDown   :=   itemState   and   ODS_SELECTED   <>   0;  
          IsDefault   :=   itemState   and   ODS_FOCUS   <>   0;  
      end;  
   
      Flags   :=   DFCS_BUTTONPUSH   or   DFCS_ADJUSTRECT;  
      if   IsDown   then   Flags   :=   Flags   or   DFCS_PUSHED;  
      if   DrawItemStruct.itemState   and   ODS_DISABLED   <>   0   then  
            Flags   :=   Flags   or   DFCS_INACTIVE;  
   
      if   IsFocused   or   IsDefault   then  
      begin  
          //按钮得到焦点时的状态绘制  
          FCanvas.Pen.Color   :=   clWindowFrame;  
          FCanvas.Pen.Width   :=   1;  
          FCanvas.Brush.Style   :=   bsClear;  
          FCanvas.Rectangle(ARect.Left,   ARect.Top,   ARect.Right,   ARect.Bottom);  
          InflateRect(ARect,   -1,   -1);  
      end;  
   
      FCanvas.Pen.Color   :=   clBtnShadow;  
      FCanvas.Pen.Width   :=   1;  
      FCanvas.Brush.Color   :=   FColor;  
      if   IsDown   then   begin  
          //按钮被按下时的状态绘制  
            FCanvas.Rectangle(ARect.Left   ,   ARect.Top,   ARect.Right,   ARect.Bottom);  
            InflateRect(ARect,   -1,   -1);  
      end   else  
            //绘制一个未按下的按钮  
            DrawFrameControl(DrawItemStruct.hDC,   ARect,   DFC_BUTTON,   Flags);  
      FCanvas.FillRect(ARect);  
   
      //绘制Caption文本内容  
      FCanvas.Font   :=   Self.Font;  
      ARect:=ClientRect;  
      wh:=FCanvas.TextExtent(Caption);  
      FCanvas.Pen.Width   :=   1;  
      FCanvas.Brush.Style   :=   bsClear;  
      if   not   Enabled   then  
      begin   //按钮失效时应多绘一次Caption文本  
            FCanvas.Font.Color   :=   clBtnHighlight;  
            FCanvas.TextOut((Width   div   2)-(wh.cx   div   2)+1,  
                                            (height   div   2)-(wh.cy   div   2)+1,  
                                              Caption);  
            FCanvas.Font.Color   :=   clBtnShadow;  
      end;  
      FCanvas.TextOut((Width   div   2)-(wh.cx   div   2),(height   div   2)-(wh.cy   div   2),Caption);  
   
      //绘制得到焦点时的内框虚线  
      if   IsFocused   and   IsDefault   then  
      begin  
            ARect   :=   ClientRect;  
            InflateRect(ARect,   -4,   -4);  
            FCanvas.Pen.Color   :=   clWindowFrame;  
            FCanvas.Brush.Color   :=   FColor;  
            DrawFocusRect(FCanvas.Handle,   ARect);  
      end;  
      FCanvas.Handle   :=   0;  
   
  end;  
  procedure   TMyButton.SetButton(var   ADefault:Boolean);  
  begin  
      if   ADefault   <>   IsFocused   then  
      begin  
          IsFocused   :=   ADefault;  
          Refresh;  
      end;  
  end;  
  procedure   TMyButton.CreateParams(var   Params:TCreateParams);  
  begin  
      inherited   CreateParams(Params);  
    with   Params.WindowClass   do  
      Style:=Style   or   BS_OWNERDRAW;  
  end;  
  constructor   TMyButton.Create(AOwner:TComponent);  
  begin  
      inherited;  
      FCanvas:=TCanvas.Create;  
  end;  
  destructor   TMyButton.Destroy;  
  begin  
      FCanvas.Free;  
      inherited;  
  end;  
  procedure   Register;  
  begin  
      RegisterComponents('MyLib',   [TMyButton]);  
  end;  
   
  end.  
   
 

keiy()   :  
  我编译完成了,并已安装了.只是在使用时出错,我新建一个工程,当我把这个控件放到FORM中时出错:  
  system   error.   code:87  
  参数错误.  
   
  怎回事?

keiy改得没有问题,是你自己编译没有更新  
  最好将以期的代码改名备份重新编译  
  参考下面改进后的代码:  
   
  unit   MyButton;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes,   Controls,   StdCtrls,   Graphics;  
   
  type  
      TMyButton   =   class(TButton)  
      private  
          FCanvas:   TCanvas;  
          IsFocused:   Boolean;  
          procedure   CNDrawItem(var   Message:   TWMDrawItem);   message   CN_DRAWITEM;   //   换成CN_DRAWITE不是WM_DRAWITE  
      protected  
          procedure   CreateParams(var   Params:   TCreateParams);   override;  
          procedure   SetButtonStyle(ADefault:   Boolean);   override;   //   这条必须加,才能触发CN_DRAWITEM  
      public  
          constructor   Create(AOwner:   TComponent);override;  
          destructor   Destroy;   override;  
      published  
          property   Color   default   clWhite;   //   Color在父类中已经有声明  
      end;  
   
  procedure   Register;  
   
  implementation  
   
  procedure   Register;  
  begin  
      RegisterComponents('MyLib',   [TMyButton]);  
  end;  
   
  procedure   TMyButton.CNDrawItem(var   Message:   TWMDrawItem);  
  var  
      IsDown,   IsDefault:   Boolean;  
      ARect:   TRect;  
      Flags:   Longint;  
      DrawItemStruct:   TDrawItemStruct;  
      wh:   TSize;  
  begin  
      DrawItemStruct   :=   Message.DrawItemStruct^;  
      FCanvas.Handle   :=   DrawItemStruct.hDC;  
      ARect   :=   ClientRect;  
      with   DrawItemStruct   do  
      begin  
          IsDown   :=   itemState   and   ODS_SELECTED   <>   0;  
          IsDefault   :=   itemState   and   ODS_FOCUS   <>   0;  
      end;  
   
      Flags   :=   DFCS_BUTTONPUSH   or   DFCS_ADJUSTRECT;  
      if   IsDown   then   Flags   :=   Flags   or   DFCS_PUSHED;  
      if   DrawItemStruct.itemState   and   ODS_DISABLED   <>   0   then  
          Flags   :=   Flags   or   DFCS_INACTIVE;  
   
      if   IsFocused   or   IsDefault   then  
      begin  
          //按钮得到焦点时的状态绘制  
          FCanvas.Pen.Color   :=   clWindowFrame;  
          FCanvas.Pen.Width   :=   1;  
          FCanvas.Brush.Style   :=   bsClear;  
          FCanvas.Rectangle(ARect.Left,   ARect.Top,   ARect.Right,   ARect.Bottom);  
          InflateRect(ARect,   -1,   -1);  
      end;  
   
      FCanvas.Pen.Color   :=   clBtnShadow;  
      FCanvas.Pen.Width   :=   1;  
      FCanvas.Brush.Color   :=   Color;  
      if   IsDown   then  
      begin  
        //按钮被按下时的状态绘制  
          FCanvas.Rectangle(ARect.Left   ,   ARect.Top,   ARect.Right,   ARect.Bottom);  
          InflateRect(ARect,   -1,   -1);  
      end   else  
          //绘制一个未按下的按钮  
          DrawFrameControl(DrawItemStruct.hDC,   ARect,   DFC_BUTTON,   Flags);  
      FCanvas.FillRect(ARect);  
   
      //绘制Caption文本内容  
      FCanvas.Font.Assign(Font);  
      ARect   :=   ClientRect;  
      wh   :=   FCanvas.TextExtent(Caption);  
      FCanvas.Pen.Width   :=   1;  
      FCanvas.Brush.Style   :=   bsClear;  
      if   not   Enabled   then  
      begin   //按钮失效时应多绘一次Caption文本  
          FCanvas.Font.Color   :=   clBtnHighlight;  
          FCanvas.TextOut((Width   div   2)   -   (wh.cx   div   2)   +   1,  
              (Height   div   2)   -   (wh.cy   div   2)   +   1,   Caption);  
          FCanvas.Font.Color   :=   clBtnShadow;  
      end;  
      FCanvas.TextOut((Width   div   2)   -   (wh.cx   div   2),  
          (Height   div   2)   -   (wh.cy   div   2),   Caption);  
   
      //绘制得到焦点时的内框虚线  
      if   IsFocused   and   IsDefault   then  
      begin  
          ARect   :=   ClientRect;  
          InflateRect(ARect,   -4,   -4);  
          FCanvas.Pen.Color   :=   clWindowFrame;  
          FCanvas.Brush.Color   :=   Color;  
          DrawFocusRect(FCanvas.Handle,   ARect);  
      end;  
      FCanvas.Handle   :=   0;  
  end;  
   
  procedure   TMyButton.SetButtonStyle(ADefault:   Boolean);  
  begin  
      if   ADefault   <>   IsFocused   then  
      begin  
          IsFocused   :=   ADefault;  
          Refresh;  
      end;  
  end;  
   
  procedure   TMyButton.CreateParams(var   Params:   TCreateParams);  
  begin  
      inherited   CreateParams(Params);  
      with   Params   do   Style   :=   Style   or   BS_OWNERDRAW;   //   不是Params.WindowClass  
  end;  
   
  constructor   TMyButton.Create(AOwner:   TComponent);  
  begin  
      inherited;  
      FCanvas   :=   TCanvas.Create;  
      Color   :=   clWhite;   //   默认值需要在Create中设置  
  end;  
   
  destructor   TMyButton.Destroy;  
  begin  
      FCanvas.Free;  
      inherited;  
  end;  
   
  end.  
 

开始我也发现system   error.   code:87错,用我上面的,注意以下部分  
   
  procedure   TMyButton.CreateParams(var   Params:TCreateParams);  
  begin  
      inherited   CreateParams(Params);  
    with   Params.WindowClass   do  
      Style:=Style   or   BS_OWNERDRAW;  
  end;  
   
  另外,按zswang(伴水清清)(专家门诊清洁工)所说,重新编译

出错:  
    procedure   SetButtonStyle(ADefault:   Boolean);   override;  
   
  提示:Declaration   of   'setbuttonstyle'   differs   from   previous   declaration.  
  是不是说定义出父类的不一样?

不会吧,用我的程序,贴到你的unit中试试(我安装使用没问题)  
  如果你用zswang(伴水清清)(专家门诊清洁工)的程序,头上和下面的SetButtonStyle都要改

ok了,谢谢大家!  
  不过有几个问题不明白:  
  1、procedure   CNDrawItem(var   Message:   TWMDrawItem);   message   CN_DRAWITEM;   //   换成CN_DRAWITEM不是WM_DRAWITE   为什么要换成CN_DRAWITEM   ,WINDOWS消息不是WM_DRAWITEM,怎么变成CN_DRAWITEM。  
  2、   SetButtonStyle(ADefault:   Boolean);   函数既然是父类的函数,在我DELPHI的帮助中TBUTTON类里找不到SetButtonStyle   这个函数?

1、你自己换成WM_DRAWITEM自己看看效果,少动口多动手  
      看TBitBtn怎么封装就怎么封装,VCL是开源的  
      你学自定义组建最好的学习对象就是VCL的源代码  
   
  2、  
      TButton   =   class(TButtonControl)  
      private  
  //。。。。  
      protected  
  //。。。。  
          procedure   SetButtonStyle(ADefault:   Boolean);   virtual;  
  //。。。。  
      end;  
 

WIDNOWS消息以WM开头的,怎么又变成CN开头了,我想知道原因,我现在已经搞定了,可我还是不知道为什么是CN_    
  我要知道它为什么这样.

CN_XXX是delphi使用的自定义消息  
 

那用WM_DRAWITEM代替CN_DRAWITEM可以吗?  
 

这个问题还需要问吗?你自己替换测试一下就得到结果了

我试过了不行,可是我不明白为什么WM_DRAWITEM不行,WINDOWS中本来就有这条消息.为什么不行.  
  还有既然有CN_DRAWITEM,那有没有CN_LBUTTON等呢?

我赞成这样的书  
  代码贴上去就能用跟没看有啥区别?  
  让你找错才是它真正的目的  
  楼主可以查询一下其他的基础书籍,等你解决了问题,你会发现自己学到很多

为什么用WM_DRAWITEM不行呢?

posted @ 2009-01-04 16:52 delphi2007 阅读(127) | 评论 (0)编辑 收藏

函数返回数组怎么调用啊? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221095617231.html
type  
      a_nx   =array   of   Integer;  
        function   Func_getnx(CYbh:   string;   cNy:   string;var   sErr:   string):   a_nx;  
   
  客户端程序中我怎么调用这个函数啊?我申明了一个整数数组好像不行?

急!在线等!

function里面怎么还有"var"的部分呢?  
  ----------------------------------------------------  
  type  
      a_nx   =array   of   Integer;  
   
  var   x:   a_nx  
   
  function   Func_getnx(CYbh:   string;   cNy:   string):   a_nx;  
  begin  
      //....  
  end  
   
  x   :=   Func_getnx;

搞错了,请无视上贴横线上面的话   -_-  
   
  不过赋值应该没问题的?

看你函数中如何对数组进行操作的   有没有动态设置一下数组的长度!

这种设计是错误的  
   
  你要返回数组应用开放数组作参数  
   
  type  
      a_nx   =array   of   Integer;  
        function   Func_getnx(CYbh:   string;   cNy:   string;var   sErr:   string;anx   :array   of   Integer):boolean;  
   
  调用时传个数组进去就行了  
  这样结构保证,谁使用谁申请空间谁释放  
  Func_getnx   中   使用low(anx)   与   High(anx)来取数组下标范围   (因为Delphi   可以array[x..y]滴  
   
  如果你一定要返回数组哪比较麻烦  
      a_nx   =array   of   Integer;  
        function   Func_getnx(CYbh:   string;   cNy:   string;var   sErr:   string):   Pointer;  
        begin  
            GetMem(Result,iNeed   *   Sizeof(Integer);   //   申请堆空间  
          ///do....  
   
          end;  
          使用时  
          更加麻烦   Delphi好像不能给数组指针给值  
        useanx:   a_nx;  
        setlength(a_nx,needsize);  
        aPointer   :=   Func_getnx.....  
        Copymemory(useanx,apointer,CopySize);  
  然后才能   useanx....  
   
        还要   Freemem(apointer,size);

我还是不大明白:  
  type  
      TArray1   =   array   of   xxx;  
   
  var  
      a:   TArray1;  
   
  function   x(..):TArray1;  
   
  为何不能直接a:=x,   把函数x的引用传递给a呢?   我以前试过可以的.

函数不支持数组类型返回值,但支持记录类型返回值  
  你可定义一个记录类型:  
  type  
      TRecData   =   Record  
              a_nx:   array   of   Integer  
      end;  
  然后:  
    function   funName(Pn....):   TRecData;

这样是可以的:  
   
  type  
        TArr   =   array   of   integer;  
   
  function   abc(a:integer):Tarr;  
  var  
          tempArr:TArr;  
  begin  
          setlength(tempArr,2);  
          tempArr[0]   :=   a;  
          tempArr[1]   :=   a   +   10;  
          result:=tempArr;  
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
          a   :   integer;  
  begin  
          a   :=   5;  
          showmessage(inttostr(       abc(a)[0]       ));     //5  
          showmessage(inttostr(       abc(a)[1]       ));     //15  
  end;

同意楼上,静态数组我没试过,但是动态数组肯定可以.

我就是用Harryfin(Harry)的方法实现的,我的是动态数组  
  谢谢各位

posted @ 2009-01-04 16:51 delphi2007 阅读(652) | 评论 (0)编辑 收藏

自定义控件的问题:如何设置 ListSource VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061221084905233.html
某自定义控件继承于  
  EDIT,功能是弹出DBGRID,选择其中某一字段  
  现在我想增加两个属性  
   
  ListSource和ListField  
  分别对应于其中DBGRID中的DataSource和DataField字段,如何做才好,谢谢!

没人知道?高手帮忙呀!

你最好把你的调试代码贴出来  
  问题是你自己的,如果你自己不原意麻烦,别人更不原意麻烦。

哦,我的意思只是说两个控件合并后  
  如何通过设置合并控件属性ListSource达到设置DBGRID的DataSource属性的目的,谢谢

posted @ 2009-01-04 16:51 delphi2007 阅读(198) | 评论 (0)编辑 收藏

仅列出标题
共34页: First 13 14 15 16 17 18 19 20 21 Last