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 //
\83t
\83@
\83C
\83\8b\82Ì
\91¶
\8dÝ
\82ð
\8am
\94F
124 if FileExists(FilePath) then begin
125 ini := TMemIniFile.Create(FilePath);
126 sections := TStringList.Create;
127 keys := TStringList.Create;
129 ini.ReadSections(sections);
131 for i :=0 to sections.Count - 1 do begin
133 ini.ReadSection(sections[i], keys);
134 for j := 0 to keys.Count - 1 do begin
135 resWord := TResistWord.Create;
136 resWord.SetCategory(sections[i]);
137 resWord.SetKey(keys[j]);
138 resWord.SetText(ini.ReadString(sections[i], keys[j], ''));
139 FDictionary.AddObject(resWord.GetKey, resWord);
147 if FSorted Then begin
148 FDictionary.CustomSort(KeySort);
156 //!
\8ew
\92è
\82³
\82ê
\82½
\83p
\83X
\82Ì
\83t
\83@
\83C
\83\8b\82É
\95Û
\91¶
\82·
\82é
157 procedure TInputAssistDM.SaveToFile(FilePath: String);
161 resWord : TResistWord;
163 if FileExists(FilePath) then begin
165 SysUtils.DeleteFile(FilePath);
170 ini := TMemIniFile.Create(FilePath);
172 for i :=0 to FDictionary.Count - 1 do begin
173 resWord := TResistWord(FDictionary.Objects[i]);
174 ini.WriteString(resWord.FCategory, resWord.FKey, resWord.FText);
181 //!
\83f
\83X
\83g
\83\89\83N
\83^
182 procedure TInputAssistDM.DataModuleDestroy(Sender: TObject);
186 if (FDictionary <> nil) then begin
187 for i := FDictionary.Count - 1 downto 0 do begin
188 TResistWord(FDictionary.Objects[i]).Free;
191 FDictionary.Capacity := 0;
195 //!
\83R
\83\93\83X
\83g
\83\89\83N
\83^
196 procedure TInputAssistDM.DataModuleCreate(Sender: TObject);
198 FDictionary := TStringList.Create;
199 FDictionary.Sorted := False;
202 //!
\93o
\98^
\92P
\8cê
\90\94\8eæ
\93¾
203 function TInputAssistDM.ResistWordCount : Integer;
206 if (FDictionary <> nil) then begin
207 Result := FDictionary.Count;
210 //!
\93o
\98^
\92P
\8cê
\8eæ
\93¾
211 function TInputAssistDM.GetResistWord(Index: Integer): TResistWord;
214 if (FDictionary <> nil) then begin
215 if (Index >= 0) and (Index < FDictionary.Count) then begin
216 Result := TResistWord(FDictionary.Objects[index]);
220 //!
\93o
\98^
\92P
\8cê
\82Ì
\8dí
\8f\9c
221 procedure TInputAssistDM.DeleteResistWord(ResistWord: TResistWord);
225 if (FDictionary <> nil) then begin
226 for i := 0 to FDictionary.Count - 1 do begin
227 if (ResistWord = FDictionary.Objects[i]) then begin
228 TResistWord(FDictionary.Objects[i]).Free;
229 FDictionary.Delete(i);
233 if FSorted Then begin
234 FDictionary.CustomSort(KeySort);
238 //!
\93o
\98^
\92P
\8cê
\92Ç
\89Á
239 function TInputAssistDM.Add(Key: String): TResistWord;
241 resWord : TResistWord;
244 if (FDictionary <> nil) then begin
245 resWord := TResistWord.Create;
247 resWord.SetCategory('
\83J
\83e
\83S
\83\8a');
248 resWord.SetText('
\92è
\8c^
\95¶');
249 FDictionary.AddObject(Key, resWord);
251 if FSorted Then begin
252 FDictionary.CustomSort(KeySort);
256 //!
\93o
\98^
\92P
\8cê
\82Ì
\83L
\81[
\95Ï
\8dX
257 procedure TInputAssistDM.ChangeKey(ResistWord: TResistWord);
261 if (FDictionary <> nil) then begin
262 for i := 0 to FDictionary.Count - 1 do begin
263 if (ResistWord = FDictionary.Objects[i]) then begin
264 FDictionary.Strings[i] := ResistWord.GetKey;
268 if FSorted Then begin
269 FDictionary.CustomSort(KeySort);
274 //! Key
\82ð
\8e\9d\82Â
\93o
\98^
\82³
\82ê
\82Ä
\82¢
\82é
\92P
\8cê
\82ð
\8eæ
\93¾
275 function TInputAssistDM.GetStartWithKeyResistWords(Key: String; var list: TStringList): Integer;
278 resWord : TResistWord;
282 if (FDictionary <> nil) and (list <> nil) then begin
283 Key := ZenToHan(Key);
284 for i := 0 to FDictionary.Count - 1 do begin
285 if (AnsiPos(Key, ZenToHan(FDictionary.Strings[i])) = 1) then begin
287 resWord := TResistWord(FDictionary.Objects[i]);
288 list.AddObject(resWord.GetKey + '(' +
289 resWord.GetCategory + ')', resWord);
290 end else if (Result > 0) then begin
291 //
\83\
\81[
\83g
\82³
\82ê
\82Ä
\82¢
\82é
\82©
\82ç
\81A
\83q
\83b
\83g
\82·
\82ê
\82Î
\98A
\91±
\82·
\82é
\82Í
\82¸
297 //! Key
\82ð
\83J
\83e
\83S
\83\8a\82É
\8e\9d\82Â
\93o
\98^
\82³
\82ê
\82Ä
\82¢
\82é
\92P
\8cê
\82ð
\8eæ
\93¾
298 function TInputAssistDM.GetStartWithCategoryResistWords(Key: String; var list: TStringList): Integer;
301 resWord : TResistWord;
304 if (FDictionary <> nil) and (list <> nil) then begin
305 Key := ZenToHan(Key);
306 for i := 0 to FDictionary.Count - 1 do begin
307 resWord := TResistWord(FDictionary.Objects[i]);
308 if (AnsiPos(Key, ZenToHan(resWord.GetCategory)) = 1) then begin
310 list.AddObject(resWord.GetKey + '(' +
311 resWord.GetCategory + ')', resWord);
314 list.CustomSort(CategorySort);
318 //!
\83\
\81[
\83g
\82Ì
\8fó
\91Ô
\82Ì
\8eæ
\93¾
319 function TInputAssistDM.GetSorted: Boolean;
323 //!
\83\
\81[
\83g
\8fó
\91Ô
\82Ì
\90Ý
\92è
324 procedure TInputAssistDM.SetSorted(Value: Boolean);
326 if (not FSorted) and (Value) then begin
327 FDictionary.CustomSort(KeySort);
331 //! Key
\82Ì
\83J
\83e
\83S
\83\8a\82É
\93o
\98^
\82³
\82ê
\82Ä
\82¢
\82é
\92P
\8cê
\82ð
\8eæ
\93¾
332 function TInputAssistDM.GetCategoryResistWords(Key: String; var list: TStringList): Integer;
335 resWord : TResistWord;
338 if (FDictionary <> nil) and (list <> nil) then begin
339 for i := 0 to FDictionary.Count - 1 do begin
340 resWord := TResistWord(FDictionary.Objects[i]);
341 if (Key = resWord.GetCategory) then begin
343 list.AddObject(resWord.GetKey + '(' +
344 resWord.GetCategory + ')', resWord);
347 list.CustomSort(CategorySort);
351 //!
\93o
\98^
\8dÏ
\82Ý
\83L
\81[
\82Ì
\91S
\82Ä
\82Ì
\83J
\83e
\83S
\83\8a\83\8a\83X
\83g
\8eæ
\93¾
352 procedure TInputAssistDM.GetCategoryList(var list: TStringList);
356 if (FDictionary <> nil) and (list <> nil) then begin
357 //
\8fd
\95¡
\83`
\83F
\83b
\83N
\82ðTStringList
\82Ì
\8b@
\94\
\82Å
\8ds
\82¤
359 list.Duplicates := dupIgnore;
362 for i := 0 to FDictionary.Count - 1 do begin
363 list.Add(TResistWord(FDictionary.Objects[i]).GetCategory);
369 //! 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
370 function CategorySort(List: TStringList; Index1, Index2: Integer): Integer;
372 resWord1 : TResistWord;
373 resWord2 : TResistWord;
377 resWord1 := TResistWord(List.Objects[Index1]);
378 resWord2 := TResistWord(List.Objects[Index2]);
379 Result := CompareStr(ZenToHan(resWord1.GetCategory),
380 ZenToHan(resWord2.GetCategory));
381 if (Result = 0) then begin
382 Result := CompareStr(ZenToHan(resWord1.GetKey),
383 ZenToHan(resWord2.GetKey));
388 //! 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
389 function KeySort(List: TStringList; Index1, Index2: Integer): Integer;
391 resWord1 : TResistWord;
392 resWord2 : TResistWord;
396 resWord1 := TResistWord(List.Objects[Index1]);
397 resWord2 := TResistWord(List.Objects[Index2]);
398 Result := CompareStr(ZenToHan(resWord1.FKey),
399 ZenToHan(resWord2.FKey));
400 if (Result = 0) then begin
401 Result := CompareStr(ZenToHan(resWord1.GetCategory),
402 ZenToHan(resWord2.GetCategory));
407 //!
\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
408 function TInputAssistDM.IsDupulicate(Key: String; Category: String): Boolean;
412 //
\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é
414 if (FDictionary <> nil) then begin
415 for i := 0 to FDictionary.Count - 1 do begin
416 if (Key = FDictionary.Strings[i]) and
417 (Category = TResistWord(FDictionary.Objects[i]).GetCategory)