随笔 - 110  文章 - 28 评论 - 26 

留言簿(1)

随笔分类(103)

随笔档案(110)

文章分类(25)

文章档案(28)

新闻档案(3)

友情连接

  • 小蜜蜂
  • 马氏膏药网
  • 淋巴结肿大,淋巴结核,淋巴结炎 乳腺增生,小叶增生 颈椎病,腰椎病,腰间盘突出 马氏淋巴消炎贴,马氏增生散结贴,马氏关节肌肉贴
  • 黑客基地
  • 全球最大的黑客门户网站

最新随笔

积分与排名

  • 积分 - 143936
  • 排名 - 44

最新评论

阅读排行榜

评论排行榜

1  连接远程服务器
procedure Connect(AAutoLogin: boolean; const ATimeout: Integer);
2  改变目录
procedure ChangeDir(const ADirName: string);
3  下载
procedure Get(const ASourceFile: string; ADest: TStream; AResume: Boolean); overload;
procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean; AResume: Boolean); overload;
4  上传
procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: boolean); overload;
procedure Put(const ASourceFile: string; const ADestFile: string; const AAppend: boolean); overload;
5  删除
procedure Delete(const AFilename: string);


判断是否连接
if  IdFTP1.Connected  then
begin
...........
end;

引用别人一下,做为自己以后笔记

    现在很多应用都需要上传与下载大型文件,通过HTTP方式上传大文件有一定的局限性。幸好FTP作为一个非常老而且非常成熟的协议可以高效稳定地完成大文件的上传下载,并且可以完美地实现续传。就拿我写的电影服务器管理端程序来说,各种方案比较后,发现使用FTP可以完美地实现要求。但是要通过WinSocket库实现FTP比较麻烦,幸好有Indy--一个包装了大多数网络协议的组件包。
     通过Indy,程序设计人员可以通过阻塞方式进行编程,可以抛开蹩脚的Winsocket异步模式,采用与Unix系统上等同的阻塞编程模式进行。这样,程序员就可以很好的处理程序的运行流程。

     下面,我们进入到Indy的TIdFtp世界。

1.控件的说明

     使用Indy 9中的TIdFtp控件可以实现通过FTP方式进行文件的上传与下载。

2.控件的具体使用

(1)控件属性设置

     默认属性即可,与服务器连接直接相关的属性如主机名与用户等在建立连接时进行设定。需要设定的是RecvBufferSize和SendBufferSize两属性的值。另外需要根据要传输的文件类型指定TransferType属性,而其他属性按默认值设定即可。

     RecvBufferSize说明(默认值为8192字节):该属性为整型变量,用于指定连接所用的接受缓冲区大小。

     SendBufferSize说明(默认值为32768字节):该属性也为整型变量,用于指定连接所用的发送缓冲区的最大值。该属性在WriteStream方法中时,可用于TStream指定要发送内容的块数。如果要发送的内容大于本属性值,则发送内容被分为多个块发送。

TransferType说明(默认值为ftBinary):该属性为TIdFTPTransferType型变量。用于指定传输内容是二进制文件(ftBinary )还是ASCII文件(ftASCII)。应用程序需要使用二进制方式传输可执行文件、压缩文件和多媒体文件等;而使用ASCII方式传输文本或超文本等文本型数据。

