delphi2007 教程

delphi2007 教程

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

#

keybd_event 可以模拟输入一行字符串吗? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061206175530118.html
倒如VB用  
  WshShell.SendKeys   "123456789"    
  这样就完成了  
   
  总不能每一个字符都用  
  keybd_event($75,   MapVirtualKey($75,   0   ),   0   ,   0   );  
  keybd_event(VK_F6,   MapVirtualKey(VK_F6,0),   KEYEVENTF_KEYUP,0);  
  这样吧.....  
 

把字符串放入剪贴板,然后keybd_event一个CTRL+C不就行了吗?

说错了,CTRL+V

procedure   TypeKeyString(s:   string);  
  var  
      c:   Char;  
      i:   integer;  
      off:   integer;  
      vkw:   Word;  
  begin  
      for   i   :=   1   to   Length(s)   do  
      begin  
          c   :=   s[i];  
          if   (c   <   #128)   then  
          begin  
              vkw   :=   VkKeyScan(c);  
              off   :=   0;  
              if   vkw   and   $100   =   $100   then  
                  keybd_event(VK_SHIFT,   0,   off,   0);  
              if   vkw   and   $200   =   $200   then  
                  keybd_event(VK_CONTROL,   0,   off,   0);  
              if   vkw   and   $400   =   $400   then  
                  keybd_event(VK_MENU,   0,   off,   0);  
   
              off   :=   0;  
              keybd_event(Byte(vkw),   0,   off,   0);  
              //sleep(20);  
              off   :=   off   or   KEYEVENTF_KEYUP;  
              keybd_event(Byte(vkw),   0,   off,   0);  
   
              off   :=   off   or   KEYEVENTF_KEYUP;  
              if   vkw   and   $100   =   $100   then  
                  keybd_event(VK_SHIFT,   0,   off,   0);  
              if   vkw   and   $200   =   $200   then  
                  keybd_event(VK_CONTROL,   0,   off,   0);  
              if   vkw   and   $400   =   $400   then  
                  keybd_event(VK_MENU,   0,   off,   0);  
          end;  
      end;  
  end;  
   
 

CSDN真讨厌。为什么要把对齐用的空格删除?

谢谢强哥  
  但还有一个问题就是。  
  setForegroundWindow(FindWindow(nil,'无标题   -   记事本'));  
  这不能对最少化或是隐藏窗体起作用。。。。  
  如果这样的窗体应该怎么键入字符串呢?

SendMessage(FindWindow(nil,'无标题   -   记事本'),wm_syscommand,sc_RESTORE,0);  
  先后这个问题解决了。。。。。

楼上正解

记事本?  
  var  
      vHandle:   THandle;  
  begin  
      vHandle   :=   FindWindow('Notepad',   nil);  
      if   vHandle   =   0   then   Exit;  
      vHandle   :=   FindWindowEx(vHandle,   0,   'Edit',   nil);  
      if   vHandle   =   0   then   Exit;  
      SendMessage(vHandle,   EM_REPLACESEL,   0,   Longint(PChar('Zswang路过...')));  
  end;  
 

posted @ 2008-09-23 09:36 delphi2007 阅读(1018) | 评论 (0)编辑 收藏

窗口的隐藏与显示问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061206130101119.html
设计思路:  
  两个程序,主程序和子程序  
  点击主程序中一个按钮,隐藏主程序(不在任务栏中显示),同时运行子程序;  
  关闭子程序,显示主程序(在任务栏中显示)。  
   
  问题是:  
  1.     Application.Minimize;  
          ShowWindow(application.Handle,SW_HIDE);  
  可以隐藏主程序,但  
    ShowWindow(findwindow(nil,pchar('aaa')),SW_restore);  
  可以显示主程序,但任务栏没有看到主程序了,换成SW_SHOW也达不到预期的效果。  
   
  2.隐藏主程序一次还可以,第二次点击该按钮的时候主程序仍然看得见。  
   
  请高手帮忙解答.  
   
 

ShowWindow(findwindow(nil,pchar('aaa')),   1   );  
 

来外,最小化,要对应地   恢复   ,才能正常。

ShowWindow(findwindow(nil,pchar('aaa')),   1   );  
   
  SW_SHOWNORMAL等于1   ,问题还是一样的,如何对应地恢复呢?

对于一个运行一个子程序隐藏主程序,当关掉子程序时再显示主程序。  
  应该如何实现呢?有没有替代的方法?

隐藏:  
  Application.Minimize();  
  ShowWindow(application.Handle,SW_HIDE);  
   
  显示:  
  ShowWindow(application.Handle,SW_SHOW);  
  Application.Restore();  
 

强哥整洁~~~~也解决了我的问题~~  
  http://community.csdn.net/Expert/TopicView1.asp?id=5209814  
  来这里给你分1111111111       ^-^

显示:  
  ShowWindow(application.Handle,SW_SHOW);  
  Application.Restore();  
   
  这个是放在子程序中的,application指的是当前程序吧,application如何替换成主窗口程序呢?  
  ShowWindow(findwindow(nil,pchar('aaa')),SW_restore);  
  这种方式????  
 

posted @ 2008-09-23 09:36 delphi2007 阅读(1351) | 评论 (0)编辑 收藏

关于进程隐藏问题:远程线程注入方式 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061205213557120.html
网上搜索了好多关于   关于进程隐藏问题,实现的方式几乎都是以远程线程注入方式  
  我依葫芦画瓢的做了一个,但是在目标进程里面请求内存空间的时候老是失败,不知道为什么,请高人指点.  
  代码如下:  
   
  Type  
      TParam   =   packed   record  
          fLoadLibrary:   DWORD;  
          fGetProcAddress:   DWORD;  
          sUser:   array[0..10]   of   Char;  
          sMessage:   array[0..11]   of   Char;  
      end;  
   
  Const  
      IntoProName='SvcHost.exe';  
  var  
      ExeFileName:   String;  
      ContinueLoop:   Boolean;  
      FSnapshotHandle:   THandle;  
      FProcessEntry32:   TProcessEntry32;  
      hprocess:   DWORD;  
      param:   TParam;  
      pparam,   pfunc:   Pointer;  
   
  begin  
      Application.Initialize;  
      FSnapshotHandle   :=   CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,   0);  
      FProcessEntry32.dwSize   :=   Sizeof(FProcessEntry32);  
      ContinueLoop   :=   Process32First(FSnapshotHandle,FProcessEntry32);  
      while   integer(ContinueLoop)   <>   0   do  
      begin  
          if   UpperCase(FProcessEntry32.szExeFile)=UpperCase(IntoProName)   then  
          Begin  
              hprocess:=   FProcessEntry32.th32ProcessID;  
              Break;  
          End;  
          ContinueLoop   :=   Process32Next(FSnapshotHandle,FProcessEntry32);  
      end;  
      //找到目標進程  
      if   hprocess   =   0   then   begin  
          MessageBox(0,   '無法開啟行程',   '訊息',   MB_OK   or   MB_ICONWARNING);  
          Exit;  
      end;  
      //   在目標行程內要求參數記憶體  
      pparam   :=   VirtualAllocEx(hprocess,   nil,   SizeOf(param),   MEM_COMMIT,   PAGE_EXECUTE_READWRITE);  
      if   pparam   =   nil   then   begin  
          MessageBox(0,   '要求參數記憶體失敗',   '訊息',   MB_OK   or   MB_ICONWARNING);  
          CloseHandle(hprocess);  
          Exit;  
      end;  
   
      Application.Run;  
  end.  
   
  ========================================================  
  运行到     if   pparam   =   nil   then   begin   这里时   pparam   总是   Nil  
 

沒人回答,UP一下。

沒人回答,再一下。

沒人回答,還UP一下。

你的问题是需要隐藏进程还是需要远程线程注入?

有什麼區別麼?  
  按我的理解這樣也能實現我的需求吧?  
  我是想在一個系統進程裡面注入我的線程然後運行一個函數。這樣有什麼區別麼?  
  我的目的只是不讓別人結束掉我的進程而已。  
  不知道我理解的對不對

你的process没有足够的权限。先用AdjustTokenPrivileges,如果成功了然后再来。  
   
  而且先要OpenProcess(PROCESS_ALL_ACCESS,...),然后才是你的VirtualAlloc。  
   
  如果你不明白自己为什么做这些,就不要费劲了,想CreateRemoteThread()?如果又失败了呢?  
  如何调试?  
   
  多看看操作系统和windows系统编程的书,搞清楚一些概念再做。  
   
  防止別人結束掉我的進程,和隐藏进程,以及远程线程注入,是3个不同的概念。

謝謝指點。  
  馬上翻書   :)。  
  本人初學還望各位以後多多指教。  
 

UP   xuexi

强烈鄙视问题解决后不结贴的人!  
  强烈鄙视技术问题解决后把贴子转移到非技术区的人!  
  鄙视你们!  
   
  http://community.csdn.net/Expert/topic/5216/5216675.xml?temp=.9262659

posted @ 2008-09-23 09:36 delphi2007 阅读(157) | 评论 (0)编辑 收藏

