WinInet 利用プログラミング(2)
InternetReadFile に於いて、読み込みバッファの適正サイズを取得する InternetQueryDataAvailable の返す値って何か根拠あるんですかね…… 単にサーバーがこういう値を使って通信してるという事だろうか? それとも対象のファイルの大きさに比例しているのかも……ファイルサイズが割り切れるような数で最小限のループになるように、とか。
もののサンプルには、読み込みループの中に入れて毎回取得しているのがあって謎。これって読み込む度に変わるものなのか~? 単なる大ボケ算譜と言う感じもします。
っていうか、そもそも、バッファを大きく確保しても不味い事は無いと思うんですけど……
同様に、確保する時に+1する必要は無いみたいですし。ヌル文字ついてこない(途中だとつける意味もない)。それに Delphi の場合だと読み込んだサイズでCopy()するだけなんでヌルついてようがいまいが関係ない。もし付いていたとしても、InternetReadFile が返す読み込んだ長さでコピーするので問題ないわけ。
あとメモリの置き場所もローカルだったりグローバルだったり。どっちが正しいんだよぅ。
もののサンプルには、読み込みループの中に入れて毎回取得しているのがあって謎。これって読み込む度に変わるものなのか~? 単なる大ボケ算譜と言う感じもします。
っていうか、そもそも、バッファを大きく確保しても不味い事は無いと思うんですけど……
同様に、確保する時に+1する必要は無いみたいですし。ヌル文字ついてこない(途中だとつける意味もない)。それに Delphi の場合だと読み込んだサイズでCopy()するだけなんでヌルついてようがいまいが関係ない。もし付いていたとしても、InternetReadFile が返す読み込んだ長さでコピーするので問題ないわけ。
あとメモリの置き場所もローカルだったりグローバルだったり。どっちが正しいんだよぅ。
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;
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;
アホみたいに単純(笑)
で 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アーカイブから補完するとちゃんと動いた。
問題なさそうに見えるなぁ。とりあえず、会話データを全部チェックしなおすか……
大儀な作業だ……
アップロードしてあるnarアーカイブから補完するとちゃんと動いた。
問題なさそうに見えるなぁ。とりあえず、会話データを全部チェックしなおすか……
大儀な作業だ……