(2)控件的事件响应

     OnDisconnected响应:TNotifyEvent类,用于响应断开(disconnect)事件。当Disconnect方法被调用用来关闭Socket的时候,触发该响应。应用程序必须指定该事件响应的过程,以便对该断开事件进行相应。

     OnStatus响应:TIdStatusEvent类。该响应在当前连接的状态变化时被触发。该事件可由DoStatus方法触发并提供给事件控制器属性。axStatus是当前连接的TIdStatus值;aaArgs是一个可选的参数用于格式化函数,它将用于构造表现当前连接状态的文本消息。

     OnWork响应:OnWord是TWorkEvent类事件的响应控制器。OnWork用于关联DoWork方法当缓冲区读写操作被调用时通知Indy组件和类。它一般被用于控制进度条和视窗元素的更新。AWorkMode表示当前操作的模式,其中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据。AWorkCount指示当前操作的字节计数。

     OnWorkBegin响应:TWorkBeginEvent类。当缓冲区读写操作初始化时,该事件关联BeginWork方法用于通知Indy组件和类。它一般被用于控制进度条和视窗元素的更新。AWorkMode表示当前操作的模式,其中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据。AWorkCountMax用于指示发送到OnWorkBegin事件的操作的最大字节数,0值代表未知。

     OnWorkEnd响应:TWorkEndEvent类。当缓冲区读写操作终止时,该事件关联EndWork方法用于通知Indy组件和类。AWorkMode表示当前操作的模式,其中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据。AWorkCount表示操作的字节数。

在事件响应中,主要通过上述五种事件响应来控制程序。在一般情况下,在OnDisconnected中设定连接断开的界面通知;在OnStatus中设定当前操作的状态;在OnWork中实现传输中状态条和其他参数的显示;而在OnWorkBegin和OnWorkEnd中分别设定开始传输和传输结束时的界面。

(3)连接远程服务器

     完成了设定控件属性和实现了控件的事件响应后,就可以与服务器进行交互和传输了。在连接之前,应首先判断IdFtp是否处于连接状态,如果Connected为False,则通过界面控件或其他方式指定与服务器连接相关的一些TCP类属性的设置,分别是:Host(主机名):String、Username(用户名):String、Password(密码):String,也可以指定Port(端口)。之后调用Connect方法连接远程服务器,如果无异常出现则连接成功建立。

过程说明:procedure Connect(AAutoLogin: boolean; const ATimeout: Integer);

该过程连接远程FTP服务器

属性:AAutoLogin: boolean = True

连接后自动登录,该参数默认为True。

const ATimeout: Integer = IdTimeoutDefault

超时时间,单位:秒。

示例代码:

   if IdFTP1.Connected then try

     if TransferrignData then IdFTP1.Abort;

     IdFTP1.Quit;

   finally

   end

   else with IdFTP1 do try

     Username := UserIDEdit.Text;

     Password := PasswordEdit.Text;

     Host := FtpServerEdit.Text;

     Connect;

     ChangeDir(CurrentDirEdit.Text);

   finally

   end;

(4)改变目录

     连接建立后,可以改变当前FTP会话所在的目录。对于已知绝对路径的情况下,可以直接调用ChangeDir(const ADirName: string)方法来转换目录,ADirName表示服务器上的文件系统目录,另外还可以调用ChangeDirUp回到上级目录。

     如果未知路径,则可以通过List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean)过程获取远程服务器的当前目录结构,此时必须设定TransferType为ftASCII(ASCII模式),其中:ADest保存当前目录结构,可以在后续程序中调用该列表。另外可以通过RetrieveCurrentDir方法获取当前目录名。

过程说明:

procedure ChangeDir(const ADirName: string);

改变工作目录

属性

const ADirName: string

远程服务器的目录描述

说明:该过程实际上是实现了FTP CWD命令。

 

procedure ChangeDirUp;

到上一级目录

 

function RetrieveCurrentDir: string;

该函数返回当前目录名

 

procedure List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean);

列出当前目录所有文件和子目录及其属性

参数:

ADest: TStrings

保存文件及子目录的返回结果

const ASpecifier: string =

文件掩码,用于列出符合条件的文件

const ADetails: boolean = true

包含文件和子目录属性

 

property DirectoryListing: TIdFTPListItems;

返回文件及目录结构的列表

 

