OSDN Git Service

NGワードで、該当行数が表示できる機能をつけた。
[gikonavigoeson/gikonavi.git] / AbonUnit.pas
1 unit AbonUnit;
2
3 interface
4 uses
5     Windows,Messages, ShellAPI, SysUtils, Classes,StdCtrls,StrUtils;
6
7 type
8   TIndiviAbon = record
9         Res: Integer;
10     option: Integer; // 0:\93§\96¾ 1:\92Ê\8fí\82 \82Ú\81[\82ñ
11   end;
12
13   TAbon = class(TObject)
14   private
15     { Private \90é\8c¾ }
16     Froot : String;
17     Flistpath : String;
18     FNGwordpath : String;
19     Ftokens : array of array of string;
20     FAbonRes : array of TIndiviAbon;
21     FAbonString : String;
22     FCutoffNum : Integer; //\82±\82Ì\90\94\88È\8fã\98A\91±\82·\82é\93¯\82\89p\8e\9a\82ðNG\83\8f\81[\83h\82Æ\82·\82é
23     FDeleterlo : Boolean; //&rlo;\82ð\8dí\82é\82©
24     FReplaceul :Boolean ; //<ul>\83^\83O\82ð<br>\83^\83O\82É\92u\8a·\82·\82é\82©
25     FReverse : Boolean ;  //NG\83\8f\81[\83h\82Å\82Ì\82 \82Ú\81`\82ñ\82Ì\8c\8b\89Ê\82ð\94½\93]\82³\82¹\82é\82©
26     FAbonPopupRes : Boolean; //\83\8c\83X\83|\83b\83v\83A\83b\83v\82Ì\8e\9e\82É\82 \82Ú\81[\82ñ\82·\82é\82©
27     FCreateNGwordFile : Boolean; //\8ew\92è\82³\82ê\82½path\82ÉNG\83\8f\81[\83htxt\82ª\96³\82©\82Á\82½\82Æ\82«\82É\8e©\93®\93I\82É\90\90¬\82·\82é\82©
28     FNGwordFileIndex : Integer; //\8c»\8dÝ\93Ç\82Ý\8d\9e\82ñ\82Å\82éNG\83\8f\81[\83h\82ªlist\82Ì\89½\8ds\96Ú\82©
29     FNGwordname : String; //\8c»\8dÝ\93Ç\82Ý\8d\9e\82ñ\82Å\82éNG\83\8f\81[\83h\82Ì\95\\8e¦\96¼
30     FIndividualFileName : String;       //\8cÂ\95Ê\82 \82Ú\81`\82ñ\82Ì\83t\83@\83C\83\8b\96¼
31     FReturnNGwordLineNum : Boolean;     //NG\83\8f\81[\83h\82Ì\8ds\90\94\82ð\95Ô\82·\81B
32     FSetNGResAnchor : Boolean; //NG\82É\8aY\93\96\82µ\82½\82Æ\82«\82É\96{\95\82É\82»\82Ì\83\8c\83X\82Ö\82Ì\83\8c\83X\83A\83\93\83J\81[\82ð\82Â\82¯\82é\82©\82Ç\82¤\82©
33     procedure SetTokens(index: integer ; argline:String);
34     function Getlistpath() : String;
35     procedure Setlistpath(const Value : String);
36     function LoadListFile(path :String;listStringList : TStringList) : Boolean;
37     function ReadNGwordslist(line : Integer) : Boolean;
38     function LoadFromSetResNumFile(SetResNumFile : String) : Boolean;
39   public
40     { Public \90é\8c¾ }
41     constructor Create; // \83R\83\93\83X\83g\83\89\83N\83^
42     destructor Destroy; override; // \83f\83X\83g\83\89\83N\83^
43     property Deleterlo: Boolean read FDeleterlo write FDeleterlo  default false;
44     property Replaceul: Boolean read FReplaceul write FReplaceul  default false;
45     property Reverse: Boolean read FReverse write FReverse  default false;
46     property CreateNGwordFile: Boolean read FCreateNGwordFile write FCreateNGwordFile;
47     property AbonString : String read FAbonString write FAbonString;
48     property  AbonPopupRes : Boolean read FAbonPopupRes write FAbonPopupRes default false;
49     property listpath : String read Getlistpath write Setlistpath;
50     property NGwordFileIndex : Integer read FNGwordFileIndex write FNGwordFileIndex default 0;
51     property NGwordname : String read FNGwordname write FNGwordname;
52         property ReturnNGwordLineNum : Boolean read FReturnNGwordLineNum write FReturnNGwordLineNum default false;
53     property SetNGResAnchor : Boolean read FSetNGResAnchor write FSetNGResAnchor default false;
54     procedure Setroot(root :String);
55     function Getroot() : String;
56
57     function Getfullpath(argpath : String) : String;
58     procedure SetNGwordpath(path :String);
59     function GetNGwordpath() : String;
60     function LoadFromNGwordFile(path :String) : Boolean;
61     function ReLoadFromNGwordFile() : Boolean;
62     procedure LoadFromStringList( bufstl : TStringList );
63     function CheckAbonPopupRes(line : String) :Boolean;
64     function FindNGwords(line : String) : Boolean; overload;//1\83\89\83C\83\93\82¸\82Â\97p\81B
65     function FindNGwords(line : String; var NGwordsLineNum : Integer) : Boolean; overload;//1\83\89\83C\83\93\82¸\82Â\97p\81B
66     function Cutoff(line : String) : Boolean; //CutOff\92l\88È\8fã\8cÂ\82Ì\93¯\82\89p\90\94\82ª\95À\82ñ\82Å\82¢\82½\82çtrue
67     //\82 \82Ú\81`\82ñ\8f\88\97\9d(NG\83\8f\81[\83h\82Å\82Ì\83t\83B\83\8b\83^\83\8a\83\93\83O)
68     procedure Execute(var ThreadStrings : TStringList); overload;
69     procedure Execute(var ThreadStrings : TStringList; NGwords : TStringList); overload;
70     procedure Execute(var ThreadStrings : TStringList; NGwords : TStrings); overload;
71     //\8cÂ\95Ê\82 \82Ú\81`\82ñ\82µ\82å\82è
72     procedure IndividualAbon(var ThreadStrings : TStringList; SetResNumFile : String);
73     procedure AddIndividualAbon( ResNum : Integer ; option : Integer);
74     procedure DeleteIndividualAbon( ResNum : Integer);
75     function GetAbonResCount() : Integer;
76     function GetAbonResString(Num : Integer) : String;
77     function CheckIndividualAbonList(ResNum : Integer) : Boolean;
78     //--
79     function ExecuteFile(datfilepath : String; NGwordpath : String) : Boolean; overload;//DAT\83t\83@\83C\83\8b\82ð\92¼\82É\82¢\82\82é
80     function ExecuteFile(datfilepath : String; resnum : Integer) : Boolean; overload; //DAT\83t\83@\83C\83\8b\82ð\92¼\82É\82¢\82\82é
81     function ExecuteFile(datfilepath : String; firstres : Integer; count : Integer) : Boolean; overload; //DAT\83t\83@\83C\83\8b\82ð\92¼\82É\82¢\82\82é
82     function ReverseExecuteFile(datfilepath : String) : Boolean; overload; //DAT\83t\83@\83C\83\8b\82ð\92¼\82É\82¢\82\82é
83     function ReverseExecuteFile(datfilepath : String; resnum : Integer) : Boolean; overload; //DAT\83t\83@\83C\83\8b\82ð\92¼\82É\82¢\82\82é
84     function ReverseExecuteFile(datfilepath : String; firstres : Integer; count : Integer) : Boolean; overload; //DAT\83t\83@\83C\83\8b\82ð\92¼\82É\82¢\82\82é
85     //--
86     procedure EditNGwords();  //NGword.txt\82ð\8aJ\82­\81B
87     function ShowAllTokens() : String;  //\83f\83o\83b\83O\97p
88     //--
89     procedure GoHome();//List\82Ì\82P\8ds\96Ú\82ð\93Ç\82Þ
90     function GoForward() : Boolean; //List\82Ì\88ê\82Â\8e\9f\82ÌNG\83\8f\81[\83h\83t\83@\83C\83\8b\82ð\93Ç\82Ý\8d\9e\82Þ
91     function GoBack() : Boolean; //List\82Ì\88ê\82Â\91O\82ÌNG\83\8f\81[\83h\83t\83@\83C\83\8b\82ð\93Ç\82Ý\8d\9e\82Þ
92   end;
93 var
94     Abon1 :TAbon;
95 const
96     NGwordListFileName : String = 'NGwords.list';
97
98 implementation
99
100 constructor TAbon.Create;
101 begin
102     // \8f\89\8aú\89»
103     FAbonString := '&nbsp;<>&nbsp;<>&nbsp;<>&nbsp;&nbsp;<><>';
104     FCreateNGwordFile := true;
105     SetLength(FAbonRes,1);
106     FAbonRes[0].Res := 0;
107     FAbonRes[0].option := -1;
108
109 end;
110
111 destructor TAbon.Destroy;
112 begin
113     inherited;
114 end;
115 //root\82ÍExe\config\NGwords\83t\83H\83\8b\83_
116 procedure TAbon.Setroot(root :String);
117 var
118     bufStringList : TStringList;
119 begin
120     bufStringList := TStringList.Create;
121     try
122         if not DirectoryExists(root) then begin
123             CreateDir(root);
124         end;
125         if root[Length(root)] <> '\' then begin
126             root := root + '\';
127         end;
128         Flistpath := root + NGwordListFileName;
129         LoadListFile(Flistpath, bufStringList);
130     finally
131         bufStringList.Free;
132     end;
133     Froot := root;
134 end;
135 function TAbon.Getroot() : String;
136 begin
137     Result := Froot;
138 end;
139 //NGwordpath\82ÍNGword.txt\82Ì\83t\83\8b\83p\83X
140 procedure TAbon.SetNGwordpath(path :String);
141 begin
142     FNGwordpath := Getfullpath(path);
143     LoadFromNGwordFile(FNGwordpath);
144 end;
145 function TAbon.GetNGwordpath() : String;
146 begin
147     Result :=  FNGwordpath;
148 end;
149 //\83t\83\8b\83p\83X\82Å\82È\82¯\82ê\82Î\83t\83\8b\83p\83X\82É\82µ\82Ä\95Ô\82·\81B
150 function TAbon.Getfullpath(argpath : String) : String;
151 begin
152     if AnsiPos(':\',argpath) <> 2 then begin  //\83h\83\89\83C\83u\82©\82ç\82Ì\83t\83\8b\83p\83X\82ª\96³\82¯\82ê\82Î
153         if Getroot() = '' then begin
154             Result := '';    //root\83p\83X\82ª\90Ý\92è\82³\82ê\82Ä\82È\82¢\82©\8bó\82É\82·\82é
155         end else begin
156             if (Froot[Length(Froot)] = '\') and (argpath[1] = '\') then begin  //\90æ\93ª\82Ì\\82ð\8dí\8f\9c
157                 Delete(argpath,1,1);
158             end;
159             Insert( Getroot(), argpath , 1);//root\83p\83X\82ð\91}\93ü
160             Result := argpath;
161         end;
162     end else begin
163         Result := argpath;
164     end;
165
166 end;
167 //NGword\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý
168 function TAbon.LoadFromNGwordFile(path :String) : boolean;
169 var
170     bufstl : TStringList;
171 begin
172     path := Getfullpath(path);
173     if path = '' then begin
174         Result := false;
175     end else begin
176         bufstl := TStringList.Create;
177         try
178             try
179                 bufstl.LoadFromFile(path);
180                 LoadFromStringList( bufstl );
181                 Result := true;
182             except
183                 if CreateNGwordFile = true then begin
184                     bufstl.SaveToFile(path);
185                 end;
186                 Result := false;
187             end;
188         finally
189             bufstl.Free;
190         end;
191     end;
192
193 end;
194 //NGword\83\8a\83X\83g\93Ç\82Ý\8d\9e\82Ý
195 procedure TAbon.LoadFromStringList( bufstl : TStringList );
196 var
197     i : integer;
198 begin
199     try
200         for i := bufstl.Count -1  downto 0 do begin
201             if bufstl.Strings[i] = '' then begin
202                 bufstl.Delete(i);
203             end;
204         end;
205         SetLength(Ftokens,bufstl.Count);
206         for i := 0  to bufstl.Count -1 do begin
207             SetTokens(i , bufstl.Strings[i]);
208         end;
209
210     except
211         Exit;
212     end;
213 end;
214 //NGwordpath\82ª\8aù\82É\90Ý\92è\82³\82ê\82Ä\82¢\82é\82Æ\82«\82Ì\83\8a\83\8d\81[\83h\97p\8aÖ\90\94
215 function TAbon.ReLoadFromNGwordFile() : boolean;
216 begin
217     if GetNGwordpath() ='' then begin
218         Result := false;
219     end else begin
220         Result := LoadFromNGwordFile( GetNGwordpath() );
221     end;
222 end;
223 function TAbon.Getlistpath() : String;
224 begin
225     Result := Flistpath;
226 end;
227 procedure TAbon.Setlistpath(const Value : String);
228 begin
229     Flistpath := Getfullpath(Value);
230 end;
231 //\88ê\8ds\82Ì\92\86\82Ì\83g\81[\83N\83\93\82ð\90Ø\82è\95ª\82¯\82Ä\83Z\83b\83g
232 procedure TAbon.SetTokens(index: integer ; argline : String);
233 var
234     ret : Integer;
235     bufstl : TStringList;
236     i : Integer;
237     pos : Integer;
238     buftoken : String;
239 begin
240     pos := 0;
241     bufstl := TStringList.Create;
242     try
243         if Length(argline) > 0 then begin
244                 pos := AnsiPos(#9,argline);
245             while pos <> 0 DO begin
246                 buftoken := Copy(argline,1,pos-1);
247                 Delete(argline,1,pos);
248                 if Length(buftoken) > 0 then begin
249                                 bufstl.Append(buftoken);
250                 end;
251                     pos := AnsiPos(#9,argline);
252             end;
253                 if Length(argline) > 0 then begin
254                         bufstl.Append(argline);
255             end;
256                 ret := bufstl.Count;
257                 SetLength(Ftokens[index],ret);
258                 for i := 0 to bufstl.Count - 1  do begin
259                         Ftokens[index][i] := bufstl.Strings[i];
260                 end;
261         end;
262     finally
263         bufstl.Free;
264     end;
265
266 end;
267 //Debug\97p\82¿\82á\82ñ\82ÆNG\83\8f\81[\83h\82ð\8fE\82¦\82Ä\82¢\82é\82©
268 function TAbon.ShowAllTokens() : String;
269 var
270     i : Integer;
271     j : Integer;
272     ret : String;
273 begin
274     for i := 0 to High(Ftokens) do begin
275         for j := 0 to High(Ftokens[i]) do begin
276             ret := ret + Ftokens[i][j];
277         end;
278     end;
279     Result := ret;
280
281
282
283 end;
284
285 //****************************************************************************//
286 //NG\83\8f\81[\83h\82ª\8aÜ\82Ü\82ê\82Ä\82½\82çtrue\82ð\95Ô\82·\81B
287 function TAbon.FindNGwords(line : String) : Boolean;
288 var
289     lines : Integer;
290     cells : Integer;
291     hit : Boolean;
292     bufline : String;
293 begin
294     hit := false;
295     if AnsiPos(FAbonString,line) <> 1 then begin
296         for lines := 0 to High(Ftokens) do begin
297                 hit := true;
298             bufline := line;
299             for cells := 0 to High(Ftokens[lines]) do begin
300                 if AnsiPos(Ftokens[lines][cells],bufline) = 0 then begin
301                         hit := false;
302                     break;
303                 end else begin
304                         Delete(bufline,AnsiPos(Ftokens[lines][cells],bufline),Length(Ftokens[lines][cells]));
305                 end;
306             end;
307             if hit = true then begin
308                 break;
309             end;
310         end;
311     end;
312     Result := hit;
313 end;
314 //NG\83\8f\81[\83h\82ª\8aÜ\82Ü\82ê\82Ä\82¢\82½\82çtrue\82ð\95Ô\82µ\81A\82»\82ÌNG\83\8f\81[\83h\82Ì\8ds\90\94\82ðNGwordsLineNum\82É\93ü\82ê\82Ä\95Ô\82·
315 function TAbon.FindNGwords(line : String; var NGwordsLineNum : Integer) : Boolean;
316 var
317     lines : Integer;
318     cells : Integer;
319     hit : Boolean;
320     bufline : String;
321 begin
322     hit := false;
323     if AnsiPos(FAbonString,line) <> 1 then begin
324         for lines := 0 to High(Ftokens) do begin
325                 hit := true;
326             bufline := line;
327             for cells := 0 to High(Ftokens[lines]) do begin
328                 if AnsiPos(Ftokens[lines][cells],bufline) = 0 then begin
329                         hit := false;
330                     break;
331                 end else begin
332                         Delete(bufline,AnsiPos(Ftokens[lines][cells],bufline),Length(Ftokens[lines][cells]));
333                 end;
334             end;
335             if hit = true then begin
336                 NGwordsLineNum := lines + 1;
337                 break;
338             end;
339         end;
340     end;
341     Result := hit;
342 end;
343 //CutOff\92l\88È\8fã\8cÂ\82Ì\93¯\82\89p\90\94\82ª\95À\82ñ\82Å\82¢\82½\82çtrue
344 function TAbon.Cutoff(line : String) : Boolean;
345 var
346     i : Integer;
347     sheed : AnsiChar;
348     buf : String;
349     ret : Bool;
350 begin
351     ret := false;
352     if FCutoffNum <> 0 then begin
353         for i := 65 to 90 do begin
354             sheed := Chr(i);
355             buf := DupeString(sheed, FCutoffNum);
356             if AnsiContainsText(line, buf) = true then begin
357                 ret := true;
358                 break;
359             end;
360         end;
361     end;
362     Result := ret;
363 end;
364 //\96\96\94ö\82Ì\83u\81[\83\8b\92l\82Ítrue\82¾\82Æ\81ANG\83\8f\81[\83h\82ð\8aÜ\82Þ\82à\82Ì\82¾\82¯\82ð\95Ô\82·\81B
365 procedure TAbon.Execute(var ThreadStrings : TStringList);
366 var
367     i : Integer;
368     NGwordsLine : Integer;
369     bufline : String;
370 begin
371     //FRetStrings.Clear;
372     if not ReturnNGwordLineNum then begin
373     //if ReturnNGwordLineNum then begin
374         for i:=0 to ThreadStrings.Count - 1 do begin
375                 if FindNGwords(ThreadStrings.Strings[i]) <> Reverse  then begin
376                 if not SetNGResAnchor then
377                         ThreadStrings.Strings[i] := FAbonString
378                 else
379                         ThreadStrings.Strings[i] := Format('&nbsp;<>&nbsp;<>&nbsp;<>&gt;%d<><>',[(i+1)]);
380                 end else begin
381                 bufline := ThreadStrings.Strings[i];
382                 if Deleterlo = true then begin
383                         bufline := AnsiReplaceText( bufline,'&rlo;','' );
384                 end;
385                 if Replaceul = true then begin
386                         bufline := AnsiReplaceText( bufline,'<ul>','<br>' );
387                         bufline := AnsiReplaceText( bufline,'</ul>','<br>' );
388                 end;
389                 ThreadStrings.Strings[i] := bufline;
390                 end;
391         end;
392     end else begin
393         for i:=0 to ThreadStrings.Count - 1 do begin
394             NGwordsLine := 0;
395                 if FindNGwords(ThreadStrings.Strings[i], NGwordsLine) <> Reverse  then begin
396                 if not SetNGResAnchor then
397                     ThreadStrings.Strings[i] := Format('&nbsp;<>&nbsp;<>&nbsp;<><B> %d \8ds\96Ú\82ÌNG\83\8f\81[\83h\82ª\8aÜ\82Ü\82ê\82Ä\82¢\82Ü\82·\81B</B><><>',[NGwordsLine])
398                 else
399                         ThreadStrings.Strings[i] := Format('&nbsp;<>&nbsp;<>&nbsp;<><B> %d \8ds\96Ú\82ÌNG\83\8f\81[\83h\82ª\8aÜ\82Ü\82ê\82Ä\82¢\82Ü\82·\81B</B>&gt;%d <><>',[NGwordsLine,(i+1)]);
400                 end else begin
401                 bufline := ThreadStrings.Strings[i];
402                 if Deleterlo = true then begin
403                         bufline := AnsiReplaceText( bufline,'&rlo;','' );
404                 end;
405                 if Replaceul = true then begin
406                         bufline := AnsiReplaceText( bufline,'<ul>','<br>' );
407                         bufline := AnsiReplaceText( bufline,'</ul>','<br>' );
408                 end;
409                 ThreadStrings.Strings[i] := bufline;
410                 end;
411         end;
412
413     end;
414
415 end;
416 procedure TAbon.Execute(var ThreadStrings : TStringList; NGwords : TStringList);
417 var
418     i : Integer;
419 begin
420     SetLength(Ftokens,NGwords.Count);
421     for i := 0  to NGwords.Count -1 do begin
422         SetTokens(i , NGwords.Strings[i]);
423     end;
424     Execute(ThreadStrings);
425
426 end;
427 procedure TAbon.Execute(var ThreadStrings : TStringList; NGwords : TStrings);
428 var
429     i : Integer;
430     buf : TStringList;
431 begin
432     buf := TStringList.Create;
433     buf.AddStrings(NGwords);
434     SetLength(Ftokens,buf.Count);
435     for i := 0  to buf.Count -1 do begin
436         SetTokens(i , buf.Strings[i]);
437     end;
438     Execute(ThreadStrings);
439     buf.Free;
440 end;
441
442
443 //****************************************************************************//
444 //DAT\82ð\92¼\82É\82¢\82\82é\93z\82ç===========================================================
445 //NG\83\8f\81[\83h\82ð\8aÜ\82Þ\83\8c\83X\82Ì\90æ\93ª\82É\82 \82Ú\81[\82ñ\82ð\91}\93ü
446 function TAbon.ExecuteFile(datfilepath : String; NGwordpath : String) : Boolean; //DAT\83t\83@\83C\83\8b\82ð\92¼\82É\82¢\82\82é
447 var
448     datstl : TStringList;
449     ret : Boolean;
450     i : Integer;
451 begin
452     datstl := TStringList.Create;
453     ret := true;
454     try
455         try
456             datstl.LoadFromFile(datfilepath);
457             for i := 0 to datstl.Count -1 do begin
458                 if FindNGwords(datstl.Strings[i]) = true  then begin
459                     datstl.Strings[i] := FAbonString + datstl.Strings[i]
460                 end;
461             end;
462
463             datstl.SaveToFile(datfilepath);
464         except
465             ret := false;
466         end;
467     finally
468         datstl.Free;
469     end;
470     Result := ret;
471
472 end;
473 //\8ew\92è\82³\82ê\82½\83\8c\83X\94Ô\82Ì\90æ\93ª\82É\82 \82Ú\81[\82ñ\91}\93ü
474 function TAbon.ExecuteFile(datfilepath : String; resnum : Integer) : Boolean; //DAT\83t\83@\83C\83\8b\82ð\92¼\82É\82¢\82\82é
475 var
476     datstl : TStringList;
477     ret : Boolean;
478 begin
479     ret := true;
480     datstl := TStringList.Create;
481     try
482         try
483             datstl.LoadFromFile(datfilepath);
484             if (resnum > 0) and (resnum <= datstl.Count) then begin
485                 if AnsiPos(FAbonString, datstl.Strings[resnum-1]) <> 1 then begin
486                     datstl.Strings[resnum-1] := FAbonString + datstl.Strings[resnum-1];
487                 end;
488             end;
489             datstl.SaveToFile(datfilepath);
490         except
491             ret := false;
492         end;
493     finally
494         datstl.Free;
495     end;
496     Result := ret;
497 end;
498 //firstres\82©\82çcount\8cÂ\82Ì\83\8c\83X\82Ì\90æ\93ª\82É\82 \82Ú\81[\82ñ\91}\93ü
499 function TAbon.ExecuteFile(datfilepath : String; firstres : Integer; count : Integer) : Boolean; //DAT\83t\83@\83C\83\8b\82ð\92¼\82É\82¢\82\82é
500 var
501     datstl : TStringList;
502     i : Integer;
503     endnum : Integer; //\8fI\82í\82è\82Ì\83\8c\83X\94Ô
504     ret : Boolean;
505 begin
506     ret := true;
507     datstl := TStringList.Create;
508     try
509         try
510             datstl.LoadFromFile(datfilepath);
511             if (firstres > 0) and (firstres <= datstl.Count) then begin
512                 if firstres + count -1 > datstl.Count then begin
513                     endnum := datstl.Count;
514                 end else if count <= 0 then begin
515                     endnum := firstres + 1;
516                 end else begin
517                     endnum := firstres + count -1;
518                 end;
519
520                 for i := firstres to endnum do begin
521                     if AnsiPos(FAbonString, datstl.Strings[i-1]) <> 1 then begin
522                         datstl.Strings[i-1] := FAbonString + datstl.Strings[i-1];
523                     end;
524                 end;
525             end;
526             datstl.SaveToFile(datfilepath);
527         except
528             ret := false;
529         end;
530     finally
531         datstl.Free;
532     end;
533     Result := ret;
534 end;
535 //DAT\82ð\92¼\82É\82¢\82\82é\93z\82ç==========\82±\82±\82Ü\82Å=========================================
536
537 //\8c³\82É\96ß\82·\93z\82ç==================================================================
538 function TAbon.ReverseExecuteFile(datfilepath : String) : Boolean; //DAT\83t\83@\83C\83\8b\82ð\92¼\82É\82¢\82\82é
539 var
540     datstl : TStringList;
541     i : Integer;
542     buf : String;
543     ret : Boolean;
544 begin
545     ret := true;
546     datstl := TStringList.Create;
547     try
548         try
549             datstl.LoadFromFile(datfilepath);
550             for i:=0 to datstl.Count -1  do begin
551                 if AnsiPos(FAbonString, datstl.Strings[i]) = 1 then begin
552                     buf := datstl.Strings[i];
553                     Delete(buf,1,Length(FAbonString));
554                     datstl.Strings[i] := buf;
555                 end;
556             end;
557             datstl.SaveToFile(datfilepath);
558         except
559             ret := false;
560         end;
561     finally
562         datstl.Free;
563     end;
564     Result := ret;
565
566 end;
567 function TAbon.ReverseExecuteFile(datfilepath : String; resnum : Integer) : Boolean; //DAT\83t\83@\83C\83\8b\82ð\92¼\82É\82¢\82\82é
568 var
569     datstl : TStringList;
570     buf : String;
571     ret : Boolean;
572 begin
573     ret := true;
574     datstl := TStringList.Create;
575     try
576         try
577             datstl.LoadFromFile(datfilepath);
578             if (resnum > 0) and (resnum <= datstl.Count) then begin
579                 if AnsiPos(FAbonString, datstl.Strings[resnum-1]) = 1 then begin
580                     buf := datstl.Strings[resnum-1];
581                     Delete(buf,1,Length(FAbonString));
582                     datstl.Strings[resnum-1] := buf;
583                 end;
584             end;
585             datstl.SaveToFile(datfilepath);
586         except
587             ret := false;
588         end;
589     finally
590         datstl.Free;
591     end;
592     Result := ret;
593
594 end;
595 function TAbon.ReverseExecuteFile(datfilepath : String; firstres : Integer; count : Integer) : Boolean;//DAT\83t\83@\83C\83\8b\82ð\92¼\82É\82¢\82\82é
596 var
597     datstl : TStringList;
598     i : Integer;
599     endnum : Integer; //\8fI\82í\82è\82Ì\83\8c\83X\94Ô
600     buf : String;
601     ret : Boolean;
602 begin
603     ret := true;
604     datstl := TStringList.Create;
605     try
606         try
607             datstl.LoadFromFile(datfilepath);
608             if (firstres > 0) and (firstres <= datstl.Count) then begin
609                 if firstres + count -1 > datstl.Count then begin
610                     endnum := datstl.Count;
611                 end else if count <= 0 then begin
612                     endnum := firstres + 1;
613                 end else begin
614                     endnum := firstres + count -1;
615                 end;
616                 for i := firstres to endnum do begin
617                     if AnsiPos(FAbonString, datstl.Strings[i-1]) = 1 then begin
618                         buf := datstl.Strings[i-1];
619                         Delete(buf,1,Length(FAbonString));
620                         datstl.Strings[i-1] := buf;
621                     end;
622                 end;
623             end;
624             datstl.SaveToFile(datfilepath);
625         except
626             ret := false;
627         end;
628     finally
629         datstl.Free;
630     end;
631     Result := ret;
632 end;
633 //\8c³\82É\96ß\82·\93z\82ç=================\82±\82±\82Ü\82Å=========================================
634 //\8c»\8dÝ\83Z\83b\83g\82³\82ê\82Ä\82¢\82éNGword.txt\82ð\8aJ\82­
635 procedure TAbon.EditNGwords();
636 begin
637     ShellExecute(0 ,nil,PChar(FNGwordpath),nil,nil,SW_SHOW);
638 end;
639 //\83|\83b\83v\83A\83b\83v\97p\94»\92è\8aÖ\90\94
640 function TAbon.CheckAbonPopupRes(line : String) :Boolean;
641 begin
642     if AbonPopupRes = true then begin
643         Result := FindNGwords(line);
644     end else begin
645         Result := false;
646     end;
647 end;
648 //\95¡\90\94\82ÌNG\83\8f\81[\83h\83e\83L\83X\83g\82ð\93Ç\82Ý\8d\9e\82Þ==============================================
649 //List\83t\83@\83C\83\8b\82ð\93Ç\82Ý\8d\9e\82Þ
650 function TAbon.LoadListFile(path :String; listStringList : TStringList) : Boolean;
651 begin
652     try
653         listStringList.LoadFromFile(path);
654         Result := true;
655     except
656         listStringList.Append('\88ê\94Ê=NGword.txt');
657         listStringList.SaveToFile(path);
658         Result := false;
659     end;
660 end;
661 //List\82Ì\88ê\82Â\8e\9f\82ÌNG\83\8f\81[\83h\83t\83@\83C\83\8b\82ð\93Ç\82Ý\8d\9e\82Þ
662 function TAbon.GoForward() : Boolean;
663 begin
664     FNGwordFileIndex := FNGwordFileIndex + 1;
665     Result := ReadNGwordslist(FNGwordFileIndex);
666 end;
667 //List\82Ì\88ê\82Â\91O\82ÌNG\83\8f\81[\83h\83t\83@\83C\83\8b\82ð\93Ç\82Ý\8d\9e\82Þ
668 function TAbon.GoBack() : Boolean;
669 begin
670     FNGwordFileIndex := FNGwordFileIndex -1;
671     Result := ReadNGwordslist(FNGwordFileIndex);
672 end;
673 //List\82Ì\82P\8ds\96Ú\82ð\93Ç\82Þ
674 procedure TAbon.GoHome();
675 begin
676     FNGwordFileIndex := 0;
677     ReadNGwordslist(FNGwordFileIndex);
678 end;
679 //List\82Ìline\8ds\96Ú\82ð\93Ç\82Þ
680 function TAbon.ReadNGwordslist(line : Integer) : Boolean;
681 var
682     liststl : TStringList;
683     linebuf : String;
684 begin
685     liststl := TStringList.Create;
686     try
687         if LoadListFile(Flistpath,liststl) = true then begin
688             if line < 0 then begin
689                 line := liststl.Count - 1;
690                 FNGwordFileIndex := liststl.Count - 1;
691             end else if line > liststl.Count - 1 then begin
692                 line := 0;
693                 FNGwordFileIndex := 0;
694             end;
695             linebuf := liststl.Strings[line];
696             FNGwordname := Copy(linebuf,1,AnsiPos('=',linebuf)-1);
697             Delete(linebuf,1,AnsiPos('=',linebuf));
698             SetNGwordpath(linebuf);
699             Result := true;
700         end else begin
701             Result := false;
702         end
703     finally
704         liststl.Free;
705     end;
706
707 end;
708 //\95¡\90\94\82ÌNG\83\8f\81[\83h\83e\83L\83X\83g\82ð\93Ç\82Ý\8d\9e\82Þ=====\82±\82±\82Ü\82Å=================================
709 //\8cÂ\95Ê\82 \82Ú\81`\82ñ\8eÀ\8ds\8aÖ\90\94
710 procedure TAbon.IndividualAbon(var ThreadStrings : TStringList; SetResNumFile : String);
711 var
712         i : Integer;
713 begin
714         if FileExists(SetResNumFile) = true then begin
715         if LoadFromSetResNumFile(SetResNumFile) = true then begin
716                 for i := 0 to High(FAbonRes) do begin
717                  if (FAbonRes[i].Res <= ThreadStrings.Count) and (FAbonRes[i].Res > 0) then begin
718                         if FAbonRes[i].option = 0 then begin
719                         ThreadStrings.Strings[FAbonRes[i].Res-1] := '';
720                     end else begin
721                         ThreadStrings.Strings[FAbonRes[i].Res-1] := '\82 \82Ú\81`\82ñ<>\82 \82Ú\81`\82ñ<>\82 \82Ú\81`\82ñ<>\82 \82Ú\81`\82ñ<>';
722                     end;
723                  end;
724
725             end;
726         end;
727     end else begin
728         FIndividualFileName := SetResNumFile;
729         SetLength(FAbonRes,1);
730         FAbonRes[0].Res := 0;
731         FAbonRes[0].option := -1;
732     end;
733 end;
734 //\8cÂ\95Ê\82 \82Ú\81`\82ñ\83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý\8aÖ\90\94
735 function TAbon.LoadFromSetResNumFile(SetResNumFile : String) : Boolean;
736 var
737         bufStringList : TStringList;
738     bufLine : String;
739     i : Integer;
740 begin
741     bufStringList := TStringList.Create;
742     try
743         try
744                 bufStringList.LoadFromFile(SetResNumFile);
745             FIndividualFileName := SetResNumFile;
746             //\8bó\8ds\8dí\8f\9c
747             for i := bufStringList.Count-1 downto 0 do begin
748                         if bufStringList.Strings[i] = '' then begin
749                         bufStringList.Delete(i);
750                     end;
751             end;
752
753             //\83\81\83\82\83\8a\8am\95Û
754                 SetLength(FAbonRes,bufStringList.Count);
755             //\91ã\93ü
756             for i :=0 to bufStringList.Count - 1 do begin
757                         bufLine := Trim(bufStringList.Strings[i]);
758                     FAbonRes[i].Res :=  StrToInt(Copy(bufLine,1,AnsiPos('-',bufLine)-1));
759                 FAbonRes[i].option := StrToInt(Copy(bufLine,AnsiPos('-',bufLine)+1,1));
760             end;
761         except
762                 Result := false;
763             Exit;
764         end;
765     finally
766         bufStringList.Free;
767     end;
768     Result := true;
769 end;
770 //\8cÂ\95Ê\82 \82Ú\81`\82ñ\83t\83@\83C\83\8b\82É\92Ç\89Á
771 procedure TAbon.AddIndividualAbon( ResNum : Integer ; option : Integer);
772 var
773         IndividualFile : TStringList;
774     linebuf : String;
775     i : Integer;
776 begin
777     IndividualFile := TStringList.Create;
778         if FAbonRes[0].Res <> 0 then begin
779         for i := 0 to High(FAbonRes) do begin
780             if FAbonRes[i].Res <> ResNum then begin
781                         linebuf := IntToStr(FAbonRes[i].Res) + '-' + IntToStr(FabonRes[i].option);
782                 IndividualFile.Append(linebuf);
783             end;
784         end;
785     end;
786     linebuf := IntToStr(ResNum) + '-' + IntToStr(option);
787     IndividualFile.Append(linebuf);
788     try
789         IndividualFile.SaveToFile(FIndividualFileName);
790     finally
791         IndividualFile.Free;
792     end;
793 end;
794 //\8cÂ\95Ê\82 \82Ú\81`\82ñ\83t\83@\83C\83\8b\82©\82ç\8dí\8f\9c
795 procedure TAbon.DeleteIndividualAbon( ResNum : Integer);
796 var
797         IndividualFile : TStringList;
798     linebuf : String;
799     i : Integer;
800 begin
801     IndividualFile := TStringList.Create;
802         if FAbonRes[0].Res <> 0 then begin
803         for i := 0 to High(FAbonRes) do begin
804             if FAbonRes[i].Res <> ResNum then begin
805                         linebuf := IntToStr(FAbonRes[i].Res) + '-' + IntToStr(FabonRes[i].option);
806                 IndividualFile.Append(linebuf);
807             end;
808         end;
809     end;
810         if IndividualFile.Count <> 0 then begin
811         try
812                 IndividualFile.SaveToFile(FIndividualFileName);
813         finally
814                 IndividualFile.Free;
815         end;
816     end else begin
817         if FileExists(FIndividualFileName) = true then begin
818                 DeleteFile(FIndividualFileName);
819         end;
820     end;
821 end;
822 //\8cÂ\95Ê\82 \82Ú\81`\82ñ\82Ì\83\8a\83X\83g\82Ì\8cÂ\90\94\82ð\95Ô\82·
823 function TAbon.GetAbonResCount() : Integer;
824 var
825         i : Integer;
826 begin
827     if FAbonRes[0].Res = 0 then begin
828         Result := 0
829     end else begin
830                 i := High(FAbonRes);
831         Result := i+1;
832     end;
833 end;
834 //\8cÂ\95Ê\82 \82Ú\81`\82ñ\82Ì\83\8a\83X\83g\82Ì\82\8e\8ds\96Ú\82Ì\83\8c\83X\82ð\95\8e\9a\97ñ\82Å\95Ô\82·
835 function TAbon.GetAbonResString(Num : Integer) : String;
836 begin
837         if (Num <= High(FAbonRes)) and (Num >= 0) then begin
838         Result := IntToStr(FAbonRes[Num].Res);
839     end else begin
840         Result := '';
841     end;
842 end;
843 //\83|\83b\83v\83A\83b\83v\82Ì\94»\92è\97p
844 function TAbon.CheckIndividualAbonList(ResNum : Integer) : Boolean;
845 var
846         i : Integer;
847 begin
848         if FAbonRes[0].Res <> 0 then begin
849         for i := 0 to High(FAbonRes) do begin
850                 if FAbonRes[i].Res = ResNum then begin
851                 Result := true;
852                 Exit;
853             end;
854         end;
855     end;
856     Result := false;
857     
858 end;
859 end.
860