1 unit InputAssistDataModule;
6 SysUtils, Classes, Windows;
11 TInputAssistDM = class(TDataModule)
12 procedure DataModuleDestroy(Sender: TObject);
13 procedure DataModuleCreate(Sender: TObject);
17 FDictionary : TStringList; ///<
\93o
\98^
\92P
\8cê
\82Æ
\92è
\8c^
\95¶
\82Ì
\8e«
\8f\91
19 function GetSorted: Boolean; ///<
\83\
\81[
\83g
\82Ì
\8fó
\91Ô
\82Ì
\8eæ
\93¾
20 procedure SetSorted(Value: Boolean); ///<
\83\
\81[
\83g
\8fó
\91Ô
\82Ì
\90Ý
\92è
24 property Sorted : Boolean read GetSorted write SetSorted;
25 procedure Init(FilePath: String);
26 procedure SaveToFile(FilePath: String);
27 function ResistWordCount : Integer; ///<
\93o
\98^
\92P
\8cê
\90\94\8eæ
\93¾
28 function GetResistWord(Index: Integer): TResistWord; ///<
\93o
\98^
\92P
\8cê
\8eæ
\93¾
29 procedure DeleteResistWord(ResistWord: TResistWord); ///<
\93o
\98^
\92P
\8cê
\82Ì
\8dí
\8f\9c
30 function Add(Key: String): TResistWord; ///<
\93o
\98^
\92P
\8cê
\92Ç
\89Á
31 procedure ChangeKey(ResistWord: TResistWord); ///<
\93o
\98^
\92P
\8cê
\82Ì
\83L
\81[
\95Ï
\8dX
32 //! Key
\82ð
\83L
\81[
\82É
\8e\9d\82Â
\93o
\98^
\82³
\82ê
\82Ä
\82¢
\82é
\92P
\8cê
\82ð
\8eæ
\93¾
33 function GetStartWithKeyResistWords(Key: String; var list: TStringList): Integer;
34 //! Key
\82ð
\83J
\83e
\83S
\83\8a\82É
\8e\9d\82Â
\93o
\98^
\82³
\82ê
\82Ä
\82¢
\82é
\92P
\8cê
\82ð
\8eæ
\93¾
35 function GetStartWithCategoryResistWords(Key: String; var list: TStringList): Integer;
36 //! Key
\82Ì
\83J
\83e
\83S
\83\8a\82É
\93o
\98^
\82³
\82ê
\82Ä
\82¢
\82é
\92P
\8cê
\82ð
\8eæ
\93¾
37 function GetCategoryResistWords(Key: String; var list: TStringList): Integer;
38 //!
\93o
\98^
\8dÏ
\82Ý
\83L
\81[
\82Ì
\91S
\82Ä
\82Ì
\83J
\83e
\83S
\83\8a\83\8a\83X
\83g
\8eæ
\93¾
39 procedure GetCategoryList(var list: TStringList);
40 //!
\8aù
\82É
\93o
\98^
\8dÏ
\82Ý
\82Ì
\83L
\81[
\82Æ
\83J
\83e
\83S
\83\8a\82Ì
\83Z
\83b
\83g
\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
41 function IsDupulicate(Key: String; Category: String): Boolean;
45 TResistWord = class(TObject)
47 FKey : String; ///<
\95Ï
\8a·
\8e\9e\82Ì
\83L
\81[
\82É
\82È
\82é
48 FCategory : String; ///<
\95ª
\97Þ
49 FText : String; ///<
\92è
\8c^
\95¶
51 function GetKey: String;
52 procedure SetKey(Value: String);
53 function GetCategory: String;
54 procedure SetCategory(Value: String);
55 function GetText: String;
56 procedure SetText(Value: String);
57 property Key: String read FKey write FKey;
58 property Category: String read FCategory write FCategory;
59 property Text: String read GetText write SetText;
62 function CategorySort(List: TStringList; Index1, Index2: Integer): Integer;
63 function KeySort(List: TStringList; Index1, Index2: Integer): Integer;
65 InputAssistDM: TInputAssistDM;
73 //! FKey
\82É
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82é
\92l
\82ð
\8eæ
\93¾
\82·
\82é
74 function TResistWord.GetKey: String;
76 //
\83G
\83X
\83P
\81[
\83v
\82µ
\82Ä
\82¢
\82é=
\82ð
\95\9c\8c³
\82·
\82é
77 Result := MojuUtils.CustomStringReplace(FKey, '=', '=');
79 //! FKey
\82É
\92l
\82ð
\90Ý
\92è
\82·
\82é
80 procedure TResistWord.SetKey(Value: String);
82 //=
\82Í
\95Û
\91¶
\8e\9e\82É
\8eg
\82¤
\82Ì
\82Å
\83G
\83X
\83P
\81[
\83v
\82·
\82é
83 FKey := MojuUtils.CustomStringReplace(Value, '=', '=');
85 //! FCategory
\82É
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82é
\92l
\82ð
\8eæ
\93¾
\82·
\82é
86 function TResistWord.GetCategory: String;
88 //
\83G
\83X
\83P
\81[
\83v
\82µ
\82Ä
\82¢
\82é=
\82ð
\95\9c\8c³
\82·
\82é
89 Result := MojuUtils.CustomStringReplace(FCategory, '=', '=');
91 //! FCategory
\82É
\92l
\82ð
\90Ý
\92è
\82·
\82é
92 procedure TResistWord.SetCategory(Value: String);
94 //=
\82Í
\95Û
\91¶
\8e\9e\82É
\8eg
\82¤
\82Ì
\82Å
\83G
\83X
\83P
\81[
\83v
\82·
\82é
95 FCategory := MojuUtils.CustomStringReplace(Value, '=', '=');
97 //! FText
\82É
\90Ý
\92è
\82³
\82ê
\82Ä
\82¢
\82é
\92l
\82ð
\8eæ
\93¾
\82·
\82é
98 function TResistWord.GetText: String;
100 //
\83G
\83X
\83P
\81[
\83v
\82µ
\82Ä
\82¢
\82é=
\82ð
\95\9c\8c³
\82·
\82é
101 Result := MojuUtils.CustomStringReplace(FText, '=', '=');
102 // #1
\82É
\82µ
\82½
\89ü
\8ds
\83R
\81[
\83h
\82ð#13#10
\82É
\95\9c\8c³
\82·
\82é
103 Result := MojuUtils.CustomStringReplace(Result, #1, #13#10);
105 procedure TResistWord.SetText(Value: String);
107 //=
\82Í
\95Û
\91¶
\8e\9e\82É
\8eg
\82¤
\82Ì
\82Å
\83G
\83X
\83P
\81[
\83v
\82·
\82é
108 FText := MojuUtils.CustomStringReplace(Value, '=', '=');
109 //
\89ü
\8ds
\83R
\81[
\83h
\82ð#1
\82É
\82·
\82é
\81i1
\8ds
\82É
\82·
\82é
\82½
\82ß)
110 FText := MojuUtils.CustomStringReplace(FText, #13#10, #1);
112 //!
\83t
\83@
\83C
\83\8b\82ð
\93Ç
\82Ý
\8d\9e\82ñ
\82Å
\8f\89\8aú
\89»
\82·
\82é
113 procedure TInputAssistDM.Init(FilePath: String);
116 sections: TStringList;
119 resWord : TResistWord;
123 // ini
\83t
\83@
\83C
\83\8b\82ª
\96³
\82¯
\82ê
\82Î
\81A
\83f
\83t
\83H
\83\8b\83g
\82ð
\83\8a\83l
\81[
\83\80\82·
\82é
124 if not FileExists(FilePath) then begin
126 PChar(ChangeFileExt(FilePath, '.default')),
127 PChar(FilePath), True);
130 //
\83t
\83@
\83C
\83\8b\82Ì
\91¶
\8dÝ
\82ð
\8am
\94F
131 if FileExists(FilePath) then begin
132 ini := TMemIniFile.Create(FilePath);
133 sections := TStringList.Create;
134 keys := TStringList.Create;
136 ini.ReadSections(sections);
138 for i :=0 to sections.Count - 1 do begin
140 ini.ReadSection(sections[i], keys);
141 for j := 0 to keys.Count - 1 do begin
142 resWord := TResistWord.Create;
143 resWord.SetCategory(sections[i]);
144 resWord.SetKey(keys[j]);
145 resWord.SetText(ini.ReadString(sections[i], keys[j], ''));
146 FDictionary.AddObject(resWord.GetKey, resWord);
154 if FSorted Then begin
155 FDictionary.CustomSort(KeySort);
163 //!
\8ew
\92è
\82³
\82ê
\82½
\83p
\83X
\82Ì
\83t
\83@
\83C
\83\8b\82É
\95Û
\91¶
\82·
\82é
164 procedure TInputAssistDM.SaveToFile(FilePath: String);
168 resWord : TResistWord;
170 if FileExists(FilePath) then begin
172 SysUtils.DeleteFile(FilePath);
177 ini := TMemIniFile.Create(FilePath);
179 for i :=0 to FDictionary.Count - 1 do begin
180 resWord := TResistWord(FDictionary.Objects[i]);
181 ini.WriteString(resWord.FCategory, resWord.FKey, resWord.FText);
188 //!
\83f
\83X
\83g
\83\89\83N
\83^
189 procedure TInputAssistDM.DataModuleDestroy(Sender: TObject);
193 if (FDictionary <> nil) then begin
194 for i := FDictionary.Count - 1 downto 0 do begin
195 TResistWord(FDictionary.Objects[i]).Free;
198 FDictionary.Capacity := 0;
202 //!
\83R
\83\93\83X
\83g
\83\89\83N
\83^
203 procedure TInputAssistDM.DataModuleCreate(Sender: TObject);
205 FDictionary := TStringList.Create;
206 FDictionary.Sorted := False;
209 //!
\93o
\98^
\92P
\8cê
\90\94\8eæ
\93¾
210 function TInputAssistDM.ResistWordCount : Integer;
213 if (FDictionary <> nil) then begin
214 Result := FDictionary.Count;
217 //!
\93o
\98^
\92P
\8cê
\8eæ
\93¾
218 function TInputAssistDM.GetResistWord(Index: Integer): TResistWord;
221 if (FDictionary <> nil) then begin
222 if (Index >= 0) and (Index < FDictionary.Count) then begin
223 Result := TResistWord(FDictionary.Objects[index]);
227 //!
\93o
\98^
\92P
\8cê
\82Ì
\8dí
\8f\9c
228 procedure TInputAssistDM.DeleteResistWord(ResistWord: TResistWord);
232 if (FDictionary <> nil) then begin
233 for i := 0 to FDictionary.Count - 1 do begin
234 if (ResistWord = FDictionary.Objects[i]) then begin
235 TResistWord(FDictionary.Objects[i]).Free;
236 FDictionary.Delete(i);
240 if FSorted Then begin
241 FDictionary.CustomSort(KeySort);
245 //!
\93o
\98^
\92P
\8cê
\92Ç
\89Á
246 function TInputAssistDM.Add(Key: String): TResistWord;
248 resWord : TResistWord;
251 if (FDictionary <> nil) then begin
252 resWord := TResistWord.Create;
254 resWord.SetCategory('
\83J
\83e
\83S
\83\8a');
255 resWord.SetText('
\92è
\8c^
\95¶');
256 FDictionary.AddObject(Key, resWord);
258 if FSorted Then begin
259 FDictionary.CustomSort(KeySort);
263 //!
\93o
\98^
\92P
\8cê
\82Ì
\83L
\81[
\95Ï
\8dX
264 procedure TInputAssistDM.ChangeKey(ResistWord: TResistWord);
268 if (FDictionary <> nil) then begin
269 for i := 0 to FDictionary.Count - 1 do begin
270 if (ResistWord = FDictionary.Objects[i]) then begin
271 FDictionary.Strings[i] := ResistWord.GetKey;
275 if FSorted Then begin
276 FDictionary.CustomSort(KeySort);
281 //! Key
\82ð
\8e\9d\82Â
\93o
\98^
\82³
\82ê
\82Ä
\82¢
\82é
\92P
\8cê
\82ð
\8eæ
\93¾
282 function TInputAssistDM.GetStartWithKeyResistWords(Key: String; var list: TStringList): Integer;
285 resWord : TResistWord;
289 if (FDictionary <> nil) and (list <> nil) then begin
290 Key := ZenToHan(Key);
291 for i := 0 to FDictionary.Count - 1 do begin
292 if (AnsiPos(Key, ZenToHan(FDictionary.Strings[i])) = 1) then begin
294 resWord := TResistWord(FDictionary.Objects[i]);
295 list.AddObject(resWord.GetKey + '(' +
296 resWord.GetCategory + ')', resWord);
297 end else if (Result > 0) then begin
298 //
\83\
\81[
\83g
\82³
\82ê
\82Ä
\82¢
\82é
\82©
\82ç
\81A
\83q
\83b
\83g
\82·
\82ê
\82Î
\98A
\91±
\82·
\82é
\82Í
\82¸
304 //! Key
\82ð
\83J
\83e
\83S
\83\8a\82É
\8e\9d\82Â
\93o
\98^
\82³
\82ê
\82Ä
\82¢
\82é
\92P
\8cê
\82ð
\8eæ
\93¾
305 function TInputAssistDM.GetStartWithCategoryResistWords(Key: String; var list: TStringList): Integer;
308 resWord : TResistWord;
311 if (FDictionary <> nil) and (list <> nil) then begin
312 Key := ZenToHan(Key);
313 for i := 0 to FDictionary.Count - 1 do begin
314 resWord := TResistWord(FDictionary.Objects[i]);
315 if (AnsiPos(Key, ZenToHan(resWord.GetCategory)) = 1) then begin
317 list.AddObject(resWord.GetKey + '(' +
318 resWord.GetCategory + ')', resWord);
321 list.CustomSort(CategorySort);
325 //!
\83\
\81[
\83g
\82Ì
\8fó
\91Ô
\82Ì
\8eæ
\93¾
326 function TInputAssistDM.GetSorted: Boolean;
330 //!
\83\
\81[
\83g
\8fó
\91Ô
\82Ì
\90Ý
\92è
331 procedure TInputAssistDM.SetSorted(Value: Boolean);
333 if (not FSorted) and (Value) then begin
334 FDictionary.CustomSort(KeySort);
338 //! Key
\82Ì
\83J
\83e
\83S
\83\8a\82É
\93o
\98^
\82³
\82ê
\82Ä
\82¢
\82é
\92P
\8cê
\82ð
\8eæ
\93¾
339 function TInputAssistDM.GetCategoryResistWords(Key: String; var list: TStringList): Integer;
342 resWord : TResistWord;
345 if (FDictionary <> nil) and (list <> nil) then begin
346 for i := 0 to FDictionary.Count - 1 do begin
347 resWord := TResistWord(FDictionary.Objects[i]);
348 if (Key = resWord.GetCategory) then begin
350 list.AddObject(resWord.GetKey + '(' +
351 resWord.GetCategory + ')', resWord);
354 list.CustomSort(CategorySort);
358 //!
\93o
\98^
\8dÏ
\82Ý
\83L
\81[
\82Ì
\91S
\82Ä
\82Ì
\83J
\83e
\83S
\83\8a\83\8a\83X
\83g
\8eæ
\93¾
359 procedure TInputAssistDM.GetCategoryList(var list: TStringList);
363 if (FDictionary <> nil) and (list <> nil) then begin
364 //
\8fd
\95¡
\83`
\83F
\83b
\83N
\82ðTStringList
\82Ì
\8b@
\94\
\82Å
\8ds
\82¤
366 list.Duplicates := dupIgnore;
369 for i := 0 to FDictionary.Count - 1 do begin
370 list.Add(TResistWord(FDictionary.Objects[i]).GetCategory);
376 //! Key
\82ð
\83J
\83e
\83S
\83\8a\82É
\8e\9d\82Â
\93o
\98^
\92P
\8cê
\82ð
\95Ô
\82·
\8e\9e\82Ì
\83\
\81[
\83g
\97p
\94ä
\8ar
\83\81\83\
\83b
\83h
377 function CategorySort(List: TStringList; Index1, Index2: Integer): Integer;
379 resWord1 : TResistWord;
380 resWord2 : TResistWord;
384 resWord1 := TResistWord(List.Objects[Index1]);
385 resWord2 := TResistWord(List.Objects[Index2]);
386 Result := CompareStr(ZenToHan(resWord1.GetCategory),
387 ZenToHan(resWord2.GetCategory));
388 if (Result = 0) then begin
389 Result := CompareStr(ZenToHan(resWord1.GetKey),
390 ZenToHan(resWord2.GetKey));
395 //! Key
\82ð
\91S
\94¼
\8ap
\96³
\8e\8b\82Ì
\8c`
\82Å
\83\
\81[
\83g
\82·
\82é
\8dÛ
\82Ì
\94ä
\8ar
\83\81\83\
\83b
\83h
396 function KeySort(List: TStringList; Index1, Index2: Integer): Integer;
398 resWord1 : TResistWord;
399 resWord2 : TResistWord;
403 resWord1 := TResistWord(List.Objects[Index1]);
404 resWord2 := TResistWord(List.Objects[Index2]);
405 Result := CompareStr(ZenToHan(resWord1.FKey),
406 ZenToHan(resWord2.FKey));
407 if (Result = 0) then begin
408 Result := CompareStr(ZenToHan(resWord1.GetCategory),
409 ZenToHan(resWord2.GetCategory));
414 //!
\8aù
\82É
\93o
\98^
\8dÏ
\82Ý
\82Ì
\83L
\81[
\82Æ
\83J
\83e
\83S
\83\8a\82Ì
\83Z
\83b
\83g
\82©
\82Ç
\82¤
\82©
\83`
\83F
\83b
\83N
415 function TInputAssistDM.IsDupulicate(Key: String; Category: String): Boolean;
418 // resWord : TResistWord;
420 //
\82±
\82Ì
\83\81\83\
\83b
\83h
\82Å
\82Í
\81A
\83\
\81[
\83g
\8dÏ
\82Ý
\82Æ
\82Í
\8cÀ
\82ç
\82È
\82¢
\82Ì
\82Å
\81A
\91S
\82Ä
\82Ì
\83L
\81[
\82ð
\92T
\8dõ
\82µ
\82Ä
\82¢
\82é
422 if (FDictionary <> nil) then begin
423 for i := 0 to FDictionary.Count - 1 do begin
424 if (Key = FDictionary.Strings[i]) and
425 (Category = TResistWord(FDictionary.Objects[i]).GetCategory)