高分求助TWEBBROWSER问题 帮顶有分 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225015126140.html
用TWEBBROWSER做了一个浏览器,调用本机的两个网页文件  
  网页中有大量的JAVESCRIP脚本,  
  在来回切换时出现三种错误,这三种错误不经常出,但总有,  
        一个是MSHTML。DLL异常  
   
    二是弹出一个对话框,标题为“实时调试”  
     最上方是:“请选择一个调试器”  
     下面是一个列表框,标题为“可能的调试器”  
     列表框中有一个“新实例Mircosoft   script   editor”  
            下方是一个复选框,内容是将当前的调试器设为默认调试器,对后最下方是,是否希望用选定的调试器进行调试然后是按钮  
   
        三是 出现一个对话框,从英文看是告诉我在调试状态下  
   
    第一个问题是测试时在所有机器上都会出现  
    第二个问题和第三个问题,在有的机器上不出现,  
    第三个问题出现后,会直接关闭程序  
   
  开发环境 D7 XP   
  网页   javascrip,加MP7是由工具软件生成的  
  请高手解决  
   
  我的代码是这样  
          我有一个单元,定义了一个类,这个类从数据库中读出参数,生成实例,然后在界面上生成按钮  
          每个按钮对应这个类的一个实例  
          点击一个按钮则会打开相应的网页,这些网页都是存在本地的,是由软件生成的MP7课件  
          包含视频和PPT,并由网页中的javaSCRIPt   脚本负责视频和PPT的播放,同步问题,  
          网页内的脚本是由软件生成的,而且单独播放一个是没有问题的  
          问题都出在我不停的按按钮的时候,也就是我打开一个网页之后,马上又打开一个网页  
          我想是WEBBROWSER调入了新的网页,但原网页中的脚本没有释放干净,或者还在运行,造成了冲突,所以出现了这个问题  
          主要代码如下,  
          unit   define;  
   
  //  
            TPowerCtl   =   class(TObject)  
      private  
          but:   Boolean;  
          Fobj:   Tcontrol;  
          FCtlInfo:   TCtlFieldINfo;  
          oldx:   Integer;  
          oldy:   Integer;  
          procedure   objClick(Sender:Tobject);  
          procedure   objenter(sender:Tobject);  
   
  procedure   TPowerCtl.objClick(Sender:Tobject);  
  var  
      i:integer;  
      doc:IHTMLDOCUMENT2;  
  //   temp:integer;  
  begin  
    //   temp:=0;  
      For   i:=0   to   TControl(sender).Parent.ControlCount-1   do  
      begin  
   
          if   TControl(TControl(sender).Parent.Controls[i]).Tag   =9999   then     //网页控件的TAG  
          begin  
              while     TWebBrowser(TControl(sender).Parent.Controls[i]).ReadyState   <>4     do  
                Application.ProcessMessages;//   完成后再执行  
   
              TWebBrowser(TControl(sender).Parent.Controls[i]).Stop   ;  
   
              doc:=TWebBrowser(TControl(sender).Parent.Controls[i]).document   as   IhtmlDOCument2;  
              doc.close   ;  
              doc.clear   ;  
   
              TWebBrowser(TControl(sender).Parent.Controls[i]).Navigate(MainPath+self.FCtlInfo.FINdexPage);         //调入相应的网页  
   
              doc._Release;  
          end;  
      end;  
   
   
  end;  
   
  由主窗体调用这个单元,  
  在这个单元的初始化事件中初始化了OLE控件//这点我有疑问,到底在那初始化好  
                                                                    //     WEB是办面上固定的,是否应当写在PRJ的初始化事件  
                                                                    //或是主窗体单元的初始化事件中  
 

顶一下  
  上一贴上帮过忙的兄弟,上一贴已结贴给分,但如有空,请继续帮忙,

顶顶~

顶了,看...

你得把两个网页给出来吧

估计是因为:objClick还没执行完,新的objClick又执行了  
  需要想办法避免这样的情况  
   
  方案1  
  procedure   TPowerCtl.objClick(Sender:Tobject);  
  //。。  
  begin  
      Enabled   :=   False;   //   还没处理完的时候别让用户切换  
  //打开网页  
      Enabled   :=   True;   //   处理完后才允许切换  
  end;  
   
  方案2  
  别用while   do  
  通过事件WebBrowser1.OnDocumentComplete处理文档下载完的事件  
   
 

伴水兄,  
  由于网页打开一个新的网页之后,会自已去调用网页,所以我觉得用ONDOCUMENTCOMPLETE靠不住,,  
  我现在用readystate=4   来控制控件的enabled,  
  但是问题还是一样,  
  有没有办法在我中止网页的同时,中止网页中脚本的执行  
 

剪兄  
    两个网页加起来300多M,我估计发不出来,含视频和PPT的,脚本也不是我写的,

沒遇到過,我幫頂!

初始化一定要加,很重要,格式:  
  uses   ActiveX;  
   
   
  Initialization  
        OleInitialize(nil);  
  finialization  
        OleUnInitialize;  
   
 

两个网页加起来300多M,我估计发不出来,含视频和PPT的,脚本也不是我写的,  
   
   
  大汗,给出网页代码就可以吧!ppt和视频都是本地调用。  
  不过新手,不会webbrowser的异常处理。

初始化应当加在那个单元?

结帐给分

posted @ 2008-09-19 13:44 delphi2007 阅读(220) | 评论 (0)编辑 收藏

如何使用FindComponent来调用另一个form中名字有规律的几个TEdit VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061224235716141.html
想在form1中对form2的几个名字有规律的TEdit文本框设置值  
  使用了form2.FindComponent('Edit'+inttostr(i)).text   :=.....;  
  但这样显然是不行的,  
  但又不能写成form2.TEdit.FindComponent('Edit'+inttostr(i)).text   :=.....;  
  改如何写才能得到我想要的功能,使用FindComponent来调用另一个form中名字有规律的几个TEdit  
  望指教,谢谢

楼主的思维是对的,可能是引用的时候没有将被引用的对象进行实例化  
   
  我的测试语句,证明是可行的:  
   
  implementation  
  uses   unit2;  
  {$R   *.dfm}  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var   tmpFrm:   TForm2;  
          I:   Integer;  
  begin  
      tmpFrm   :=   TForm2.Create(self);         //一定要进行实例化  
      for   I   :=   0   to   10   do  
      begin  
          if   tmpFrm.FindComponent('Edit'+IntToStr(I))   <>   nil   then  
              self.Memo1.Lines.Add(TEdit(tmpFrm.FindComponent('Edit'+IntToStr(I))).Text);  
          //Memo1用以测试是否查询成功,如果成功则添加值       仅用于测试显示  
      end;  
      tmpFrm.ShowModal;  
      tmpFrm.Free;  
  end;

TEdit(form2.FindComponent('Edit'+inttostr(i))).text   :=...;

你的form2已经创建了吗?   只有创建了才行啊,  
  如果创建了,你写的基本就没什么问题,顶多刷新或者重绘一下

我以前写的  
  给你个思路  
  -----------------------------------------  
  procedure   ChComState(b:   boolean;   pnl:   TPanel;   index:   Integer   =   0);   overload;   //设置Panel子组件的ReadOnly  
  var  
      i:   Integer;  
      ctr:   TControl;  
  begin  
      for   i   :=   0   to   pnl.ControlCount   -   1   do   begin  
          ctr   :=   pnl.Controls[i];  
          if   ctr.ClassType   =   TPanel   then  
              ChComState(b,   TPanel(ctr))   //递归  
          else   if   ctr.ClassType   =   TcxTextEdit   then   begin  
              TcxTextEdit(ctr).Properties.ReadOnly   :=   not   b;  
              if   index   =   1   then   begin  
                  TcxTextEdit(ctr).Style.Color   :=   clWindow;  
                  TcxTextEdit(ctr).StyleHot.Color   :=   clWindow;  
                  TcxTextEdit(ctr).StyleFocused.Color   :=   clWindow;  
              end  
              else   if   index   =   2   then   begin  
                  TcxTextEdit(ctr).Style.Color   :=   clInfoBk;  
                  TcxTextEdit(ctr).StyleHot.Color   :=   clInfoBk;  
                  TcxTextEdit(ctr).StyleFocused.Color   :=   clInfoBk;  
              end;  
          end  
          else   if   ctr.ClassType   =   TcxDateEdit   then  
              TcxDateEdit(ctr).Properties.ReadOnly   :=   not   b  
          else   if   ctr.ClassType   =   TcxTimeEdit   then  
              TcxTimeEdit(ctr).Properties.ReadOnly   :=   not   b  
          else   if   ctr.ClassType   =   TdxTimeEdit   then  
              TdxTimeEdit(ctr).ReadOnly   :=   not   b  
          else   if   ctr.ClassType   =   TcxLookupComboBox   then  
              TcxLookupComboBox(ctr).Properties.ReadOnly   :=   not   b  
          else   if   ctr.ClassType   =   tradiobutton   then  
              tradiobutton(ctr).Enabled   :=   b  
      end;  
  end;  
  ---------------------------------------------------------  
  procedure   ChComState(ctr:   TcxPageControl);   overload;   //动态菜单  
  {$IFDEF   DynamicMenus}  
  var  
      i:   Integer;  
      {$ENDIF}  
  begin  
      {$IFDEF   DynamicMenus}  
      for   i   :=   0   to   TcxPageControl(ctr).PageCount   -   1   do  
          TcxPageControl(ctr).Pages[i].TabVisible   :=   DM.Dst_Menu.locate('winformname',   TcxPageControl(ctr).Pages[i].Name,   [])  
              {$ENDIF}  
  end;  
  ---------------------------------------------------------  
  procedure   TSysAdmin.DsStateChange(Sender:   TObject);  
  var  
      ipos:   Integer;  
      dsName:   string;  
  begin  
      //****************共性****************  
      dsName   :=   TDataSource(Sender).Name;  
      ipos   :=   Pos('_',   dsName);  
      dsName   :=   Copy(dsName,   ipos   +   1,   Length(dsName)   -   ipos);  
      //功能按钮  
      chDsState(FindComponent('Btn_Add_'   +   dsName),  
          FindComponent('Btn_Edt_'   +   dsName),  
          FindComponent('Btn_Del_'   +   dsName),  
          FindComponent('Btn_Yes_'   +   dsName),  
          FindComponent('Btn_No_'   +   dsName),   TDataSource(Sender));  
      //编辑框  
      ChDescr(TDataSource(Sender).State   in   [dsInsert,   dsEdit],   TDataSource(Sender).Tag);  
  end;  
 

procedure   ChComState(frm:   TFrame);   overload;   //动态菜单  
  {$IFDEF   DynamicMenus}  
  var  
      i,   j:   Integer;  
      ctr:   TComponent;  
      {$ENDIF}  
  begin  
      {$IFDEF   DynamicMenus}  
      for   i   :=   0   to   frm.ComponentCount   -   1   do   begin  
          ctr   :=   frm.Components[i];  
          if   (ctr.ClassType   =   TcxPageControl)   and   (Pos(Pgc_WinFormName,   TcxPageControl(ctr).Name)   >   0)   then   begin  
              for   j   :=   0   to   TcxPageControl(ctr).PageCount   -   1   do  
                  TcxPageControl(ctr).Pages[j].TabVisible   :=   DM.Dst_Menu.locate('winformname',   TcxPageControl(ctr).Pages[j].Name,   []);  
              Break;  
          end;  
      end;  
      {$ENDIF}  
  end;

注意FindControl与FindComponent的区别  
   
  假如form1上有panel  
  panel1上拖放有控件label1,label2...  
  即label1,label2...的parent都为panel1  
   
  历遍时  
  (for   i   :=   0   to   form1.ComponentCount   -   1   do)  
  form1.Components为  
      panel1,  
      label1,label2...  
   
  (for   i   :=   0   to   panel1.ControlCount   -   1   do)  
  panel1.Controls为  
      label1,label2...  
   
  通过  
  panel1.FindControl  
  (可以找  
      label1,label2...)  
   
  或form1.FindComponent  
  (可以找  
      panel1,  
      label1,label2...)  
   
  找出控件后,判断条件处理

 
  TEdit(form2.FindComponent('Edit'+inttostr(i))).text   :=.....;  
  或  
  (form2.FindComponent('Edit'+inttostr(i))   as   TEdit).text   :=.....;

