|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"URLからHTMLソースを取得する"
TITLE:URLからHTMLソースを取得する
Edit に書き込んだURLを元に、TClientSocket を使って 80番
ポートに接続、HTMLソースを取得して RichEdit に表示するように
作ってみました。
ソケットの試用の過程で作ったので、あまり自信がありません。
適宜フォローをいただけると助かります。m(_ _)m
【使用するコンポーネントを貼り付ける】
「新規アプリケーション」に
TClientSocket、(ClientSocket1)
TEdit、 (Edit1)
TRichEdit、 (RichEdit1)
を1個ずつ置きます。
【受信データを入れるクラスを用意する】
メインフォームの private メンバに
private
FData: TMemoryStream;
を追加します。FData の作成と破棄をメインフォームの OnCreate、
OnDestroy イベントハンドラでそれぞれ行います。
procedure TForm1.FormCreate(Sender: TObject);
begin
FData := TMemoryStream.Create;
// オブジェクトインスペクタで設定してもOK
ClientSocket1.Port := 80;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FData.Free;
end;
【サーバー名とドキュメントパスを取得してサーバに接続する】
Editコンポーネントの OnKeyDown イベントハンドラを作成し、
リターンキーが押されたら、Edit1.Text からURLを取得して
ソケットの接続を行うようにします。
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
S: string;
I: Integer;
begin
if Key <> VK_RETURN then Exit;
// 既に接続されていたら、一旦接続を切る
ClientSocket1.OnConnect := nil;
ClientSocket1.OnDisconnect := nil;
ClientSocket1.Active := FALSE;
// Edit1.Text に入っているURLから
// サーバー名を ClientSocket1.Host に
// ドキュメントのパスを Caption に
// それぞれ分取します。
S := Edit1.Text;
// 最初の 'http://' を取る
if StrLIComp(PChar(S), 'http://', 7) = 0 then
Delete(S, 1, 7);
// サーバー名とドキュメントパスの境目を探す
I := Pos('/', S);
// サーバー名しか入ってない場合
if I = 0 then
begin
ClientSocket1.Host := S;
Caption := '/';
end
else // サーバー名とドキュメントパスを分離する
begin
ClientSocket1.Host := Copy(S, 1, I - 1);
Caption := Copy(S, I, Length(S) - I + 1);
end;
// ソケットを接続する
ClientSocket1.OnConnect := ClientSocket1Connect;
ClientSocket1.OnDisconnect := ClientSocket1Disconnect;
ClientSocket1.Active := TRUE;
end;
【サーバーに接続したら、ドキュメントを要求するコマンドを送信】
ClientSocket1.OnConnect イベントハンドラを作成し、
サーバーに接続したら、受信データを入れる FData を初期化し、
欲しいドキュメントの要求をサーバーに送信するようにします。
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// 受信データを入れる FData を初期化
FData.Clear;
RichEdit1.Clear;
RichEdit1.Lines.Add(ClientSocket1.Host);
RichEdit1.Lines.Add(Caption);
// サーバーにドキュメントの送信を要求する
Socket.SendText('GET ' + Caption + #13#10);
end;
【サーバーから受信したデータを FData にためる】
ClientSocket1.OnRead イベントハンドラを作成し、
受信したデータは FData にためるようにします。
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
S: string;
begin
// 受信データを string 型で受け取り、
S := Socket.ReceiveText;
// FData に追加保存する
FData.Write(PChar(S)^, Length(S));
// 受信状況を表示しています
Caption := IntToStr(FData.Size);
end;
【接続が切れたら受信したデータを RichEdit で表示する】
ClientSocket1.OnDisconnect イベントハンドラを作成し、
接続終了時に取得したデータ(FData)を RichEdit1 にロードします。
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// FData を RichEdit1 にロードする
FData.Position := 0;
RichEdit1.Lines.LoadFromStream(FData);
// メインフォームのキャプションを戻す
Caption := Application.Title;
end;
以上です。
2001/05/09、河邦 正(GCC02240@nifty.com)
(http://homepage2.nifty.com/kht0000/、NIFTY外へ私作のComponentの
公開用)
- FDELPHI MES(16):玉石混淆みんなで作るSample蔵【見本蓄積】 01/05/11 -
Original document by 河邦 正 氏 ID:(GCC02240)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|