鴛鴦呼蝉庵日乗
  2002.10.14 Shell
 パソコンに長時間向き合っていたので、少々息抜きにVCLを整えました。伊藤 隆志さんのShell Component Library 0.96をインストールしました。同名の衝突を避けて、伊藤さんの名前のItoを頭付けてインストール。無事使用できました。本当はβ版のD7用のがあれば、一番いいのですが。もっとも正式版が完成すると一番うれしいですね。あとは、FermionさんのSHFOPのD7用が出れば、必要なVCLがそろいます。ShellFileOparationは自作で処理すればいいのですが、Pchar の処理が面倒ですから、楽な方をとります。null処理はいつも面倒なので、回避したくなります。それをがまんすれば、後はAPI処理のみです。それで思い切って、回避してばかりいられませんので、APIで処理しました。
極めて、普通のコードです。まだ通してないのと、例外処理をしていないので、細かく設定するのが残っています。

Flist:TString;
with SHFileOpStruct do
begin
 Wnd := Application.Handle;
 wFunc := FO_COPY;
 pFrom := PChar(Flist);
 pTo := PChar(ToPath);
 fFlags := FOF_ALLOWUNDO;
 hNameMappings := nil;
 lpszProgressTitle:= nil;
end;
SHFileOperation(SHFileOpStruct);


 これ、Flistの最後が#0+#0になるというのは忘れやすいですね。空白の入ったファイルも引用符でくくるのですが、それを無視したらどうなるか、#20と#0の区別はできるはずですが。iniファイルの場合は、無理でしたね。だから、#で囲むことにしました。バイナリやテキストで処理すればいいのですが、iniファイルの方が便利なのでそのまま使っています。registryを使うのはためらいますね。やっぱり、そういう思想に入るのはどうもよくない。スタンドアロンで開発できるのが、ソフトの一番の方法。でも、開発しても、一つ困るのが、InstallSeildがWindowsInstallerに対応したこと。機種別にしないと、ファイルが大きくなってしまいます。ブロードバンド時代だから、それはいいとしても、でも、1.44M以内に抑えたいのが心情。

 正規表現で、
 <[^>+]>
 を発見したら、htmlからテキストは楽になりました。ただ、改行を含むとできませんから、改行コードをあり得ない文字に入れて、それで#13を削除。改行コード文字を#13#10にして終了。ただ、#13のみの場合と、#13と#10の場合、これが面倒です。多くの処理は#13#10を処理するのですが、それを怠ると、読み込みに失敗しますから、面倒です。
 正規表現でこれだけの処理を今までは、いろいろな人のコードを使いながら処理してました。もちろん、JAVAscriptの削除ができません。CSSも難しいですね。

txtList := TStringList.Create;
try
txtList.Text:=RichEdit1.Text;
dmystr:='';
Str := '';

RichEdit1.Lines.Clear;
for i := 0 to txtList.Count-1 do
begin
Str := Str + txtList.Strings[i];
c1 := pos('<!--',str);
c2 := pos('-->',str);
if (c1>0) and (c2>0) then Delete(str,c1,c2-c1+3);
p1 := Pos('<', Str);
p2 := Pos('>', Str);
while (p1 > 0) and (p2 > 0) do
begin
if p1 > p2 then Delete(Str, 1, p2)
else
begin
Tag := UpperCase( Copy(Str, p1 + 1, p2 - p1 - 1) );

if (Tag = 'BR') or (Tag = 'P') or (Tag = '/P') or (Tag = '/TR') or (Tag = '/TD')
or (Tag = 'LI') or (Tag='/DL') or (Tag='OL') or (copy(Tag,1,2)='/H')
or (Tag='/BLOCKQUOTE') or (Tag='/TITLE') or (Tag='/ADDRESS')
or (Tag='FN') or (Tag='/CENTER') or (copy(Tag,1,2)='HR')
then
begin
RichEdit1.Lines.Add( Copy(Str, 1, p1 - 1) );

Delete(Str, 1, p2);
if (Tag='LI') then str:='・'+str;