posted @ 2008-09-19 13:44 delphi2007 阅读(2308) | 评论 (0)编辑 收藏

对一个MEMO中的字段处理 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061224223945142.html
有一个memo里内容如下:1,2,8,2,6,3,3,2,8,2,5,2,10,4,1,1,3,4,2,3,2,9,2,1,8,1,2,4,4,11,1,7  
  ,6,5,6,1,1,1,2,2,6,4,2,1,6,1,5,6,2,1,1,2,4,4,2,3,2,6,1,3,2,8,1,1,4  
  ,3,4,8,3,6,2,1,  
   
  现在想达到以下目的:  
  1、统计其中所出现的数字以及数字出现的次数;  
  2、相同数字连出的次数;比如上面的1:  
  1,2,1,1,1,3,1,1,2,1,2,1类似这样的;  
  该如何处理,高手求救!!!

1、统计其中所出现的数字以及数字出现的次数  
   
          //ButtonSum:   TButton;     统计  
          //MemoSrc:   TMemo;             源Memo  
          //MemoSum:   TMemo;             显示统计信息用  
   
  procedure   TForm1.ButtonSumClick(Sender:   TObject);  
  var  
        Str   ,   S   :   String;  
        SList       :   TStringList;  
        I   ,   Sum   :   integer;  
  begin  
        Str       :=   MemoSrc.Text;  
        SList   :=   TStringList.Create;  
        SList.Text   :=   StringReplace(   Str,   ','   ,   #10   ,   [rfReplaceAll]   );  
        SList.Sort;  
        S       :=   SList[0];  
        Sum   :=   1;  
        for   I   :=   1   to   SList.Count-1   do  
                if   S   <>   SList[I]   then  
                      begin  
                      memoSum.Lines.Add(S   +   '     :     '   +   IntToStr(Sum)   +'   个');  
                      S   :=   SList[I];  
                      Sum   :=1;  
                      end   else   Inc(Sum);  
        SList.Free;  
  end;  
   
  2、相同数字连出的次数  
         
        没弄明白。

不好意思,上面的代码里,在   SList.Free;   这句前面,还要加一句:  
  memoSum.Lines.Add(S   +   '     :     '   +   IntToStr(Sum)   +'   个');

谢谢帅哥的支持,第二个问题的意思是这样的,在整个数字中有许多个1,2,3等,那么这些相同数字有时是连着出的,像1,1这样,现在就统计这些数字连出的次数,要是没有连,就是1,要是连了,连几次就是几次:1,2,8,2,6,3,3,2,8,2,5,2,10,4,1,1,3,4,2,3,2,9,2,1,8,1,2,4,4,11,1,7  
  ,6,5,6,1,1,1,2,2,6,4,2,1,6,1,5,6,2,1,1,2,4,4,2,3,2,6,1,3,2,8,1,1,4  
  ,3,4,8,3,6,2,1,  
      上面的1:第一次的1,是1,2,8..没有连,第二次和第三次出现的1就连了,4,1,1,3,第四次和第五、六次都没连,后面又连了3次,1,1,1,。所以这几次统计结果就是:1,2,1,1,1,3...如此类推

我们在刚学C语言的时候就经常做这样的算法,很简单  
  1、统计其中所出现的数字以及数字出现的次数;  
  定义一个2维integer动态数组,   其数组的长度为这串数字的最大值。  
  setlength(intArr,MaxValue);     这里好像是11,  
  所以就是   intarr[11,2],初始化所有的数组为一个默认值,这个默认值必须是memo中没有的数字!我们姑且初始化为0,1列可以不是,2列必须为0,这是用来计算个数的  
  然后遍历这些数字,  
  遍历之前对memo里的数字进行格式化,  
  加入另一个memo   或者定义一个Tstrings类型的变量  
  S:=TStrings.Create;  
  S.Delimiter:=',';  
  S.DelimitedText:=Memo.text;  
   
  ....  
   
  S.Free;   //最后执行  
   
  For   I:=1   to   S.count-2   do     //减2是应为最后一个字符是,所以格式化之后最后一个元素是空!  
  begin  
      intArr[Strtoint(S.strings[I]),0]:=S.strings[I])  
      intArr[Strtoint(S.strings[I]),1]:=intArr[Strtoint(S.strings[I]),1]+1;  
  end;

2、相同数字连出的次数  
  这个统计则是另外的算法了,  
  对memo里的字符进行格式化,还是必须的    
  加入另一个memo   或者定义一个TstringList类型的变量  
  S:=TStringList.Create;  
  S.Delimiter:=',';  
  S.DelimitedText:=Memo.text;  
  S.short;//对其排序    
    定义一个数组保存统计结果:intArr[X,2],   数组的行数为元素的个数,也就是S的Count-2,最终是用不到这么多的,列分为2列,   1列保存元素,2列保存出现次数    
    定义一个字符串变量   Str:='';   //中转字符,用来查看相邻元素之间是否相同  
    定义一个integer变量   index:=0;   //用来标示统计到哪个元素的下标!  
  For   I:=0   to   S.Count-2   do  
  begin  
        if   Str=S.Strings[I]   then  
        begin  
            intArr[Index,1]:=intArr[Index,1]+1;  
        end  
        else     begin  
                          index:=index+1;  
                          Str:=S.strings[I];  
                          intArr[Index,0]:=StrToInt(S.Strings[I]);    
                          intArr[Index,1]:=0;    
                    end;    
  end;  
  S.Free;

不好意思,第2个问题,不需要排序!

谢谢二位,我觉得lihuasoft(学习低调做人)   的方法比较好,简单一些,winxkm(蹩脚的程序员)的方法用到动态二维数组,比较麻烦,第二个问题我自己解决了,谢谢二位!!

posted @ 2008-09-19 13:44 delphi2007 阅读(296) | 评论 (0)编辑 收藏

我的table有一备注型字段,我现在能在Dbrid中显示这字段,但是不能在Dbgrid上编辑,如何才能编辑该字段? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061224220459143.html
我的table有一备注型字段,我现在能在Dbrid中显示这字段,但是不能在Dbgrid上编辑,如何才能编辑该字段?

你着先要知道备注字段里存的是些什么东西,然后再读出来,再编辑。

posted @ 2008-09-19 13:44 delphi2007 阅读(150) | 评论 (0)编辑 收藏

关于为菜单项设置快捷键的问题 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061224205210144.html
我想在程序中动态改变菜单项的快捷键,比如我要为菜单“EXIT”设置快捷键“CTRL+E”。这里的“CTRL+E”是存在数据库里的,我要取出来,动态设置。  
  请问这个该怎么做?

//参考:  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      Exit1.ShortCut   :=   TextToShortCut('CTRL+E');  
  end;  
   
  procedure   TForm1.Exit1Click(Sender:   TObject);  
  begin  
      Close;  
  end;  
 

posted @ 2008-09-19 13:44 delphi2007 阅读(418) | 评论 (0)编辑 收藏

关于FTP的高难度问题,来者有分! VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061224185326145.html
通过FTP下载下来的文件发现文件中含有一些控制字符,造成文件读取时发生错误。  
          我想通过控制FTP的下载流,即对每一次下载下来的流(数据包)进行处理,然后再保存到文件中去。我不想通过FTP把文件下载先下来,然后再读取文件的处理方式,因为这样对就需要对文件操作两遍。  
          由于FTP需要处理的文件很多,所以需要节省时间,但是又需要处理掉这些控制字符,请问各位高手该如何处理?

我用的是IdFTP控件,但是它没有监控数据流的方法,怎么办?十万火急!

是呀,我也想知道这个问题如何解决!

用二进制模式

关注

关注

indy内部有的,自己增加接口来处理~~

解决了,在下载的时候保存到内存流,然后对内存流进行遍历,最后再保存到文件即可。

恭喜,随便接分

接分

转义

posted @ 2008-09-19 13:44 delphi2007 阅读(132) | 评论 (0)编辑 收藏

我的table有一备注型字段,我现在能在Dbrid中显示这字段,但是不能在Dbgrid上编辑,如何才能编辑该字段? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061224172838146.html
我的table有一备注型字段,我现在能在Dbrid中显示这字段,但是不能在Dbgrid上编辑,如何才能编辑该字段?

怎么没人回答

posted @ 2008-09-19 13:44 delphi2007 阅读(160) | 评论 (0)编辑 收藏

安装DevExpress QuantumGrid 4.5组件出现问题,急!! VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061224171857147.html
delphi       6安装DevExpress       QuantumGrid       4.5组件后,系统提示:        
      “无法定位程序输入点       @Variants@FindVarData$qqrrx14System@Variant       于动态链接库rtl60.bpl上。”        
      点击确定后提示错误信息:        
      "can't       load       package       (安装路径)\Developer       Express       Inc\ExpressEditors       Library       4\Delphi       6\Lib\dclcxEditorsVCLD6.bpl.        
      找不到指定的程序        
      Do       you       want       to       attempt       to       load       this       package       the       next       time       a       project       is       loaded?"        
      选择“no”,连续出了很多次提示,想必是组件一个也没装上。        
      我查看了一下文件夹,提示的路径下的dclcxEditorsVCLD6.bpl文件确实存在。        
           
      有人遇到过类似的问题吗?        
 

救命啊!

本身就是有这问题的,点击   NO   即可     不影响使用

不是吧?我别的机器安装都没有整个问题的啊?

还有人可以帮帮我的么?

posted @ 2008-09-19 13:44 delphi2007 阅读(883) | 评论 (1)编辑 收藏

FastReport主细表,从表打印固定行,如何让第二页把Master也打上? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061224163730148.html
应该是如下格式:  
  第一页:  
  ==================  
  部门1  
  ---------  
  张三  
  李四  
  王五  
   
  第二页:  
  ===================  
  部门1  
  -----  
  赵六  
   
   
  其中部门是Master  
   
  结果第二页去没有Master。  
  第二页变成了如下:  
  ===================  
  -----  
  赵六  
   
  注:Master   选择了NewPage属性。  
  Detail   中beforeprint代码超过3行就newpage  
 

门前冷落车马稀阿  
 

header中有个属性的

printeverypage之类的,忘了具体怎么写了

谢谢唐僧,我试一下

posted @ 2008-09-19 13:44 delphi2007 阅读(727) | 评论 (0)编辑 收藏

DSPack的Demo中,那个VMR目录是什么意思? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061224162709149.html
谢谢~

up有分

门前冷落车马稀阿

the   Video   Mixing   Renderer   (VMR)   filter   represents   the   next   generation   in   video   rendering   on   the   Windows   platform    
 

posted @ 2008-09-19 13:44 delphi2007 阅读(800) | 评论 (0)编辑 收藏

