今宵は月が高い。注意されたし。 -7ページ目

WinInet 利用プログラミング(2)

InternetReadFile に於いて、読み込みバッファの適正サイズを取得する InternetQueryDataAvailable の返す値って何か根拠あるんですかね…… 単にサーバーがこういう値を使って通信してるという事だろうか? それとも対象のファイルの大きさに比例しているのかも……ファイルサイズが割り切れるような数で最小限のループになるように、とか。

もののサンプルには、読み込みループの中に入れて毎回取得しているのがあって謎。これって読み込む度に変わるものなのか~? 単なる大ボケ算譜と言う感じもします。
っていうか、そもそも、バッファを大きく確保しても不味い事は無いと思うんですけど……
同様に、確保する時に+1する必要は無いみたいですし。ヌル文字ついてこない(途中だとつける意味もない)。それに Delphi の場合だと読み込んだサイズでCopy()するだけなんでヌルついてようがいまいが関係ない。もし付いていたとしても、InternetReadFile が返す読み込んだ長さでコピーするので問題ないわけ。

あとメモリの置き場所もローカルだったりグローバルだったり。どっちが正しいんだよぅ。

WinInetネタ 修正

昨日のコードは試行錯誤の手垢がそのままだったので、ちょっとだけ見栄えよく。まぁ大して変わらんけどね…… うへらうへら。

WinInet 利用プログラミング(1)

大したコードじゃないんですが、WinINet ユニットを使ってインターネット上からファイルを読み込む関数。

function LoadFromInternet( URL:String; Document:TStrings ): Boolean;
const
  BufSize = 1000;
var
  hINet: HINTERNET;
  hURL : HINTERNET;
  iRead: Cardinal;
  pBuf : PChar;
  bRslt: Boolean;
  Wrk : String;
begin
  Result := False;
  Document.Clear;

  hINet := wininet.InternetOpen( gcSenderString, INTERNET_OPEN_TYPE_PRECONFIG, NIL, NIL, 0 );
  if not Assigned(hINet) then Exit;
  
  hURL := wininet.InternetOpenUrl( hINet, PChar(URL), NIL, 0, INTERNET_FLAG_RELOAD, 0 );
  if not Assigned(hURL) then
  begin
    wininet.InternetCloseHandle( hINet );
    Exit;
  end;


  try
    iRead := BufSize;
    pBuf := StrAlloc( iRead );
    Wrk := '';
    repeat
      bRslt := InternetReadFile( hURL, pBuf, BufSize, iRead );
      if bRslt and (iRead > 0) then
        Wrk := Wrk +Copy( pBuf, 1, iRead );
    until (bRslt = False) or (iRead = 0);
    if (Wrk <> '') then Document.Text := Wrk;

  finally  
    StrDispose( pBuf ) ;
    wininet.InternetCloseHandle( hURL );
    wininet.InternetCloseHandle( hINet );
  end;

  Result := (Document.Text <> '')
end;

TFountain

TFountain とは HEditor のパーサークラス。パース処理を本体から分離して、テキストの色分けを HEditor わ参照する事なしに実現します。

HEditor の目玉でもある範囲着色。ブラケットと言うのですが、このブラケットは「ある文字列からある文字列の間」を着色します。(正確に言えば着色の指示を本体に渡します)

ですが、ソースコードのコメントなどでは「行末まで」と言うケースも多い。これはいくつかの既成 Fountain が「コメント用」という別処理を与えているのですが、自作の Fountain の度に実装しなきゃいけない。面倒だ。

でブラケットで行末まで処理するようにしてみました。結構斬新だと思うのだけどなぁ(^-^;)


procedure TMYParser.BracketProc; {override}
var
  RBS: String; {RightBracketString}
begin
  RBS := FFountain.Brackets[FBracketIndex].RightBracket;
  
  if (RBS = '') then
  begin
    FToken := toBracket;
    FDrawBracketIndex := FBracketIndex;
    FBracketIndex := NormalBracketIndex; // -1

    while not (FP^ in [#0,#10,#13]) do
    begin
      if (FP^ in LeadBytes) then Inc(FP);
      Inc(FP);
    end;
    
  end else
    inherited BracketProc;

end;


アホみたいに単純(笑)

伺か/ゴースト製作日記(1) - 補足II

バルーンはやっぱりファイルが足りなくなっていたため。まぁそんなところですかね。
アップロードしてあるnarアーカイブから補完するとちゃんと動いた。

問題なさそうに見えるなぁ。とりあえず、会話データを全部チェックしなおすか……
大儀な作業だ……