お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





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

"TEditorでNifty URL その2"




こんばんは〜 H-Tritonです。
キーワードを忘れたため、再掲いたします。m(__)m
仕様を一部見直しました。

TEditor上でハイライト表示された Nifty URL等(Web URL、Mail Addressを
含む)に対するマウス操作の処理です。

なぞった時:
(1)マウスカーソルを手の形に変る
(2)StatusBarにNifty URL等を示する。
(3)Nifty URLの場合はその情報(URL文字列、フォーラム名、会議室番号、
   発言番号)をレコード型に格納する。

クリックした時:
(4)Nifty URLの場合はその情報をメッセージボックスに表示する。
   (実際のアプリでは、そのURLへジャンプするなどの処理に置き換わる)
(5)Web URLの場合は、Web Browzerを起動してそこへ飛んでゆく。
(6)Mail Addressの場合は、その宛先でメーラーを起動する。


// uses ShellAPIを追加してね。

type
  TNifUrlInfo = record
    UrlStr: string;    // Nifty URLの文字列
    ForumName: string; // Niftyのフォーラム名
    RoomNo: string;    // Niftyの会議室番号
    MsgNo: string;     // Niftyの会議室発言番号
  end;

var
  NifUrlInfo: TNifUrlInfo;

// マウスでなぞった時の処理
// ここで呼び出している関数 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: TNifUrlInfo;
begin
  Editor1.Cursor:= crDefault;
  uInfo.UrlStr:= '';
  uInfo.ForumName:= '';
  uInfo.MsgNo:= '';
  uInfo.RoomNo:= '';
  P.x:= X;
  P.y:= Y;
  with Editor1 do
  begin
    StrInfo:= StrInfoFromPos(P);
    if (StrInfo.Line < 0) or (StrInfo.Line > Lines.Count - 1) then
    begin
      StatusBar1.SimpleText:= '';
      Exit;
    end else
    if TokenFromPos(P) in [toUrl, toMail] then
    begin
      Cursor:= crHandPoint;
      StatusBar1.SimpleText:= TokenStringFromPos(P);
    end else
    begin
      i:= StrInfo.CharIndex;
      S:= Lines[StrInfo.Line];
      if not (S[i+1] in NifChar) then
      begin
        NifUrlInfo:= uInfo;
        StatusBar1.SimpleText:= NifUrlInfo.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.ForumName:= 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.RoomNo:= Parser.TokenString;
                 NifUrl:= True;
               end;
            8: if IsStrNumeric(Parser.TokenString) then
               begin
                 uInfo.MsgNo:= Parser.TokenString;
                 NifUrl:= True;
               end;
          end;
          if NifUrl then
          begin
            uInfo.UrlStr:= uInfo.UrlStr + Parser.TokenString;
            if j = 8 then
            begin
              Cursor:= crHandPoint;
              NifUrlInfo:= uInfo;
              Break;
            end else Inc(j);
          end;  
          Parser.NextToken;
        end;
      finally
        Parser.Free;
      end;
      StatusBar1.SimpleText:= uInfo.UrlStr;
    end;
  end;
end;

// クリックした時
procedure TForm1.Editor1Click(Sender: TObject);
var
  S: string;
  C: Char;
begin
  C:= Editor1.TokenFromCaret;
  if C in [toMail, toUrl] then
  begin
    if C = toMail then S:= 'mailto:' + Editor1.TokenStringFromCaret else
    if C = toUrl then S:= Editor1.TokenStringFromCaret;
    ShellExecute(Handle, 'OPEN', PChar(S), '', '', SW_SHOW);
  end else
   if NifUrlInfo.UrlStr <> '' then
     ShowMessage('Forum Name : ' + NifUrlInfo.ForumName + #13 +
                 'Room Name  : ' + NifUrlInfo.RoomNo + #13 +
                 'Message No : ' + NifUrlInfo.MsgNo);
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