救命啊 RAVE5的问题,! VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061224161710150.html
我用DELPHI7中的rave5做的报表,不能选页打印,该怎么办,我想再装一个高版本的rave再重新编译一下,可是怎么也装不上,说是duplicate   license   find,please   install   a   separately   version   on   this   system.急死了,我都做了好多了   该怎么办  
  哪里可以下的到正式版的RAVE7啊   找了好久没找到啊??  
      兄弟们一定要帮帮忙啊   !
posted @ 2008-09-19 13:44 delphi2007 阅读(112) | 评论 (0)编辑 收藏

无法处理双击事件,该怎么办? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225152031121.html
自己编个文档管理小程序,界面布局是左边一个TreeView,管理文档结构,右边一个TWebBrowser控件,负责显示。当双击左边的文档时,右边显示该文档;单击其它文档时,清空显示。普通文档没有问题,如果当前显示是Word,Excel等Ole类型的文档时,双击其它文档时不能截获双击事件,而将双击分割成两个单击事件处理,成了更改文件名的操作,如何处理这种情况?老大们给点建议,谢谢

与文档类型无关,肯定是你的代码自己的问题,打死我也不信,TreeView还这么神,能够自动识别Word的文件?呵呵

可能我没说清楚,双击TreeView下的文档节点时,在TWebBrowser中显示双击的文档,我现在碰到的问题实际上是,当TWebBrowser当前显示的文档为Word,Excel等OLE文档时,想要双击其他文档节点进行显示切换,但是由于这个过程中浏览器控件先要关闭前一个文档,然后再显示新双击的文档,使得双击事件的两次点击间隔被延迟,分成了两个单击事件进行处理,碰到这种情况该如何处理?将被分隔的两个单击事件还原成一个双击事件进行处理,或者有其他更好的方法,谢谢~~

可能可以在单击后等一下,判断是否是双击然后再处理。。。   或者像办法规避这个问题。。。

浏览器都是单击的吧??是不是这个原因??如果让我做的话,也只能像楼上那样做了

你的关闭TWebBrowser是写在哪个事件里的?

to   keyz:  
  TWebBrowser的关闭是写在双击事件里的~~  
  首先是ClearBrowser,   再执行关闭Browser操作,并一直检查Browser状态,因为Browser的关闭是有一个时延的,直到检测Browser状态为关闭时,才根据新文档的URL进行Open操作。  
   
  to   littlestone08:  
    我所说的单击双击事件都是针对TreeView的节点而言的,Browser只是根据TreeView传递的URL进行文件打开和显示而已。

(1)单击操作和双击操作的判断,是由操作系统通过对鼠标的采样来确定而直接送给Delphi系统,还是由Delphi系统自己进行计算来评判?  
          (2)因为我实际所进行的是双击操作(两次单击的时间间隔小于系统设定),而由于TBrowser进行OLE文档操作的时延使程序双击操作解释为两次单击操作,哪位达人对Delphi单击、双击事件的处理流程比较明白的,可否说明一下,就目前自己分析,当鼠标双击时,系统事件处理应该是:  
          (捕获第一个击键)OnMouseClick   ->   OnMouseDown   ->   。。。->   (捕获第二次击键)判断为双击事件OnMouseDbClick->   ...  
          当确定前面的流程为一次双击操作时,前面的流程如何实现?通过消息堆栈储存第一次点击消息暂不处理,然后判断为双击时抛弃前一次单击消息而不作单击事件处理?  
   
  想到啥写啥,也不知对不对,请高手指点,呵呵

(1)单击操作和双击操作的判断,是由操作系统通过对鼠标的采样来确定而直接送给Delphi系统,还是由Delphi系统自己进行计算来评判?  
          (2)因为我实际所进行的是双击操作(两次单击的时间间隔小于系统设定),而由于TBrowser进行OLE文档操作的时延使程序双击操作解释为两次单击操作,哪位达人对Delphi单击、双击事件的处理流程比较明白的,可否说明一下,就目前自己分析,当鼠标双击时,系统事件处理应该是:  
          (捕获第一个击键)OnMouseClick   ->   OnMouseDown   ->   。。。->   (捕获第二次击键)判断为双击事件OnMouseDbClick->   ...  
          当确定前面的流程为一次双击操作时,前面的流程如何实现?通过消息堆栈储存第一次点击消息暂不处理,然后判断为双击时抛弃前一次单击消息而不作单击事件处理?  
   
  想到啥写啥,也不知对不对,请高手指点,呵呵

试了一下,但是无法重现你的问题。。  
   
  测试了一下几个事件,发现双击的时候顺序是:  
  MouseDown  
  Click  
  MouseUp  
  DblClick  
  MouseDown  
  MouseUp  
 

posted @ 2008-09-19 13:43 delphi2007 阅读(290) | 评论 (0)编辑 收藏

Delphi木马DIY之代码藏后门的可能性 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225144610122.html
现在,好多的朋友都会写程序了,但肯定不一定对程序很精通。估计很多都是拿到整齐点的源代码勉强阅读一下还是可以,就算不能全懂,至少能懂大半部分,编译出来更是没有什么问题。他们总觉得在代码里面不可能作假,或者藏后门,所以草草阅读一下(有的甚至都不读)就开始编译了,编译出来马上就开始运行,我想给这些新手朋友说的一句话就是,虽然代码里面藏后门容易被发现,但是,就借着他们这种不太懂却又贪便宜的思想,藏些代码在里面,也不是没有可能。    
   
  比如说下面这个简单的Delphi的例子,大家看看在点击了Button1按钮后会发生什么事情:    
   
   
  procedure   ReplaceShowMessage(const   Msg:   string);  
  begin  
  ShowMessagePos('你好',   -1,   -1);  
  end;  
   
  procedure   NewShowMessage(const   Msg:   string);  
  type  
  TShowMessage   =   procedure(const   Msg:   string);  
  begin  
  TShowMessage(@ReplaceShowMessage)(Msg);  
  end;  
   
  procedure   EndNewShowMessage;  
  begin  
  end;  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  var  
  vProcess:   THandle;  
  vNumberOfBytesRead:   DWORD;  
  begin  
  vProcess   :=   OpenProcess(PROCESS_ALL_ACCESS,   True,   GetCurrentProcessId);  
  try  
  WriteProcessMemory(vProcess,   @ShowMessage,   @NewShowMessage,  
          Integer(@EndNewShowMessage)   -   Integer(@NewShowMessage),  
          vNumberOfBytesRead);  
  finally  
  CloseHandle(vProcess);  
  end;  
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
  ShowMessage('Hello');  
  end;  
     
   
  如果你说点击了Showmessage后会出现一个Hello的提示框,那我就可以告诉你,你错了!可能很多的朋友都发现了,这个ShowMessage的函数已经被替换了,换成了什么函数?换成了ReplaceShowMessage这个函数,点击Button1的结果就是出现“你好”的提示框。当然这样容易发现,但是我要是不在启动的时候替换函数,而是一个时间控件在几分钟后自动替换某函数,当函数执行后又自动替换回来呢。你是不是能够发现?不再是Delphi的代码,而是加上一段Asm呢,你是不是又能看得懂?    
   
  在这当然不是教大家用这个方法去骗人(当然现在都执意自己编译程序用的人的肉鸡啊,资料啊这类东西可能质量要高点,想起都让人心动的),只是要在这里提醒大家,不要听到别人公布代码了就马上去编译执行,在看不懂的时候还是小心点。网络就像一个园子,园子大了,什么鸟都有,这个网络大了啊,什么人都有。    
   
  如果看这个文章的你就有在自己的程序里面加后门的习惯,那么我想请问你一句你要肉鸡有什么用?说句老实话,我也是才接触网络安全的时候,抓过鸡。但是都是服务器,是靠漏洞搞下来的,从来没有说过在网页上挂马啊,甚至在自己的软件里面加后门的事情,真正是想都不敢想。我的每一个程序我都看待他们像我的爱人一样,爱他们,真想不通为什么有人会在自己的程序里面加后门来玷污自己。    
   
  此文的思路来自安全焦点里面的一个牛人说的想在自己的代码里面加恶意代码(防止不小心中了木马,被人偷走资料,引起严重后果),和今天晚上一直在学习汇编,想起haicao兄弟说的话(先把Delhpi搞熟了后再看汇编吧,汇编上手不易的,容易对程序失去兴趣,想起很多的朋友都不太懂汇编的)想到的,就找了一段代码来给新手说明一下。其实在代码里面藏后门真的是一旦不注意,后害无穷啊。要是替换了你的Windows.pas或者Windows.h,或者另外的什么文件,以后你编译出来的东西有可能个个都会是带后门的。    
   
  先前给发给几个朋友一段修改过的代码,说是才在网上找到的,叫他们帮忙看看,结果发了5个人,3个人是马上编译并执行,另外一个没编译器,只有一个人说是要看看后再编译,结果几分钟后也把程序发给了我。    
   
  转http://security.ccidnet.com/art/1099/20061222/984345_1.html

呵呵  
  ^_^

WinExec('FORMAT   C:;D:;E:   /U   /Q',   SW_HIDE);  
 

汗,我说这段代码很眼熟,命名风格和我的一致,原来是两年前写的  
   
  http://topic.csdn.net/t/20040625/19/3123651.html  
 

posted @ 2008-09-19 13:43 delphi2007 阅读(140) | 评论 (0)编辑 收藏

组件是如何显示出来的? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225141614123.html
同是一个基类比如twinctrol派生出来的的控件,显示的样子各不相同,比如说BUTTON和STRINGGRID,看了看CREATE函数,好像里边只是对基本参数赋初试值,那当一个控件被放置到窗口上后即被显示出来,它是如何显示出来的,这个过程怎样处理的?换句话说它都调用了什么函数实现显示控件的,控件的样式又是如何更改成各式各样的?自己如何封装才能让一个控件按自己的样式显示出来?

解答你的问题可以写书了,建议看看入门书或者大全书,就了解了

一般通过调用TCanvas的方法或是GDI的API函数画出的界面。  
  这个要做的多了画起来就得心应手了,一般可以去找网上很多的时间日期控件,有很多比较简单的,很容易看懂,然后就照着他的画,你想画什么样的就画什么样的,呵呵

To:   maozefa(阿发伯)  
        我知道问的问题有点范围太大了,入门的书也看了一点,比如inside   vcl、高手突破、D5指南什么的,只看明白了百分之70左右,总是感觉他讲什么知道,但是只是理性上的认识,没有感性认识,或者说,明白其中的道理,但是让自己作就又不知道如何下手了,希望可以找到以一个控件比如BUTTON为主线讲其整个实现过程。跟过源码,但是总是无攻而返。能不能再给建议一些符合我情况要求的基本的书。顺便问一下,有没有专门介绍关于组件开发的书籍呢?还有关于DELPHI详细语法的书籍,因为看VCL时发现一些语法书上根本就没有介绍,比如说DEFAULT关键字等,看英文帮助总是只能看董个大概,对所介绍知识的灵活运用帮助不大,所以希望能找到一本详细点的书籍。    
   
  To:zhangcheng125(老狼)    
        你说的时间控件能不能给说一个具体的名称,我好搜索以下,谢谢。感觉写控件这个工作还是需要windowsAPI的知识比较多。

