お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"TEditorで Nifty URL その2"



こんばんは〜 H-Tritonです。
TEditor上でハイライト表示された URL(Mail Address, Nifty URLを含む)
に対するマウス操作の処理です。

なぞった時:
(1)マウスカーソルを手の形に変る
(2)URLが持つ情報(URLの種類、URL文字列、フォーラム名、会議室番号、
   会議室発言番号)をレコード型に格納する。

クリックした時:
(3)レコード型が保持する情報をメッセージボックスに表示する。
   (実際のアプリでは、そのURLへジャンプするなどの処理に置き換わる)

type
  TUrlKind = (ukMail, ukWeb, ukNif, ukNone);
//  (URLの種類=メールアドレス, Web URL, Nifty URL, URL機能なし)
  TUrlInfo = record
    UrlKind: TUrlKind;    // URLの種類
    UrlStr: string;       // URL文字列
    NifForumName: string; // Niftyのフォーラム名
    NifRoomNo: string;    // Niftyの会議室番号
    NifMsgNo: string;     // Niftyの会議室発言番号
  end;

// マウスでなぞった時の処理
// ここで呼び出している関数 IsStrAlphaUpCaseとIsStrNumericは
// nifty:FDELPHI/MES/16/965と共用しています。
// コードはそちらにあります。
procedure TForm1.Editor1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
const
  NifChar = ['0'..'9','A'..'Z', 'a'..'z', ':', '/'];
var
  P: TPoint;
  S: string;
  i, j: Integer;
  StrInfo: TEditorStrInfo;
  Parser: TEditorParser;
  NifUrl: Boolean;
  uInfo: TUrlInfo;
begin
  Editor1.Cursor:= crDefault;
  uInfo.UrlKind:= ukNone;
  uInfo.UrlStr:= '';
  uInfo.NifForumName:= '';
  uInfo.NifMsgNo:= '';
  uInfo.NifRoomNo:= '';
  P.x:= X;
  P.y:= Y;
  with Editor1 do if TokenFromPos(P) in [toUrl, toMail] then
  begin
    Cursor:= crHandPoint;
    if TokenFromPos(P) = toUrl then
      uInfo.UrlKind:= ukWeb else uInfo.UrlKind:= ukMail;
      uInfo.UrlStr:= TokenStringFromPos(P);
      UrlInfo:= uInfo;
  end else
  begin
    StrInfo:= StrInfoFromPos(P);
    if (StrInfo.Line < 0) or (StrInfo.Line > Lines.Count - 1) then
    begin
      UrlInfo:= uInfo;
      StatusBar1.SimpleText:= uInfo.UrlStr;
      Exit;
    end;
    i:= StrInfo.CharIndex;
    S:= Lines[StrInfo.Line];
    if not (S[i+1] in NifChar) then
    begin
      UrlInfo:= uInfo;
      StatusBar1.SimpleText:= UrlInfo.UrlStr;
      Exit;
    end;
    repeat
      if Copy(S, i, 6) = 'nifty:' then Break;
      Dec(i);
    until i = -1;
    if i = -1 then Exit;
    J:= -1;
    Parser:= TEditorParser.Create(S);
    try
      while Parser.Token <> toEOF do
      begin
        NifUrl:= False;
        if Parser.SourcePos = i-1 then j:= 0;
        case j of
          0: if Parser.TokenString = 'nifty' then NifUrl:= True;
          1: if Parser.TokenString = ':' then NifUrl:= True;
          2: if IsStrAlphaUpCase(Parser.TokenString) then
             begin
               uInfo.NifForumName:= Parser.TokenString;
               NifUrl:= True;
             end;
          3, 5, 7: if Parser.TokenString = '/' then NifUrl:= True;
          4: if Parser.TokenString = 'MES' then NifUrl:= True;
          6: if IsStrNumeric(Parser.TokenString) then
             begin
               uInfo.NifRoomNo:= Parser.TokenString;
               NifUrl:= True;
             end;
          8: if IsStrNumeric(Parser.TokenString) then
             begin
               uInfo.NifMsgNo:= Parser.TokenString;
               NifUrl:= True;
             end;
        end;
        if NifUrl then
        begin
          uInfo.UrlStr:= uInfo.UrlStr + Parser.TokenString;
          if j = 8 then
          begin
            Cursor:= crHandPoint;
            uInfo.UrlKind:= ukNif;
            UrlInfo:= uInfo;
            Break;
          end else Inc(j);
        end;
        Parser.NextToken;
      end;
    finally
      Parser.Free;
    end;
  end;
  StatusBar1.SimpleText:= uInfo.UrlStr;
end;

// クリックした時
procedure TForm1.Editor1Click(Sender: TObject);
var
  Kind: string;
begin
  case UrlInfo.UrlKind of
    ukMail: Kind:= 'Mail';
    ukWeb : Kind:= 'Web URL';
    ukNif : Kind:= 'Nifty URL';
    ukNone: Exit;
  end;
  ShowMessage('Kind : ' + Kind + #13 +
              'URL  : ' + UrlInfo.UrlStr + #13 +
              'Forum Name : ' + UrlInfo.NifForumName + #13 +
              'Room Name  : ' + UrlInfo.NifRoomNo + #13 +
              'Message No : ' + UrlInfo.NifMsgNo);
end;

                  http://member.nifty.ne.jp/h-triton/
          ○ 快速・大容量テキストエディタ「えるの〜と」進化中 ○
          Avalon's Friendly Crew #80008  H-Triton (^^) since 1996

Original document by H-Triton        氏 ID:(QZV11422)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum