OSDN Git Service

8d071114ae27585ed43dc5a7d345721e0a7a0fd4
[winbottle/winbottle.git] / bottleclient / SettingForm.pas
1 unit SettingForm;
2
3 {
4   \90Ý\92è\89æ\96Ê\81B\82»\82ê\96¢\96\9e\82Å\82à\82»\82ê\88È\8fã\82Å\82à\82È\82¢\81B
5   Pref\83I\83u\83W\83F\83N\83g\82ð\8eÀ\8dÛ\82É\91\80\8dì\82·\82é\81B
6 }
7
8 interface
9
10 uses
11   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
12   ComCtrls, StdCtrls, ExtCtrls, BottleDef, Spin,
13   CPCConfigTreeView, ColorSettingFrame, BottleChainListFrame, SakuraSeekerInstance,
14   ImgList, StrListEditor, SppList, Plugins, Clipbrd, SsPlayTime, StrUtils;
15
16 type
17   TfrmSetting = class(TForm)
18     PageControl: TPageControl;
19     btnClose: TButton;
20     tstGeneral: TTabSheet;
21     tstDisplay: TTabSheet;
22     tstKeys: TTabSheet;
23     rgpWhenReturn: TRadioGroup;
24     rgpWhenShiftReturn: TRadioGroup;
25     rgpWhenCtrlReturn: TRadioGroup;
26     memDefaultScript: TMemo;
27     lblDefaultScript: TLabel;
28     tstReceive: TTabSheet;
29     OpenDialog: TOpenDialog;
30     spnWaitScriptEnd: TSpinEdit;
31     lblWaitScriptEnd: TLabel;
32     cbxNoSendGhostList: TCheckBox;
33     cbxConfirmOnExit: TCheckBox;
34     ctvBottle: TCPCConfigTreeView;
35     gbxColor: TGroupBox;
36     frmColorSetting: TfrmColorSetting;
37     tstRule: TTabSheet;
38     frmRuleList: TfrmBottleChainList;
39     tstDetailed: TTabSheet;
40     lblFMOName: TLabel;
41     memFMOName: TMemo;
42     tstChannel: TTabSheet;
43     lblAutoJoinChannels: TLabel;
44     memAutoJoinChannels: TMemo;
45     cbxAutoStart: TCheckBox;
46     btnUseCurrentJoinChannels: TButton;
47     ImageList: TImageList;
48     tstSurfacePreview: TTabSheet;
49     lblSurfacePreview: TLabel;
50     lvwPluginList: TListView;
51     lblPluginList: TLabel;
52     ctvSurfacePreview: TCPCConfigTreeView;
53     btnVisibleGhosts: TButton;
54     cbxHideGhosts: TCheckBox;
55     cbxNoExtraSSTPHeaders: TCheckBox;
56     lblLUID: TLabel;
57     edtLUID: TEdit;
58     cbxShowRuler: TCheckBox;
59     rgpTabPosition: TRadioGroup;
60     lblGhostDropDownCount: TLabel;
61     spnGhostDropDownCount: TSpinEdit;
62     cbxIgnoreTimeCritical: TCheckBox;
63     cbxAutoClip: TCheckBox;
64     btnCopyLUID: TButton;
65     tvwCategory: TTreeView;
66     Label1: TLabel;
67     pnlHeading: TPanel;
68     cbxConfirmOnTabClose: TCheckBox;
69     tstConnection: TTabSheet;
70     grpProxy: TGroupBox;
71     lblProxyAddress: TLabel;
72     lblProxyPort: TLabel;
73     Label6: TLabel;
74     edtProxyAddress: TEdit;
75     edtProxyPort: TEdit;
76     cbxUseHttpProxy: TCheckBox;
77     spnReconnectWait: TSpinEdit;
78     lblReconnectWait: TLabel;
79     lblPartialConfirmFormat: TLabel;
80     edtPartialConfirmFormat: TEdit;
81     cbxAutoPartialConfirm: TCheckBox;
82     tstPlayTime: TTabSheet;
83     grpPlayTimeParams: TGroupBox;
84     lblPlayTimeProfile: TLabel;
85     cbxPlayTimeProfile: TComboBox;
86     spnCostDBWhiteSpace: TSpinEdit;
87     spnCostWhiteSpace: TSpinEdit;
88     spnCostDBChar: TSpinEdit;
89     spnCostWait: TSpinEdit;
90     spnCostSurface: TSpinEdit;
91     spnCostChar: TSpinEdit;
92     spnCostQuickChar: TSpinEdit;
93     lblCostWait: TLabel;
94     lblCostSurface: TLabel;
95     lblCostChar: TLabel;
96     lblCostDBChar: TLabel;
97     lblCostWhiteSpace: TLabel;
98     lblCostDBWhiteSpace: TLabel;
99     lblCostQuickChar: TLabel;
100     btnSavePlayTimeProfile: TButton;
101     procedure FormClose(Sender: TObject; var Action: TCloseAction);
102     procedure edtProxyPortKeyPress(Sender: TObject; var Key: Char);
103     procedure ctvBottleNodeChecked(Sender: TObject;
104       Node: TCPCConfigItemNode);
105     procedure ctvBottleNodeChecking(Sender: TObject;
106       Node: TCPCConfigItemNode; var Allow: Boolean);
107     procedure tstRuleShow(Sender: TObject);
108     procedure btnUseCurrentJoinChannelsClick(Sender: TObject);
109     procedure btnVisibleGhostsClick(Sender: TObject);
110     procedure lvwPluginListDblClick(Sender: TObject);
111     procedure edtLUIDEnter(Sender: TObject);
112     procedure edtLUIDExit(Sender: TObject);
113     procedure btnCopyLUIDClick(Sender: TObject);
114     procedure FormCreate(Sender: TObject);
115     procedure tvwCategoryChange(Sender: TObject; Node: TTreeNode);
116     procedure tvwCategoryMouseMove(Sender: TObject; Shift: TShiftState; X,
117       Y: Integer);
118     procedure cbxPlayTimeProfileChange(Sender: TObject);
119     procedure btnSavePlayTimeProfileClick(Sender: TObject);
120     procedure spnCostWaitChange(Sender: TObject);
121   private
122     { Private \90é\8c¾ }
123     FOldLUID: String;
124     FSpinUpdateFlag: boolean;
125     procedure LoadPlayTimeProfiles;
126     procedure PlayTimeParamsToControl(Params: TSsPlayTimeParams);
127     procedure ControlToPlayTimeParams(Params: TSsPlayTimeParams);
128   public
129     { Public \90é\8c¾ }
130     procedure Execute;
131   end;
132
133 var
134   frmSetting: TfrmSetting;
135
136 const
137   DefaultNode = -1;
138   ChannelDefaultGhost = '(\83`\83\83\83\93\83l\83\8b\90\84\8f§\83S\81[\83X\83g)';
139   CheckedBottle = 22;
140   UnCheckedBottle = 17;
141
142 implementation
143
144 {$R *.DFM}
145
146 const
147   SettingIcon = 4;
148
149 procedure TfrmSetting.Execute;
150 var i: integer;
151     Node: TCPCGroupNode;
152 begin
153   PageControl.ActivePage := tstGeneral;
154   memDefaultScript.Text := Pref.DefaultScript;
155   cbxShowRuler.Checked := Pref.ShowRuler;
156   cbxIgnoreTimeCritical.Checked := Pref.IgnoreTimeCritical;
157   cbxNoSendGhostList.Checked := Pref.NoSendGhostList;
158   edtPartialConfirmFormat.Text := Pref.PartialConfirmFormat;
159   cbxAutoPartialConfirm.Checked := Pref.AutoPartialConfirm;
160   cbxConfirmOnExit.Checked := Pref.ConfirmOnExit;
161   cbxConfirmOnTabClose.Checked := Pref.ConfirmOnTabClose;
162   cbxAutoClip.Checked := Pref.AutoClip;
163   //
164   with frmColorSetting do begin
165     Color['H'] := Pref.TalkColorH;
166     Color['U'] := Pref.TalkColorU;
167     Color['Synchro'] := Pref.TalkColorS;
168     Color['Tag'] := Pref.MarkUpColor;
169     Color['Meta'] := Pref.MetaWordColor;
170     Color['Error'] := Pref.MarkErrorColor;
171     Color['Background'] := Pref.BgColor;
172   end;
173   //
174   cbxPlayTimeProfile.Items.Clear;
175   cbxPlayTimeProfile.Items.Add(Pref.PlayTimeParams.ProfileName);
176   cbxPlayTimeProfile.ItemIndex := 0;
177   LoadPlayTimeProfiles;
178   PlayTimeParamsToControl(Pref.PlayTimeParams);
179   //
180   cbxAutoStart.Checked := Pref.AutoStart;
181   rgpTabPosition.ItemIndex := Ord(Pref.TabPosition);
182   spnGhostDropDownCount.Value := Pref.GhostDropDownCount;
183   try
184     with ctvBottle do begin
185       (GetNodeFromKeyPath('Arrive\NoTranslate') as TCPCCheckBoxNode).Checked := Pref.NoTranslate;
186       (GetNodeFromKeyPath('Arrive\NoDescript') as TCPCCheckBoxNode).Checked := Pref.NoDescript;
187       if Pref.NoTransUrl then
188         (GetNodeFromKeyPath('Arrive\UrlTag\NoSelection') as TCPCRadioNode).Check
189       else
190         (GetNodeFromKeyPath('Arrive\UrlTag\WithSelection') as TCPCRadioNode).Check;
191       (GetNodeFromKeyPath('Arrive\SilentWhenHidden') as TCPCCheckBoxNode).Checked := Pref.SilentWhenHidden;
192       (GetNodeFromKeyPath('Arrive\FixMessySurface') as TCPCCheckBoxNode).Checked := Pref.FixMessySurface;
193       (GetNodeFromKeyPath('Arrive\HUTagTo01Tag') as TCPCCheckBoxNode).Checked := Pref.HUTagTo01Tag;
194       (GetNodeFromKeyPath('Out\ResetIfGhostAfterSend') as TCPCCheckBoxNode).Checked := Pref.ResetIfGhostAfterSend;
195       (GetNodeFromKeyPath('Out\ClearAfterSend') as TCPCCheckBoxNode).Checked := Pref.ClearAfterSend;
196       (GetNodeFromKeyPath('Out\NeedConfirmBeforeSend') as TCPCCheckBoxNode).Checked := Pref.NeedConfirmBeforeSend;
197       (GetNodeFromKeyPath('Out\Confirm') as TCPCCheckBoxNode).Checked := not Pref.NoConfirm;
198       (GetNodeFromKeyPath('Out\Warn\ScopeChangeInSynchronize') as TCPCCheckBoxNode).Checked := Pref.WarnScopeChangeInSynchronize;
199       (GetNodeFromKeyPath('Out\Warn\YenTNotExist') as TCPCCheckBoxNode).Checked := Pref.WarnYenTNotExist;
200     end;
201   except
202     on E: Exception do ShowMessage(E.Message);
203   end;
204   //cbxIgnoreFrequentYenS.Checked := Pref.IgnoreFrequentYenS;
205   spnWaitScriptEnd.Value := Pref.WaitScriptEnd;
206   //
207   rgpWhenReturn.ItemIndex := Ord(Pref.WhenReturn);
208   rgpWhenShiftReturn.ItemIndex := Ord(Pref.WhenShiftReturn);
209   rgpWhenCtrlReturn.ItemIndex := Ord(Pref.WhenCtrlReturn);
210   //
211   cbxUseHttpProxy.Checked := Pref.UseHttpProxy;
212   edtProxyAddress.Text := Pref.ProxyAddress;
213   edtProxyPort.Text := IntToStr(Pref.ProxyPort);
214   //
215   spnReconnectWait.Value := Pref.ReconnectWait;
216   //
217   edtLUID.Text := Pref.LUID;
218   //
219   memFMOName.Lines := Pref.FMOName;
220   cbxHideGhosts.Checked := Pref.HideGhosts;
221   memAutoJoinChannels.Lines := Pref.AutoJoinChannels;
222   cbxNoExtraSSTPHeaders.Checked := Pref.NoExtraSSTPHeaders;
223   //
224   with ctvSurfacePreview do
225   begin
226     (GetNodeFromKeyPath('OnHint\DoPreview') as TCPCCheckBoxNode).Checked := Pref.SurfacePreviewOnHint;
227     (GetNodeFromKeyPath('OnScriptPoint\DoPreview') as TCPCCheckBoxNode).Checked := Pref.SurfacePreviewOnScriptPoint;
228     Node := GetNodeFromKeyPath('OnScriptPoint\Position') as TCPCGroupNode;
229     (Node.Item[Ord(Pref.SurfacePreviewOnScriptPointPosition)] as TCPCRadioNode).Check;
230   end;
231   for i := 0 to Spps.Count-1 do
232   begin
233     with lvwPluginList.Items.Add do
234     begin
235       Caption := ExtractFileName(Spps.SppItem[i].ModuleName);
236       SubItems.Add(Spps.SppItem[i].PluginName);
237     end;
238   end;
239   //
240   ShowModal;
241 end;
242
243 procedure TfrmSetting.FormClose(Sender: TObject; var Action: TCloseAction);
244 var i: integer;
245     Node: TCPCGroupNode;
246 begin
247   Pref.DefaultScript := memDefaultScript.Text;
248   Pref.ShowRuler := cbxShowRuler.Checked;
249   Pref.IgnoreTimeCritical := cbxIgnoreTimeCritical.Checked;
250   Pref.NoSendGhostList := cbxNoSendGhostList.Checked;
251   Pref.PartialConfirmFormat := edtPartialConfirmFormat.Text;
252   Pref.AutoPartialConfirm := cbxAutoPartialConfirm.Checked;
253   Pref.ConfirmOnExit := cbxConfirmOnExit.Checked;
254   Pref.ConfirmOnTabClose := cbxConfirmOnTabClose.Checked;
255   Pref.AutoClip := cbxAutoClip.Checked;
256   //
257   with frmColorSetting do begin
258     Pref.TalkColorH := Color['H'];
259     Pref.TalkColorU := Color['U'];
260     Pref.TalkColorS := Color['Synchro'];
261     Pref.MarkUpColor := Color['Tag'];
262     Pref.MetaWordColor := Color['Meta'];
263     Pref.MarkErrorColor := Color['Error'];
264     Pref.BgColor := Color['Background'];
265   end;
266   //
267   Pref.PlayTimeParams.ProfileName := cbxPlayTimeProfile.Text;
268   ControlToPlayTimeParams(Pref.PlayTimeParams);
269   //
270   Pref.AutoStart := cbxAutoStart.Checked;
271   Pref.TabPosition := TTabPosition(rgpTabPosition.ItemIndex);
272   Pref.GhostDropDownCount := spnGhostDropDownCount.Value;
273   try
274     with ctvBottle do begin
275       Pref.NoTranslate := (GetNodeFromKeyPath('Arrive\NoTranslate') as TCPCCheckBoxNode).Checked;
276       Pref.NoDescript := (GetNodeFromKeyPath('Arrive\NoDescript') as TCPCCheckBoxNode).Checked;
277       Pref.NoTransUrl := (GetNodeFromKeyPath('Arrive\UrlTag\NoSelection') as TCPCRadioNode).Checked;
278       Pref.SilentWhenHidden := (GetNodeFromKeyPath('Arrive\SilentWhenHidden') as TCPCCheckBoxNode).Checked;
279       Pref.FixMessySurface := (GetNodeFromKeyPath('Arrive\FixMessySurface') as TCPCCheckBoxNode).Checked;
280       Pref.HUTagTo01Tag := (GetNodeFromKeyPath('Arrive\HUTagTo01Tag') as TCPCCheckBoxNode).Checked;
281       Pref.ResetIfGhostAfterSend := (GetNodeFromKeyPath('Out\ResetIfGhostAfterSend') as TCPCCheckBoxNode).Checked;
282       Pref.ClearAfterSend := (GetNodeFromKeyPath('Out\ClearAfterSend') as TCPCCheckBoxNode).Checked;
283       Pref.NeedConfirmBeforeSend := (GetNodeFromKeyPath('Out\NeedConfirmBeforeSend') as TCPCCheckBoxNode).Checked;
284       Pref.NoConfirm := not (GetNodeFromKeyPath('Out\Confirm') as TCPCCheckBoxNode).Checked;
285       Pref.WarnYenTNotExist := (GetNodeFromKeyPath('Out\Warn\YenTNotExist') as TCPCCheckBoxNode).Checked;
286       Pref.WarnScopeChangeInSynchronize := (GetNodeFromKeyPath('Out\Warn\ScopeChangeInSynchronize') as TCPCCheckBoxNode).Checked;
287     end;
288   except
289     on E: Exception do ShowMessage(E.Message);
290   end;
291   //Pref.IgnoreFrequentYenS := cbxIgnoreFrequentYenS.Checked;
292   Pref.WaitScriptEnd := spnWaitScriptEnd.Value;
293   //
294   Pref.WhenReturn := TReturnKeyFunction(rgpWhenReturn.ItemIndex);
295   Pref.WhenShiftReturn := TReturnKeyFunction(rgpWhenShiftReturn.ItemIndex);
296   Pref.WhenCtrlReturn := TReturnKeyFunction(rgpWhenCtrlReturn.ItemIndex);
297   //
298   Pref.UseHttpProxy := cbxUseHttpProxy.Checked;
299   Pref.ProxyAddress := edtProxyAddress.Text;
300   Pref.ProxyPort := StrToInt(edtProxyPort.Text);
301   //
302   Pref.ReconnectWait := spnReconnectWait.Value;
303   //
304   Pref.LUID := edtLUID.Text;
305   //
306   Pref.FMOName := memFMOName.Lines;
307   SakuraSeeker.FileMappingTarget := Pref.FMOName;
308   Pref.HideGhosts := cbxHideGhosts.Checked;
309   Pref.NoExtraSSTPHeaders := cbxNoExtraSSTPHeaders.Checked;
310   //
311   Pref.AutoJoinChannels := memAutoJoinChannels.Lines;
312   //
313   with ctvSurfacePreview do
314   begin
315     Pref.SurfacePreviewOnHint := (GetNodeFromKeyPath('OnHint\DoPreview') as TCPCCheckBoxNode).Checked;
316     Pref.SurfacePreviewOnScriptPoint := (GetNodeFromKeyPath('OnScriptPoint\DoPreview') as TCPCCheckBoxNode).Checked;
317     Node := GetNodeFromKeyPath('OnScriptPoint\Position') as TCPCGroupNode;
318     for i := 0 to Node.Count-1 do
319       if (Node.Item[i] as TCPCRadioNode).Checked then
320         Pref.SurfacePreviewOnScriptPointPosition := TSurfacePreviewOnScriptPointPosition(i);
321   end;
322 end;
323
324 procedure TfrmSetting.edtProxyPortKeyPress(Sender: TObject; var Key: Char);
325 begin
326   if not(Key in ['0'..'9']) then Key := Char(0);
327 end;
328
329 procedure TfrmSetting.ctvBottleNodeChecked(Sender: TObject;
330   Node: TCPCConfigItemNode);
331 begin
332   //ShowMessage(ctvBottle.GetFullKeyPath(Node));
333 end;
334
335 procedure TfrmSetting.ctvBottleNodeChecking(Sender: TObject;
336   Node: TCPCConfigItemNode; var Allow: Boolean);
337 begin
338   if Node.KeyName = 'IgnoreBottle' then begin
339     MessageDlg('\82±\82Ì\8b@\94\\82Í\8eÀ\91\95\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ', mtError, [mbOk], 0);
340     Allow := false;
341   end;
342 end;
343
344 procedure TfrmSetting.tstRuleShow(Sender: TObject);
345 begin
346   frmRuleList.UpdateDisplay;
347 end;
348
349 procedure TfrmSetting.btnUseCurrentJoinChannelsClick(Sender: TObject);
350 begin
351   memAutoJoinChannels.Lines := JoinChannels;
352 end;
353
354 procedure TfrmSetting.btnVisibleGhostsClick(Sender: TObject);
355 var i: integer;
356     FullGhosts: TStringList;
357 begin
358   FullGhosts := TStringList.Create;
359   SakuraSeeker.BeginDetect;
360   try
361     for i := 0 to SakuraSeeker.Count-1 do
362       FullGhosts.Add(SakuraSeeker[i].Name);
363     StrListEdit(Pref.VisibleGhostsList, '\83S\81[\83X\83g\82ð\8ew\92è', true, FullGhosts);
364   finally
365     FullGhosts.Free;
366   end;
367 end;
368
369 procedure TfrmSetting.lvwPluginListDblClick(Sender: TObject);
370 var Index: integer;
371 begin
372   if lvwPluginList.Selected = nil then
373     Exit;
374   Index := lvwPluginList.Selected.Index;
375   if pfConfigure in Spps.SppItem[Index].PluginFunctions then
376     Spps.SppItem[Index].Configure
377   else
378     ShowMessage('\92Ç\89Á\82Ì\90Ý\92è\8d\80\96Ú\82Í\82 \82è\82Ü\82¹\82ñ\81B');
379 end;
380
381 procedure TfrmSetting.edtLUIDEnter(Sender: TObject);
382 begin
383   FOldLUID := edtLUID.Text;
384 end;
385
386 procedure TfrmSetting.edtLUIDExit(Sender: TObject);
387 var TmpLUID: String;
388     i: integer;
389     Err: boolean;
390 begin
391   TmpLUID := edtLUID.Text;
392   i := 1;
393   Err := false;
394   if Length(TmpLUID) <> 82 then
395     Err := true
396   else
397     while i <= Length(TmpLUID) do
398     begin
399       if not (TmpLUID[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '.', ',']) then
400       begin
401         Err := true;
402         Break;
403       end;
404       Inc(i);
405     end;
406   if Err then
407   begin
408     ShowMessage('LUID\82Ì\93à\97e\82ª\95s\90³\82Å\82·');
409     edtLUID.Text := FOldLUID;
410   end;
411 end;
412
413 procedure TfrmSetting.btnCopyLUIDClick(Sender: TObject);
414 begin
415   Clipboard.SetTextBuf(PChar(edtLUID.Text));
416 end;
417
418 procedure TfrmSetting.FormCreate(Sender: TObject);
419 var
420   i: integer;
421   Cap: String;
422   Node: TTreeNode;
423 begin
424   for i := 0 to PageControl.PageCount-1 do
425   begin
426     Cap := PageControl.Pages[i].Caption;
427     if Pos(':', Cap) > 0 then
428       Cap := Copy(Cap, 1, Pos(':', Cap)-1);
429     Node := tvwCategory.Items.Add(nil, Cap);
430     Node.ImageIndex := -1;
431     Node.SelectedIndex := SettingIcon;
432   end;
433   tvwCategoryChange(Self, tvwCategory.Items[0]);
434   tvwCategory.Items[0].Selected := true;
435 end;
436
437 procedure TfrmSetting.tvwCategoryChange(Sender: TObject; Node: TTreeNode);
438 begin
439   PageControl.ActivePageIndex := Node.Index;
440   pnlHeading.Caption := PageControl.ActivePage.Caption;
441 end;
442
443 procedure TfrmSetting.tvwCategoryMouseMove(Sender: TObject;
444   Shift: TShiftState; X, Y: Integer);
445 var
446   Node: TTreeNode;
447   NewHint: String;
448   CPos: TPoint;
449 begin
450   Node := tvwCategory.GetNodeAt(X, Y);
451   if Node <> nil then
452   begin
453     NewHint := PageControl.Pages[Node.Index].Caption;
454     if tvwCategory.Hint <> NewHint then
455     begin
456       tvwCategory.Hint := NewHint;
457       GetCursorPos(CPos);
458       Application.ActivateHint(CPos);
459     end;
460   end else
461   begin
462     tvwCategory.Hint := '';
463     Application.HideHint;
464   end;
465 end;
466
467 procedure TfrmSetting.PlayTimeParamsToControl(Params: TSsPlayTimeParams);
468 begin
469   FSpinUpdateFlag := true;
470   with Params do
471   begin
472     spnCostWait.Value         := CostWait;
473     spnCostSurface.Value      := CostSurface;
474     spnCostChar.Value         := CostChar;
475     spnCostDBChar.Value       := CostDBChar;
476     spnCostWhiteSpace.Value   := CostWhiteSpace;
477     spnCostDBWhiteSpace.Value := CostDBWhiteSpace;
478     spnCostQuickChar.Value    := CostQuickChar;
479   end;
480   FSpinUpdateFlag := false;
481 end;
482
483 procedure TfrmSetting.ControlToPlayTimeParams(Params: TSsPlayTimeParams);
484 begin
485   with Params do
486   begin
487     CostWait         := spnCostWait.Value;
488     CostSurface      := spnCostSurface.Value;
489     CostChar         := spnCostChar.Value;
490     CostDBChar       := spnCostDBChar.Value;
491     CostWhiteSpace   := spnCostWhiteSpace.Value;
492     CostDBWhiteSpace := spnCostDBWhiteSpace.Value;
493     CostQuickChar    := spnCostQuickChar.Value;
494   end;
495 end;
496
497
498 procedure TfrmSetting.LoadPlayTimeProfiles;
499 var i: integer;
500     F: TSearchRec;
501     Path, Item: String;
502 begin
503   Path := ExtractFilePath(Application.ExeName);
504   i := FindFirst(Path + 'playtime\*.txt', 0, F);
505   if i = 0 then begin
506     repeat
507       Item := ChangeFileExt(F.Name, '');
508       if cbxPlayTimeProfile.Items.IndexOf(Item) < 0 then
509         cbxPlayTimeProfile.Items.Add(ChangeFileExt(F.Name, ''));
510       i := FindNext(F);
511     until i <> 0;
512   end;
513   FindClose(F);
514 end;
515
516 procedure TfrmSetting.cbxPlayTimeProfileChange(Sender: TObject);
517 var
518   Params: TSsPlayTimeParams;
519   Strs: TStringList;
520   Path, ProName: String;
521 begin
522   try
523     Strs := TStringList.Create;
524     ProName := cbxPlayTimeProfile.Text;
525     try
526       Path := ExtractFilePath(Application.ExeName) + 'playtime\';
527       Strs.LoadFromFile(Path + ProName + '.txt');
528       Params := StringToComponent(Strs.Text) as TSsPlayTimeParams;
529       try
530         PlayTimeParamsToControl(Params);
531       finally
532         Params.Free;
533       end;
534     finally
535       Strs.Free;
536     end;
537     with cbxPlayTimeProfile do
538     begin
539       Items.Clear;
540       LoadPlayTimeProfiles;
541       ItemIndex := Items.IndexOf(ProName);
542     end;
543   except
544     ; // Do nothing
545   end;
546 end;
547
548 procedure TfrmSetting.btnSavePlayTimeProfileClick(Sender: TObject);
549 var
550   ProfileName, Path, FileName: String;
551   Strs: TStringList;
552   TmpParams: TSsPlayTimeParams;
553 begin
554   ProfileName := cbxPlayTimeProfile.Text;
555   if InputQuery('\83v\83\8d\83t\83@\83C\83\8b\96¼', '\95Û\91\82·\82é\83v\83\8d\83t\83@\83C\83\8b\96¼', ProfileName) then
556   begin
557     try
558       Path := ExtractFilePath(Application.ExeName) + 'playtime\';
559       FileName := Path + ProfileName + '.txt';
560       if FileExists(FileName) then
561         if MessageDlg(Format('\83v\83\8d\83t\83@\83C\83\8b"%s"\82ð\8fã\8f\91\82«\82µ\82Ü\82·', [ProfileName]),
562           mtConfirmation, mbOkCancel, 0) = mrCancel then
563           Exit;
564       Strs := TStringList.Create;
565       try
566         TmpParams := TSsPlayTimeParams.Create(nil);
567         try
568           ControlToPlayTimeParams(TmpParams);
569           TmpParams.ProfileName := ProfileName;
570           Strs.Text := ComponentToString(TmpParams);
571           Strs.SaveToFile(FileName);
572         finally
573           TmpParams.Free;
574         end;
575       finally
576         Strs.Free;
577       end;
578       with cbxPlayTimeProfile do
579       begin
580         Items.Clear;
581         Items.Add(ProfileName);
582         ItemIndex := 0;
583         LoadPlayTimeProfiles;
584       end;
585     except
586       on E: Exception do
587         ShowMessage('\95Û\91\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B' + E.Message);
588     end;
589   end;
590 end;
591
592 procedure TfrmSetting.spnCostWaitChange(Sender: TObject);
593 var
594   ProName: String;
595 const
596   Modified = '(\95Ï\8dX\8dÏ\82Ý)';
597 begin
598   if FSpinUpdateFlag then
599     Exit;
600   if RightBStr(cbxPlayTimeProfile.Text, Length(Modified)) <> Modified then
601   begin
602     ProName := Format('%s%s', [cbxPlayTimeProfile.Text, Modified]);
603     with cbxPlayTimeProfile do
604     begin
605       Items.Clear;
606       Items.Add(ProName);
607       ItemIndex := 0;
608       LoadPlayTimeProfiles;
609     end;
610   end;
611 end;
612
613 end.