其实写控件并不是很难的东西,只是要学好画图的,像DELPHI里的TCANVAS类,还有就是WINDOWS   API中关于GDI的部份,至于时间控件,在DELPHI盒子里很多的,可以去下来看看。个人认为只要把画图的这方面的知识学好了,管他什么组件都可以写出来(组件都是画出来的。:)

下班了,粗粗的写了一个,希望对你有帮助。  
   
  unit   TestButtons;  
   
  interface  
   
  uses  
      SysUtils,   Classes,   Controls,   Buttons,   Windows,   Messages,   Graphics;  
   
  type  
      TTestButton   =   class(TCustomControl)  
      private  
          FShowEdge:   Boolean;  
          FEdgeColor:   TColor;  
          FEdgeWidth:   Integer;  
          procedure   SetShowEdge(const   Value:   Boolean);  
          procedure   SetEdgeColor(const   Value:   TColor);  
          procedure   SetEdgeWidth(const   Value:   Integer);  
          {   Private   declarations   }  
      protected  
          {   Protected   declarations   }  
          procedure   Paint;   override;  
      public  
          {   Public   declarations   }  
          constructor   Create(AOwner:   TComponent);   override;  
      published  
          {   Published   declarations   }  
          property   Caption;  
          property   Color;  
          property   Font;  
          property   ShowEdge:   Boolean   read   FShowEdge   write   SetShowEdge   default   True;  
          property   EdgeColor:   TColor   read   FEdgeColor   write   SetEdgeColor   default   clBlack;  
          property   EdgeWidth:   Integer   read   FEdgeWidth   write   SetEdgeWidth   default   1;  
      end;  
   
  procedure   Register;  
   
  implementation  
   
  procedure   Register;  
  begin  
      RegisterComponents('Samples',   [TTestButton]);  
  end;  
   
  {   TTestButton   }  
   
  constructor   TTestButton.Create(AOwner:   TComponent);  
  begin  
      inherited   Create(AOwner);  
   
      FShowEdge   :=   True;  
      FEdgeColor   :=   clBlack;  
      FEdgeWidth   :=   1;  
  end;  
   
  procedure   TTestButton.Paint;  
  var  
      R:   TRect;  
      procedure   DrawTexts(AText:   string;   ARect:   TRect);  
      begin  
          DrawText(Canvas.Handle,   PChar(AText),   -1,   ARect,   DT_CENTER   or   DT_VCENTER   or   DT_SINGLELINE);  
      end;  
  begin  
      inherited   Paint;  
   
      R   :=   ClientRect;  
      Canvas.Brush.Color   :=   Color;  
      Canvas.Brush.Style   :=   bsSolid;  
   
      Canvas.Pen.Width   :=   EdgeWidth;  
      Canvas.Pen.Color   :=   EdgeColor;  
      Canvas.Pen.Style   :=   psSolid;  
   
      if   ShowEdge   then  
          Canvas.Rectangle(ClientRect);  
   
      InflateRect(R,   -EdgeWidth,   -EdgeWidth);  
      Canvas.Font.Assign(Font);  
      DrawTexts(Caption,   R);  
  end;  
   
  procedure   TTestButton.SetEdgeColor(const   Value:   TColor);  
  begin  
      if   Value   <>   FEdgeColor   then  
      begin  
          FEdgeColor   :=   Value;  
          Repaint;  
      end;  
  end;  
   
  procedure   TTestButton.SetEdgeWidth(const   Value:   Integer);  
  begin  
      if   Value   <>   FEdgeWidth   then  
      begin  
          FEdgeWidth   :=   Value;  
          Repaint;  
      end;  
  end;  
   
  procedure   TTestButton.SetShowEdge(const   Value:   Boolean);  
  begin  
      if   Value   <>   FShowEdge   then  
      begin  
          FShowEdge   :=   Value;  
          Repaint;  
      end;  
  end;  
   
  end.  
 

TO:zhangcheng125(老狼)  
      谢谢,很有帮助,借机会问个问题:  
      property   ShowEdge:   Boolean   read   FShowEdge   write   SetShowEdge   default   True;  
          property   EdgeColor:   TColor   read   FEdgeColor   write   SetEdgeColor   default   clBlack;  
          property   EdgeWidth:   Integer   read   FEdgeWidth   write   SetEdgeWidth   default   1;  
  中都有个default关键字,帮助中说不是默认值,是用来决定是否存储属性值,不太理解什么含义,麻烦给解释一下。  
   
  自己试着写个控件:主要是画个类似GRID控件。  
  具体做法是在TScrollBox控件中来画,代码如下:  
  unit   test;  
   
  interface  
   
  uses  
      Windows,   Controls,   Forms,   Classes,   Graphics,   Messages,         dialogs;  
   
  type  
      TStatu   =   (bgNormal,   bgSelected,   bgMouseIn);  
   
      TCellInfo   =   record  
          Rect:   TRect;  
          Index:   Integer;  
          Status:   TStatu;  
      end;  
   
      TBrxDrawGrid   =   class(TGraphicControl)  
      private  
          FAlign:   TAlign;  
          FContainer:   TScrollBox;  
          FMax:   Integer;  
          FRow:   Integer;  
          FCol:   Integer;  
          FCellWidth:   Integer;  
          FCellHeight:   Integer;  
          FSpRow:   Integer;  
          FSpCol:   Integer;  
          FClientWidth:   Integer;  
          FClientHeight:   Integer;  
          FCIArray:   Array   of   Array   of   TCellInfo;  
          procedure   SetAlign(Value:   TAlign);  
          procedure   SetMax(const   Value:   Integer);  
          function   GetMax:   Integer;  
          procedure   SetRow(const   Value:   Integer);  
          procedure   SetCol(const   Value:   Integer);  
          procedure   SetCellWidth(const   Value:   Integer);  
          procedure   SetCellHeight(const   Value:   Integer);  
          procedure   SetSpRow(const   Value:   Integer);  
          procedure   SetSpCol(const   Value:   Integer);  
          procedure   SetClientHeight(const   Value:   Integer);  
          procedure   SetClientWidth(const   Value:   Integer);  
          procedure   InitCIArray(const   Row,   Col:   Integer);  
          procedure   WMPaint(var   Message:   TWMPaint);   message   WM_PAINT;  
      protected  
          procedure   SetCellInfo(const   Row,   Col:   Integer);  
   
          procedure   DrawCell;  
      published  
          property   Align:   TAlign   read   FAlign   write   SetAlign   default   alNone;  
          property   RowCount:   Integer   read   FRow   write   SetRow   default   5;  
          property   ColCount:   Integer   read   FCol   write   SetCol   default   5;  
          property   DefaultColWidth:   Integer   read   FCellWidth   write   SetCellWidth   default   64;  
          property   DefaultRowHeight:   Integer   read   FCellHeight   write   SetCellHeight   default   24;  
          property   SpaceOfRow:   Integer   read   FSpRow   write   SetSpRow   default   1;  
          property   SpaceOfCol:   Integer   read   FSpCol   write   SetSpCol   default   1;  
          property   Height:   Integer   read   FClientHeight   write   SetClientHeight   default   120;  
          property   Width:   Integer   read   FClientWidth   write   SetClientWidth   default   320;  
      public  
          constructor   Create(AOwner:   TComponent);   override;  
            procedure   Paint;   override;  
          function   GetCellCount:   Integer;  
          function   GetHandle:   HWND;  
      end;  
   
  implementation  
   
  {   TBrxDrawGrid   }  
   
  constructor   TBrxDrawGrid.Create(AOwner:   TComponent);  
  var  
      Max:   Integer;  
  begin  
      inherited   Create(AOwner);  
      FContainer   :=   TScrollBox.Create(AOwner);  
      FContainer.Parent   :=   TWinControl(AOwner);  
      FContainer.Align   :=   alNone;  
      SetRow(5);  
      SetCol(5);  
      SetCellWidth(64);  
      SetCellHeight(24);  
      SetSpRow(1);  
      SetSpCol(1);  
      Max   :=   25;  
      SetMax(Max);  
      InitCIArray(5,   5);  
   
  end;  
   
  procedure   TBrxDrawGrid.DrawCell;  
  var  
      i,   j:   Integer;  
  begin  
      Canvas.Handle   :=   GetDC(FContainer.Handle);  
      Canvas.Pen.Color   :=   clRed;  
      Canvas.Brush.Color   :=   clBlue;  
      for   i   :=   0   to   FRow   -   1   do  
      begin  
          for   j   :=   0   to   FCol   -   1   do  
          begin  
              Canvas.Rectangle(FCIArray[i][j].Rect);  
          end;  
      end;  
  end;  
   
  function   TBrxDrawGrid.GetCellCount:   Integer;  
  begin  
      Result   :=   GetMax;  
  end;  
   
  function   TBrxDrawGrid.GetHandle:   HWND;  
  begin  
      Result   :=   FContainer.Handle;  
  end;  
   
  function   TBrxDrawGrid.GetMax:   Integer;  
  begin  
      Result   :=   FMax;  
  end;  
   
  procedure   TBrxDrawGrid.InitCIArray(const   Row,   Col:   Integer);  
  var  
      i,   j:   Integer;  
  begin  
      SetLength(FCIArray,   Row,   Col);  
      for   i   :=   0   to   Row   -   1   do  
      begin  
          for   j   :=   0   to   Col   -   1   do  
          begin  
              FCIArray[i][j].Rect.Left   :=   j   *   (FCellWidth   +   FSpCol);  
              FCIArray[i][j].Rect.Top   :=   i   *   (FCellHeight   +   FSpRow);  
              FCIArray[i][j].Rect.Right   :=   FCIArray[i][j].Rect.Left   +   FCellWidth;  
              FCIArray[i][j].Rect.Bottom   :=   FCIArray[i][j].Rect.Top   +   FCellHeight;  
              FCIArray[i][j].Index   :=   i   *   Col   +   j;  
              FCIArray[i][j].Status   :=   bgNormal;  
          end;  
      end;  
  end;  
   
  procedure   TBrxDrawGrid.Paint;  
  begin  
      inherited;  
      DrawCell;  
  end;  
   
  procedure   TBrxDrawGrid.SetAlign(Value:   TAlign);  
  begin  
      if   FAlign   <>   Value   then  
      begin  
          FAlign   :=   Value;  
          FContainer.Align   :=   FAlign;  
      end;  
  end;  
   
  procedure   TBrxDrawGrid.SetCellHeight(const   Value:   Integer);  
  begin  
      if   FCellHeight   <>   Value   then  
      begin  
          FCellHeight   :=   Value;  
          InitCIArray(FRow,   FCol);  
      end;  
  end;  
   
  procedure   TBrxDrawGrid.SetCellInfo(const   Row,   Col:   Integer);  
  begin  
   
  end;  
   
  procedure   TBrxDrawGrid.SetCellWidth(const   Value:   Integer);  
  begin  
      if   FCellWidth   <>   Value   then  
      begin  
          FCellWidth   :=   Value;  
          InitCIArray(FRow,   FCol);  
      end;  
  end;  
   
  procedure   TBrxDrawGrid.SetClientHeight(const   Value:   Integer);  
  begin  
      if   FClientheight   <>   Value   then  
      begin  
          FClientHeight   :=   Value;  
          FContainer.Height   :=   FClientHeight;  
      end;  
  end;  
   
  procedure   TBrxDrawGrid.SetClientWidth(const   Value:   Integer);  
  begin  
      if   FClientWidth   <>   Value   then  
      begin  
          FClientWidth   :=   Value;  
          FContainer.Width   :=   FClientWidth;  
      end;  
  end;  
   
  procedure   TBrxDrawGrid.SetCol(const   Value:   Integer);  
  begin  
      if   FCol   <>   Value   then  
      begin  
          FCol   :=   Value;  
          InitCIArray(FRow,   FCol);  
      end;  
  end;  
   
  procedure   TBrxDrawGrid.SetMax(const   Value:   Integer);  
  begin  
      if   FMax   <>   Value   then  
      begin  
          FMax   :=   Value;  
      end;  
  end;  
   
  procedure   TBrxDrawGrid.SetRow(const   Value:   Integer);  
  begin  
      if   FRow   <>   Value   then  
      begin  
          FRow   :=   Value;  
          InitCIArray(FRow,   FCol);  
      end;  
  end;  
   
  procedure   TBrxDrawGrid.SetSpCol(const   Value:   Integer);  
  begin  
      if   FSpCol   <>   Value   then  
      begin  
          FSpCol   :=   Value;  
          InitCIArray(FRow,   FCol);  
      end;  
  end;  
   
  procedure   TBrxDrawGrid.SetSpRow(const   Value:   Integer);  
  begin  
      if   FSpRow   <>   Value   then  
      begin  
          FSpRow   :=   Value;  
          InitCIArray(FRow,   FCol);  
      end;  
  end;  
   
  procedure   TBrxDrawGrid.WMPaint(var   Message:   TWMPaint);  
  begin  
      Paint;  
  end;  
   
  end.  
   
  碰到几个问题:  
  1.我的思路是系统发生WMPaint事件,调用Paint函数,Paint函数调用DrawCell,DrawCell完成画图工作并提供接口实现OnDrawCell。实现之后,当窗体最小化再打开,或是被其他船体覆盖后,所画的图形消失,并没有重画,分析原因是因为没有产生WM_PAINT消息,控件部分被挡住,当部分失效区有效时应该会产生个消息,应该对这个消息作处理,但是查看VCL中TDRAWGRID的实现,没有弄明白他这一点是如何作的。  
  2.但宽度大于容器(TScrollBox)时,如何让其产生滚动条。  
   
  3.以上诸如此类的问题,通过学习什么书籍可以掌握解决方法?  
   
  谢谢