示例代码:

   LS := TStringList.Create;

   try

     IdFTP1.ChangeDir(DirName);

     IdFTP1.TransferType := ftASCII;

     CurrentDirEdit.Text := IdFTP1.RetrieveCurrentDir;

     DirectoryListBox.Items.Clear;

     IdFTP1.List(LS);

     DirectoryListBox.Items.Assign(LS);

     if DirectoryListBox.Items.Count > 0 then

       if AnsiPos(total, DirectoryListBox.Items[0]) > 0 then DirectoryListBox.Items.Delete(0);

   finally

     LS.Free;

   end;

 

 

(5)下载的实现

     在下载之前,必须查看DirectoryListing.Items[sCurrFile].ItemType是否为文件,如返回为ditDirectory则代表当前文件名为目录,不能下载,必须导向到文件才可。如为文件,则可以进行下载。在下载前,设定传输的类型为二进制文件,并且指定本地要保存的路径。通过调用Get方法,实现文件的下载。下载过程较慢,可以考虑将其放到线程中实现。

过程说明:

procedure Get(const ASourceFile: string; ADest: TStream; AResume: Boolean); overload;

procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean; AResume: Boolean); overload;

从远程服务器上获取文件。

属性说明:

const ASourceFile: string

远程服务器上的源文件名

const ADestFile: string

保存到客户机上的文件名

const ACanOverwrite: boolean = false

重写同名文件

AResume: Boolean = false

是否进行断点续传

 

示例代码:

       SaveDialog1.FileName := Name;

       if SaveDialog1.Execute then begin

         SetFunctionButtons(false);

 

         IdFTP1.TransferType := ftBinary;

         BytesToTransfer := IdFTP1.Size(Name);

 

         if FileExists(Name) then begin

           case MessageDlg(File aready exists. Do you want to resume the download operation?,

             mtConfirmation, mbYesNoCancel, 0) of

             mrYes: begin

               BytesToTransfer := BytesToTransfer - FileSizeByName(Name);

               IdFTP1.Get(Name, SaveDialog1.FileName, false, true);

             end;

             mrNo: begin

               IdFTP1.Get(Name, SaveDialog1.FileName, true);

             end;

             mrCancel: begin

               exit;

             end;

           end;

         end

         else begin

           IdFTP1.Get(Name, SaveDialog1.FileName, false);

         end;

 

(6)上传的实现

     上传的实现与下载类似,通过put方法即可。

过程说明:

procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: boolean); overload;

procedure Put(const ASourceFile: string; const ADestFile: string; const AAppend: boolean); overload;

上传文件至服务器

属性说明:

const ASourceFile: string

将要被上传的文件

const ADestFile: string =

服务器上的目标文件名

const AAppend: boolean = false

是否继续上传

 

代码示例:

   if IdFTP1.Connected then begin

     if UploadOpenDialog1.Execute then try

       IdFTP1.TransferType := ftBinary;

       IdFTP1.Put(UploadOpenDialog1.FileName, ExtractFileName(UploadOpenDialog1.FileName));

       //可以在此添加改变目录的代码;

     finally

       //完成清除工作

     end;

   end;

(7)删除的实现

     删除文件使用Delete方法,该方法删除指定的文件,删除对象必须为文件。如果要删除目录则使用RemoveDir方法。

过程说明:

procedure Delete(const AFilename: string);

删除文件

procedure RemoveDir(const ADirName: string);

删除文件夹,根据不同的服务器删除文件夹有不同的要求。有些服务器不允许删除非空文件夹,程序员需要添加清空目录的代码。

上述两个过程的参数均为目标名称

代码示例:

   if not IdFTP1.Connected then exit;

   Name := IdFTP1.DirectoryListing.Items[iCurrSelect].FileName;

   if IdFTP1.DirectoryListing.Items[iCurrSelect].ItemType = ditDirectory then try

     idftp1.RemoveDir(Name);

   finally

   end

   else

   try

     idftp1.Delete(Name);

   finally

   end;

(8)后退的实现

     后退在实际上是目录操作的一种,可以简单的改变当前目录为..来实现,也可以通过回到上级目录来实现。

