Develop and Download Open Source Software

Browse CVS Repository

Contents of /gikonavigoeson/gikonavi/Search.pas

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.19 - (show annotations) (download) (as text)
Mon Apr 24 16:12:53 2006 UTC (17 years, 10 months ago) by h677
Branch: MAIN
CVS Tags: v1_59_0_771, v1_59_0_770, v1_59_0_773, v1_59_0_772, v1_59_0_775, v1_59_0_774, v1_59_0_777, v1_59_0_776, v1_56_0_715, v1_59_0_778, v1_63_1_819, v1_57_0_737, v1_62_0_812, v1_57_0_735, v1_57_0_734, v1_57_0_733, v1_57_0_732, v1_57_0_731, v1_57_0_730, v1_57_0_739, v1_57_0_738, v1_59_1_765, v1_53_0_671, v1_60_0_788, v1_60_0_789, v1_54_0_677, v1_54_0_676, v1_58_0_748, v1_58_0_745, v1_60_0_781, v1_60_0_782, v1_58_0_746, v1_60_0_784, v1_54_0_678, v1_60_0_786, v1_60_0_787, v1_56_0_707, v1_59_0_767, v1_56_0_705, v1_56_0_704, v1_56_0_703, v1_56_0_702, v1_56_0_701, v1_56_0_700, v1_59_1_778, v1_57_0_723, v1_52_1_658, v1_59_0_768, v1_59_0_769, v1_57_0_725, v1_57_0_726, v1_57_0_727, v1_57_0_720, v1_57_0_722, v1_57_1_744, v1_57_0_728, v1_57_0_729, v1_57_0_736, v1_58_0_752, v1_58_0_750, v1_58_0_751, v1_58_0_756, v1_58_0_757, v1_58_0_754, v1_58_0_755, v1_58_0_759, v1_57_0_719, v1_57_0_718, v1_56_0_716, v1_54_0_687, v1_56_0_710, v1_56_0_711, v1_56_1_717, v1_56_1_716, v1_54_0_688, v1_54_0_689, v1_54_0_684, v1_54_0_685, v1_53_0_664, v1_61_0_796, v1_61_0_797, v1_61_0_795, v1_61_0_798, v1_61_0_799, v1_53_0_661, v1_53_0_663, v1_53_0_662, v1_53_0_665, v1_53_0_667, v1_53_0_666, v1_53_0_669, v1_53_0_668, v1_55_0_692, v1_55_0_693, v1_55_0_696, v1_55_0_697, v1_55_0_694, v1_55_0_695, v1_54_1_691, v1_56_2_724, v1_56_2_722, v1_52_0_652, v1_55_1_697, v1_52_0_654, v1_56_0_714, v1_53_0_672, v1_53_0_670, v1_63_0_818, v1_63_0_817, v1_63_0_816, v1_63_0_815, v1_54_0_686, v1_54_0_680, v1_54_0_681, v1_62_0_805, v1_62_0_804, v1_62_0_807, v1_62_0_806, v1_56_0_712, v1_62_0_803, v1_62_0_802, v1_56_0_713, v1_62_0_809, v1_54_0_682, v1_56_0_721, v1_54_0_683, v1_60_0_780, v1_60_0_779, v1_62_0_810, v1_62_0_811, v1_58_0_747, v1_60_0_783, v1_54_0_679, v1_59_2_785, marged_bRESPOPUP, v1_54_0_675, v1_56_0_706, root-of-Bb53, v1_52_1_657, v1_54_0_674, v1_52_0_660, v1_60_1_793, v1_54_0_690, v1_58_0_763, v1_58_0_762, v1_58_0_761, v1_58_0_760, v1_62_1_813, v1_57_2_749, v1_57_0_742, v1_57_0_743, v1_57_0_740, v1_57_0_741, v1_52_0_655, v1_56_0_709, v1_57_0_744, v1_52_0_656, v1_56_0_708, v1_61_0_800, v1_53_1_673, v1_56_0_699, v1_56_0_698, v1_60_0_793, v1_60_0_792, v1_60_0_791, v1_60_0_790, v1_60_2_794, v1_61_1_801, HEAD
Branch point for: Bb57, Bb56, Bb55, Bb53, Bb52, Bb62, Bb63, Bb60, Bb61, Bb59, Bb58, bRESPOPUP, bListSU, Bb54
Changes since 1.18: +11 -0 lines
File MIME type: text/x-pascal
検索中のフォームのクローズでのキャンセル処理追加。
ログ検索フォームを消さずに、終了したときのAccesViolation対策