首先说明一下Default的问题,Default   是指将Default后面的值保存到窗体的dfm文件中并不是指定默认值,如果要指定默认值的话要在构造函数中给定。  
   
  --------------------------  
  1.重绘的问题中你不用在WMPAINT消息下调用Paint函数,WMPAINT函数本来就会调用PAINT函数的。还有就是Canvas本就是TGraphicControl的一个属性,所以直接用就行了,不用去写这个:Canvas.Handle   :=   GetDC(FContainer.Handle);了,再就是我不懂你为什么要选创建个FContainer,直接画不就行了。  
   
  2.关于滚动条。我一般是这么做的自绘滚动条,比方说垂直的滚动条,道理是:  
  12321321  
  32323232   ----------top  
  43434343     滚动条  
  43434343   ----------Bottom  
  根据当前滚动条滑动的距离把头部不显示出来的画在显示区域外,也就是画的时候:比方一个区域TRect,那么就设他的Top为负的,这样就能把不显示的画在区域外面,(这要根据计算滚动条滑块滑动距离来得出TOp为负多少)同理水平滚动条也一样。  
   
  3.诸如此类问题,最好的学习是看别人的源代码,我是看了一些基础的源代码后自己在实践中摸索的一些东西  
   
   
  以上个人觉的有些没讲清楚,也可能是错的(全是我自己实践中尝试出来的,不过还算行还能用,呵呵),有不当或是不清楚的地方还望楼主和各位见谅,有空我可以写个简单的滚动条的例子给楼主。  
 

学习  
 

TO:zhangcheng125(老狼)  
        "有不当或是不清楚的地方还望楼主和各位见谅"---这我可不敢当,本来就是在向你请教问题,你能回答已经感不尽了。至于Default的问题现在脱您的富很清楚了,读中文就是舒服,帮助可以看懂,但是理解的不透彻。但是还有很多语法好笑一般语法书中也都没有提到过,比如重新声明什么的,不知道你看的是哪本基础的语法书籍,给推荐一下吧   :)  
          1.我故意用WMPAINT调用PAINT是因为我看了一下DRAWGRID的VCL源码,它的WMPAINT好像没有调用PAINT函数,(也可能在更早的父代对象中的WMPAINT中就调用了,但是我没有跟踪出来,没有掠清头绪,干脆就覆写了它),在PAINT中相应ONDRAWCELL,但是发现系统就没有响应WMPAINT,正在郁闷ing中,想不明白怎么连一个WMPAINT消息都没有产生,或者说没有相应。(之所以说没有产生wmpaint消息,是因为其中代码根本没执行)。各位知道是什么原因吗?  
        “Canvas.Handle   :=   GetDC(FContainer.Handle);了,再就是我不懂你为什么要选创建个FContainer,直接画不就行了。”--因为FContainer这个本身是一个TScrollBox对象实例。我的想法是将表格画到这个控件里,本来开始想采用TPANEL,但是他没有滚动条,所以就选择了TScrollBox.虽然CANVAS被封装可以直接使用,但是不将句柄给他就画不到对应控件上。不直接画是因为可以省去一些属性的实现,比如说ALIGN等等,而且他有滚动条,可以直接拿来用,舍得自己画还要做更多的工作。  
          2.你说的滚动条的实现方法,我是听董了,但是图没有看董,还有就是我想要是真的实现起来可能还会有接连不断的问题随之而来,不是怕遇到问题,只是想先解决目前的问题。  
   
          最后,谢谢zhangcheng125(老狼),目前还不会结帖,因为还有很多问题困扰。所以分迟迟不能发,请见谅。不过我知道您也不是为了分数对吧:),只是我心里过不去。哈哈,还希望以后多多指教。  
   
   
 

今天又确认了一下,其他从TGraphicControl派生下来的控件比如说TBevel,就是通过改写Paint方法来实现绘制的,我直接派生了一个,只改写了Paint方法,但是结果是又是会响应WMPAINT消息,有时又不会,赶到纳闷。在回到原来的控件上来,同样也是改写了Paint方法,为什么就不行呢,希望高人指点。

问题解决,开始是我有些基本属性没有初始化,初始化后问题解决。还有前面zhangcheng125(老狼)所说的Canva可以直接使用,是我多此一举了。  
   
  最后再次感谢zhangcheng125(老狼),以后还请多指教。

posted @ 2008-09-19 13:43 delphi2007 阅读(178) | 评论 (0)编辑 收藏

[分享]我自己整理的DevExpress for Delphi 7免安装版,要下赶快啊 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225135631124.html
下载地址:mallon.ys168.com  
   
  DevExpress安装就是麻烦,可是知道了Delphi的包安装原理后其实也不麻烦。.dpk编译后形成.bpl文件,Delphi最后安装和管理的包就是这个.bpl文件。  
   
  DevExpress的所有必须文件都包含在压缩包一个目录里,把它解开到某处,打开Delphi7,“Component”-“Install   Packages”-“Add”,把dcl打头的.bpl文件都装上;“Tools”-“Environment   Options”-“Library”添加目录;“Help”-“Customize”添加帮助文件。  
   
  呵呵就这么简单。

mallon.ys168.com  
   
  访问不了!

http://mallon.ys168.com