if (Tag='OL') then str:='#.'+str;
if (copy(Tag,1,2)='HR') then str:=StringOfChar('-',60)+#13+#10+str;
end else
begin
Delete(Str, p1, p2 - p1 + 1);
end;// if tag
if Tag='PRE' then ispre:=true;
if Tag='/PRE' then ispre:=false;
end;//if p1 > p2
p1 := Pos('<', Str);
p2 := Pos('>', Str);
end;//while
RichEdit1.Lines.Add(str);
if RichEdit1.Lines.Count>0 then
begin
if pos('&lt;',RichEdit1.Text)>0 then RichEdit1.Text:=StringReplace(RichEdit1.Text,'&lt;' ,'<' ,[rfReplaceAll,rfIgnoreCase]);
if pos('&gt;',RichEdit1.Text)>0 then RichEdit1.Text:=StringReplace(RichEdit1.Text,'&gt;' ,'>' ,[rfReplaceAll,rfIgnoreCase]);
if pos('&amp;',RichEdit1.Text)>0 then RichEdit1.Text:=StringReplace(RichEdit1.Text,'&amp;' ,'&' ,[rfReplaceAll,rfIgnoreCase]);
if pos('&quot;',RichEdit1.Text)>0 then RichEdit1.Text:=StringReplace(RichEdit1.Text,'&quot;' ,'"' ,[rfReplaceAll,rfIgnoreCase]);
if pos('&reg;',RichEdit1.Text)>0 then RichEdit1.Text:=StringReplace(RichEdit1.Text,'&reg;' ,'(R)',[rfReplaceAll,rfIgnoreCase]);
if pos('&copy;',RichEdit1.Text)>0 then RichEdit1.Text:=StringReplace(RichEdit1.Text,'&copy;' ,'(C)',[rfReplaceAll,rfIgnoreCase]);
if pos('&nbsp;',RichEdit1.Text)>0 then RichEdit1.Text:=StringReplace(RichEdit1.Text,'&nbsp;' ,' ',[rfReplaceAll,rfIgnoreCase]);

RichEdit1.Lines.Insert(1, '');
end;
finally
txtList.Free;
end;//try txtlist

 楽な方がいいというのはどこでも同じですが、ブラウザを使うときも、IEやNCのエンジンを使うことになります。NCは全てにインストールされているわけではないので、IEのエンジンを使いますが、それを回避して独自の解釈をするとjavaやjavascriptの処理を回避して最低限の処理が可能となります。むしろテキストベースにして処理したほうがいいのかもしれません。高速で内容処理をできますから。画像を中心に扱う必要がなければ、いいのですから。

 それにしても、bmRegexpコンポで、エラーがでます。EAccessViolation なのですが、ポインタの所で発生しますが、空のフォームにTawkとTgrepを貼り付けて実行しても、エラーが出ます。多分、システムでどこかで衝突があるのでしょうけど、回避できなくて困っています。grepはできなくても、Tawkはどうしても必要ですから。グローバル関数の方を使用すれば回避できるかも知れませんが。

 あと知りたいのが、拡張RichEditの処理。OLE対応の2.0を使えれば拡張機能が使えます。DLLに依存するので、どうするか考えててしまいます。それと、ttfontのグリフの取得。それを画像処理して、いけば、印刷でも速度を速められる。もっとも、ttfよりもopenfontになるから、その対応は同じでしょうか。

 fontでは、やっぱりきれいなのが、ヒラギノですね。ただ、ヒラギノ明朝体と游築五号仮名が一つのフォントになるとバランスもいいので、使いやすいのですが、なぜないのか不思議です。リョービはその点、小仮名を入れているので、そのまま使ってもきれいに出力できます。ただ、文字の強さからいったら、秀英明朝ですね。「新潮文庫の100冊」に入っていました。迫力がいいですね。読みやすいから。ヒラギノか秀英か、どちらがいいかですね。個人的にはヒラギノの美しさを取りますが。秀英の端正さも捨てがたい。ウェイトは違いますが、雰囲気を比較してみてください。

ヒラギノ明朝 (©大日本スクリーン)
リョービの明朝、新かな (©リョービ)
秀英明朝、いわゆる築地系ですね。

前へ 目次へ 次へ
かくかい.net 日乗目次 かくかいNEWS 作者から 開発情報
Copyright 黒川孝広 © 2002,Kurokawa Takahiro All rights reserved.