1 unit Search;
2
3 interface
4
5 uses
6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7 Dialogs, StdCtrls, ExtCtrls, ComCtrls,
8 BoardGroup, GikoSystem, bmRegExp, YofUtils;
9
10 type
11 TSearchDialog = class(TForm)
12 BoardListView: TListView;
13 BoardLabel: TLabel;
14 OkBotton: TButton;
15 CancelBotton: TButton;
16 Label1: TLabel;
17 SearchComboBox: TComboBox;
18 CategoryListView: TListView;
19 AllReleaseButton: TButton;
20 AllSelectButton: TButton;
21 GroupBox1: TGroupBox;
22 NameCheckBox: TCheckBox;
23 MailCheckBox: TCheckBox;
24 IDCheckBox: TCheckBox;
25 SentenceCheckBox: TCheckBox;
26 RegExpCheckBox: TCheckBox;
27 GoogleCheckBox: TCheckBox;
28 FuzzyCharDicCheckBox: TCheckBox;
29 BoardsProgressBar: TProgressBar;
30 procedure FormCreate(Sender: TObject);
31 procedure CategoryListViewSelectItem(Sender: TObject; Item: TListItem;
32 Selected: Boolean);
33 procedure BoardListViewChange(Sender: TObject; Item: TListItem;
34 Change: TItemChange);
35 procedure AllSelectButtonClick(Sender: TObject);
36 procedure AllReleaseButtonClick(Sender: TObject);
37 procedure OkBottonClick(Sender: TObject);
38 procedure BoardListViewDblClick(Sender: TObject);
39 procedure CancelBottonClick(Sender: TObject);
40 procedure BoardListViewResize(Sender: TObject);
41 procedure FormDestroy(Sender: TObject);
42 procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
43 private
44 { Private 鐃緒申鐃緒申 }
45 FChkItem: TObject;
46 FRegItem: TThreadItem;
47 FCancel: Boolean;
48 procedure SetCategoryList;
49 procedure SetBoardList(Item: TListItem);
50 procedure CheckItem(Item: TObject);
51 procedure OnMatch(Sender: TObject; LineInfo: RE_LineInfo_t);
52 procedure SearchLogs( Reg: TGrep );
53 procedure SearchLog(Reg: TGrep; Item: TThreadItem);
54 function CountBoards : Integer;
55 public
56 { Public 鐃緒申鐃緒申 }
57 // constructor Create(AOwner: TComponent); overload; override;
58 constructor Create(AOwner: TComponent; ChkItem: TObject); virtual; //overload;
59 end;
60
61 var
62 SearchDialog: TSearchDialog;
63
64 implementation
65
66 uses Giko;
67
68 {$R *.dfm}
69
70 {constructor TSearchDialog.Create(AOwner: TComponent);
71 begin
72 Create(AOwner, nil);
73 end;}
74
75 constructor TSearchDialog.Create(AOwner: TComponent; ChkItem: TObject);
76 begin
77 inherited Create(AOwner);
78 FChkItem := ChkItem;
79 FCancel := false;
80 end;
81
82 procedure TSearchDialog.FormCreate(Sender: TObject);
83 begin
84 SetCategoryList;
85 CheckItem(FChkItem);
86 end;
87
88 procedure TSearchDialog.CategoryListViewSelectItem(Sender: TObject;
89 Item: TListItem; Selected: Boolean);
90 begin
91 if not Selected then Exit;
92 SetBoardList(Item);
93 end;
94
95 procedure TSearchDialog.SetCategoryList;
96 var
97 i, j, k: integer;
98 Item: TListItem;
99 bbs : TBBS;
100 begin
101 Item := CategoryListView.Items.Add;
102 Item.Caption := '鐃?鐃緒申鐃緒申鐃緒申鐃?';
103 Item.Data := nil;
104 for k := 0 to Length( BBSs ) - 1 do begin
105 bbs := BBSs[ k ];
106 for i := 0 to bbs.Count - 1 do begin
107 Item := CategoryListView.Items.Add;
108 Item.Caption := bbs.Items[i].Title;
109 Item.Data := bbs.Items[i];
110 for j := 0 to bbs.Items[i].Count - 1 do
111 bbs.Items[i].Items[j].BoolData := False;
112 end;
113 end;
114 end;
115
116 procedure TSearchDialog.SetBoardList(Item: TListItem);
117 var
118 i, j, k: Integer;
119 NewItem: TListItem;
120 Category: TCategory;
121 bbs : TBBS;
122 begin
123 BoardListView.Clear;
124 if Item.Data = nil then begin
125 for k := 0 to Length( BBSs ) - 1 do begin
126 bbs := BBSs[ k ];
127 for i := 0 to bbs.Count - 1 do begin
128 Category := bbs.Items[i];
129 for j := 0 to Category.Count - 1 do begin
130 NewItem := BoardListView.Items.Add;
131 NewItem.Caption := Category.Items[j].Title;
132 NewItem.Checked := Category.Items[j].BoolData;
133 NewItem.Data := Category.Items[j];
134 end;
135 end;
136 end;
137 end else if TObject(Item.Data) is TCategory then begin
138 Category := TCategory(Item.Data);
139 for i := 0 to Category.Count - 1 do begin
140 NewItem := BoardListView.Items.Add;
141 NewItem.Caption := Category.Items[i].Title;
142 NewItem.Checked := Category.Items[i].BoolData;
143 NewItem.Data := Category.Items[i];
144 end;
145 end;
146 end;
147
148 procedure TSearchDialog.CheckItem(Item: TObject);
149 var
150 i: Integer;
151 Category: TCategory;
152 Board: TBoard;
153 begin
154 if Item is TCategory then begin
155 Category := TCategory(Item);
156 for i := 0 to CategoryListView.Items.Count - 1 do begin
157 if TObject(CategoryListView.Items[i].Data) is TCategory then
158 if TCategory(CategoryListView.Items[i].Data) = Category then begin
159 CategoryListView.Items[i].Selected := True;
160 CategoryListView.Items[i].MakeVisible(False);
161 end;
162 end;
163 AllSelectButtonClick( nil );
164 end else if Item is TBoard then begin
165 Board := TBoard(Item);
166 Category := Board.ParentCategory;
167 Board.BoolData := True;
168 for i := 0 to CategoryListView.Items.Count - 1 do begin
169 if TObject(CategoryListView.Items[i].Data) is TCategory then begin
170 if TCategory(CategoryListView.Items[i].Data) = Category then begin
171 CategoryListView.Items[i].Selected := True;
172 CategoryListView.Items[i].MakeVisible(False);
173 end;
174 end;
175 end;
176 end else begin
177 // 鐃?(鐃緒申鐃緒申鐃緒申)鐃?鐃緒申鐃?鐃?鐃?鐃?
178 CategoryListView.Items[0].Selected := True;
179 CategoryListView.Items[0].MakeVisible(False);
180 AllSelectButtonClick( nil );
181 end;
182 end;
183
184 procedure TSearchDialog.BoardListViewChange(Sender: TObject;
185 Item: TListItem; Change: TItemChange);
186 var
187 Board: TBoard;
188 begin
189 if TObject(Item.Data) is TBoard then begin
190 Board := TBoard(Item.Data);
191 Board.BoolData := Item.Checked;
192 end;
193 end;
194
195 procedure TSearchDialog.AllSelectButtonClick(Sender: TObject);
196 var
197 i: Integer;
198 //Board: TBoard;
199 begin
200 for i := 0 to BoardListView.Items.Count - 1 do begin
201 if TObject(BoardListView.Items[i].Data) is TBoard then begin
202 //Board := TBoard(BoardListView.Items[i].Data);
203 BoardListView.Items[i].Checked := True;
204 end;
205 end;
206 end;
207
208 procedure TSearchDialog.AllReleaseButtonClick(Sender: TObject);
209 var
210 i: Integer;
211 //Board: TBoard;
212 begin
213 for i := 0 to BoardListView.Items.Count - 1 do begin
214 if TObject(BoardListView.Items[i].Data) is TBoard then begin
215 //Board := TBoard(BoardListView.Items[i].Data);
216 BoardListView.Items[i].Checked := False;
217 end;
218 end;
219 end;
220
221 procedure TSearchDialog.OnMatch(Sender: TObject; LineInfo: RE_LineInfo_t);
222 begin
223
224 // 鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃?鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
225 BoardListView.AddItem( FRegItem.Title, FRegItem );
226 // 鐃緒申鐃緒申鐃?鐃?鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
227 TGrep( Sender ).Cancel := True;
228
229 end;
230
231 procedure TSearchDialog.OkBottonClick(Sender: TObject);
232 var
233 i : Integer;
234 // i, j, k, l: Integer;
235 // Category: TCategory;
236 // Board: TBoard;
237 // ThreadItem: TThreadItem;
238 List: TList;
239 //sl: TStringList;
240 SearchWord: string;
241 Reg: TGrep;
242 Filter: string;
243 oldText: string;
244 // bbs : TBBS;
245 begin
246 // grep 鐃緒申鐃緒申鐃?鐃?鐃緒申鐃?鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
247 AllSelectButton.Enabled := False;
248 AllReleaseButton.Enabled := False;
249 OkBotton.Enabled := False;
250 CancelBotton.Enabled := true;
251 FCancel := false;
252 CategoryListView.Enabled := False;
253
254 Screen.Cursor := crHourglass;
255 //sl := TStringList.Create;
256 List := TList.Create;
257
258 Reg := TGrep.Create( nil );
259 try
260 // 鐃?鐃緒申鐃?鐃緒申鐃?鐃?鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
261 BoardsProgressBar.Max := CountBoards;
262 BoardsProgressBar.Position := 0;
263 BoardsProgressBar.Visible := True;
264
265 if Length( SearchComboBox.Text ) > 0 then
266 begin
267 // ComboBox 鐃緒申鐃緒申鐃?鐃緒申鐃?鐃?
268 oldText := SearchComboBox.Text;
269 i := GikoSys.Setting.SelectTextList.IndexOf( oldText );
270 if i <> -1 then
271 GikoSys.Setting.SelectTextList.Delete( i );
272 i := SearchComboBox.Items.IndexOf( oldText );
273 if i <> -1 then
274 SearchComboBox.Items.Delete( i );
275 GikoSys.Setting.SelectTextList.Insert( 0, oldText );
276 SearchComboBox.Items.Insert( 0, oldText );
277 SearchComboBox.Text := oldText;
278
279 BoardListView.Clear;
280 Application.ProcessMessages;
281 // grep 鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃?鐃緒申鐃緒申鐃緒申
282 Reg.OnMatch := OnMatch;
283 Reg.UseFuzzyCharDic := FuzzyCharDicCheckBox.Checked;
284
285 If RegExpCheckBox.Checked Then
286 SearchWord := SearchComboBox.Text
287 Else
288 SearchWord := RegExpEncode( SearchComboBox.Text );
289
290 If NameCheckBox.Checked And
291 MailCheckBox.Checked And
292 IDCheckBox.Checked And
293 SentenceCheckBox.Checked Then
294 Begin
295 // 鐃?鐃緒申鐃?鐃?鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃緒申鐃緒申鐃緒申
296 // (鐃緒申鐃?鐃?鐃緒申鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃緒申鐃緒申鐃緒申)
297 Reg.RegExp := SearchWord;
298 End Else Begin
299 If NameCheckBox.Checked Then
300 Filter := '.*' + SearchWord + '.*<>'
301 Else
302 Filter := '.*<>';
303 If MailCheckBox.Checked Then
304 Filter := Filter + '.*' + SearchWord + '.*<>'
305 Else
306 Filter := Filter + '.*<>';
307 If IDCheckBox.Checked Then
308 Filter := Filter + '.*' + SearchWord + '.*<>'
309 Else
310 Filter := Filter + '.*<>';
311 If SentenceCheckBox.Checked Then
312 Filter := Filter + '.*' + SearchWord + '.*<>\n'
313 Else
314 Filter := Filter + '.*<>\n';
315
316 Reg.RegExp := Filter;
317 End;
318
319 // 鐃?鐃?鐃?鐃緒申鐃緒申鐃緒申 (鐃緒申鐃緒申)
320 SearchLogs(Reg);
321 end;
322 finally
323 //鐃?鐃緒申鐃?鐃緒申鐃?鐃?鐃?鐃緒申鐃?鐃緒申
324 BoardsProgressBar.Visible := False;
325 //sl.Free;
326 List.Free;
327 Screen.Cursor := crDefault;
328 Reg.Free;
329
330 // 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃緒申
331 AllSelectButton.Enabled := True;
332 AllReleaseButton.Enabled := True;
333 OkBotton.Enabled := True;
334 CategoryListView.Enabled := True;
335 CancelBotton.Enabled := false;
336 end;
337 end;
338 //! 鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃緒申鐃?鐃?鐃緒申鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
339 procedure TSearchDialog.SearchLogs( Reg: TGrep );
340 var
341 i, j, k, l : Integer;
342 bbs : TBBS;
343 Category: TCategory;
344 Board: TBoard;
345 begin
346 // 鐃?鐃?鐃?鐃緒申鐃緒申鐃緒申 (鐃緒申鐃緒申)
347 try
348 // 鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申 (鐃緒申鐃緒申)
349 for l := 0 to Length( BBSs ) - 1 do begin
350 bbs := BBSs[ l ];
351 for i := 0 to bbs.Count - 1 do begin
352 // 鐃?鐃?鐃?鐃緒申鐃緒申鐃緒申鐃緒申 (鐃緒申鐃緒申)
353 Category := bbs.Items[i];
354 for j := 0 to Category.Count - 1 do begin
355 // 鐃緒申鐃緒申鐃緒申鐃緒申 (鐃緒申鐃緒申)
356 Board := Category.Items[j];
357 if Board.BoolData then begin
358 if not Board.IsThreadDatRead then
359 GikoSys.ReadSubjectFile(Board);
360 for k := 0 to Board.Count - 1 do begin
361 // 鐃緒申鐃?鐃緒申鐃?鐃緒申鐃?鐃?鐃緒申 (鐃緒申鐃緒申)
362 SearchLog(Reg, Board.Items[k]);
363 end;
364 BoardsProgressBar.StepIt;
365 end;
366
367 end;
368 end;
369 end;
370 except
371 on E:Exception do ShowMessage(E.Message)
372 end;
373 end;
374 //! 鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃?鐃緒申鐃?鐃緒申鐃緒申
375 function TSearchDialog.CountBoards : Integer;
376 var
377 i, j, l : Integer;
378 bbs : TBBS;
379 Category: TCategory;
380 Board: TBoard;
381 begin
382 Result := 0;
383 // 鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申 (鐃緒申鐃緒申)
384 for l := 0 to Length( BBSs ) - 1 do begin
385 bbs := BBSs[ l ];
386 for i := 0 to bbs.Count - 1 do begin
387 // 鐃?鐃?鐃?鐃緒申鐃緒申鐃緒申鐃緒申 (鐃緒申鐃緒申)
388 Category := bbs.Items[i];
389 for j := 0 to Category.Count - 1 do begin
390 // 鐃緒申鐃緒申鐃緒申鐃緒申 (鐃緒申鐃緒申)
391 Board := Category.Items[j];
392 if Board.BoolData then begin
393 Inc(Result);
394 end;
395 end;
396 end;
397 end;
398 end;
399 //! 鐃緒申鐃?鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃緒申鐃?鐃?鐃緒申鐃緒申鐃?鐃?鐃?鐃?鐃緒申鐃緒申鐃緒申鐃緒申
400 procedure TSearchDialog.SearchLog(Reg: TGrep; Item: TThreadItem);
401 begin
402 // 鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃?
403 if (Item.IsLogFile) and (FileExists( Item.GetThreadFileName )) then begin
404 try
405 // 鐃緒申鐃緒申
406 // 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申 OnMatch 鐃緒申鐃緒申鐃緒申
407 FRegItem := Item;
408 // GrepByReg鐃緒申鐃緒申鐃緒申Application.ProcessMessage鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
409 Reg.GrepByRegExp( Item.GetThreadFileName )
410 except
411 end;
412 if FCancel then raise Exception.Create('鐃緒申鐃?鐃緒申鐃緒申鐃緒申鐃緒申鐃?鐃緒申鐃緒申鐃緒申');
413 end;
414 end;
415 procedure TSearchDialog.BoardListViewDblClick(Sender: TObject);
416 begin
417
418 If TObject( BoardListView.Selected.Data ) is TThreadItem Then
419 GikoForm.InsertBrowserTab( TThreadItem(BoardListView.Selected.Data) );
420
421 BringToFront;
422 end;
423
424 procedure TSearchDialog.CancelBottonClick(Sender: TObject);
425 begin
426 TGrep(Sender).Cancel := true;
427 FCancel := true;
428 end;
429
430 procedure TSearchDialog.BoardListViewResize(Sender: TObject);
431 begin
432
433 BoardListView.Column[ 0 ].Width := BoardListView.ClientWidth;
434
435 end;
436
437 procedure TSearchDialog.FormDestroy(Sender: TObject);
438 begin
439 if (BoardListView <> nil) then begin
440 BoardListView.Clear;
441 end;
442 if (CategoryListView <> nil) then begin
443 CategoryListView.Clear;
444 end;
445 end;
446
447 procedure TSearchDialog.FormCloseQuery(Sender: TObject;
448 var CanClose: Boolean);
449 begin
450 if (BoardsProgressBar.Visible) then begin
451 TGrep(Sender).Cancel := true;
452 FCancel := true;
453 Application.ProcessMessages;
454 end;
455 end;
456
457 end.

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26