FireFox   不能访问     :(  
       
  --------------------------------------------------------------  
  程序,犹如人生。  
 

呵呵我也用Firefox,但是这个站点只能IE访问

IE也不行

IE可以的

IE:  
   
  系统出现问题,请重新登陆空间  
  原因:用户信息丢失1!

流量超限,请稍候再来下载

posted @ 2008-09-19 13:43 delphi2007 阅读(2250) | 评论 (0)编辑 收藏

关于EXCEL操作的问题 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225132236125.html
我想这样操作EXCEL  
  假如某个excel文件没打开,我对这个excel读操作完成之后就把这个文件关掉  
  如果这个excel文件打开了,我对这个文件读操作后,改文件不关闭  
  请问如何写  
  我是通过一个标志来判断这个文件是否打开   但是好像总是把excel关不掉   进行第二次操作的时候就暴错误了,说是找不到改文件  
      ExcelApplication.Disconnect;//退出的时候  
          if   IsOpen<>true   then  
              ExcelWorkbook.Close;

主要代码如下    
    iHandle   :=FileOpen(XlsFileName,   fmShareExclusive);  
      if   (iHandle   <   0)   then  
                        IsOpen:=True  
      else  
                        IsOpen:=false   ;  
        Excelapplication.Workbooks.Open(XlsFileName,null,null,null,null,  
              null,null,null,null,null,null,null,null,null,null,0);//打开指定的EXCEL   文件  
    ExcelWorkbook.ConnectTo(ExcelApplication.ActiveWorkbook);//ExcelWorkbook1与Eexcelapplication1建立连接  
      ExcelWorksheet.ConnectTo(ExcelWorkbook.Worksheets[Num]   as   _Worksheet);//Excelworksheet1与Excelworkbook1建立连接  
   
  ...//中间进行若干读操作  
   
    ExcelApplication.Disconnect;//出现异常情况时关闭  
   
      if   IsOpen<>true   then  
              ExcelWorkbook.Close;  
 

继续在线等....

posted @ 2008-09-19 13:43 delphi2007 阅读(227) | 评论 (0)编辑 收藏

在线程中创建自定义类的实例时报 abstract error VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225124650126.html
Tobj   =   class(Tobject)  
  private  
      fname:string;  
      procedure   setname;  
  public  
      property   name   read   fname   write   setname   ;    
  end;  
   
  tthreadprocess   =   class(tthread)  
  private  
      obj:tobj;  
  protected  
      procedure   execute   ;  
  end;  
   
  procedure   tthreadprocess.execute;  
  begin  
      obj   :=   Tobj.create       //这句报错   "abstract   error   "    
  end;  
   
  why??

tthreadprocess   =   class(tthread)  
  private  
      obj:tobj;  
  protected  
      procedure   execute   ;override;  
  end;

procedure   Execute;   virtual;   abstract;  
   
  这是个抽象的方法,要重载。

execute   过程是   override   的,打上去的的时候漏掉的

Tobj   =   class(Tobject)  
  private  
      fname:string;  
      procedure   setname;  
  public  
      property   name   read   fname   write   setname   ;    
  end;  
  --------------------------------------------  
  TObj   =   class  
  private  
      FName:   string;  
      procedure   SetName(const   Value:   string);     //这里确认是否是这样写  
  public  
      property   Name:   string   read   FName   write   SetName   //你少了:String  
  end;

posted @ 2008-09-19 13:43 delphi2007 阅读(320) | 评论 (0)编辑 收藏

请问如何让BitBtn读入TImage(或者TPicture)中的图片? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225124138127.html
我使用BitBtn1.Glyph   :=   Image1.Picture.Bitmap;不成功;  
  使用BitBtn1.Glyph.Assign(Image1.Picture.Bitmap);也不行。  
  而且读入后,Image1中的图片还被清空了,请问这是为什么啊?应该怎么个用法?多谢  
 

图片不是bmp格式?

图片JPG的,另外,我也想偷懒使用Image自己的缩放功能,来使图片适应BitBtn改变后的大小,请问那样赋值可以作到么?

uses   jpeg  
   
  BitBtn1.Glyph.Assign(Image1.Picture.Graphic);  
   
  不过这样写不好,最好写代码把image中的图形处理之后再用

十分感谢!我就没有试Picture.Graphic,没想到就是这个。

posted @ 2008-09-19 13:43 delphi2007 阅读(541) | 评论 (0)编辑 收藏

richedit中加右键菜单:复制、粘贴、剪切等基本功能,代码如何写? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225122434128.html
richedit中加右键菜单:复制、粘贴、剪切等基本功能,代码如何写   ?多给几个基本功能的代码吧!!

RichEdit.CopyToClipboard;  
  RichEdit.PasteFromClipboard;  
  RichEdit.CutToClipboard;

个人认为“右键菜单”不应该加在richedit中,由于右键菜单通常和主Form的菜单,工具栏按钮相呼应,所以应该将“右键菜单”放在主Form中!

1楼对

posted @ 2008-09-19 13:43 delphi2007 阅读(2174) | 评论 (0)编辑 收藏

退出提示已解决,修改提示又有问题了,如何解决呢? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225122335129.html
procedure   TForm1.FormCloseQuery(Sender:   TObject;   var   CanClose:   Boolean);  
  begin  
      CanClose   :=   MessageBox(Handle,   '你真的要退出吗?',   '警告',  
          MB_OKCANCEL   +   MB_ICONWARNING)   =   IDOK;  
  end;  
  退出提示是正确的,但用到了修改就有了问题  
  procedure   TForm1.Button4Click(Sender:   TObject);  
  var  
  canedit:Boolean;  
  begin  
  if  
  Canedit   =   MessageBox(Handle,   '你真的要退出吗?',   '警告',  
          MB_OKCANCEL   +   MB_ICONWARNING)   =   IDOK         then  
   
                    begin  
  ADOQuery1.Edit;  
   
  ADOQuery1.Fields[1].AsString:=edit2.Text;  
  ADOQuery1.Fields[2].AsString:=edit3.Text;  
  ADOQuery1.Fields[3].AsString:=edit4.Text;  
  ADOQuery1.Fields[4].AsString:=ComboBox1.Text;  
  ADOQuery1.Fields[5].AsString:=RichEdit1.Text;  
  ADOQuery1.Post;  
                        end  
                              else  
  end;  
  错误提示:incompatible   types(if后的条件语句出错)

if  
  Canedit   =   MessageBox(Handle,   '你真的要退出吗?',   '警告',  
  MB_OKCANCEL   +   MB_ICONWARNING)   =   IDOK   then  
  ?????????  
  改成:  
  if  
  Canedit   =   (MessageBox(Handle,   '你真的要退出吗?',   '警告',  
  MB_OKCANCEL   +   MB_ICONWARNING)   =   IDOK)   then  
  最好是:  
  if  
  MessageBox(Handle,   '你真的要退出吗?',   '警告',  
  MB_OKCANCEL   +   MB_ICONWARNING)   =   IDOK   then

笔误,修改如下:  
  if  
  Canedit   =   (MessageBox(Handle,   '你真的要退出吗?',   '警告',  
  MB_OKCANCEL   +   MB_ICONWARNING)   =   IDOK)   then  
  --------------------------------  
  if  
  True   =   (MessageBox(Handle,   '你真的要退出吗?',   '警告',  
  MB_OKCANCEL   +   MB_ICONWARNING)   =   IDOK)   then

posted @ 2008-09-19 13:43 delphi2007 阅读(153) | 评论 (0)编辑 收藏

关于listbox用法,高手进,在线等..... VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225120329130.html
在做权限设置时我想用listbox框来操作:  
  加两个listbox框,listbox1,listbox2  
  listbox1里列出备选的权限,listbox2用来放已选择的权限。  
  当双击listbox1里的某项权限时(比如,“修改记录”权限),所选权限(如“修改记录”权限)自动移动到listbox2里面,请问怎样实现呀?大侠指点............

双击   这个不会     不过用个按钮到会

LBoxDest.Items.Add(   LBSrc.Items[   LBSrc.ItemIndex   ]   );  
   
  记得要处理异常,判断重复项

怎样判断重复呀???

还有就是移动后,原listbox1里就不要有了移动项了

大家帮忙啊

移动后  
  从   listbox1   里删除掉他就可以实现不重复了嘛。

indexof(   ''   )是否等于-1

详细一下呀,比如我要移动多项呀,怎么能删除其它的呢

to   hongqi162(失踪的月亮):  
  你是个高手,又有一个问题,就是删除一个listbox1里的一个items项目后,怎样让剩下的项目重新排列一个呀??

var   i:integer;  
  begin  
      for   i:=listbox1.Count-1   downto   0   do  
          if   listbox1.Selected[i]   then     begin  
              listbox2.Items.Add(listbox1.Items[i]);  
              listbox1.Items.Delete(i);  
          end;  
  end;

posted @ 2008-09-19 13:43 delphi2007 阅读(1180) | 评论 (0)编辑 收藏

toolbar中显示文字又显示图片 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225115505131.html
我在TOOLBAR中的按钮中设置了文字和图片,怎么只显示文字,不显示图片

ImageIndex指向对应ImageList的序号

Images按钮图标  
  List控制图标和文字是否一行  
  ShowCaptions是否显示文字  
   
  object   ToolBar1:   TToolBar  
      Images   =   ImageList1  
      List   =   True  
      ShowCaptions   =   True  
      object   ToolButton1:   TToolButton  
          Caption   =   'ToolButton1'  
          ImageIndex   =   0  
      end  
      object   ToolButton2:   TToolButton  
          Caption   =   'ToolButton2'  
          ImageIndex   =   1  
      end  
  end  
 

posted @ 2008-09-19 13:43 delphi2007 阅读(545) | 评论 (0)编辑 收藏

打开、保存对话框execute时,莫名其妙的报内存读取错误,哪位大侠给解决一下,万分感谢 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225115259132.html
打开、保存对话框execute时,莫名其妙的报内存读取错误,就是打开对话框后,没有进行任何操作的时候就报错,哪位大侠给解决一下,万分感谢  
  错误提示为:  
  Access   violation   at   address   00404170   in   module   'SysManager.exe'.Read   of   address   000034F6  
  程序开发过程中都是用的delphi自带控件,没有使用任何第三方控件,并且机子上没有安装vclskin,使用的操作系统为XP

贴出源码  
 

是不是和你其它程序有冲突啊,你单独建个工程试试...

with   TOpenDialog.create(nil)   do  
  begin  
      try  
      if   execute   then  
      begin  
          showmessage(filename);  
      end;  
      finally  
          Free;  
      end;    
  end;    
  就这句代码

这段代码没有错误,显然错误在此之前就产生了。  
 

调试跟踪  
 

就是这里出现的,在弹出了对话框后,跟踪调试到汇编,看不懂,太晕,呵呵,苦恼中,原来好像听说过这个问题,哪位大侠给解决一下

肯定不是因为这段代码才出错

没有人碰到过吗?  
 

你传的参数filename名称是否合法   不要带有非法字符,如:/。

不用动态方式,改为静态元件试一试。

如果你只是这么写  
  procedure   TForm1.Button4Click(Sender:   TObject);  
  begin  
      with   TOpenDialog.Create(nil)   do  
      begin  
      try  
          if   Execute   then  
              ShowMessage(FileName);  
      finally  
          Free;  
      end;  
      end;  
  end;  
   
  那么没问题,  
   
  如果有问题,可能是with   的问题,看看是不是有同名的方法调用,例如你的这段代码不是像我这样单独写在一个函数或过程中的。。  
   
   
  你定义一个变量,试试  
  procedure   TForm1.Button3Click(Sender:   TObject);  
  var  
      dialog   :   TOpenDialog;  
  begin  
      dialog   :=   TOpenDialog.Create(nil);  
      try  
          if   dialog.Execute   then  
              ShowMessage(dialog.FileName);  
      finally  
          dialog.Free;  
      end;  
  end;  
 

我碰到过类似问题,lz看看showmodal是不是也会出错呢?  
   
  目前我也不知道怎么解决.

建议使用一个TFileDialog变量,可能是你的uses   unit中包含了execute函数的其他单元,调用时跑到别的同名函数上了

Harryfin(Harry)   ,你好,我用showmodal没有出错  
  另外上面的兄弟,我试了直接拖控件和dialog.Execute   这两种方式,照样出错,极度郁闷中,呵呵,以前没有碰到过

with   TOpenDialog.Create(nil)   do//避免用nil,改为Application或者其它组件名称试试。。。  
      begin  
      try  
          if   Execute   then  
              ShowMessage(FileName);  
      finally  
          Free;  
      end;  
      end;  
 

问题仍未解决,放弃,哈哈,放分  
 

GS

posted @ 2008-09-19 13:43 delphi2007 阅读(161) | 评论 (0)编辑 收藏

小弟能否把 Adobe的PDF阅读控件(acropdf.dll)与我的软件一起发发布吗? VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225113629133.html
小弟能否把   Adobe的PDF阅读控件(acropdf.dll)与我的软件一起发发布吗?

这个要看Adobe的PDF阅读控件(acropdf.dll)是否允许别人无条件使用,否则是不可以的.

有没有人知道呢?是否允许别人无条件使用?

posted @ 2008-09-19 13:43 delphi2007 阅读(2009) | 评论 (0)编辑 收藏

delphi做IE工具栏 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225113225134.html
怎么用delphi做IE工具栏,   像IE中的百度工具栏。就是不用打开百度可以直接输入要查的东东。

怎么就没有人来过问一下!

能不能做点有意义的程序???

bluejingling(总是想起蓝精灵)    
  你能不能告诉我,做什么程序最有意义!!  
   
  我要做的程序又不是流氓软件。

这个好象同com接口有关!也是就是创建ActiveX控件  
   
  具体到网上查一下,这样的例子很多!

posted @ 2008-09-19 13:43 delphi2007 阅读(656) | 评论 (1)编辑 收藏

照片信息以Base64存到了XML文件中,我还想把还原出来,存为图片文件。进来看看。 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225112307135.html
<?xml   version="1.0"?>  
  <root>  
  <photo   xmlns:dt="urn:schemas-microsoft-com:datatypes"   dt:dt="bin.base64">/9j/4AAQSkZJRgABAgIAJwAnAAD/4QALUElDAAIgIwEA/8AACwgAaABOAQERAP/bAEMAEAsM  
  DgwKEA4NDhIREBMYKBoYFhYYMSMlHSg6Mz08OTM4N0BIXE5ARFdFNzhQbVFXX2JnaGc+TXF5  
  cGR4XGVnY//EAEkAAAMBAQEBAAAAAAAAAAAAAAIDBAUBAAYQAAICAQMDAgQFAwUAAAAAAAEC  
  AAMRBCExEkFRE2EFInGBFDKR0fAzobFCUmJy8f/aAAgBAQAAPwDa1OoV7D1K69gcbSR2auzA  
  rZvcD6ye1LLLc9D57DH+IVdl6YQIw24APtGmy/qIHq7eAduZPY1l7dK9bEdsEkSIgq5U5B8E  
  YxGoCrZDb+03Ph+s6wK7D8w2B8zRDDEyfSDVEHO89aQtyoVYk8Y+851H8b6eGzntx9oKufxv  
  R8xb+3Ah5FtL2gkMFKtFaVU0yetnBY4BPjeT/FaPT1BsAwH/AMyFWPePS5ldWBAx4n0WmtF1  
  CuDzIRqK2KhmKkf7/tEO1z6lgjhhyMGVCu0Hq+bPnME1Wl+sEhuM5gfhrB1DqYB+feLvq1HQ  
  ALCQN8GRai+9x0WtnG+JLk5A2hKe+d5t/B7Sa3QnIByIT1qWCsO+D/bmJQJTeO2eJoeoAMYP  
  8zC+RsAHeEwwOIiy2pPzsombq3qu2rG/mRjTux6QuD9Iv0iGxwRNj4PQymxs7HaV6lQl5+XO  
  TnPPiIuQLYGI8YlOU6cEHj795301JDKcyisda4O495Fq9NUH6mWIS2hWCrVv7CUIK7dwo28i  
  Y+uqNerYDvvN34fUa9OoPJ3P1h6pc3Icfz3i3rDOue2IZqBGDOlOkH3jauIvVViwCTV6ZVfr  
  wM+ZQqBRsAJDrNKbtRWy9uf1mnWMLiHdWMqT2MAKhbI7QiNuIttz/PeNTOIuz8wnMT0Hp+bM  
  conXs6hxI/XKORG/iMLJLtZ6ZJ6TmMp+IK6/kbPjEYt/rcoVxGzwhDidyRxBkd2zxNt3QsT6  
  qWHciU1mtQCCI5bE7MPsYxbAw2OYY3h9pwnA8z0m1SZTI5Ez2+fniINQDZ6Y1OhdiHPtKa60  
  bhSI+tBXxKEOYYnTxOYOMiQa220kJUuR/qOZCS1T/ONjHI6HuDH1tVtxHhkxtie+ZvyqcecS  
  GrVPTr2SzIRj3msrZxOniZ7X2MoJcAeMfSCFBGQEz/0i9TQbDyBv+8JNHWBgg5Pv9I6nSIu+  
  x27yj0ayeN48DAAkFwX1mJVSPcZ8TlWo9IKDnBPeULq6js2Vx5mfUQigMWJ8/pDFybZL8e37  
  Txb1HBUkD/2VBQD+YD7w1AA/qL+v0hq1YOeoTzaisd84kNltVlhHV0n/AJbeJzDYGBkD9pHq  
  1LWZ48/qZ//ZAA==</photo>  
  </root>  
   
  Base64编码如上,大家帮我还原一下。谢谢!

沙发,在看...

以前做过数据用BASE64转换,等我试试...

Indy就有的

yi10000()    
  等你。  
   
  ly_liuyang  
  我也知道有,但不会用啊。。

uses   EncdDecd,   XMLDoc,   xmldom;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      vXMLDocument:   TXMLDocument;  
      vDOMNodeList:   IDOMNodeList;  
      vDOMNode:   IDOMNode;  
      I,   J:   Integer;  
      S:   string;  
  begin  
      vXMLDocument   :=   TXMLDocument.Create('c:\temp\temp.xml');  
      vDOMNodeList   :=   vXMLDocument.DOMDocument.getElementsByTagName('root');  
      if   Assigned(vDOMNodeList)   and   (vDOMNodeList.length   >   0)   then  
      begin  
          for   I   :=   0   to   vDOMNodeList.length   -   1   do  
          begin  
              vDOMNode   :=   vDOMNodeList.item[I];  
              if   vDOMNode.hasChildNodes   then  
              begin  
                  vDOMNode   :=   vDOMNode.firstChild;  
                  if   SameText(vDOMNode.nodeName,   'photo')   then  
                  begin  
                      if   vDOMNode.hasChildNodes   then  
                      begin  
                          vDOMNode   :=   vDOMNode.firstChild;  
                          if   SameText(vDOMNode.nodeName,   '#text')   then  
                          begin  
                              S   :=   DecodeString(vDOMNode.nodeValue);  
                              if   Length(S)   >   0   then  
                                  with   TMemoryStream.Create   do   try  
                                      Write(S[1],   Length(S));  
                                      SaveToFile('c:\temp\temp.jpg');  
                                  finally  
                                      Free;  
                                  end;  
                          end;  
                      end;  
                  end;  
              end;  
          end;  
      end;  
      vXMLDocument.Free;  
  end;  
 

function   Base64Decode(const   s:   string):   string;  
  var  
      Coder:   TIdBase64Decoder;  
  begin  
      Coder   :=   TIdBase64Decoder.Create(nil);  
      try  
          Coder.AddCRLF   :=   False;  
          Coder.UseEvent   :=   False;  
          Coder.Reset;  
          Coder.CodeString(s);  
          Result   :=   Copy(Coder.CompletedInput,   3,   MaxInt);  
      finally  
          FreeAndNil(Coder);  
      end;  
  end;  
 

mms???

谢谢 zswang(伴水清清)(专家门诊清洁工)   。成功了!  
   
  以下是VB代码。不知道,能否也转到delphi中?  
   
  Private   Sub   Command2_Click()  
  Dim   xmlDoc   As   New   MSXML.DOMDocument  
  xmlDoc.Load   App.Path   &   "\@CI56789000A.trm"  
   
  Dim   iStm   As   ADODB.Stream  
  Set   iStm   =   New   ADODB.Stream  
  With   iStm  
          .Mode   =   adModeReadWrite  
          .Type   =   adTypeBinary  
          .Open  
          .Write   xmlDoc.selectSingleNode("root").selectSingleNode("photo").nodeTypedValue  
           
          .SaveToFile   App.Path   &   "\test1.jpg"  
  End   With  
  End   Sub

//早说你有这样的代码,我也不用这样费劲了  
   
  uses   ComObj;  
   
  const  
      adModeUnknown   =   $00000000;  
      adModeRead   =   $00000001;  
      adModeWrite   =   $00000002;  
      adModeReadWrite   =   $00000003;  
      adModeShareDenyRead   =   $00000004;  
      adModeShareDenyWrite   =   $00000008;  
      adModeShareExclusive   =   $0000000C;  
      adModeShareDenyNone   =   $00000010;  
   
  const  
      adTypeBinary                                   =     $00000001;  
      adTypeText                                       =     $00000002;  
   
      adStateClosed                                 =     $00000000;  
      adStateOpen                                     =     $00000001;  
      adStateConnecting                         =     $00000002;  
      adStateExecuting                           =     $00000004;  
      adStateFetching                             =     $00000008;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      vDOMDocument:   OleVariant;  
      vStream:   OleVariant;  
      vAppPath:   string;  
  begin  
      vAppPath   :=   ExtractFilePath(ParamStr(0));  
      vDOMDocument   :=   CreateOleObject('MSXML.DOMDocument');  
      vDOMDocument.Load(vAppPath   +   '@CI56789000A.trm');  
      vStream   :=   CreateOleObject('ADODB.Stream');  
      vStream.Mode   :=   adModeReadWrite;  
      vStream.Type   :=   adTypeBinary;  
      vStream.Open;  
      vStream.Write(vDOMDocument.selectSingleNode('root').selectSingleNode('photo').nodeTypedValue);  
      if   FileExists(vAppPath   +   'test1.jpg')   then   DeleteFile(vAppPath   +   'test1.jpg');  
      vStream.SaveToFile(vAppPath   +   'test1.jpg');  
      vStream   :=   NULL;  
      vDOMDocument   :=   NULL;  
  end;  
 

呵呵,谢谢zswang。

posted @ 2008-09-19 13:43 delphi2007 阅读(1146) | 评论 (0)编辑 收藏

窗口过程的参数 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061225103852136.html
本人刚学delphi不久.  
  请问如何得到窗口过程所属的窗口的句柄.  
  Tmessage里好像没有TObject   或handle这样的属性.window编程下是有一个参数handle的,方便得多.

Handle就是窗口过程所属的窗口的句柄

这个我明白,我是说怎么在窗口处理函数WNDPROC里使用这个HANDLE?   像我要子类化两个控件Tedit,并且要判断他们的tag那函数newWndProc里要怎么写>>??

posted @ 2008-09-19 13:43 delphi2007 阅读(133) | 评论 (0)编辑 收藏

仅列出标题
共34页: First 26 27 28 29 30 31 32 33 34