(9)取消的实现

     在IdFtp的传输过程中,可以随时使用abort方法取消当前操作。可以的OnWork事件的实现中来确定何时取消操作。

代码示例:

//取消按钮的OnClick响应

procedure TMainForm.AbortButtonClick(Sender: TObject);

begin

   AbortTransfer := true;

end;

//IdFTP的OnWork事件响应

procedure TMainForm.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;

   const AWorkCount: Integer);

begin

   ...

   if AbortTransfer then IdFTP1.Abort;

   AbortTransfer := false;

end;

(10)断点续传的实现

     断点续传就是在上传或下载过程开始时,判断已经传输过的文件是否上传输完毕,如果传输没有成功完成,则在上次中断处继续进行传输工作。实现该功能需要两个重要的操作,首先是判断文件的大小信息,其次是在传输过程Get和Put中指定上传的行为。

     判断服务器上文件的大小使用函数Size(FileName)。在下载过程中,比较本地文件和远程文件的信息,然后在Get中指定AResume := True即可。而上传也一样,指定Put的AAppend := True就可以了。   

 

在前面我们讲过,Indy的网络操作大部分是阻塞模式的,TIdFtp也不例外。这样在上述各个操作运行过程的时候用户界面被暂时冻结,必须要等待调用返回才能继续用户操作界面响应。所以在实际编程中,需要使用多线程的方式来保证户界面的响应。Windows系统可以使用CreateThread系统调用来创建线程,但是在使用的时候需要开发人员做很多额外的工作来保证线程的同步等问题。而Indy中也包含了实现多线程的控件TIdThreadComponent,相对比之下该控件实现多线程时更加方便,也更容易控制。我将在后续的文章里为大家介绍TIdThreadCOmponent的使用方法。

posted @ 2009-01-06 01:54 小叶子 阅读(9342) | 评论 (1)编辑 收藏
第一种方法:
我们用Twebbrowser来得到
新建application,加入memo,button,webbrowser三个组件

procedure TForm1.FormCreate(Sender: TObject);
begin
webbrowser1.Navigate('www.baidu.com');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
vv:olevariant;
s:string;
begin
memo1.Lines.Clear;
vv:=webbrowser1.Document;
s:=vv.all.item(0).outerhtml;
memo1.Lines.Add(s);
end;
这样就会在memo中得到百度所有的代码了
s:=vv.all.item(0).outerhtml;
在这句中,请使用item(0)
如果你在面度中输入111,再点下'百度一下',会出现很多关于'111'的内容,这时你使用
s:=vv.all.item(0).outerhtml;
memo1.Lines.Add(s);
memo1中不会出现真正网页的源码了,些时只要改一点:item(1)就可以了






第二种方法:
我们使用Tidhttp来得到
var
s:string;

s:=idhttp1.get(url);//URL必须带有HTTP://
而webbrowser可以是www.***.com或***.com

这也是我使用idhttp1.get(url)出错的原因

还有一点s:=idhttp1.get('http://www.baidu.com');还是出错,不知道为什么百度不可以
等待高手解释
posted @ 2009-01-06 00:15 小叶子 阅读(1472) | 评论 (1)编辑 收藏

从例子中你学到的知识比你学书本更容易记忆

现在做一个手机号查询工具,他是利用www.ip138.com来查的
主要用到webbrowser
利用pos()从源码中找出你想要的数据
还有一点,有些控件我没有办法去隐藏,只能用别有一些控件来覆盖起来,从而程序看起来美观
一会我发出代码,但希望你一看就懂,不懂的在提出问题来,我在第一时间回答你的问题
下载这个程序源码:
http://www.cnitblog.com/Files/shuyezi122/手机号查寻工具.rar

