OSDN Git Service

1.52.1.658
[gikonavigoeson/gikonavi.git] / HTMLCreate.pas
index ab56fb4..baf9a40 100644 (file)
@@ -15,7 +15,7 @@ uses
        {HttpApp,} YofUtils, {URLMon,} BoardGroup, {gzip,} {Dolib,}
        {bmRegExp,} AbonUnit,   MojuUtils, Setting,
        ExternalBoardManager, ExternalBoardPlugInMain{,}
-       {Sort,} ,GikoBayesian, HintWindow;
+       {Sort,} ,GikoBayesian, HintWindow, ActiveX;
 
 type
 
@@ -25,6 +25,22 @@ type
                FKey : string;
        end;
 
+       TBufferedWebBrowser = class(TStringList)
+       private
+               //! \8f\91\82«\8d\9e\82Þ\83u\83\89\83E\83U
+               FBrowser: TWebBrowser;
+               //! \89½\8ds\82Ü\82Å\82½\82ß\82é\82©\82Ì\83T\83C\83Y
+               FBuffSize: Integer;
+               //! \83u\83\89\83E\83U\82ÌIHTMLDocument2\83C\83\93\83^\83t\83F\81[\83X\82ð\95Û\8e\9d\82·\82é open\82©\82çclose\82Ì\8aÔ\82Å
+               FBrowserDoc: Variant;
+       public
+               constructor Create(Browser: TWebBrowser; BuffSize: Integer);
+               destructor Destory;
+               procedure Open;
+               procedure Close;
+               procedure Flush;
+               function Add(const S: string): Integer; override;
+       end;
        THTMLCreate = class(TObject)
        private
                { Private \90é\8c¾ }
@@ -38,10 +54,10 @@ type
                constructor Create;
 
                function AddBeProfileLink(AID : string; ANum: Integer):string ;