发出主要代码:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, mshtml, StdCtrls, Buttons, OleCtrls, SHDocVw, ExtCtrls, Mask;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    PostEdit: TBitBtn;
    PostStr: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit5: TEdit;
    Edit4: TEdit;
    Edit6: TEdit;
    zhang: TEdit;
    Image1: TImage;
    procedure HandPostButClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure PostEditMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure WebBrowser1NavigateComplete2(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    procedure Button1Click(Sender: TObject);
    procedure WebBrowser1DownloadComplete(Sender: TObject);
    procedure PostStrKeyPress(Sender: TObject; var Key: Char);
    procedure PostEditClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  myitem:Olevariant;

implementation

{$R *.dfm}
procedure TForm1.HandPostButClick(Sender: TObject);

begin
  WebBrowser1.Navigate('http://www.ip138.com:8080/search.asp');
 end;
procedure TForm1.FormCreate(Sender: TObject);
begin
webbrowser1.Navigate('http://www.ip138.com:8080/search.asp');
end;

procedure TForm1.PostEditMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
    i:integer;
begin
    myitem := WebBrowser1.Document;
       for i := 0 to myitem.all.length - 1 do
begin
  if myitem.all.item(i).tagName = 'INPUT' then
begin
   if Uppercase(myitem.all.item(i).name)='MOBILE' then
         myitem.all.item(i).value:=PostStr.Text;
end;
end;

    for i := 0 to myitem.all.length - 1 do
     begin
        if myitem.all.item(i).tagName = 'INPUT' then
        begin
               if Uppercase(myitem.all.item(i).type)='SUBMIT' then
           begin
             if Uppercase(myitem.all.item(i).value)='查 询' then  myitem.all.item(i).click;  // 点击提交键
           end;
        end;
    end;
end;

procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);

begin
    myitem := WebBrowser1.Document;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   s,IPSTR , IPSTR1 : String;
   iPos,i : Integer;
begin
 edit1.Text:=poststr.Text;
 IPSTR:=myitem.all.item(1).outerhtml;

 iPos := Pos('卡号归属地',IPSTR);
 if iPos <> 0 then
      edit2.Text:= Copy(IPSTR,iPos+53,4);
      edit6.Text:= Copy(IPSTR,iPos+63,4);

 iPos := Pos('卡&nbsp;类&nbsp;型',IPSTR);
 if iPos <> 0 then
      edit3.Text:= Copy(IPSTR,iPos+61,9);

 iPos := Pos('区 号',IPSTR);
 if iPos <> 0 then
      zhang.Text:=Copy(IPSTR,iPos+40,4);
    if  zhang.Text[4]  in ['0'..'9'] then
    edit4.text:=zhang.text
    else
    begin
    s:=zhang.Text;
    setlength(s,3);
    edit4.text:=s;
    end;
 iPos := Pos('邮 编',IPSTR);
 if iPos <> 0 then
      edit5.Text:= Copy(IPSTR,iPos+40,6);
end;

procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
begin
postedit.Enabled:=true;
end;

procedure TForm1.PostStrKeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['0'..'9',#8]) then
begin
application.MessageBox('手机号只能是数字','提示',64);
key:=#0;
poststr.SetFocus;
end;
end;

procedure TForm1.PostEditClick(Sender: TObject);
begin
button1.Enabled:=true;
end;

end.

posted @ 2009-01-05 23:12 小叶子 阅读(729) | 评论 (1)编辑 收藏
隐藏 ( 显示 )


一:
screen.cursor:=crnone;  (screen.cuisor:=crdefault;)

二:
showcursor(false);   (  showcursor(ture);  )


隐藏 显示 是一一对应的,交错使用无效,并且只在程序内部隐藏.
实事上他只隐藏,还有存在的,只要鼠标对准你指定的焦点后点击,还是可以的,只是没有显示出鼠标的样子而已,如果你要做到去掉鼠标,只能做钩子来截获鼠标消息了
posted @ 2009-01-04 01:24 小叶子 阅读(1518) | 评论 (0)编辑 收藏

源码下载:
http://www.cnitblog.com/Files/shuyezi122/webbrowser做网页浏览.rar

下面是所有代码

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ImgList, OleCtrls, SHDocVw, StdCtrls, ExtCtrls,
  ToolWin;

type
  TForm1 = class(TForm)
    ToolBar1: TToolBar;
    Panel1: TPanel;
    Edit1: TEdit;
    Button9: TButton;
    WebBrowser1: TWebBrowser;
    ImageList1: TImageList;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton4: TToolButton;
    ToolButton5: TToolButton;
    ToolButton6: TToolButton;
    ToolButton8: TToolButton;
    ToolButton9: TToolButton;
    ToolButton3: TToolButton;
    Label1: TLabel;
    StatusBar1: TStatusBar;
    Timer1: TTimer;
    procedure ToolButton8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure ToolButton1Click(Sender: TObject);
    procedure ToolButton4Click(Sender: TObject);
    procedure ToolButton5Click(Sender: TObject);
    procedure ToolButton6Click(Sender: TObject);
    procedure WebBrowser1DownloadBegin(Sender: TObject);
    procedure WebBrowser1DownloadComplete(Sender: TObject);
    procedure WebBrowser1NewWindow2(Sender: TObject; var ppDisp: IDispatch;
      var Cancel: WordBool);
    procedure WebBrowser1StatusTextChange(Sender: TObject;
      const Text: WideString);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ToolButton2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  nurl:string;

implementation

{$R *.dfm}

procedure TForm1.ToolButton8Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
webbrowser1.Navigate(edit1.Text);\\打开网页
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
try
webbrowser1.GoBack;\\返回
except
showmessage('没有记录了');
exit;
end;
end;

procedure TForm1.ToolButton4Click(Sender: TObject);
begin
webbrowser1.Stop;\\停止
end;

procedure TForm1.ToolButton5Click(Sender: TObject);
begin
webbrowser1.Refresh;\\刷新
end;

procedure TForm1.ToolButton6Click(Sender: TObject);
begin
webbrowser1.GoHome;
end;

procedure TForm1.WebBrowser1DownloadBegin(Sender: TObject);
begin
statusbar1.Panels[0].Text:='正在打开'+edit1.Text;
end;

procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
begin
statusbar1.Panels[0].Text:='完毕';
end;

procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
begin
Cancel:=true;
WebBrowser1.Navigate (nurl);\\在你自己应用程序中打开网页超连接,nurl来自下面
end;

procedure TForm1.WebBrowser1StatusTextChange(Sender: TObject;
  const Text: WideString);
begin
nurl:=text;\\得到连接地址,给上面函数用
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
statusbar1.Panels[1].Text:=timetostr(now);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
statusbar1.Panels[2].Text:='元旦快乐';\\今天元旦,送自己的礼物
end;

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
try
webbrowser1.GoForward ;
except
 showmessage('没有记录了');
exit;
end;
end;
end.







得到webbrowser内网页源码
var
myitem:Olevariant;
begin
    myitem := WebBrowser1.Document;
    memo1.Lines.add(myitem.all.item(0).outerhtml);
end;
 

posted @ 2008-12-31 23:29 小叶子 阅读(735) | 评论 (0)编辑 收藏
ping是发送很小的包去你指定的地址,返回快
加上:edit,button,listbox,idicmpclient四个


双击button
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
idicmpclient.Host:=edit1.Text;
for i:=0 to 3 do
begin
idicmpclient.Ping;
application.ProcessMessages;
 sleep(1000);
end;
end;

在idicmpclient事件的onreply中加代码
procedure TForm1.idicmpclientReply(ASender: TComponent;
  const AReplyStatus: TReplyStatus);
var
stime:string;
begin
stime:='=';
listbox1.Items.Add(format('Reply from   %s:  time=%dms   TTL=%d ms',
[aReplyStatus.fromipaddress,\\ping的IP地址
 aReplyStatus.sequenceid div 100,\\整除100是为了显示MS(毫秒)
 aReplyStatus.timetolive,\\生命周期
 stime,
 aReplyStatus.msroundtriptime]));\\不知道是什么
end;

 AReplyStatus: TReplyStatus
有好心人请帮我讲一下它的方法属性
在这里先说谢谢了

posted @ 2008-12-31 19:48 小叶子 阅读(4418) | 评论 (1)编辑 收藏

如 果你运行一个非常耗时的循环,那么在这个循环结束前,你的程序可能不会响应任何事件,你按按钮没有反应,程序设置无法绘制窗体,看上去就如同死了一样,这 有时不是很方便,例如于终止循环的机会都没有了。这时你就可以在循环中加上这么一句,每次程序运行到这句时,程序就会让系统响应一下消息,从而使你有机会 按按钮,窗体有机会绘制


i:integer;
b:boolean;
procedure TForm1.Button1Click(Sender: TObject);

begin
b:=true;
for i:=0 to maxint do
begin
if b then
form1.Caption:='数字'+inttostr(i)
  else
  exit;
  Application.ProcessMessages
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
b:=false;
end;

posted @ 2008-12-30 21:01 小叶子 阅读(800) | 评论 (0)编辑 收藏
掩码编辑框(MaskEdit)是一种特殊的编辑框。使用它可以设计出许多复杂的输入格式。在选用MaskEdit之后,需要为它设计一个输入格式。方法如下:

  首先在窗体上将MaskEdit选中,在对象查看器(Object Inspector)中找到EditMask属性,双击它,弹出一个如下图所示的对话框。

  对话框左上角的Input Mask编辑框用于输入掩码格式。掩码格式可以分为三部分,每个部分之间用分号“;”分开,如“!90:90:90:;1;_ ”。下面解释各输入格式符的意义:

  1. 输入格式的第一部分是掩码本身,也就是数据输入格式。在这一部分用一些特殊的格式符来表示应输入的字符类型及格式,如“!l0A9:C>ll<”这样一串输入格式掩码。常用的MaskEdit输入格式符有:

格式符意义

L和l L表示该位置只能填一个字母。l和L一样,但允许不填。

A和a A表示该位置只能填一个字母或数字。a和A一样,但允许不填。

C和c C表示该位置可以填任意字符。c和C一样,但允许不填。

0和9 0表示该位置只能填一个数字。9和0一样,但允许不填。

<和> <格式符表示随后的字母均以小写的形式显示,直到遇到一个>格式字符或<>格式符。>格式符则和<正好相反。

<> 表示不作大小写转换,以输入时的形式为准。

\ 表示该格式符之后的那个掩码格式符将作为数据中的普通字符对待。当用户想在数据中放进一个普通字符,而不希望作为掩码格式符被解析时,就可以在这个字符前放一个\符号。如\A,\\等等。

# 表示该位置可以填一个数字或正负号,或什么都不填。

! !格式符只能放在掩码格式符的第一个字符处,表示输入的数据的前导空格将被去除(即读取EditMask控件值的时候将没有这些空格),没有!则数据后的空格将被去除。

;和/ 标准的分隔符,可作为数据的一部分。其中/在显示时为‘-’而非‘/’。

  2. 在输入格式中的第二部分只有0和1两种选择。如为1,则掩码中的非用户输入数据和标准分隔符等其它各种字符会作为数据的一部分保存;为0则不保存。

  3. 输入格式的第三部分用于表示数据中的空位用哪个字符代替显示。

  在有了上述知识后,现在来设计一个例子。例如要输入一个汽车牌号如CA-300019 。该数据前两位为字母且为大写,第三位为一个系统分隔符号,后6位为数字。可以这样设计掩码格式:
  !>LL/000000;1;_
  掩码的第二部分取为1表示系统分隔符‘-’也将作为数据保存。第三部分的“_”表示在掩码编辑框中为空时,用“_”来表示空位。我们也可以用空格来标识空位。
  又如一个邮编如PO-100083,其中PO表示邮政,是每个邮政编码中都有的前缀,可以这样设计掩码格式:
  !PO/000000;1;_
  在掩码设计对话框的右侧是Sample Masks,这里有系统预设的常用的掩码格式,如电话号码(Phone)、日期(Date)等。我们可以选择一个,然后进行必要的调整。对话框左下部是一个Test Input栏,我们可以在这里输入字符,以检测输入格式是否令人满意。 

首先我想问一下,不会是写错了吧,好像是TMaskEdit对象吧   
    
  EditMask主要是用来设置掩码(Mask)的指定子符,换言之,我们可以利用MaskEdit对象所提供的EditMask属性强迫使用者输入合法的字符   
    
  你只要点击EditMask属性右面的按钮就可以打开Input   Mask   Editor对话框,你可以在右面的Sample   Masks中点击来选择一个预设的格式,也可以在Input   Mask中直接输入掩码子符串,左下角的输入框是用来对你在左上脚定义的掩码格式做输入测试的,它也是最终显示在MaskEdit1中的格式。   
    
  至于掩码的格式子符有许多种,在这里一一例举不太可能,我只能给你几个常用的   
  #   其所对应的位置只能输入数字或正负号,但不一定要输入   
  9   其所对应的位置只能输入数字,但不一定要输入   
  0   其所对应的位置只能输入数字,一定要输入   
  c   其所对应的位置只能输入子符,但不一定要输入   
  C   其所对应的位置只能输入子符,一定要输入   
  !   假如!子符出现在TMaskEdit掩码子符中,则"!"子符前的空格不会被存为数据   
  /   通常用来分隔日期中的年月日等数据   
  _   _处自动插入一个空格   
  ;   用来分隔各个部分   
    
  比如你所说的   
  2002-12-5   就可以写为   !0000/00/0;1;   或   0000/00/0;1;     
  其中最后一个1表示掩码子符会保存在数据中,比如说‘/',如果为0就表示不保存   
  ;用来分隔各部分,0表示必须输入一个数字,/表示分隔符'-',

posted @ 2008-12-29 18:39 小叶子 阅读(2751) | 评论 (0)编辑 收藏

百般求解,无人帮我做一个发邮件的程序
今天迫不得以把indy9.0换成了10.2.3版本

所以邮件发送程序成功发送了,下边把代码发给大家

procedure TForm1.Button1Click(Sender: TObject);
var
MgeSend:tidmessage;
begin

{邮箱主体}
mgesend:=tidmessage.create(nil);
MgeSend.Recipients.EMailAddresses:=edit1.Text;\\发送到的邮箱
MgeSend.from.Text:='shuyezi122@163.com';\\来自哪里
mgesend.Subject:=edit2.Text;\\主题
mgesend.Body.Assign(memo1.Lines);  \\邮箱内容
{下面是发送部分}

idsmtp1.host:='smtp.163.com';
idsmtp1.Username:='shuyezi122@163.com';\\帐号   
idsmtp1.Password:='*******';\\密码
try
idsmtp1.Connect;
except
showmessage('无法连接');
exit;
end;
try
idsmtp1.Send(MgeSend);
finally
idsmtp1.Disconnect;
end;
end;
{结束}

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

posted @ 2008-12-25 20:13 小叶子 阅读(158) | 评论 (0)编辑 收藏
得到数据库字段值的两种方法:(name是字段名称)
 1. Edit1.Text:=Table1.FieldByname('name').AsString;

2. Edit1.Text:=Table1name.AsString;这个要在fileds里加上字段名字

同样用于改字段名
1.  Table1.FieldByName('name').DisplayLabel:='国家名';

2.  Table1name.DisplayLabel:='国家名';           这两个都要在fileds里加上字段名字
posted @ 2008-12-20 02:46 小叶子 阅读(108) | 评论 (0)编辑 收藏
仅列出标题
共11页: First 3 4 5 6 7 8 9 10 11 

笔记和文章,可能抄袭,只为学习,请原谅