-               procedure CreateUsePluginHTML(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
-               procedure CreateUseSKINHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList);
-               procedure CreateUseCSSHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
-               procedure CreateDefaultHTML (doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
+               procedure CreateUsePluginHTML(html:TBufferedWebBrowser; ThreadItem: TThreadItem; var sTitle: string);
+               procedure CreateUseSKINHTML(html:TBufferedWebBrowser; ThreadItem: TThreadItem; ReadList: TStringList);
+               procedure CreateUseCSSHTML(html:TBufferedWebBrowser; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
+               procedure CreateDefaultHTML (html:TBufferedWebBrowser; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
                procedure ConvertResAnchor(PRes: PResRec);
                procedure separateNumber(var st: String; var et: String; const Text, Separator: String);
                function checkComma(const s : String; var j : Integer; var No  : String) : boolean;
@@ -54,7 +70,7 @@ type
                function SkinedRes(const skin: string; PRes: PResRec; const No: string): string;
                procedure ConvRes( PRes : PResRec; PResLink : PResLinkRec; DatToHTML: boolean = false); overload;
                function ConvRes(const Body, Bbs, Key,  ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue : string; DatToHTML: boolean = false): string; overload;
-               procedure CreateHTML2(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
+               procedure CreateHTML2(Browser: TWebBrowser; ThreadItem: TThreadItem; var sTitle: string);
                procedure CreateHTML3(var html: TStringList; ThreadItem: TThreadItem; var sTitle: string);
                //\83\8c\83X\83|\83b\83v\83A\83b\83v\82Ì\8dì\90¬
                procedure SetResPopupText(Hint :TResPopup; threadItem: TThreadItem; StNum, ToNum: Integer; Title, First: Boolean);
@@ -280,10 +296,10 @@ begin
                                if pos = nil then
                                        b := Length(REF_MARK[idx2])
                                else
-                                       b := pos - pp + 1;
+                                       b := pos - (pp  + idx) + 1;
 
                                len := Length(PRes.FBody);
-                               SetLength(PRes.FBody, len + idx + b);
+                               SetLength(PRes.FBody, len + idx + b );
                                Move(pp^, PRes.FBody[len + 1], idx + b);
                                Delete(s, 1, idx + b);
                        end else begin
@@ -778,7 +794,7 @@ begin
 end;
 
 //Plugin\82ð\97\98\97p\82·\82éBoard\82Ì\83X\83\8c\83b\83h\82ÌHTML\82ð\8dì\90¬\82µ\82Ädoc\82É\8f\91\82«\8d\9e\82Þ
-procedure THTMLCreate.CreateUsePluginHTML(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
+procedure THTMLCreate.CreateUsePluginHTML(html:TBufferedWebBrowser; ThreadItem: TThreadItem; var sTitle: string);
 var
        i: integer;
        NewReceiveNo: Integer;
@@ -790,85 +806,80 @@ begin
        NewReceiveNo    := ThreadItem.NewReceive;
        // \83t\83H\83\93\83g\82â\83T\83C\83Y\82Ì\90Ý\92è
        UserOptionalStyle := GikoSys.SetUserOptionalStyle;
-       try
-               doc.open;
-               // \83w\83b\83_
-               doc.Write( boardPlugIn.GetHeader( DWORD( threadItem ),
-                       '<style type="text/css">body {' + UserOptionalStyle + '}</style>' ));
-               doc.Write('<p id="idSearch"></p>');
-
-               for i := 0 to threadItem.Count - 1 do begin
-                       // 1 \82Í\95K\82¸\95\\8e¦
-                       if i <> 0 then begin
-                               // \95\\8e¦\94Í\88Í\82ð\8cÀ\92è
-                               case GikoSys.ResRange of
-                               Ord( grrKoko ):
-                                       if ThreadItem.Kokomade > (i + 1) then
-                                               Continue;
-                               Ord( grrNew ):
-                                       if NewReceiveNo > (i + 1) then
-                                               Continue;
-                               10..65535:
-                                       if (threadItem.Count - i) > GikoSys.ResRange then
-                                               Continue;
-                               end;
+       html.add(boardPlugIn.GetHeader( DWORD( threadItem ),
+               '<style type="text/css">body {' + UserOptionalStyle + '}</style>' ));
+       html.Add('<p id="idSearch"></p>');
+       html.Flush;
+       
+       for i := 0 to threadItem.Count - 1 do begin
+               // 1 \82Í\95K\82¸\95\\8e¦
+               if i <> 0 then begin
+                       // \95\\8e¦\94Í\88Í\82ð\8cÀ\92è
+                       case GikoSys.ResRange of
+                       Ord( grrKoko ):
+                               if ThreadItem.Kokomade > (i + 1) then
+                                       Continue;
+                       Ord( grrNew ):
+                               if NewReceiveNo > (i + 1) then
+                                       Continue;
+                       10..65535:
+                               if (threadItem.Count - i) > GikoSys.ResRange then
+                                       Continue;
                        end;
+               end;
 
-                       // \90V\92\85\83}\81[\83N
-                       if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
-                               try
-                                       if GikoSys.Setting.UseSkin then begin
-                                               if FileExists( GikoSys.GetSkinNewmarkFileName ) then
-                                                       doc.Write( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ))
-                                               else
-                                                       doc.Write( '<a name="new"></a>');
-                                       end else if GikoSys.Setting.UseCSS then begin
-                                               doc.Write('<a name="new"></a><div class="new">\90V\92\85\83\8c\83X <span class="newdate">' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</span></div>');
-                                       end else begin
-                                               doc.Write('</dl>');
-                                               doc.Write('<a name="new"></a>');
-                                               doc.Write('<table width="100%" bgcolor="#3333CC" cellpadding="0" cellspacing="1"><tr><td align="center" bgcolor="#6666FF" valign="middle"><font size="-1" color="#ffffff"><b>\90V\92\85\83\8c\83X ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</b></font></td></tr></table>');
-                                               doc.Write('<dl>');
-                                       end;
-                               except
-                                       doc.Write( '<a name="new"></a>');
+               // \90V\92\85\83}\81[\83N
+               if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
+                       try
+                               if GikoSys.Setting.UseSkin then begin
+                                       if FileExists( GikoSys.GetSkinNewmarkFileName ) then
+                                               html.Add( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ))
+                                       else
+                                               html.Add( '<a name="new"></a>');
+                               end else if GikoSys.Setting.UseCSS then begin
+                                       html.Add('<a name="new"></a><div class="new">\90V\92\85\83\8c\83X <span class="newdate">' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</span></div>');
+                               end else begin
+                                       html.Add('</dl>');
+                                       html.Add('<a name="new"></a>');
+                                       html.Add('<table width="100%" bgcolor="#3333CC" cellpadding="0" cellspacing="1"><tr><td align="center" bgcolor="#6666FF" valign="middle"><font size="-1" color="#ffffff"><b>\90V\92\85\83\8c\83X ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</b></font></td></tr></table>');
+                                       html.Add('<dl>');
                                end;
+                       except
+                               html.Add( '<a name="new"></a>');
                        end;
+               end;
 
-                       // \83\8c\83X
-                       doc.Write( boardPlugIn.GetRes( DWORD( threadItem ), i + 1 ));
+               // \83\8c\83X
+               html.Add( boardPlugIn.GetRes( DWORD( threadItem ), i + 1 ));
 
-                       if ThreadItem.Kokomade = (i + 1) then begin
-                               // \82±\82±\82Ü\82Å\93Ç\82ñ\82¾
-                               try
-                                       if GikoSys.Setting.UseSkin then begin
-                                               if FileExists( GikoSys.GetSkinBookmarkFileName ) then
-                                                       doc.Write( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 )
-                                               else
-                                                       doc.Write( '<a name="koko"></a>');
-                                       end else if GikoSys.Setting.UseCSS then begin
-                                               doc.Write('<a name="koko"></a><div class="koko">\83R\83R\82Ü\82Å\93Ç\82ñ\82¾</div>');
-                                       end else begin
-                                               doc.Write('</dl>');
-                                               doc.Write('<a name="koko"></a><table width="100%" bgcolor="#55AA55" cellpadding="0" cellspacing="1"><tr><td align="center" bgcolor="#77CC77" valign="middle"><font size="-1" color="#ffffff"><b>\83R\83R\82Ü\82Å\93Ç\82ñ\82¾</b></font></td></tr></table>');
-                                               doc.Write('<dl>');
-                                       end;
-                               except
-                                       doc.Write( '<a name="koko"></a>');
+               if ThreadItem.Kokomade = (i + 1) then begin
+                       // \82±\82±\82Ü\82Å\93Ç\82ñ\82¾
+                       try
+                               if GikoSys.Setting.UseSkin then begin
+                                       if FileExists( GikoSys.GetSkinBookmarkFileName ) then
+                                               html.Add( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ))
+                                       else
+                                               html.Add( '<a name="koko"></a>');
+                               end else if GikoSys.Setting.UseCSS then begin
+                                       html.Add('<a name="koko"></a><div class="koko">\83R\83R\82Ü\82Å\93Ç\82ñ\82¾</div>');
+                               end else begin
+                                       html.Add('</dl>');
+                                       html.Add('<a name="koko"></a><table width="100%" bgcolor="#55AA55" cellpadding="0" cellspacing="1"><tr><td align="center" bgcolor="#77CC77" valign="middle"><font size="-1" color="#ffffff"><b>\83R\83R\82Ü\82Å\93Ç\82ñ\82¾</b></font></td></tr></table>');
+                                       html.Add('<dl>');
                                end;
+                       except
+                               html.Add('<a name="koko"></a>');
                        end;
                end;
+       end;
 
 
-               // \83X\83L\83\93(\83t\83b\83^)
-               doc.Write( boardPlugIn.GetFooter( DWORD( threadItem ), '<a name="bottom"></a>' ));
-       finally
-               doc.Close;
-       end;
+       // \83X\83L\83\93(\83t\83b\83^)
+       html.Add( boardPlugIn.GetFooter( DWORD( threadItem ), '<a name="bottom"></a>' ));
 end;
 
 
-procedure THTMLCreate.CreateUseSKINHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList);
+procedure THTMLCreate.CreateUseSKINHTML(html:TBufferedWebBrowser; ThreadItem: TThreadItem; ReadList: TStringList);
 const
        KOKO_TAG = '<a name="koko"></a>';
        NEW_TAG = '<a name="new"></a>';
@@ -889,99 +900,91 @@ begin
        ThreadName := ChangeFileExt(ThreadItem.FileName, '');
        ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
        ResLink.FKey := ThreadName;
-       //,
-       doc.open;
+       // \83X\83L\83\93\82Ì\90Ý\92è
        try
-               doc.charset := 'Shift_JIS';
-
-               // \83X\83L\83\93\82Ì\90Ý\92è
-               try
-                       SkinHeader := LoadFromSkin( GikoSys.GetSkinHeaderFileName, ThreadItem, ThreadItem.Size);
-                       if Length( UserOptionalStyle ) > 0 then
-                               SkinHeader := CustomStringReplace( SkinHeader, '</head>',
-                                       '<style type="text/css">body {' + UserOptionalStyle + '}</style></head>');
-                       doc.Write( SkinHeader );
-               except
-               end;
-
-               SkinNewRes := LoadFromSkin( GikoSys.GetSkinNewResFileName, ThreadItem, ThreadItem.Size);
-               SkinRes := LoadFromSkin( GikoSys.GetSkinResFileName, ThreadItem, ThreadItem.Size );
-
-               doc.Write('<p id="idSearch"></p>'#13#10'<a name="top"></a>');
-
-               for i := 0 to ReadList.Count - 1 do begin
-                       // 1 \82Í\95K\82¸\95\\8e¦
-                       if i <> 0 then begin
-                               // \95\\8e¦\94Í\88Í\82ð\8cÀ\92è
-                               case GikoSys.ResRange of
-                               Ord( grrKoko ):
-                                       if ThreadItem.Kokomade > (i + 1) then
-                                               Continue;
-                               Ord( grrNew ):
-                                       if NewReceiveNo > (i + 1) then
-                                               Continue;
-                               10..65535:
-                                       if (threadItem.Count - i) > GikoSys.ResRange then
-                                               Continue;
-                               end;
-                       end;
+               SkinHeader := LoadFromSkin( GikoSys.GetSkinHeaderFileName, ThreadItem, ThreadItem.Size);
+               if Length( UserOptionalStyle ) > 0 then
+                       SkinHeader := CustomStringReplace( SkinHeader, '</head>',
+                               '<style type="text/css">body {' + UserOptionalStyle + '}</style></head>');
+               html.Add( SkinHeader );
+       except
+       end;
 
-                       // \90V\92\85\83}\81[\83N
-                       if (NewReceiveNo = i + 1) or ((NewReceiveNo = 0) and (i = 0)) then begin
-                               if FileExists( GikoSys.GetSkinNewmarkFileName ) then
-                                       doc.Write( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ))
-                               else
-                                       doc.Write( NEW_TAG );
+       SkinNewRes := LoadFromSkin( GikoSys.GetSkinNewResFileName, ThreadItem, ThreadItem.Size);
+       SkinRes := LoadFromSkin( GikoSys.GetSkinResFileName, ThreadItem, ThreadItem.Size );
+
+       html.Add('<p id="idSearch"></p>'#13#10'<a name="top"></a>');
+       html.Flush;
+
+       for i := 0 to ReadList.Count - 1 do begin
+               // 1 \82Í\95K\82¸\95\\8e¦
+               if i <> 0 then begin
+                       // \95\\8e¦\94Í\88Í\82ð\8cÀ\92è
+                       case GikoSys.ResRange of
+                       Ord( grrKoko ):
+                               if ThreadItem.Kokomade > (i + 1) then
+                                       Continue;
+                       Ord( grrNew ):
+                               if NewReceiveNo > (i + 1) then
+                                       Continue;
+                       10..65535:
+                               if (threadItem.Count - i) > GikoSys.ResRange then
+                                       Continue;
                        end;
+               end;
 
-                       if (Trim(ReadList[i]) <> '') then begin
-                               DivideStrLine(ReadList[i], @Res);
-                               AddAnchorTag(@Res);
-                               ConvRes(@Res, @ResLink);
-                               Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
+               // \90V\92\85\83}\81[\83N
+               if (NewReceiveNo = i + 1) or ((NewReceiveNo = 0) and (i = 0)) then begin
+                       if FileExists( GikoSys.GetSkinNewmarkFileName ) then
+                               html.Add( LoadFromSkin( GikoSys.GetSkinNewmarkFileName, ThreadItem, ThreadItem.Size ))
+                       else
+                               html.Add( NEW_TAG );
+               end;
 
-                               if NewReceiveNo <= (i + 1) then
-                                       // \90V\92\85\83\8c\83X
-                                       doc.Write(SkinedRes(SkinNewRes, @Res, IntToStr(i + 1)))
-                               else
-                                       // \92Ê\8fí\82Ì\83\8c\83X
-                                       doc.Write(SkinedRes(SkinRes, @Res, IntToStr(i + 1)));
-                       end;
+               if (Trim(ReadList[i]) <> '') then begin
+                       DivideStrLine(ReadList[i], @Res);
+                       AddAnchorTag(@Res);
+                       ConvRes(@Res, @ResLink);
+                       Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
 
-                       if ThreadItem.Kokomade = (i + 1) then begin
-                               // \82±\82±\82Ü\82Å\93Ç\82ñ\82¾
-                               if FileExists( GikoSys.GetSkinBookmarkFileName ) then
-                                       doc.Write( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ) + #13#10 )
-                               else
-                                       doc.Write( KOKO_TAG );
-                       end;
+                       if NewReceiveNo <= (i + 1) then
+                               // \90V\92\85\83\8c\83X
+                               html.Add(SkinedRes(SkinNewRes, @Res, IntToStr(i + 1)))
+                       else
+                               // \92Ê\8fí\82Ì\83\8c\83X
+                               html.Add(SkinedRes(SkinRes, @Res, IntToStr(i + 1)));
                end;
 
-               doc.Write('<a name="bottom"></a>');
-               // \83X\83L\83\93(\83t\83b\83^)
-               doc.Write( LoadFromSkin( GikoSys.GetSkinFooterFileName, ThreadItem, ThreadItem.Size ) );
-       finally
-               doc.close;
+               if ThreadItem.Kokomade = (i + 1) then begin
+                       // \82±\82±\82Ü\82Å\93Ç\82ñ\82¾
+                       if FileExists( GikoSys.GetSkinBookmarkFileName ) then
+                               html.Add( LoadFromSkin( GikoSys.GetSkinBookmarkFileName, ThreadItem, ThreadItem.Size ))
+                       else
+                               html.Add( KOKO_TAG );
+               end;
        end;
+
+       html.Add('<a name="bottom"></a>');
+       // \83X\83L\83\93(\83t\83b\83^)
+       html.Add( LoadFromSkin( GikoSys.GetSkinFooterFileName, ThreadItem, ThreadItem.Size ) );
 end;
 
-procedure THTMLCreate.CreateUseCSSHTML(doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
+procedure THTMLCreate.CreateUseCSSHTML(html:TBufferedWebBrowser; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
 const
        FORMAT_NOMAIL  = '<a name="%s"></a><div class="header"><span class="no"><a href="menu:%s">%s</a></span>'
-                                       + '<span class="name_label">\96¼\91O\81F</span> <span class="name"><b>%s</b></span>'
-                                       + '<span class="date_label">\93\8a\8de\93ú\81F</span> <span class="date">%s</span></div>'
-                                       + '<div class="mes">%s</div>'#13#10;
+                                       + '<span class="name_label"> \96¼\91O\81</span> <span class="name"><b>%s</b></span>'
+                                       + '<span class="date_label"> \93\8a\8de\93ú\81F</span> <span class="date">%s</span></div>'
+                                       + '<div class="mes">%s</div>';
 
        FORMAT_SHOWMAIL = '<a name="%s"></a><div class="header"><span class="no"><a href="menu:%s">%s</a></span>'
                                        + '<span class="name_label"> \96¼\91O\81F </span><a class="name_mail" href="mailto:%s">'
                                        + '<b>%s</b></a><span class="mail"> [%s]</span><span class="date_label"> \93\8a\8de\93ú\81F</span>'
-                                       + '<span class="date"> %s</span></div><div class="mes">%s</div>'#13#10;
+                                       + '<span class="date"> %s</span></div><div class="mes">%s</div>';
 
        FORMAT_NOSHOW = '<a name="%s"></a><div class="header"><span class="no"><a href="menu:%s">%s</a></span>'
                                        + '<span class="name_label"> \96¼\91O\81F </span><a class="name_mail" href="mailto:%s">'
                                        + '<b>%s</b></a><span class="date_label"> \93\8a\8de\93ú\81F</span><span class="date"> %s</span></div>'
-                                       + '<div class="mes">%s</div>'#13#10;
-
+                                       + '<div class="mes">%s</div>';
 var
        i: integer;
        No: string;
@@ -992,101 +995,25 @@ var
        ThreadName :String;
        ResLink :TResLinkRec;
 begin
-       doc.open;
-       try
-               doc.charset := 'Shift_JIS';
-               NewReceiveNo := ThreadItem.NewReceive;
-               ThreadName := ChangeFileExt(ThreadItem.FileName, '');
-               ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
-               ResLink.FKey := ThreadName;
-               // \83t\83H\83\93\83g\82â\83T\83C\83Y\82Ì\90Ý\92è
-               UserOptionalStyle := GikoSys.SetUserOptionalStyle;
-               CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
-               if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
-                       //CSS\8eg\97p
-                       doc.Write('<html><head>');
-                       doc.Write('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">');
-                       doc.Write('<title>' + sTitle + '</title>');
-                       doc.Write('<link rel="stylesheet" href="'+CSSFileName+'" type="text/css">');
-                       if Length( UserOptionalStyle ) > 0 then
-                               doc.Write('<style type="text/css">body {' + UserOptionalStyle + '}</style>');
-                       doc.Write('</head>'#13#10'<body>');
-                       doc.Write('<a name="top"></a>'#13#10'<p id="idSearch"></p>');
-                       doc.Write('<div class="title">' + sTitle + '</div>');
-                       for i := 0 to ReadList.Count - 1 do begin
-                               // 1 \82Í\95K\82¸\95\\8e¦
-                               if i <> 0 then begin
-                                       // \95\\8e¦\94Í\88Í\82ð\8cÀ\92è
-                                       case GikoSys.ResRange of
-                                       Ord( grrKoko ):
-                                               if ThreadItem.Kokomade > (i + 1) then
-                                                       Continue;
-                                       Ord( grrNew ):
-                                               if NewReceiveNo > (i + 1) then
-                                                       Continue;
-                                       10..65535:
-                                               if (threadItem.Count - i) > GikoSys.ResRange then
-                                                       Continue;
-                                       end;
-                               end;
-
-                               if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
-                                       doc.Write('<a name="new"></a><div class="new">\90V\92\85\83\8c\83X <span class="newdate">' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</span></div>');
-                               end;
-
-                               if (Trim(ReadList[i]) <> '') then begin
-                                       No := IntToStr(i + 1);
-                                       DivideStrLine(ReadList[i], @Res);
-                                       AddAnchorTag(@Res);
-                                       ConvRes(@Res, @ResLink);
-                                       Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
-                                       if Res.FMailTo = '' then
-                                               doc.Write(Format(FORMAT_NOMAIL, [No, No, No, Res.FName, Res.FDateTime, Res.FBody]))
-                                       else if GikoSys.Setting.ShowMail then
-                                               doc.Write(Format(FORMAT_SHOWMAIL, [No, No, No, Res.FMailTo, Res.FName, Res.FMailTo, Res.FDateTime, Res.FBody]))
-                                       else
-                                               doc.Write(Format(FORMAT_NOSHOW, [No, No, No, Res.FMailTo, Res.FName, Res.FDateTime, Res.FBody]));
-                               end;
-
-                               if ThreadItem.Kokomade = (i + 1) then begin
-                                       doc.Write('<a name="koko"></a><div class="koko">\83R\83R\82Ü\82Å\93Ç\82ñ\82¾</div>');
-                               end;
-
-                       end;
-
-                       doc.Write('<a name="bottom"></a>');
-                       doc.Write('<a name="last"></a>');
-                       doc.Write('</body></html>');
-               end;
-       finally
-               doc.Close;
-       end;
-end;
-
-procedure THTMLCreate.CreateDefaultHTML (doc: Variant; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
-var
-       i: integer;
-       No: string;
-       NewReceiveNo: Integer;
-       Res: TResRec;
-       ThreadName: String;
-       ResLink : TResLinkRec;
-begin
-       doc.open;
-       try
-               doc.charset := 'Shift_JIS';
-               NewReceiveNo := ThreadItem.NewReceive;
-               ThreadName := ChangeFileExt(ThreadItem.FileName, '');
-               ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
-               ResLink.FKey := ThreadName;
-               doc.Write('<html><head>'#13#10);
-               doc.Write('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">'#13#10);
-               doc.Write('<title>' + sTitle + '</title></head>'#13#10);
-               doc.Write('<body TEXT="#000000" BGCOLOR="#EFEFEF" link="#0000FF" alink="#FF0000" vlink="#660099">'#13#10);
-               doc.Write('<a name="top"></a>'#13#10);
-               doc.Write('<font size=+1 color="#FF0000">' + sTitle + '</font>'#13#10);
-               doc.Write('<dl>'#13#10);
-               doc.Write('<p id="idSearch"></p>'#13#10);
+       NewReceiveNo := ThreadItem.NewReceive;
+       ThreadName := ChangeFileExt(ThreadItem.FileName, '');
+       ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
+       ResLink.FKey := ThreadName;
+       // \83t\83H\83\93\83g\82â\83T\83C\83Y\82Ì\90Ý\92è
+       UserOptionalStyle := GikoSys.SetUserOptionalStyle;
+       CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
+       if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
+               //CSS\8eg\97p
+               html.Add('<html><head>');
+               html.Add('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">');
+               html.Add('<title>' + sTitle + '</title>');
+               html.Add('<link rel="stylesheet" href="'+CSSFileName+'" type="text/css">');
+               if Length( UserOptionalStyle ) > 0 then
+                       html.Add('<style type="text/css">body {' + UserOptionalStyle + '}</style>');
+               html.Add('</head>'#13#10'<body>');
+               html.Add('<a name="top"></a>'#13#10'<p id="idSearch"></p>');
+               html.Add('<div class="title">' + sTitle + '</div>');
+               html.Flush;
                for i := 0 to ReadList.Count - 1 do begin
                        // 1 \82Í\95K\82¸\95\\8e¦
                        if i <> 0 then begin
@@ -1105,10 +1032,7 @@ begin
                        end;
 
                        if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
-                               doc.Write('</dl>');
-                               doc.Write('<a name="new"></a>');
-                               doc.Write('<table width="100%" bgcolor="#3333CC" cellpadding="0" cellspacing="1"><tr><td align="center" bgcolor="#6666FF" valign="middle"><font size="-1" color="#ffffff"><b>\90V\92\85\83\8c\83X ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</b></font></td></tr></table>');
-                               doc.Write('<dl>');
+                               html.Add('<a name="new"></a><div class="new">\90V\92\85\83\8c\83X <span class="newdate">' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</span></div>');
                        end;
 
                        if (Trim(ReadList[i]) <> '') then begin
@@ -1118,30 +1042,100 @@ begin
                                ConvRes(@Res, @ResLink);
                                Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
                                if Res.FMailTo = '' then
-                                       doc.Write('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> \96¼\91O\81F<font color="forestgreen"><b> ' + Res.FName + ' </b></font> \93\8a\8de\93ú\81F <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10)
+                                       html.Add(Format(FORMAT_NOMAIL, [No, No, No, Res.FName, Res.FDateTime, Res.FBody]))
                                else if GikoSys.Setting.ShowMail then
-                                       doc.Write('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> \96¼\91O\81F<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a> [' + Res.FMailTo + '] \93\8a\8de\93ú\81F <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10)
+                                       html.Add(Format(FORMAT_SHOWMAIL, [No, No, No, Res.FMailTo, Res.FName, Res.FMailTo, Res.FDateTime, Res.FBody]))
                                else
-                                       doc.Write('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> \96¼\91O\81F<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a> \93\8a\8de\93ú\81F <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10);
+                                       html.Add(Format(FORMAT_NOSHOW, [No, No, No, Res.FMailTo, Res.FName, Res.FDateTime, Res.FBody]));
                        end;
+
                        if ThreadItem.Kokomade = (i + 1) then begin
-                               doc.Write('</dl>');
-                               doc.Write('<a name="koko"></a><table width="100%" bgcolor="#55AA55" cellpadding="0" cellspacing="1"><tr><td align="center" bgcolor="#77CC77" valign="middle"><font size="-1" color="#ffffff"><b>\83R\83R\82Ü\82Å\93Ç\82ñ\82¾</b></font></td></tr></table>');
-                               doc.Write('<dl>');
+                               html.Add('<a name="koko"></a><div class="koko">\83R\83R\82Ü\82Å\93Ç\82ñ\82¾</div>');
                        end;
+
                end;
-               doc.Write('</dl>'#13#10'<a name="bottom"></a>'#13#10'</body></html>');
-       finally
-               doc.Close;
+
+               html.Add('<a name="bottom"></a>');
+               html.Add('<a name="last"></a>');
+               html.Add('</body></html>');
        end;
 end;
 
-procedure THTMLCreate.CreateHTML2(doc: Variant; ThreadItem: TThreadItem; var sTitle: string);
+procedure THTMLCreate.CreateDefaultHTML (html:TBufferedWebBrowser; ThreadItem: TThreadItem; ReadList: TStringList; sTitle: string );
+var
+       i: integer;
+       No: string;
+       NewReceiveNo: Integer;
+       Res: TResRec;
+       ThreadName: String;
+       ResLink : TResLinkRec;
+begin
+       NewReceiveNo := ThreadItem.NewReceive;
+       ThreadName := ChangeFileExt(ThreadItem.FileName, '');
+       ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
+       ResLink.FKey := ThreadName;
+       html.Add('<html><head>');
+       html.Add('<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">');
+       html.Add('<title>' + sTitle + '</title></head>');
+       html.Add('<body TEXT="#000000" BGCOLOR="#EFEFEF" link="#0000FF" alink="#FF0000" vlink="#660099">');
+       html.Add('<a name="top"></a>');
+       html.Add('<font size=+1 color="#FF0000">' + sTitle + '</font>');
+       html.Add('<dl>');
+       html.Add('<p id="idSearch"></p>');
+       html.Flush;
+       for i := 0 to ReadList.Count - 1 do begin
+               // 1 \82Í\95K\82¸\95\\8e¦
+               if i <> 0 then begin
+                       // \95\\8e¦\94Í\88Í\82ð\8cÀ\92è
+                       case GikoSys.ResRange of
+                       Ord( grrKoko ):
+                               if ThreadItem.Kokomade > (i + 1) then
+                                       Continue;
+                       Ord( grrNew ):
+                               if NewReceiveNo > (i + 1) then
+                                       Continue;
+                       10..65535:
+                               if (threadItem.Count - i) > GikoSys.ResRange then
+                                       Continue;
+                       end;
+               end;
+
+               if (NewReceiveNo = (i + 1)) or ((NewReceiveNo = 0) and (i = 0)) then begin
+                       html.Add('</dl>');
+                       html.Add('<a name="new"></a>');
+                       html.Add('<table width="100%" bgcolor="#3333CC" cellpadding="0" cellspacing="1"><tr><td align="center" bgcolor="#6666FF" valign="middle"><font size="-1" color="#ffffff"><b>\90V\92\85\83\8c\83X ' + FormatDateTime('yyyy/mm/dd(ddd) hh:mm', ThreadItem.RoundDate) + '</b></font></td></tr></table>');
+                       html.Add('<dl>');
+               end;
+
+               if (Trim(ReadList[i]) <> '') then begin
+                       No := IntToStr(i + 1);
+                       DivideStrLine(ReadList[i], @Res);
+                       AddAnchorTag(@Res);
+                       ConvRes(@Res, @ResLink);
+                       Res.FDateTime := AddBeProfileLink(Res.FDateTime, i + 1);
+                       if Res.FMailTo = '' then
+                               html.Add('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> \96¼\91O\81F<font color="forestgreen"><b> ' + Res.FName + ' </b></font> \93\8a\8de\93ú\81F <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10)
+                       else if GikoSys.Setting.ShowMail then
+                               html.Add('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> \96¼\91O\81F<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a> [' + Res.FMailTo + '] \93\8a\8de\93ú\81F <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10)
+                       else
+                               html.Add('<a name="' + No + '"></a><dt><a href="menu:' + No + '">' + No + '</a> \96¼\91O\81F<a href="mailto:' + Res.FMailTo + '"><b> ' + Res.FName + ' </B></a> \93\8a\8de\93ú\81F <span class="date">' + Res.FDateTime+ '</span><br><dd>' + Res.Fbody + ' <br><br><br>'#13#10);
+               end;
+               if ThreadItem.Kokomade = (i + 1) then begin
+                       html.Add('</dl>');
+                       html.Add('<a name="koko"></a><table width="100%" bgcolor="#55AA55" cellpadding="0" cellspacing="1"><tr><td align="center" bgcolor="#77CC77" valign="middle"><font size="-1" color="#ffffff"><b>\83R\83R\82Ü\82Å\93Ç\82ñ\82¾</b></font></td></tr></table>');
+                       html.Add('<dl>');
+               end;
+       end;
+       html.Add('</dl>'#13#10'<a name="bottom"></a>'#13#10'</body></html>');
+end;
+
+procedure THTMLCreate.CreateHTML2(Browser: TWebBrowser; ThreadItem: TThreadItem; var sTitle: string);
 var
        ReadList: TStringList;
        CSSFileName: string;
        FileName: string;
        Res: TResRec;
+       body : TBufferedWebBrowser;
 {$IFDEF DEBUG}
        st, rt: Cardinal;
 {$ENDIF}
@@ -1151,45 +1145,51 @@ begin
        st := GetTickCount;
 {$ENDIF}
        if ThreadItem <> nil then begin
-               if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
-                       CreateUsePluginHTML(doc, ThreadItem, sTitle);
-               end else begin
-                       ShortDayNames[1] := '\93ú';               ShortDayNames[2] := '\8c\8e';
-                       ShortDayNames[3] := '\89Î';               ShortDayNames[4] := '\90\85';
-                       ShortDayNames[5] := '\96Ø';               ShortDayNames[6] := '\8bà';
-                       ShortDayNames[7] := '\93y';
+               body := TBufferedWebBrowser.Create(Browser, 100);
+               try
+                       body.Open;
+                       if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
+                               CreateUsePluginHTML(body, ThreadItem, sTitle);
+                       end else begin
+                               ShortDayNames[1] := '\93ú';               ShortDayNames[2] := '\8c\8e';
+                               ShortDayNames[3] := '\89Î';               ShortDayNames[4] := '\90\85';
+                               ShortDayNames[5] := '\96Ø';               ShortDayNames[6] := '\8bà';
+                               ShortDayNames[7] := '\93y';
 
-                       ReadList := TStringList.Create;
-                       try
-                               if ThreadItem.IsLogFile then begin
-                                       ReadList.BeginUpdate;
-                                       FileName := ThreadItem.GetThreadFileName;
-                                       ReadList.LoadFromFile(FileName);
-                                       ReadList.EndUpdate;
-                                       GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG'));
-                                       GikoSys.FAbon.Execute(ReadList);                //       \82 \82Ú\81`\82ñ\82µ\82Ä
-                                       GikoSys.FSelectResFilter.Execute(ReadList); //\83\8c\83X\82Ì\83t\83B\83\8b\83^\83\8a\83\93\83O\82ð\82·\82é
-                                       if ThreadItem.Title = '' then begin
-                                               DivideStrLine(ReadList[0], @Res);
-                                               sTitle := Res.FTitle;
-                                       end else
-                                               sTitle := ThreadItem.Title
-                               end else begin
-                                       sTitle := CustomStringReplace(ThreadItem.Title, '\81\97\81M', ',');
-                               end;
-                               // \83t\83H\83\93\83g\82â\83T\83C\83Y\82Ì\90Ý\92è
-                               CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
-                               if GikoSys.Setting.UseSkin then begin
-                                       CreateUseSKINHTML(doc, ThreadItem, ReadList);
-                               end else if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
-                                       CreateUseCSSHTML(doc, ThreadItem, ReadList, sTitle);
-                               end else begin
-                                       CreateDefaultHTML(doc, ThreadItem, ReadList, sTitle);
+                               ReadList := TStringList.Create;
+                               try
+                                       if ThreadItem.IsLogFile then begin
+                                               ReadList.BeginUpdate;
+                                               FileName := ThreadItem.GetThreadFileName;
+                                               ReadList.LoadFromFile(FileName);
+                                               ReadList.EndUpdate;
+                                               GikoSys.FAbon.IndividualAbon(ReadList, ChangeFileExt(FileName,'.NG'));
+                                               GikoSys.FAbon.Execute(ReadList);                //       \82 \82Ú\81`\82ñ\82µ\82Ä
+                                               GikoSys.FSelectResFilter.Execute(ReadList); //\83\8c\83X\82Ì\83t\83B\83\8b\83^\83\8a\83\93\83O\82ð\82·\82é
+                                               if ThreadItem.Title = '' then begin
+                                                       DivideStrLine(ReadList[0], @Res);
+                                                       sTitle := Res.FTitle;
+                                               end else
+                                                       sTitle := ThreadItem.Title
+                                       end else begin
+                                               sTitle := CustomStringReplace(ThreadItem.Title, '\81\97\81M', ',');
+                                       end;
+                                       // \83t\83H\83\93\83g\82â\83T\83C\83Y\82Ì\90Ý\92è
+                                       CSSFileName := GikoSys.GetStyleSheetDir + GikoSys.Setting.CSSFileName;
+                                       if GikoSys.Setting.UseSkin then begin
+                                               CreateUseSKINHTML(body, ThreadItem, ReadList);
+                                       end else if GikoSys.Setting.UseCSS and FileExists(CSSFileName) then begin
+                                               CreateUseCSSHTML(body, ThreadItem, ReadList, sTitle);
+                                       end else begin
+                                               CreateDefaultHTML(body, ThreadItem, ReadList, sTitle);
+                                       end;
+                               finally
+                                       ReadList.Free;
                                end;
-
-                       finally
-                               ReadList.Free;
                        end;
+               finally
+                       body.Close;
+                       body.Free;
                end;
        end;
 {$IFDEF DEBUG}
@@ -1707,7 +1707,63 @@ begin
        end;
 end;
 
-
+constructor TBufferedWebBrowser.Create(Browser: TWebBrowser; BuffSize: Integer);
+begin
+       inherited Create;
+       Self.Sorted := False;
+       if (Browser = nil) then
+               Raise  Exception.Create('Browser is NULL');
+       FBrowser := Browser;
+
+       // \83o\83b\83t\83@\82·\82é\8ds\90\94\82ð
+       if (BuffSize < 0) then begin
+               FBuffSize := 100;
+       end else begin
+               FBuffSize := BuffSize;
+       end;
+       Self.Capacity := FBuffSize + 10;
+end;
+procedure TBufferedWebBrowser.Open;
+begin
+       FBrowserDoc := Idispatch( olevariant(FBrowser.ControlInterface).Document);
+       FBrowserDoc.open;
+       FBrowserDoc.charset := 'Shift_JIS';
+end;
+procedure TBufferedWebBrowser.Close;
+begin
+       Self.Flush;
+       try
+               FBrowserDoc.Close;
+       except
+       end;
+       FBrowser := nil;
+end;
+function TBufferedWebBrowser.Add(const S: string): Integer;
+begin
+       Result := inherited Add(TrimRight(s));
+       if (Self.Count > FBuffSize) then begin
+               FBrowserDoc.Write(Self.Text);
+               Self.Clear;
+       end;
+end;
+procedure TBufferedWebBrowser.Flush ;
+begin
+       if (Self.Count > 0) then begin
+               FBrowserDoc.Write(Self.Text);
+               Self.Clear;
+       end;
+end;
+destructor TBufferedWebBrowser.Destory;
+begin
+       try
+               if (FBrowserDoc <> 0) then begin
+                       FBrowserDoc.close;
+                       FBrowserDoc := 0;
+               end;
+       except
+       end;
+       inherited;
+end;
 
 initialization
         HTMLCreater := THTMLCreate.Create;