6 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
7 Dialogs, StdCtrls, ComCtrls, ExtCtrls, ToolWin, Menus, OleCtrls, Registry,
15 ActiveX, {HTTPApp,} YofUtils, IniFiles, StrUtils,
16 GikoSystem, GikoUtil, ImgList, Clipbrd, BoardGroup,
17 IdAntiFreezeBase, IdAntiFreeze, IdBaseComponent, IdComponent,
18 IdTCPConnection, IdTCPClient, IdHTTP, ActnList, StdActns, IdIntercept,
19 IdLogBase, IdLogDebug, IdException, DateUtils, bmRegExp,
20 Gesture, AppEvnts, SambaTimer;
23 // TSetLayeredWindowAttributes = function(wnd: HWND; crKey: DWORD; bAlpha: BYTE; dwFlag: DWORD): Boolean; stdcall;
24 //
\8f\91\82«
\8d\9e\82Ý
\96ß
\82è
\92l
\83^
\83C
\83v
25 TGikoResultType = (grtOK, grtCookie, grtCheck, grtError);
27 TEditorForm = class(TForm)
30 PostMessage: TMenuItem;
31 SaveMessage: TMenuItem;
34 StatusBar: TStatusBar;
35 EditorPage: TPageControl;
37 PreviewTab: TTabSheet;
45 ToolBarImageList: TImageList;
46 HotToobarImageList: TImageList;
47 NameBasePanel: TPanel;
50 NameComboBox: TComboBox;
51 MailComboBox: TComboBox;
53 SendToolButton: TToolButton;
54 OutBoxToolButton: TToolButton;
55 ToolButton5: TToolButton;
56 UndoToolButton: TToolButton;
57 CutToolButton: TToolButton;
58 CopyToolButton: TToolButton;
59 PasteToolButton: TToolButton;
60 ToolButton3: TToolButton;
61 TransToolButton: TToolButton;
62 TopToolButton: TToolButton;
64 IdAntiFreeze: TIdAntiFreeze;
65 ToolButton1: TToolButton;
66 ToolButton2: TToolButton;
67 ActionList: TActionList;
81 SageCheckBox: TCheckBox;
82 IdLogDebug: TIdLogDebug;
85 KotehanCheckBox: TCheckBox;
89 SelectAllAction: TAction;
91 SelectAll1: TMenuItem;
92 QuotePasteAction: TAction;
93 QuotePasteMenuItem: TMenuItem;
95 SpaceToNBSPAction: TAction;
96 AmpToCharRefAction: TAction;
97 SpaceTabnbsp1: TMenuItem;
99 BoardInformationTab: TTabSheet;
100 BoardtopTab: TTabSheet;
101 TitlePictureBrowser: TWebBrowser;
103 BoardInformationMemo: TMemo;
104 GetSETTINGTXTAction: TAction;
106 SETTINGTXT2: TMenuItem;
107 GetTitlePictureAction: TAction;
109 GetHeadTXTAction: TAction;
111 RocalRuleTab: TTabSheet;
112 WebBrowser1: TWebBrowser;
113 CalcCapacityAction: TAction;
116 LocalRule: TMenuItem;
119 LocalRuleBrowse: TMenuItem;
120 ToolButton4: TToolButton;
121 ToolButton6: TToolButton;
122 SaveNameMailAction: TAction;
123 ToolButton7: TToolButton;
124 BeLogInOutEAction: TAction;
125 UpdateSambaAction: TAction;
128 InputAssistAction: TAction;
129 InputAssistPopupMenu: TPopupMenu;
131 ApplicationEvents1: TApplicationEvents;
132 ToolButton8: TToolButton;
133 ToolButton9: TToolButton;
134 ShowInputAssistForm: TAction;
135 ReleaseCookieAction: TAction;
138 procedure EditorPageChange(Sender: TObject);
139 procedure FormCreate(Sender: TObject);
140 procedure BrowserStatusTextChange(Sender: TObject;
141 const Text: WideString);
142 procedure FormClose(Sender: TObject; var Action: TCloseAction);
143 procedure FormDestroy(Sender: TObject);
144 procedure SendActionExecute(Sender: TObject);
145 procedure SaveActionExecute(Sender: TObject);
146 procedure AbortActionExecute(Sender: TObject);
147 procedure CloseActionExecute(Sender: TObject);
148 procedure UndoActionExecute(Sender: TObject);
149 procedure CutActionExecute(Sender: TObject);
150 procedure CopyActionExecute(Sender: TObject);
151 procedure PasteActionExecute(Sender: TObject);
152 procedure SendActionUpdate(Sender: TObject);
153 procedure SaveActionUpdate(Sender: TObject);
154 procedure CloseActionUpdate(Sender: TObject);
155 procedure UndoActionUpdate(Sender: TObject);
156 procedure CutActionUpdate(Sender: TObject);
157 procedure CopyActionUpdate(Sender: TObject);
158 procedure PasteActionUpdate(Sender: TObject);
159 procedure TopActionExecute(Sender: TObject);
160 procedure TopActionUpdate(Sender: TObject);
161 procedure SageCheckBoxClick(Sender: TObject);
162 procedure MailComboBoxChange(Sender: TObject);
163 procedure TransActionExecute(Sender: TObject);
164 procedure TransActionUpdate(Sender: TObject);
165 procedure IdLogDebugReceive(ASender: TIdConnectionIntercept;
167 procedure IdLogDebugSend(ASender: TIdConnectionIntercept;
169 procedure SelectAllActionExecute(Sender: TObject);
170 procedure StatusBarResize(Sender: TObject);
171 procedure FormActivate(Sender: TObject);
172 procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
173 procedure QuotePasteActionExecute(Sender: TObject);
174 procedure SpaceToNBSPActionExecute(Sender: TObject);
175 procedure AmpToCharRefActionExecute(Sender: TObject);
176 procedure BoardTopClick(Sender: TObject);
177 procedure GetSETTINGTXTActionExecute(Sender: TObject);
178 procedure GetTitlePictureActionUpdate(Sender: TObject);
179 procedure GetTitlePictureActionExecute(Sender: TObject);
180 procedure GetHeadTXTActionExecute(Sender: TObject);
181 procedure CalcCapacityActionExecute(Sender: TObject);
182 procedure LocalRuleClick(Sender: TObject);
183 procedure FormDeactivate(Sender: TObject);
184 procedure LocalRuleBrowseClick(Sender: TObject);
185 procedure SaveNameMailActionExecute(Sender: TObject);
186 procedure BeLogInOutEActionExecute(Sender: TObject);
187 procedure BeLogInOutEActionUpdate(Sender: TObject);
188 procedure UpdateSambaActionUpdate(Sender: TObject);
189 procedure UpdateSambaActionExecute(Sender: TObject);
190 procedure InputAssistActionExecute(Sender: TObject);
191 procedure ApplicationEvents1Message(var Msg: tagMSG;
192 var Handled: Boolean);
193 procedure ShowInputAssistFormExecute(Sender: TObject);
194 procedure ReleaseCookieActionExecute(Sender: TObject);
195 procedure GetSETTINGTXTActionUpdate(Sender: TObject);
196 procedure GetHeadTXTActionUpdate(Sender: TObject);
198 FThreadItem: TThreadItem;
200 FNameComboEdit: THandle;
201 FMailComboEdit: THandle;
204 FStatusCode: Integer;
205 FDebugStrReceive: string;
206 FDebugStrSend: string;
208 FGestures : TMouseGesture;
209 FInputAssistKey: String; ///<
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\83L
\81[
210 FResistWords: TStringList; ///<
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\8e«
\8f\91\82©
\82ç
\82Ì
\8c\9f\8dõ
\8c\8b\89Ê
211 FSambaTimer: TSambaTimer; ///< Samba
\91Î
\8dô
\82Ì
\83^
\83C
\83}
\81[
213 function Check: Boolean;
214 procedure SetNameList(sName, sMail: string);
215 procedure Send(const ACOOKIE: string; const SPID: string; const PON: string; FirstWriting: Boolean);
216 function GetActiveControlHandle: THandle;
217 procedure GetSendData(Source: TStringStream);
218 procedure SaveSendFile;
219 procedure SetContent(Content: string; ABrowser: TWebBrowser);
220 function GetResultType(ResponseText: string): TGikoResultType;
221 ///
\96{
\95¶
\82Ì
\8eæ
\93¾
222 function GetBody : string;
223 //IdHttp
\82Ì
\8f\89\8aú
\89»
224 procedure InitIdHTTP(http: TIdHTTP);
225 procedure ShowBoardInformation(ABoard: TBoard; AMemo: TMemo);
226 function GetTitlePictureURL(body: TStringList; ABoard: TBoard): string;
227 procedure ShowTitlePicture();
228 function GetFusianaName(body: TStringList; ABoard: TBoard): String;
229 //!
\83}
\83E
\83X
\83W
\83F
\83X
\83`
\83\83\81[
\8aJ
\8en
230 procedure OnGestureStart(Sender: TObject);
231 //!
\83}
\83E
\83X
\83W
\83F
\83X
\83`
\83\83\81[
\92\86
232 procedure OnGestureMove(Sender: TObject);
233 //!
\83}
\83E
\83X
\83W
\83F
\83X
\83`
\83\83\81[
\8fI
\97¹
234 procedure OnGestureEnd(Sender: TObject);
235 //HEAD.TXT
\8e©
\93®
\95\
\8e¦
236 procedure ShowBoardHead(ABoard: TBoard; AMemo: TMemo);
237 //LocalFusianaTrapAlart
238 function LFusianaGet(const s: String): Boolean;
239 // Cookie
\82Ì
\8eæ
\93¾
240 procedure GetCookie(Rawtext: String; ABoard: TBoard);
241 //!
\93ü
\97Í
\83A
\83V
\83X
\83g
\82Ì
\83|
\83b
\83v
\83A
\83b
\83v
\83\81\83j
\83\85\81[
\82Ì
\83N
\83\8a\83b
\83N
\83C
\83x
\83\93\83g
242 procedure InputAssistMenuClick(Sender: TObject);
243 //! TMemo
\82Ì
\83J
\81[
\83\
\83\8b\88Ê
\92u
\82É
\95¶
\8e\9a\97ñ
\91}
\93ü
244 procedure InsertText(Memo: TMemo; Text: String);
245 //!
\91\97\90M
\92\86\8e~
246 procedure CancelSend(ABoard: TBoard; ASysMenu: HMENU);
247 //! Samba
\83^
\83C
\83}
\81[
\83C
\83x
\83\93\83g
248 procedure SambaTimer(Sender: TObject);
249 //!
\83E
\83B
\83\93\83h
\83E
\82Ì
\88Ê
\92u
\82Æ
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
250 procedure SetWindowRect;
251 //!
\8ag
\92£
\83^
\83u
\90Ý
\92è
252 procedure SetExtraTab;
254 function GetBoard : TBoard;
255 //! URL
\82Ì
\83f
\81[
\83^
\82ðstream
\82É
\8eæ
\82è
\8d\9e\82Þ
256 procedure GetWebData(const URL: string; const RefURL: string;
257 Modified: TDateTime; stream: TStream);
258 //! GikoForm
\82É
\90V
\92\85\83\81\83b
\83Z
\81[
\83W
\82ð
\92Ç
\89Á
\82·
\82é
259 procedure AddFormMessageNew(icon: TGikoMessageIcon);
260 //!
\83\8d\81[
\83J
\83\8bfusiana
\83g
\83\89\83b
\83v
261 function isLocalFusianaTrap: Boolean;
262 //!
\83\8d\81[
\83J
\83\8bfusiana
\83g
\83\89\83b
\83v
263 function isRemoteFusianaTrap: Boolean;
264 //! Header
\95¶
\8e\9a\97ñ
\8eæ
\93¾
265 function getHeaderStr(const ACOOKIE: string; const SPID : string;
266 const PON : string; Board : TBoard) : string;
267 //! fusiana
\8cx
\8d\90\83_
\83C
\83A
\83\8d\83O
268 function FusianaMsgBox: Integer;
270 procedure CreateParams(var Params: TCreateParams); override;
274 procedure SetThreadItem(Item: TThreadItem);
275 procedure SetBoard(Item: TBoard);
276 procedure UpdateSambaStatus;
277 property BBSID: string read FBBSID write FBBSID;
283 Giko, ItemDownload, MojuUtils, IdGlobal, GikoMessage, Imm,
284 InputAssistDataModule, InputAssist, HTMLCreate;
286 CAPTION_NAME_NEW: string = '
\83M
\83R
\83i
\83r
\83X
\83\8c\97§
\82Ä
\83G
\83f
\83B
\83^';
287 CAPTION_NAME_RES: string = '
\83M
\83R
\83i
\83r
\83\8c\83X
\83G
\83f
\83B
\83^';
289 //
\83G
\83f
\83B
\83b
\83g
\83E
\83B
\83\93\83h
\83E
\82ð
\89E
\89º
\82É
\82¸
\82ç
\82µ
\82Ä
\8aJ
\82
\88Ú
\93®
\97Ê
293 //DAX
\82³
\82ñ±Ø¶ÞÄ!(
\81L
\81¤
\81M)
294 READCGI_ERR = '-ERR';
295 READCGI_INCR = '-INCR';
297 READCGI_PARTIAL = '+PARTIAL';
298 READCGI_ERR_FOUND_KAKO = '-ERR
\89ß
\8b\8e\83\8d\83O
\91q
\8cÉ
\82Å
\94
\8c©';
299 READCGI_ERR_NOT_HTML = '-ERR html
\89»
\91Ò
\82¿';
300 READCGI_ERR_NOT_FOUND = '-ERR
\82»
\82ñ
\82È
\94Âor
\83X
\83\8c\83b
\83h
\82È
\82¢
\82Å
\82·
\81B';
301 READCGI_ERR_ABONE = '-ERR
\82Ç
\82±
\82©
\82Å
\82 \82Ú
\81[
\82ñ
\82ª
\82 \82Á
\82½
\82Ý
\82½
\82¢
\82Å
\82·
\81B';
302 READCGI_ERR_TIMEOUT = '-ERR
\8ew
\92è
\8e\9e\8aÔ
\82ª
\89ß
\82¬
\82Ü
\82µ
\82½
\81B';
303 READCGI_ERR_CANTUSE = '-ERR
\82à
\82¤
\81@
\82Â
\82©
\82¦
\82Ü
\82¹
\82ñ';
304 RES2CH_TRUE = '<!-- 2ch_X:true -->';
305 RES2CH_FALSE = '<!-- 2ch_X:false -->';
306 RES2CH_ERROR = '<!-- 2ch_X:error -->';
307 RES2CH_CHECK = '<!-- 2ch_X:check -->';
308 RES2CH_COOKIE = '<!-- 2ch_X:cookie -->';
312 StartPos, EndPos: Integer;
317 {constructor TEditorForm.Create(AOwner: TComponent; Item: TBoard);
319 inherited Create(AOwner);
322 procedure TEditorForm.CreateParams(var Params: TCreateParams);
325 if FormStyle in [fsNormal, fsStayOnTop] then
326 if BorderStyle in [bsSingle, bsSizeable] then begin
327 Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
328 Params.WndParent := 0;
332 {procedure TEditorForm.CreateParams(var Params: TCreateParams);
334 inherited CreateParams(Params);
335 Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
338 procedure TEditorForm.FormCreate(Sender: TObject);
341 FSambaTimer := TSambaTimer.Create(Self);
342 FSambaTimer.Interval := 0;
343 Browser.Navigate('about:blank');
344 TitlePictureBrowser.Navigate('about:blank');
348 //
\83E
\83B
\83\93\83h
\83E
\82Ì
\88Ê
\92u
\90Ý
\92è
351 EditorPage.ActivePage := EditorTab;
352 FNameComboEdit := GetWindow(NameComboBox.Handle, GW_CHILD);
353 FMailComboEdit := GetWindow(MailComboBox.Handle, GW_CHILD);
354 NameComboBox.Items.Assign(GikoSys.Setting.NameList);
355 MailComboBox.Items.Assign(GikoSys.Setting.MailList);
357 //
\94¼
\93§
\96¾
\97\98\97p
\89Â
\94\
\90Ý
\92è
358 TransAction.Enabled := GikoSys.CanUser32DLL;
360 //
\83E
\83B
\83\93\83h
\83E
\82Ì
\83X
\83e
\83C
\8fó
\91Ô
361 if GikoSys.Setting.EditWindowStay then begin //
\83X
\83e
\83C
\8fó
\91Ô
362 SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
363 TopAction.Checked := true;
364 TopToolButton.Down := true;
365 end else begin //
\83X
\83e
\83C
\82µ
\82È
\82¢
366 SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
367 TopAction.Checked := false;
368 TopToolButton.Down := false;
371 //
\83E
\83B
\83\93\83h
\83E
\82Ì
\94¼
\93§
\96¾
\8fó
\91Ô
372 if(GikoSys.Setting.EditWindowTranslucent) and (TransAction.Enabled) then begin //
\94¼
\93§
\96¾
\81i
\83g
\83\89\83\93\83X
\83\8b\81[
\83Z
\83\93\83g
\81j
\8fó
\91Ô
374 TransAction.Checked := true;
375 TransToolButton.Down := true;
376 end else begin //
\95s
\93§
\96¾
378 TransAction.Checked := false;
379 TransToolButton.Down := false;
381 //
\94¼
\93§
\96¾
\8fó
\91Ô
\82Ì
\95Û
\91¶
382 GikoSys.Setting.EditWindowTranslucent := TransAction.Checked;
384 SpaceToNBSPAction.Checked := GikoSys.Setting.SpaceToNBSP;
385 AmpToCharRefAction.Checked := GikoSys.Setting.AmpToCharRef;
386 //
\83\8d\81[
\83J
\83\8b\83\8b\81[
\83\8b\81{
\94Â
\83g
\83b
\83v
\89æ
\91\9c\82Ì
\83^
\83u
\82Ì
\90Ý
\92è
389 //
\83L
\81[
\90Ý
\92è
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
390 GikoSys.LoadKeySetting(ActionList, GikoSys.GetEditorKeyFileName);
391 //
\83}
\83E
\83X
\83W
\83F
\83X
\83`
\83\83\81[
\82Ì
\83C
\83\93\83X
\83g
\81[
\83\8b
392 if GikoSys.Setting.GestureEnabled then begin
394 FGestures := TMouseGesture.Create;
395 GikoSys.Setting.Gestures.ClearGesture;
397 GikoSys.Setting.Gestures.LoadGesture(
398 GikoSys.Setting.GetGestureFileName, ActionList );
399 MouseGesture.OnGestureStart := OnGestureStart;
400 MouseGesture.OnGestureMove := OnGestureMove;
401 MouseGesture.OnGestureEnd := OnGestureEnd;
402 MouseGesture.SetHook( Handle );
404 SaveNameMailAction.Checked := True;
406 procedure TEditorForm.SetBoard(Item: TBoard);
409 Caption := CAPTION_NAME_NEW + ' - [' + Item.Title + ']';
410 NameComboBox.Text := FBoard.KotehanName;
411 MailComboBox.Text := FBoard.KotehanMail;
412 SageCheckBox.Checked := AnsiPos('sage', MailComboBox.Text) <> 0;
413 TitlePanel.Visible := True;
415 if (FSambaTimer.SetBoard(FBoard) >= 0) then begin
418 FSambaTimer.OnTimer := SambaTimer;
421 ShowBoardInformation(FBoard, BoardInformationMemo);
425 procedure TEditorForm.SetThreadItem(Item: TThreadItem);
428 Caption := CAPTION_NAME_RES + ' - [' + FThreadItem.Title + ']';
429 NameComboBox.Text := FThreadItem.ParentBoard.KotehanName;
430 MailComboBox.Text := FThreadItem.ParentBoard.KotehanMail;
431 SageCheckBox.Checked := AnsiPos('sage', MailComboBox.Text) <> 0;
432 TitlePanel.Visible := False;
434 if (FSambaTimer.SetBoard(FThreadItem.ParentBoard) >= 0) then begin
437 FSambaTimer.OnTimer := SambaTimer;
440 ShowBoardInformation(FThreadItem.ParentBoard, BoardInformationMemo);
444 function TEditorForm.GetBody : string;
453 body := BodyEdit.Text;
454 if AmpToCharRefAction.Checked then
455 // &
\82Ì
\92u
\8a·
\82Í
\88ê
\94Ô
\8dÅ
\8f\89\82É
\82â
\82é
\82±
\82Æ
456 body := CustomStringReplace( body, '&', '&' );
457 if SpaceToNBSPAction.Checked then begin
459 tail := p + Length( body );
461 while p < tail do begin
468 tmp := tmp + ' ';
469 until (len mod TAB_LENGTH) = 0;
474 tmp := tmp + p^; Inc( p );
480 tmp := tmp + ' ';
486 //
\8eÀ
\91Ì
\8eQ
\8fÆ
\82Í 1
\95¶
\8e\9a\95ª
491 while p < tail do begin
492 if p^ in ['a'..'z', 'A'..'Z', '0'..'9', '#'] then begin
494 end else if p^ = ';' then begin
506 if p^ in kYofKanji then begin
507 tmp := tmp + p^; Inc( p );
508 tmp := tmp + p^; Inc( p );
511 tmp := tmp + p^; Inc( p );
523 procedure TEditorForm.SetFont;
525 BodyEdit.Font.Name := GikoSys.Setting.EditorFontName;
526 BodyEdit.Font.Size := GikoSys.Setting.EditorFontSize;
527 BodyEdit.Font.Color := GikoSys.Setting.EditorFontColor;
528 BodyEdit.Color := GikoSys.Setting.EditorBackColor;
531 procedure TEditorForm.Preview;
540 if FThreadItem = nil then begin
542 Title := THTMLCreate.RepHtml(TitleEdit.Text);
544 No := IntToStr(FThreadItem.Count + 1);
545 Title := THTMLCreate.RepHtml(FThreadItem.Title);
549 Namae := THTMLCreate.RepHtml(NameComboBox.Text);
550 Mail := THTMLCreate.RepHtml(MailComboBox.Text);
551 Body := THTMLCreate.RepHtml(Body);
552 Body := CustomStringReplace(Body, #13#10, '<br>', False);
555 if Trim(Namae) = '' then
556 Namae := '
\96¼
\96³
\82µ
\82³
\82ñ';
558 s := THTMLCreate.CreatePreviewHTML(Title, No, Mail, Namae, Body);
560 SetContent(s, Browser);
563 procedure TEditorForm.EditorPageChange(Sender: TObject);
568 tmpBoard := GetBoard;
570 if tmpBoard = nil then Exit;
572 if EditorPage.ActivePage = PreviewTab then begin
574 end else if EditorPage.ActivePage = RocalRuleTab then begin
575 if not FileExists(tmpBoard.GETHEADTXTFileName) then begin
576 LocalEdit.Text := '
\83\8d\81[
\83J
\83\8b\83\8b\81[
\83\8b\96¢
\8eæ
\93¾';
579 ShowBoardHead(tmpBoard, LocalEdit);
581 Browser.Navigate('about:blank');
585 procedure TEditorForm.BrowserStatusTextChange(Sender: TObject;
586 const Text: WideString);
588 if EditorPage.ActivePage = PreviewTab then begin
589 StatusBar.Panels[0].Text := Text;
591 StatusBar.Panels[0].Text := '';
595 function TEditorForm.Check: Boolean;
597 REQUIRED: string = '
\82ª
\93ü
\97Í
\82³
\82ê
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\81B';
598 ERROR: string = '
\83G
\83\89\81[';
608 if (not GikoSys.Setting.UseMachineTime) and
609 ((Board.LastGetTime = 0) or
610 (Board.LastGetTime = ZERO_DATE)) then begin
611 Msg := '
\83T
\81[
\83o
\82Ì
\8e\9e\8d\8f\82ª
\95ª
\82©
\82ç
\82È
\82¢
\82½
\82ß
\81A
\91\97\90M
\8fo
\97\88\82Ü
\82¹
\82ñ'#13#10
612 + '
\83X
\83\8c\83b
\83h
\82ð
\8dX
\90V
\81i
\8eæ
\93¾
\81j
\8cã
\81A15
\95b
\91Ò
\82Á
\82Ä
\82©
\82ç
\91\97\90M
\82µ
\82Ä
\82
\82¾
\82³
\82¢';
613 MsgBox(Handle, Msg, ERROR, MB_OK or MB_ICONSTOP);
615 end else if BodyEdit.Text = '' then begin
616 Msg := '
\96{
\95¶' + REQUIRED;
617 MsgBox(Handle, Msg, ERROR, MB_OK or MB_ICONSTOP);
619 end else if (FBoard <> nil) and (Trim(TitleEdit.Text) = '') then begin
620 Msg := '
\83^
\83C
\83g
\83\8b' + REQUIRED;
621 MsgBox(Handle, Msg, ERROR, MB_OK or MB_ICONSTOP);
624 if (not GikoSys.Dolib.Connected) and (AnsiPos('
\81\9c', NameComboBox.Text) <> 0) then begin
625 Msg := '
\83\8d\83O
\83C
\83\93\82µ
\82Ä
\82¢
\82È
\82¢
\82Ì
\82Å
\81\9c\82Ì
\8b@
\94\
\82Í
\97\98\97p
\8fo
\97\88\82Ü
\82¹
\82ñ
\81B'#13#10
626 + '
\82±
\82Ì
\82Ü
\82Ü
\91\97\90M
\82µ
\82Ä
\82à
\82æ
\82ë
\82µ
\82¢
\82Å
\82·
\82©
\81H';
627 rc := MsgBox(Handle, Msg, '
\8am
\94F', MB_YESNO or MB_ICONQUESTION);
628 Result := (rc = IDYES);
633 procedure TEditorForm.FormClose(Sender: TObject; var Action: TCloseAction);
639 procedure TEditorForm.FormDestroy(Sender: TObject);
641 wp: TWindowPlacement;
643 //
\8dÅ
\91å
\89»
\81E
\83E
\83B
\83\93\83h
\83E
\88Ê
\92u
\95Û
\91¶
644 wp.length := sizeof(wp);
645 GetWindowPlacement(Handle, @wp);
647 GikoSys.Setting.EditWindowTop := wp.rcNormalPosition.Top;
648 GikoSys.Setting.EditWindowLeft := wp.rcNormalPosition.Left;
649 GikoSys.Setting.EditWindowHeight := wp.rcNormalPosition.Bottom - wp.rcNormalPosition.Top;
650 GikoSys.Setting.EditWindowWidth := wp.rcNormalPosition.Right - wp.rcNormalPosition.Left;
651 GikoSys.Setting.EditWindowMax := WindowState = wsMaximized;
652 //GikoSys.Setting.EditWindowStay := FormStyle = fsStayOnTop; //
\83X
\83e
\83C
\8fó
\91Ô
\82Ì
\95Û
\91¶
653 GikoSys.Setting.EditWindowTranslucent := TransAction.Checked; //
\94¼
\93§
\96¾
\8fó
\91Ô
\82Ì
\95Û
\91¶
659 procedure TEditorForm.SetNameList(sName, sMail: string);
661 if SaveNameMailAction.Checked then begin
662 if Trim(sName) <> '' then begin
663 if GikoSys.Setting.NameList.IndexOf(sName) = -1 then
664 GikoSys.Setting.NameList.Insert(0, sName);
666 if Trim(sMail) <> '' then begin
667 if GikoSys.Setting.MailList.IndexOf(sMail) = -1 then
668 GikoSys.Setting.MailList.Insert(0, sMail);
673 function TEditorForm.GetActiveControlHandle: THandle;
675 if EditorPage.ActivePage = EditorTab then begin
676 if ActiveControl = NameComboBox then
677 Result := FNameComboEdit
678 else if ActiveControl = MailComboBox then
679 Result := FMailComboEdit
680 else if ActiveControl = BodyEdit then
681 Result := BodyEdit.Handle
682 else if ActiveControl = TitleEdit then
683 Result := TitleEdit.Handle
686 end else if Editorpage.ActivePage = BoardInformationTab then begin
687 if ActiveControl = BoardInformationMemo then
688 Result := BoardInformationMemo.Handle
691 end else if Editorpage.ActivePage = RocalRuleTab then begin
692 if ActiveCOntrol = LocalEdit then
693 Result := LocalEdit.Handle
700 procedure TEditorForm.SetContent(Content: string; ABrowser: TWebBrowser);
704 if ABrowser.Document <> nil then begin
705 doc := Idispatch( olevariant(ABrowser.ControlInterface).Document) as IHTMLDocument2;
708 doc.charset := 'Shift_JIS';
713 procedure TEditorForm.InitIdHTTP(http: TIdHTTP);
716 http.ProxyParams.BasicAuthentication := False;
717 if GikoSys.Setting.WriteProxy then begin
718 http.ProxyParams.ProxyServer := GikoSys.Setting.WriteProxyAddress;
719 http.ProxyParams.ProxyPort := GikoSys.Setting.WriteProxyPort;
720 http.ProxyParams.ProxyUsername := GikoSys.Setting.WriteProxyUserID;
721 http.ProxyParams.ProxyPassword := GikoSys.Setting.WriteProxyPassword;
722 if GikoSys.Setting.ReadProxyUserID <> '' then
723 http.ProxyParams.BasicAuthentication := True;
725 http.ProxyParams.ProxyServer := '';
726 http.ProxyParams.ProxyPort := 80;
727 http.ProxyParams.ProxyUsername := '';
728 http.ProxyParams.ProxyPassword := '';
730 Indy.Request.UserAgent := GikoSys.GetUserAgent;
731 Indy.Request.AcceptEncoding := '';
733 //!
\91\97\90M
\92\86\8e~
\82Ì
\82½
\82ß
\82Ì
\83\81\83j
\83\85\81[
\82Ì
\8dÄ
\90¶
734 procedure TEditorForm.CancelSend(ABoard: TBoard; ASysMenu: HMENU);
739 EnableMenuItem(ASysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED);
743 procedure TEditorForm.Send( const ACOOKIE: string; const SPID: string;
744 const PON: string; FirstWriting: Boolean);
746 TextStream: TStringStream;
747 Source: TStringStream;
748 ResponseText: string;
750 State: TGikoDownloadState;
751 ResultType: TGikoResultType;
755 {Protocol,Host, Path, Document, Port, Bookmark : String;}
763 if FThreadItem = nil then begin
764 URL := FBoard.GetSendURL;
765 Indy.Request.Referer := GikoSys.UrlToServer(FBoard.URL) + 'test/bbs.cgi';
767 URL := FThreadItem.GetSendURL;
768 Indy.Request.Referer := FThreadItem.URL;
771 sysMenu := GetSystemMenu( Handle, false );
772 EnableMenuItem( sysMenu, SC_CLOSE, MF_GRAYED );
774 EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED);
777 Indy.Request.CustomHeaders.Clear;
778 // Indy.Request.CacheControl := 'no-cache';
779 Indy.Request.CustomHeaders.Add('Pragma: no-cache');
780 Indy.Request.AcceptLanguage := 'ja';
781 Indy.Request.Accept := 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*';
782 Indy.Request.ContentType := 'application/x-www-form-urlencoded';
783 Indy.Request.CustomHeaders.Add(getHeaderStr(ACOOKIE, SPID, PON, Board));
784 TextStream := TStringStream.Create('');
785 Source := TStringStream.Create('');
788 FDebugStrReceive := '';
791 if (FirstWriting) then begin
792 //
\83t
\83V
\83A
\83i
\83g
\83\89\83b
\83v
\8cx
\8d\90(LocalMode) by
\92è
\8aú
\95Ö
793 if (isLocalFusianaTrap) then begin
794 CancelSend( Board, SysMenu );
797 //
\83t
\83V
\83A
\83i
\83g
\83\89\83b
\83v
\8cx
\8d\90(Remote)
798 if (isRemoteFusianaTrap) then begin
799 CancelSend( Board, SysMenu );
805 IdAntiFreeze.Active := True;
807 Indy.Post(URL, Source, TextStream);
809 IdAntiFreeze.Active := False;
811 ResponseText := TextStream.DataString;
813 ResultType := GetResultType(ResponseText);
816 if ResultType = grtOK then begin
817 if (GikoSys.Setting.UseSamba) and (FSambaTimer.Enabled) then
819 FSambaTimer.WriteSambaTime(Now());
821 State := gdsComplete;
822 end else if ResultType = grtCookie then begin
823 //
\83\8b\81[
\83v
\96h
\8e~
824 if not FirstWriting then
825 raise Exception.Create('');
827 MsgResult := MsgBox( Handle,
828 '
\81E
\93\8a\8de
\82³
\82ê
\82½
\93à
\97e
\82Í
\83R
\83s
\81[
\81A
\95Û
\91¶
\81A
\88ø
\97p
\81A
\93]
\8dÚ
\93\99\82³
\82ê
\82é
\8fê
\8d\87\82ª
\82 \82è
\82Ü
\82·
\81B' + #13#10 +
829 '
\81E
\93\8a\8de
\82É
\8aÖ
\82µ
\82Ä
\94
\90¶
\82·
\82é
\90Ó
\94C
\82Í
\91S
\82Ä
\93\8a\8de
\8eÒ
\82É
\8bA
\82µ
\82Ü
\82·
\81B' + #13#10#13#10 +
830 '
\91S
\90Ó
\94C
\82ð
\95\89\82¤
\82±
\82Æ
\82ð
\8f³
\91ø
\82µ
\82Ä
\8f\91\82«
\8d\9e\82Ý
\82Ü
\82·
\82©
\81H',
832 MB_YESNO or MB_ICONQUESTION);
834 if MsgResult = IDYES then begin
835 GetCookie(Indy.Response.RawHeaders.Text, Board);
837 if (Board.SPID = '') and (Board.PON = '') and (Board.Cookie = '') then
838 raise Exception.Create('');
840 //
\82à
\82¤
\88ê
\89ñ
\82±
\82Ì
\83\81\83\
\83b
\83h
841 Send(Board.Cookie, Board.SPID, Board.PON, False);
844 CancelSend( Board, SysMenu );
847 end else if ResultType = grtCheck then begin
848 //
\83\8b\81[
\83v
\96h
\8e~
849 if not FirstWriting then
850 raise Exception.Create('');
852 MsgResult := MsgBox( Handle,
853 '
\8f\91\82«
\8d\9e\82Ý
\82É
\8aÖ
\82µ
\82Ä
\82Í
\97l
\81X
\82È
\83\8d\83O
\8fî
\95ñ
\82ª
\8bL
\98^
\82³
\82ê
\82Ä
\82¢
\82Ü
\82·
\81B' + #13#10 +
854 '
\93\8a\8de
\82É
\8aÖ
\82µ
\82Ä
\94
\90¶
\82·
\82é
\90Ó
\94C
\82Í
\91S
\82Ä
\93\8a\8de
\8eÒ
\82É
\8bA
\82µ
\82Ü
\82·
\81B' + #13#10 +
855 '
\8cö
\8f\98\97Ç
\91
\82É
\94½
\82µ
\82½
\82è
\81A
\91¼
\90l
\82É
\96À
\98f
\82ð
\82©
\82¯
\82é
\8f\91\82«
\8d\9e\82Ý
\82Í
\8dT
\82¦
\82Ä
\89º
\82³
\82¢
\81B' + #13#10 +
856 '
\93\8a\8de
\82³
\82ê
\82½
\93à
\97e
\82Í
\83R
\83s
\81[
\81E
\95Û
\91¶
\81E
\88ø
\97p
\81E
\93]
\8dÚ
\93\99\82³
\82ê
\82é
\8fê
\8d\87\82ª
\82 \82è
\82Ü
\82·
\81B' + #13#10 +
858 '
\91S
\90Ó
\94C
\82ð
\95\89\82¤
\82±
\82Æ
\82ð
\8f³
\91ø
\82µ
\82Ä
\8f\91\82«
\8d\9e\82Ý
\82Ü
\82·
\82©
\81H',
860 MB_YESNO or MB_ICONQUESTION);
862 if MsgResult = IDYES then begin
863 GetCookie(Indy.Response.RawHeaders.Text, Board);
865 if (Board.SPID = '') and (Board.PON = '') and (Board.Cookie = '') then
866 raise Exception.Create('');
868 Send(Board.Cookie, Board.SPID, Board.PON, False);
871 CancelSend( Board, SysMenu );
875 if (GikoSys.Setting.UseSamba) and (FSambaTimer.Enabled) then
877 FSambaTimer.WriteSambaTime(Now());
881 raise Exception.Create('');
884 on E: EIdConnectException do begin
886 ResponseText := '<html><body>'
887 + '<div>
\90Ú
\91±
\82ª
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½<br>'
888 + '
\89ñ
\90ü
\82â
\83v
\83\8d\83L
\83V
\82Ì
\8fó
\91Ô
\82ð
\92²
\82×
\82Ä
\82
\82¾
\82³
\82¢<br></div>'
889 + '<br><br><div>' + E.Message + '</div>'
892 on E: Exception do begin
895 FDebugStrReceive := AnsiReplaceText(FDebugStrReceive, '<', '<');
896 FDebugStrReceive := AnsiReplaceText(FDebugStrReceive, '>', '>');
897 FDebugStrSend := AnsiReplaceText(FDebugStrSend, '<', '<');
898 FDebugStrSend := AnsiReplaceText(FDebugStrSend, '>', '>');
900 ResponseText := '<html><body>' + TextStream.DataString;
901 ResponseText := AnsiReplaceText(ResponseText, '</body>', '');
902 ResponseText := AnsiReplaceText(ResponseText, '</html>', '');
903 ResponseText := ResponseText + '<hr><div align="left"><pre>';
904 ResponseText := ResponseText + '<b>
\82±
\82±
\82©
\82ç
\83M
\83R
\83i
\83r
\82Ì
\8fî
\95ñ</b>'#13#10;
905 ResponseText := ResponseText + #13#10'
\81\9c\91\97\90M'#13#10;
906 ResponseText := ResponseText + FDebugStrSend;
907 ResponseText := ResponseText + #13#10'
\81\9c\8eó
\90M'#13#10;
908 ResponseText := ResponseText + FDebugStrReceive;
909 ResponseText := ResponseText + '</pre></div></body></html>';
912 FStatusCode := Indy.ResponseCode;
918 //sysMenu := GetSystemMenu( Handle, true );
919 EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED);
923 //
\94ñ
\8cö
\8e®
\83M
\83R
\83i
\83r
\94Â
\82È
\82Ç
\82Ì2ch
\8cÝ
\8a·
\83X
\83N
\83\8a\83v
\83g
\97p
924 //2ch
\88È
\8aO
\82Å
\82©
\82ÂResponceCode
\82ª302Found
\82Å
\8f\91\82«
\8d\9e\82Ý
\8a®
\97¹
925 //if (not Board.Is2ch) and (FStatusCode = 302) then begin
926 if FStatusCode = 302 then begin
927 GikoForm.PlaySound('ResEnd');
929 AddFormMessageNew( gmiOK );
933 if State = gdsComplete then begin
934 GikoForm.PlaySound('ResEnd');
936 AddFormMessageNew( gmiOK );
938 end else if State = gdsError then begin
939 AddFormMessageNew( gmiOK );
940 EditorPage.ActivePage := PreviewTab;
941 SetContent(ResponseText, Browser);
942 end else if State = gdsAbort then begin
943 GikoForm.AddMessageList(FThreadItem.Title + ' ' + GikoSys.GetGikoMessage(gmAbort), nil, gmiSAD);
946 function TEditorForm.GetResultType(ResponseText: string): TGikoResultType;
948 if AnsiPos('
\8f\91\82«
\82±
\82Ý
\82ª
\8fI
\82í
\82è
\82Ü
\82µ
\82½', ResponseText) <> 0 then
950 else if (AnsiPos('
\83N
\83b
\83L
\81[
\82ª
\82È
\82¢
\82©
\8aú
\8cÀ
\90Ø
\82ê
\82Å
\82·', ResponseText) > 0) or
951 (AnsiPos('<title>
\83N
\83b
\83L
\81[
\8am
\94F
\81I</title>', ResponseText) > 0) or
952 (AnsiPos('<title>
\81¡
\83N
\83b
\83L
\81[
\8am
\94F
\81I
\81¡</title>', ResponseText) > 0) or
953 //(AnsiPos('
\83N
\83b
\83L
\81[
\8am
\94F', ResponseText) > 0) or
954 (AnsiPos(RES2CH_COOKIE, ResponseText) > 0) then
956 else if (AnsiPos('<font size=+2 color=#FF0000>
\8f\91\82«
\8d\9e\82Ý
\83`
\83F
\83b
\83N
\81I </font>', ResponseText) > 0) or
957 (AnsiPos('<title>
\81¡
\8f\91\82«
\8d\9e\82Ý
\8am
\94F
\82µ
\82Ü
\82·
\81¡</title>', ResponseText) > 0) or
958 (AnsiPos('<title>
\93\8a\8de
\8am
\94F</title>', ResponseText) > 0) or
959 (AnsiPos('<b>
\8f\91\82«
\82±
\82Ý
\8am
\94F</b>', ResponseText) > 0) or
960 (AnsiPos('="../test/subbbs.cgi">', ResponseText) > 0) or
961 (AnsiPos(RES2CH_FALSE, ResponseText) > 0) then
963 else if (AnsiPos('
\81E
\93\8a\8de
\8eÒ
\82Í
\81A
\8cf
\8e¦
\94Â
\89^
\89c
\8eÒ
\82É
\91Î
\82µ
\82Ä
\81A
\92\98\8dì
\8eÒ
\90l
\8ai
\8c \82ð
\88ê
\90Ø
\8ds
\8eg
\82µ
\82È
\82¢
\82±
\82Æ
\82ð
\8f³
\91ø
\82µ
\82Ü
\82·
\81B<br>', ResponseText) > 0) or
964 (AnsiPos('
\81i
\92\98\8dì
\8c \96@
\91æ21
\8fð
\82È
\82¢
\82µ
\91æ28
\8fð
\82É
\8bK
\92è
\82³
\82ê
\82é
\8c \97\98\82à
\8aÜ
\82Þ
\81j
\82»
\82Ì
\91¼
\82Ì
\8c \97\98\82É
\82Â
\82«
\81A', ResponseText) > 0) then
971 procedure TEditorForm.GetSendData(Source: TStringStream);
982 if GikoSys.Setting.UseMachineTime then begin
983 if GikoSys.Setting.TimeAdjust then
984 Adjust := Gikosys.Setting.TimeAdjustSec
986 Adjust := GikoSys.Setting.TimeAdjustSec * -1;
987 SendTime := GikoSys.DateTimeToInt(Now) - (9 * 60 * 60) + Adjust
989 if (Board.LastGetTime = 0) or (Board.LastGetTime = ZERO_DATE) then
990 SendTime := GikoSys.DateTimeToInt(Now)
992 SendTime := GikoSys.DateTimeToInt(Board.LastGetTime);
997 SessionID := GikoSys.Dolib.SessionID;
998 if SessionID <> '' then
999 s := 'sid=' + HttpEncode(SessionID) + '&'
1002 s := s + 'subject=&'
1003 + 'FROM=' + HttpEncode(NameComboBox.Text) + '&'
1004 + 'mail=' + HttpEncode(MailComboBox.Text) + '&'
1005 + 'MESSAGE=' + HttpEncode(body) + '&'
1006 + 'bbs=' + Board.BBSID + '&'
1007 + 'time=' + IntToStr(SendTime) + '&';
1009 if FThreadItem = nil then begin
1010 s := s + 'subject=' + HttpEncode(TitleEdit.Text) + '&';
1011 s := s + 'submit=' + HttpEncode('
\91S
\90Ó
\94C
\82ð
\95\89\82¤
\82±
\82Æ
\82ð
\8f³
\91ø
\82µ
\82Ä
\8f\91\82«
\8d\9e\82Þ') + #13#10;
1013 s := s + 'key=' + ChangeFileExt(FThreadItem.FileName, '') + '&';
1014 s := s + 'submit=' + HttpEncode('
\8f\91\82«
\8d\9e\82Þ') + #13#10;
1016 Source.WriteString(s);
1019 procedure TEditorForm.SaveSendFile;
1024 ini := TMemIniFile.Create(GikoSys.GetSentFileName);
1026 sDate := IntToStr(GikoSys.DateTimeToInt(Now));
1028 ini.WriteString(sDate, 'Name', NameComboBox.Text);
1029 ini.WriteString(sDate, 'EMail', MailComboBox.Text);
1030 ini.WriteString(sDate, 'Body', HttpEncode(BodyEdit.Text));
1031 ini.WriteInteger(sDate, 'Status', FStatusCode);
1032 ini.WriteDateTime(sDate, 'Date', Now);
1033 if FThreadItem = nil then begin
1034 ini.WriteString(sDate, 'Title', MojuUtils.Sanitize(TitleEdit.Text));
1035 //ini.WriteString(sDate, 'BBS', FBoard.BBSID);
1036 ini.WriteString(sDate, 'URL', FBoard.URL);
1037 ini.WriteInteger(sDate, 'NewThread', 1);
1039 ini.WriteString(sDate, 'Title', FThreadItem.Title);
1040 //ini.WriteString(sDate, 'BBS', FThreadItem.ParentBoard.BBSID);
1041 ini.WriteString(sDate, 'URL', FThreadItem.URL);
1042 ini.WriteString(sDate, 'Key', ChangeFileExt(FThreadItem.FileName, ''));
1051 procedure TEditorForm.SendActionExecute(Sender: TObject);
1053 TITLE_SAMBA : string = 'Samba24
\8cx
\8d\90';
1058 state : TGikoDownloadState;
1065 SendAction.Enabled := False;
1066 Application.ProcessMessages;
1067 if not Check then Exit;
1071 if FThreadItem = nil then begin
1072 rc := GikoUtil.MsgBox(Handle,
1073 '
\81u' + Board.Title + '
\81v
\94Â
\82É
\90V
\82µ
\82¢
\83X
\83\8c\83b
\83h
\97§
\82Ä
\82Ü
\82·'#13#10#13#10
1074 + '
\81E
\94Â
\82Ì
\83\8b\81[
\83\8b\82ð
\8eç
\82Á
\82½
\8f\91\82«
\8d\9e\82Ý
\82Å
\82 \82é
\82±
\82Æ
\82ð
\8am
\94F
\82µ
\82Ü
\82µ
\82½
\82©
\81H'#13#10
1075 + '
\81E
\91¼
\82É
\93¯
\82¶
\82æ
\82¤
\82È
\83X
\83\8c\83b
\83h
\82ª
\96³
\82©
\82Á
\82½
\82±
\82Æ
\82ð
\8am
\94F
\82µ
\82Ü
\82µ
\82½
\82©
\81H'#13#10#13#10
1076 + '
\81u
\82Í
\82¢
\81v
\82ð
\89\9f\82·
\82Æ
\91\97\90M
\82µ
\82Ü
\82·',
1078 MB_ICONQUESTION or MB_YESNO);
1079 if rc <> ID_YES then
1083 SetNameList(NameComboBox.Text, MailComboBox.Text);
1084 if (KotehanCheckBox.Enabled) and (KotehanCheckBox.Checked) then begin
1085 Board.KotehanName := NameComboBox.Text;
1086 Board.KotehanMail := MailComboBox.Text;
1089 if Board.IsBoardPlugInAvailable then begin
1092 if FThreadItem = nil then begin
1093 //
\83X
\83\8c\97§
\82Ä
1094 state := TGikoDownloadState( Board.BoardPlugIn.CreateThread(
1095 DWORD( Board ), TitleEdit.Text, NameComboBox.Text, MailComboBox.Text, body ) );
1097 if state = gdsComplete then begin
1098 GikoForm.PlaySound('ResEnd');
1100 GikoForm.AddMessageList(FBoard.Title + ' ' + GikoSys.GetGikoMessage(gmNewSure), nil, gmiOK);
1103 end else if State = gdsError then begin
1104 GikoForm.AddMessageList(FBoard.Title + ' ' + GikoSys.GetGikoMessage(gmSureError), nil, gmiNG);
1105 end else if State = gdsAbort then begin
1106 GikoForm.AddMessageList(FBoard.Title + ' ' + GikoSys.GetGikoMessage(gmAbort), nil, gmiNG);
1110 state := TGikoDownloadState( FThreadItem.ParentBoard.BoardPlugIn.WriteThread(
1111 DWORD( FThreadItem ), NameComboBox.Text, MailComboBox.Text, body ) );
1113 if state = gdsComplete then begin
1114 GikoForm.PlaySound('ResEnd');
1116 GikoForm.AddMessageList(FThreadItem.Title + ' ' + GikoSys.GetGikoMessage(gmNewRes), nil, gmiOK);
1119 end else if State = gdsError then begin
1120 GikoForm.AddMessageList(FThreadItem.Title + ' ' + GikoSys.GetGikoMessage(gmResError), nil, gmiOK);
1121 end else if State = gdsAbort then begin
1122 GikoForm.AddMessageList(FThreadItem.Title + ' ' + GikoSys.GetGikoMessage(gmAbort), nil, gmiOK);
1126 if not FSambaTimer.Enabled then begin
1127 if CompareDateTime(Board.Expires ,Now) <= 0 then begin
1132 Send(Board.Cookie, Board.SPID, Board.PON, True);
1134 if not FSambaTimer.CheckSambaTime(Now()) then begin
1135 rc := GikoUtil.MsgBox(Handle,
1136 'Samba24
\82Ì
\8bK
\92è
\92l
\96¢
\96\9e\82Ì
\95b
\90\94\82µ
\82©
\8co
\89ß
\82µ
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\81B'#13#10
1137 + '
\91\97\90M
\82ð
\92\86\8e~
\82µ
\82Ü
\82·
\82©
\81H' + #13#10
1138 + '(
\81u
\82¢
\82¢
\82¦
\81v
\82¾
\82Æ
\91\97\90M
\82µ
\82Ü
\82·)', TITLE_SAMBA,
1139 MB_YESNO or MB_ICONQUESTION);
1140 if rc = IDYES then begin
1144 if rc = IDNO then begin
1145 rc2 := GikoUtil.MsgBox(Handle,
1146 '
\96{
\93\96\82É
\91\97\90M
\82µ
\82Ü
\82·
\82©
\81H',
1148 MB_YESNO or MB_ICONQUESTION);
1149 if rc2 = IDNO then begin
1155 if CompareDateTime(Board.Expires ,Now) <= 0 then begin
1160 Send(Board.Cookie, Board.SPID, Board.PON, True);
1165 if FSambaTimer.Enabled then begin
1166 FNow := FSambaTimer.Update;
1171 procedure TEditorForm.SaveActionExecute(Sender: TObject);
1176 procedure TEditorForm.CloseActionExecute(Sender: TObject);
1181 procedure TEditorForm.UndoActionExecute(Sender: TObject);
1183 SendMessage(GetActiveControlHandle, WM_UNDO, 0, 0);
1186 procedure TEditorForm.CutActionExecute(Sender: TObject);
1188 SendMessage(GetActiveControlHandle, WM_CUT, 0, 0);
1191 procedure TEditorForm.CopyActionExecute(Sender: TObject);
1193 SendMessage(GetActiveControlHandle, WM_COPY, 0, 0);
1196 procedure TEditorForm.PasteActionExecute(Sender: TObject);
1198 SendMessage(GetActiveControlHandle, WM_PASTE, 0, 0);
1201 procedure TEditorForm.SelectAllActionExecute(Sender: TObject);
1203 SendMessage(GetActiveControlHandle, EM_SETSEL, 0, GetWindowTextLength(GetActiveControlHandle));
1206 procedure TEditorForm.TopActionExecute(Sender: TObject); //
\83E
\83B
\83\93\83h
\83E
\8dÅ
\91O
\96Ê(Stay)
\83{
\83^
\83\93\82Ì
\8f\88\97\9d
1208 if not (fsShowing in Self.FormState) then begin
1209 if TopAction.Checked then begin //
\83X
\83e
\83C
\8fó
\91Ô
\82É
\90Ý
\92è
1210 SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
1211 GikoSys.Setting.EditWindowStay := true;
1212 end else begin //
\83X
\83e
\83C
\8fó
\91Ô
\89ð
\8f\9c
1213 SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
1214 GikoSys.Setting.EditWindowStay := false;
1216 //
\83X
\83e
\83C
\8fó
\91Ô
\82Ì
\95Û
\91¶
1217 //GikoSys.Setting.EditWindowStay := FormStyle = fsStayOnTop;
1221 procedure TEditorForm.AbortActionExecute(Sender: TObject);
1226 procedure TEditorForm.SendActionUpdate(Sender: TObject);
1228 SendAction.Enabled := not FWork;
1231 procedure TEditorForm.SaveActionUpdate(Sender: TObject);
1233 SaveAction.Enabled := False;
1236 procedure TEditorForm.CloseActionUpdate(Sender: TObject);
1238 CloseAction.Enabled := not FWork;
1241 procedure TEditorForm.UndoActionUpdate(Sender: TObject);
1243 UndoAction.Enabled := (GetActiveControlHandle <> 0)
1244 and (SendMessage(GetActiveControlHandle, EM_CANUNDO, 0, 0) <> 0)
1248 procedure TEditorForm.CutActionUpdate(Sender: TObject);
1250 Selection: TSelection;
1253 AHandle := GetActiveControlHandle;
1254 SendMessage(AHandle, EM_GETSEL, Longint(@Selection.StartPos), Longint(@Selection.EndPos));
1255 CutAction.Enabled := (AHandle <> 0)
1256 and ((Selection.EndPos - Selection.StartPos) <> 0)
1260 procedure TEditorForm.CopyActionUpdate(Sender: TObject);
1262 Selection: TSelection;
1265 AHandle := GetActiveControlHandle;
1266 SendMessage(AHandle, EM_GETSEL, Longint(@Selection.StartPos), Longint(@Selection.EndPos));
1267 CopyAction.Enabled := (AHandle <> 0)
1268 and ((Selection.EndPos - Selection.StartPos) <> 0)
1272 procedure TEditorForm.PasteActionUpdate(Sender: TObject);
1274 PasteAction.Enabled := (GetActiveControlHandle <> 0)
1275 and (Clipboard.HasFormat(CF_TEXT))
1279 procedure TEditorForm.TopActionUpdate(Sender: TObject);
1281 TopAction.Enabled := not FWork;
1284 procedure TEditorForm.SageCheckBoxClick(Sender: TObject);
1286 if SageCheckBox.Checked then begin
1287 if AnsiPos('sage', MailComboBox.Text) = 0 then
1288 MailComboBox.Text := 'sage' + MailComboBox.Text;
1290 if AnsiPos('sage', MailComboBox.Text) <> 0 then
1291 MailComboBox.Text := StringReplace(MailComboBox.Text, 'sage', '', [rfReplaceAll]);
1295 procedure TEditorForm.MailComboBoxChange(Sender: TObject);
1297 if AnsiPos('sage', MailComboBox.Text) = 0 then
1298 SageCheckBox.Checked := False
1300 SageCheckBox.Checked := True;
1303 procedure TEditorForm.IdLogDebugReceive(ASender: TIdConnectionIntercept;
1306 StringStream: TStringStream;
1308 StringStream := TStringStream.Create('');
1310 StringStream.CopyFrom(AStream, AStream.Size);
1311 FDebugStrReceive := FDebugStrReceive + StringStream.DataString;
1317 procedure TEditorForm.IdLogDebugSend(ASender: TIdConnectionIntercept;
1320 StringStream: TStringStream;
1322 StringStream := TStringStream.Create('');
1324 StringStream.CopyFrom(AStream, AStream.Size);
1325 FDebugStrSend := FDebugStrSend + StringStream.DataString;
1331 procedure TEditorForm.TransActionExecute(Sender: TObject);
1333 AlphaBlend := TransAction.Checked;
1334 //
\94¼
\93§
\96¾
\8fó
\91Ô
\82Ì
\95Û
\91¶
1335 GikoSys.Setting.EditWindowTranslucent := TransAction.Checked;
1338 procedure TEditorForm.TransActionUpdate(Sender: TObject);
1340 TransAction.Enabled := not FWork;
1342 //StatusBar
\82ÌPanels[0]
\82Ì
\95\9d\82ð
\89Â
\95Ï
\81B
\8ec
\82è
\82ð
\8cÅ
\92è
\82É
\82·
\82é
1343 procedure TEditorForm.StatusBarResize(Sender: TObject);
1345 StatusBar.Panels[0].Width := StatusBar.Width
1346 - StatusBar.Panels[1].Width - StatusBar.Panels[2].Width;
1350 //Form
\82ªActive
\82É
\82È
\82Á
\82½
\82ç
\8dÅ
\8fI
\8f\91\82«
\8d\9e\82Ý
\8e\9e\8aÔ
\82ð
\93Ç
\82Ý
\8d\9e\82Þ
1351 procedure TEditorForm.FormActivate(Sender: TObject);
1353 if ( FSambaTimer.Enabled ) and ( FThreadItem <> nil ) then
1355 FNow := FSambaTimer.Update;
1357 if GikoSys.Setting.GestureEnabled then begin
1358 GikoSys.Setting.Gestures.ClearGesture;
1359 GikoSys.Setting.Gestures.LoadGesture(
1360 GikoSys.Setting.GetGestureFileName, ActionList );
1361 MouseGesture.UnHook;
1362 MouseGesture.OnGestureStart := OnGestureStart;
1363 MouseGesture.OnGestureMove := OnGestureMove;
1364 MouseGesture.OnGestureEnd := OnGestureEnd;
1365 MouseGesture.SetHook( Handle );
1368 procedure TEditorForm.FormCloseQuery(Sender: TObject;
1369 var CanClose: Boolean);
1371 CanClose := not FWork;
1374 procedure TEditorForm.QuotePasteActionExecute(Sender: TObject);
1381 quote := GikoSys.GetOEIndentChar;
1382 s := TStringList.Create;
1384 s.Text := Clipboard.AsText;
1386 for i := s.Count - 1 downto 0 do
1387 s[ i ] := quote + s[ i ];
1389 BodyEdit.SelText := s.Text;
1396 procedure TEditorForm.SpaceToNBSPActionExecute(Sender: TObject);
1398 GikoSys.Setting.SpaceToNBSP := SpaceToNBSPAction.Checked;
1399 if EditorPage.ActivePage = PreviewTab then
1403 procedure TEditorForm.AmpToCharRefActionExecute(Sender: TObject);
1405 GikoSys.Setting.AmpToCharRef := AmpToCharRefAction.Checked;
1406 if EditorPage.ActivePage = PreviewTab then
1410 procedure TEditorForm.BoardTopClick(Sender: TObject);
1414 ini := TIniFile.Create(GikoSys.Setting.GetFileName);
1416 BoardtopTab.TabVisible := BoardTop.Checked;
1417 ini.WriteBool('EditorForm', 'BoardTopTab', BoardtopTab.TabVisible);
1424 procedure TEditorForm.GetSETTINGTXTActionExecute(Sender: TObject);
1426 memStream: TMemoryStream;
1427 URL, RefURL: string;
1428 settingBody: TStringList;
1431 if not FWork then begin
1434 tmpBoard := GetBoard;
1435 if tmpBoard <> nil then begin
1437 RefURL := tmpBoard.URL;
1438 if RefURL[Length(RefURL)] <> '/' then
1439 URL := RefURL + '/' + 'SETTING.TXT'
1441 URL := RefURL + 'SETTING.TXT';
1442 Screen.Cursor := crHourGlass;
1443 memStream := TMemoryStream.Create;
1446 StatusBar.Panels[0].Text := 'SETTING.TXT
\83_
\83E
\83\93\83\8d\81[
\83h
\92\86';
1447 GetWebData(URL, RefURL, tmpBoard.SETTINGTXTTime, memStream);
1448 if( Indy.ResponseCode = 200 ) then begin
1449 settingBody := TStringList.Create;
1451 memStream.Seek(0, soFromBeginning);
1452 settingBody.LoadFromStream(memStream);
1453 settingBody.SaveToFile(tmpBoard.GetSETTINGTXTFileName);
1454 tmpBoard.SETTINGTXTTime := Indy.Response.LastModified;
1455 tmpBoard.IsSETTINGTXT := true;
1456 tmpBoard.TitlePictureURL := GetTitlePictureURL(settingBody, tmpBoard);
1457 tmpBoard.Modified := true;
1461 StatusBar.Panels[0].Text := 'SETTING.TXT
\8eæ
\93¾
\8a®
\97¹(' + IntToStr(Indy.ResponseCode) + ')';
1464 on E: EIdException do begin
1465 if( AnsiPos('304', E.Message) > 0 ) then
1466 StatusBar.Panels[0].Text := 'SETTING.TXT
\8dX
\90V
\96³
\82µ(' + IntToStr(Indy.ResponseCode) + ')'
1468 StatusBar.Panels[0].Text := 'SETTING.TXT
\8eæ
\93¾
\83G
\83\89\81[(' + IntToStr(Indy.ResponseCode) + ')';
1473 Screen.Cursor := crDefault;
1475 ShowBoardInformation(tmpBoard, BoardInformationMemo);
1481 procedure TEditorForm.ShowBoardInformation(ABoard: TBoard; AMemo: TMemo);
1486 AMemo.Lines.Add('[SETTING.TXT]');
1487 if ABoard.IsSETTINGTXT then begin
1488 if FileExists(ABoard.GetSETTINGTXTFileName) then begin
1489 AMemo.Lines.Add(DateTimeToStr(ABoard.SETTINGTXTTime) + '
\8dX
\90V');
1490 body := TStringList.Create;
1492 body.LoadFromFile(ABoard.GetSETTINGTXTFileName);
1493 AMemo.Lines.AddStrings(body);
1498 ABoard.IsSETTINGTXT := false;
1499 ABoard.SETTINGTXTTime := ZERO_DATE;
1500 AMemo.Lines.Add('Local
\82É
\95Û
\91¶
\82³
\82ê
\82½SETTING.TXT
\82ª
\8c©
\82Â
\82©
\82è
\82Ü
\82¹
\82ñ');
1501 AMemo.Lines.Add('
\83\81\83j
\83\85\81[
\82æ
\82è
\8dÄ
\8eæ
\93¾
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B');
1504 AMemo.Lines.Add('SETTING.TXT
\82ð
\8eæ
\93¾
\82µ
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\81B');
1505 AMemo.Lines.Add('
\83\81\83j
\83\85\81[
\82æ
\82è
\8eæ
\93¾
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B');
1508 function TEditorForm.GetTitlePictureURL(body: TStringList; ABoard: TBoard): string;
1509 //BBS_TITLE_PICTURE=
1516 for i := 0 to body.Count - 1 do begin
1517 if (AnsiPos('BBS_TITLE_PICTURE=', body[i]) > 0) or
1518 (AnsiPos('BBS_FIGUREHEAD=', body[i]) > 0) then begin
1520 Delete(tmp, 1, AnsiPos('=', tmp));
1521 if AnsiPos('../', tmp) > 0 then begin
1522 tmp := CustomStringReplace(tmp, '../', GikoSys.UrlToServer(ABoard.URL));
1530 procedure TEditorForm.GetTitlePictureActionUpdate(Sender: TObject);
1532 if FThreadItem = nil then
1533 GetTitlePictureAction.Enabled := FBoard.IsSETTINGTXT
1535 GetTitlePictureAction.Enabled := FThreadItem.ParentBoard.IsSETTINGTXT;
1537 if GetTitlePictureAction.Enabled Then begin
1538 //
\8eÀ
\8ds
\92\86\82Í
\8eÀ
\8ds
\95s
\89Â
1539 GetTitlePictureAction.Enabled := not FWork;
1543 procedure TEditorForm.GetTitlePictureActionExecute(Sender: TObject);
1545 memStream: TMemoryStream;
1552 memStream := TMemoryStream.Create;
1554 tmpBoard := GetBoard;
1556 if (tmpBoard <> nil) and (tmpBoard.TitlePictureURL <> '') then begin
1557 StatusBar.Panels[0].Text := '
\94Â
\83g
\83b
\83v
\89æ
\91\9c\83_
\83E
\83\93\83\8d\81[
\83h
\92\86';
1558 Screen.Cursor := crHourGlass;
1560 // URL
\82ð
\8ew
\92è
\82µ
\82Ä
\83\81\83\82\83\8a\82É
\93Ç
\82Ý
\8d\9e\82Þ
1561 GetWebData(tmpBoard.TitlePictureURL, tmpBoard.URL,
1562 ZERO_DATE, memStream);
1563 if Indy.ResponseCode = 200 then begin
1564 memStream.SaveToFile(tmpBoard.GetTitlePictureFileName);
1566 tmpBoard.Modified := true;
1568 StatusBar.Panels[0].Text := '
\94Â
\83g
\83b
\83v
\89æ
\91\9c (' + IntToStr(Indy.ResponseCode) + ')';
1575 Screen.Cursor := crDefault;
1579 \brief URL
\82Ì
\83f
\81[
\83^
\82ðstream
\82É
\93Ç
\82Ý
\8d\9e\82Þ
1580 \param URL
\93Ç
\82Ý
\8d\9e\82Þ
\90æ
1581 \param RefURL referer
\82É
\90Ý
\92è
\82·
\82é
1582 \param Modified Modified
\82É
\90Ý
\92è
\82·
\82é
1583 \param stream
\93Ç
\82Ý
\8d\9e\82ñ
\82¾
\83f
\81[
\83^
\82Ì
\95Û
\91¶
\90æ
1585 procedure TEditorForm.GetWebData(const URL: string; const RefURL: string;
1586 Modified: TDateTime; stream: TStream);
1589 Indy.Request.Referer := RefURL;
1590 Indy.Request.LastModified := Modified;
1592 IdAntiFreeze.Active := True;
1594 Indy.Get(URL, stream);
1596 IdAntiFreeze.Active := False;
1600 procedure TEditorForm.ShowTitlePicture();
1605 tmpBoard := GetBoard;
1607 if FileExists(tmpBoard.GetTitlePictureFileName) then begin
1608 TitlePictureBrowser.Navigate(tmpBoard.GetTitlePictureFileName);
1610 s := '
\94Â
\83g
\83b
\83v
\89æ
\91\9c\96¢
\8eæ
\93¾
\82Å
\82·
\81B<br>
\83\81\83j
\83\85\81[
\82æ
\82è
\8eæ
\93¾
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B';
1611 SetContent(s, TitlePictureBrowser);
1615 function TEditorForm.GetFusianaName(body: TStringList; ABoard: TBoard): String;
1620 for i := 0 to body.Count - 1 do begin
1621 if (AnsiPos('BBS_NONAME_NAME=', body[i]) > 0) then begin
1623 Delete(tmp, 1, AnsiPos('=', tmp));
1630 procedure TEditorForm.GetHeadTXTActionExecute(Sender: TObject);
1632 URL, RefURL: string;
1633 settingBody: TStringList;
1635 memStream: TMemoryStream;
1637 if not FWork then begin
1640 tmpBoard := GetBoard;
1641 if (tmpBoard <> nil) then begin
1643 RefURL := tmpBoard.URL;
1644 if RefURL[Length(RefURL)] <> '/' then
1645 URL := RefURL + '/' + 'head.txt'
1647 URL := RefURL + 'head.txt';
1649 Screen.Cursor := crHourGlass;
1650 memStream := TMemoryStream.Create;
1652 StatusBar.Panels[0].Text := '
\83\8d\81[
\83J
\83\8b\83\8b\81[
\83\8b(head.txt)
\83_
\83E
\83\93\83\8d\81[
\83h
\92\86';
1654 GetWebData(URL, RefURL, tmpBoard.HEADTXTTime, memStream);
1655 if( Indy.ResponseCode = 200 ) then begin
1656 settingBody := TStringList.Create;
1658 memStream.Seek(0, soFromBeginning);
1659 settingBody.LoadFromStream(memStream);
1660 settingBody.Insert(0, '<HTML lang="ja"><HEAD>');
1661 settingBody.Insert(1, '<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">');
1662 settingBody.Insert(2, '<TITLE>' + tmpBoard.Title + '</TITLE>');
1663 settingBody.Insert(3, '<base href="' + RefURL + '"></HEAD><BODY>');
1664 settingBody.Add('</BODY></HTML>');
1665 settingBody.SaveToFile(tmpBoard.GETHEADTXTFileName);
1666 tmpBoard.HEADTXTTime := Indy.Response.LastModified;
1667 tmpBoard.IsHEADTXT := true;
1668 tmpBoard.Modified := true;
1672 StatusBar.Panels[0].Text := '
\83\8d\81[
\83J
\83\8b\83\8b\81[
\83\8b\8eæ
\93¾
\8a®
\97¹(' + IntToStr(Indy.ResponseCode) + ')';
1675 on E: EIdException do begin
1676 if( AnsiPos('304', E.Message) > 0 ) then
1677 StatusBar.Panels[0].Text := '
\83\8d\81[
\83J
\83\8b\83\8b\81[
\83\8b\8dX
\90V
\96³
\82µ(' + IntToStr(Indy.ResponseCode) + ')'
1679 StatusBar.Panels[0].Text := '
\83\8d\81[
\83J
\83\8b\83\8b\81[
\83\8b\8eæ
\93¾
\83G
\83\89\81[(' + IntToStr(Indy.ResponseCode) + ')';
1684 Screen.Cursor := crDefault;
1686 if tmpBoard.IsHEADTXT then begin
1687 ShowBoardHead(tmpboard, LocalEdit);
1695 procedure TEditorForm.CalcCapacityActionExecute(Sender: TObject);
1701 //
\82Ç
\82¤
\82à
\81A
\89ü
\8ds
\95ª
\82¸
\82ê
\82Ä
\82½
\82Á
\82Û
\82¢
\82¯
\82Ç
\81A
\96{
\93\96\82©
\82æ
\82
\95ª
\82©
\82ç
\82È
\82¢
\81B
1704 if Board.BoardPlugIn <> nil then
1705 body := CustomStringReplace(body, #13#10, '<br>')
1707 body := CustomStringReplace(body, #13#10, ' <br> ');
1708 StatusBar.Panels[0].Text := '
\97e
\97Ê:' + IntToStr(Length(body)) + ' byte';
1711 procedure TEditorForm.LocalRuleClick(Sender: TObject);
1715 ini := TMemIniFile.Create(GikoSys.Setting.GetFileName);
1717 RocalRuleTab.TabVisible := LocalRule.Checked;
1718 ini.WriteBool('EditorForm', 'LocalRuleTab', RocalRuleTab.TabVisible);
1725 procedure TEditorForm.FormDeactivate(Sender: TObject);
1727 if GikoSys.Setting.GestureEnabled then begin
1728 MouseGesture.UnHook;
1729 //MouseGesture.SetHook( GikoForm.Handle );
1734 procedure TEditorForm.OnGestureStart(Sender: TObject);
1739 procedure TEditorForm.OnGestureMove(Sender: TObject);
1745 s := MouseGesture.GetGestureStr;
1747 Action := GikoSys.Setting.Gestures.GetGestureAction(s);
1748 if Action <> nil then
1749 ActStr := '
\81i' + Action.Caption + '
\81j';
1750 s := '
\83W
\83F
\83X
\83`
\83\83\81[: ' + s + ActStr;
1751 StatusBar.Panels[0].Text := s;
1754 procedure TEditorForm.OnGestureEnd(Sender: TObject);
1759 s := MouseGesture.GetGestureStr;
1760 Action := GikoSys.Setting.Gestures.GetGestureAction(s);
1761 if Action <> nil then
1763 StatusBar.Panels[0].Text := '';
1766 procedure TEditorForm.ShowBoardHead(ABoard: TBoard; AMemo: TMemo);
1768 wDoc, WTex, le: OLEVariant;
1771 //http://www.campus.ne.jp/~ishigami/CREATION/TECHNIC/WEBAP-2.htm
1772 WebBrowser1.Navigate(ABoard.GETHEADTXTFileName,le,le,le,le);
1773 //
\83\8c\83^
\83\8a\83\93\83O
\82ª
\92x
\82·
\82¬
\82ÄTXT
\82É
\88Ú
\82¹
\82È
\82¢
\81B
\82Ê
\82é
\82Ûorz
1774 //
\89º
\82Ì
\82æ
\82¤
\82É
\82¿
\82á
\82ñ
\82Æ
\93Ç
\82Ý
\8d\9e\82Ý
\82ª
\8fI
\82í
\82Á
\82Ä
\82¢
\82é
\82©
\81A
\83`
\83F
\83b
\83N
\82·
\82ê
\82Î
\82¢
\82¢
\82ñ
\82¾
\82æ
\81B
1775 //
\82±
\82ê
\82Å
\82¢
\82¯
\82Ü
\82µ
\82½
\81B
\82 \82è
\82ª
\82Æ
\82¤
\82²
\82´
\82¢
\82Ü
\82µ
\82½
\81B
1776 while (WebBrowser1.ReadyState <> READYSTATE_COMPLETE) and
1777 (WebBrowser1.ReadyState <> READYSTATE_INTERACTIVE) do begin
1778 Application.ProcessMessages;
1780 wDoc := WebBrowser1.Document;
1781 wTex := wDoc.body.createTextRange;
1782 LocalEdit.Text := wTex.text;
1785 procedure TEditorForm.LocalRuleBrowseClick(Sender: TObject);
1792 if ABoard = nil then Exit;
1794 URL := ABoard.GETHEADTXTFileName;
1795 GikoSys.OpenBrowser(URL, gbtAuto);
1798 procedure TEditorForm.SaveNameMailActionExecute(Sender: TObject);
1800 SaveNameMailAction.Checked := not SaveNameMailAction.Checked;
1801 KotehanCheckBox.Enabled := SaveNameMailAction.Checked;
1804 function TEditorForm.LFusianaGet(const s: String): Boolean;
1806 FUSIANA = 'fusianasan';
1810 i := AnsiPos(FUSIANA, s);
1814 procedure TEditorForm.BeLogInOutEActionExecute(Sender: TObject);
1816 GikoSys.Setting.BeLogin := not GikoSys.Setting.BeLogin;
1819 procedure TEditorForm.BeLogInOutEActionUpdate(Sender: TObject);
1821 if (GikoSys.Setting.BeUserID <> '') and (GikoSys.Setting.BeCode <> '') then begin
1822 if (GikoSys.Setting.BeLogin) then BeLogInOutEAction.Checked := true
1823 else BeLogInOutEAction.Checked := false;
1824 BeLogInOutEAction.Enabled := true
1826 BeLogInOutEAction.Enabled := false;
1829 // Cookie
\82Ì
\8eæ
\93¾
1830 procedure TEditorForm.GetCookie(Rawtext: String; ABoard: TBoard);
1832 COOKIE_MARK = 'Set-Cookie:';
1835 EXPIRES_MARK = 'expires=';
1841 ABoard.Cookie := '';
1842 while (AnsiPos(COOKIE_MARK, Rawtext) > 0 ) do begin
1844 tmp := Copy(Rawtext, AnsiPos(COOKIE_MARK, Rawtext) + Length(COOKIE_MARK), Length(Rawtext));
1845 Delete(Rawtext, 1, AnsiPos('Set-Cookie', Rawtext)+ Length(COOKIE_MARK));
1846 //Cookie
\82ð
\90Ø
\82è
\8fo
\82·
1847 val := Trim(GikoSys.GetTokenIndex(tmp, ';', 0));
1848 if( AnsiPos(VAL_SPID, val) > 0 ) then begin
1849 ABoard.SPID := Copy(val, AnsiPos(VAL_SPID, val) + Length(VAL_SPID), Length(val));
1850 end else if( AnsiPos(VAL_PON, val) > 0 ) then begin
1851 ABoard.PON := Copy(val, AnsiPos(VAL_PON, val) + Length(VAL_PON), Length(val));
1853 ABoard.Cookie := ABoard.Cookie + val + '; ';
1855 //expires
\82ð
\90Ø
\82è
\8fo
\82·
1856 val := Trim(GikoSys.GetTokenIndex(tmp, ';', 1));
1857 if( AnsiPos(EXPIRES_MARK, val) > 0) then begin
1858 Delete(val, 1, AnsiPos(EXPIRES_MARK, val) + Length(EXPIRES_MARK) - 1);
1859 ABoard.Expires := GMTToLocalDateTime(val);
1865 //!
\83T
\83\93\83o
\8dX
\90V
\82Ì
\83A
\83N
\83V
\83\87\83\93\82ÌUpdate
\83C
\83x
\83\93\83g
\81@
\8aÈ
\92P
\82Ì
\82½
\82ß
\83^
\83C
\83}
\81[
\82Æ
\93¯
\82¶
\82É
\82µ
\82Ä
\82¨
\82
1866 procedure TEditorForm.UpdateSambaActionUpdate(Sender: TObject);
1868 UpdateSambaAction.Enabled := FSambaTimer.Enabled;
1871 //!
\83T
\83\93\83o
\8dX
\90V
\83A
\83N
\83V
\83\87\83\93
1872 procedure TEditorForm.UpdateSambaActionExecute(Sender: TObject);
1877 if InputQuery('Samba24
\90Ý
\92è
\92l
\8dX
\90V', '
\90V
\82µ
\82¢
\90Ý
\92è
\92l
\82ð
\93ü
\97Í
\82µ
\82Ä
\82
\82¾
\82³
\82¢', input) then begin
1878 input := ZenToHan(input);
1879 if GikoSys.IsNumeric(input) then begin
1880 FSambaTimer.UpdateSambaSetting(StrToInt(input));
1882 //
\91S
\82Ä
\82Ì
\83t
\83H
\81[
\83\80\82©
\82ç
\81ASamba
\83^
\83C
\83}
\81[
\82ð
\8dX
\90V
\82·
\82é
1883 for i := 0 to Screen.FormCount - 1 do begin
1884 if Screen.Forms[i] is TEditorForm then begin
1885 TEditorForm(Screen.Forms[i]).FSambaTimer.Update;
1886 TEditorForm(Screen.Forms[i]).UpdateSambaStatus;
1890 ShowMessage('
\90\94\92l
\82ð
\93ü
\97Í
\82µ
\82Ä
\82
\82¾
\82³
\82¢');
1891 UpdateSambaActionExecute(Sender);
1896 procedure TEditorForm.UpdateSambaStatus;
1898 if (FSambaTimer.Enabled) then begin
1899 StatusBar.Panels[2].Text
1900 := 'Samba24
\8bK
\92è
\92l' + IntToStr(FSambaTimer.SambaInterval);
1904 procedure TEditorForm.InputAssistActionExecute(Sender: TObject);
1910 TextWidth, ItemWidth, tmpWidth: Integer;
1912 if FInputAssistKey = '' then Exit;
1914 InputAssistPopupMenu.Items.Clear;
1916 if (FResistWords = nil) then begin
1917 FResistWords := TStringList.Create;
1922 if (GetKeyState( VK_SHIFT ) < 0) then begin
1923 //
\83V
\83t
\83g
\82ª
\89\9f\82³
\82ê
\82Ä
\82¢
\82ê
\82Î
\81A
\83L
\81[
\82Å
\8en
\82Ü
\82é
\83J
\83e
\83S
\83\8a
1925 InputAssistDM.GetStartWithCategoryResistWords(
1926 FInputAssistKey, FResistWords);
1928 //
\83V
\83t
\83g
\82ª
\96³
\82¢
\82Ì
\82Å
\81A
\83L
\81[
\82Å
\8en
\82Ü
\82é
\83L
\81[
1930 InputAssistDM.GetStartWithKeyResistWords(
1931 FInputAssistKey, FResistWords);
1933 Bitmap := TBitmap.Create;
1935 Bitmap.Canvas.Font.Assign(BodyEdit.Font);
1936 //
\83}
\81[
\83W
\83\935px
1937 TextWidth := Bitmap.Canvas.TextWidth(FInputAssistKey) + 5;
1939 for i := 0 to count - 1 do begin
1940 item := TMenuItem.Create(nil);
1941 item.Break := mbNone;
1942 item.Caption := FResistWords[i];
1944 item.OnClick := InputAssistMenuClick;
1945 InputAssistPopupMenu.Items.Add(item);
1947 tmpWidth := Bitmap.Canvas.TextWidth(Item.Caption);
1948 if (tmpWidth > ItemWidth) then begin
1949 ItemWidth := tmpWidth;
1956 if (count > 0) then begin
1958 point.X := point.X + Self.Left + (Self.Width - BodyEdit.Width) div 2;
1959 point.Y := point.Y + Self.Top + (Self.Height - Self.ClientHeight);
1961 if Screen.DesktopWidth >
1962 (point.X + TextWidth + ItemWidth) then begin
1963 InputAssistPopupMenu.Popup(
1964 point.X + TextWidth,
1965 point.Y + EditorPage.Top + EditorPage.TabHeight + BodyEdit.Top);
1967 InputAssistPopupMenu.Popup(
1968 point.X - TextWidth - ItemWidth,
1969 point.Y + EditorPage.Top + EditorPage.TabHeight + BodyEdit.Top);
1974 procedure TEditorForm.InputAssistMenuClick(Sender: TObject);
1979 if not (Sender is TMenuItem) then Exit;
1981 if (FResistWords <> nil) then begin
1984 TResistWord(FResistWords.Objects[TMenuItem(Sender).Tag]).GetText;
1988 IMC := ImmGetContext(BodyEdit.Handle); //
\83R
\83\93\83e
\83L
\83X
\83g
\8eæ
\93¾
1990 ImmNotifyIME(IMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
1992 ImmReleaseContext(BodyEdit.Handle, IMC); //
\83R
\83\93\83e
\83L
\83X
\83g
\89ð
\95ú
1996 FInputAssistKey := '';
1998 InsertText(BodyEdit, text);
2001 //! TMemo
\82Ì
\83J
\81[
\83\
\83\8b\88Ê
\92u
\82É
\95¶
\8e\9a\97ñ
\91}
\93ü
2002 procedure TEditorForm.InsertText(Memo: TMemo; Text: String);
2004 line, sel, pos: Integer;
2005 left, right : String;
2007 Memo.Lines.BeginUpdate;
2008 line := SendMessage(Memo.Handle,EM_LINEFROMCHAR,-1,0); //
\8ds
2009 sel := Memo.SelStart;
2010 pos := sel - SendMessage(Memo.Handle, EM_LINEINDEX, -1, 0); //
\8c\85
2011 if (pos > 0) then begin
2012 left := Copy(Memo.Lines[line], 0, pos);
2016 right := Copy(Memo.Lines[line], pos + 1, Length(Memo.Lines[line]));
2017 Memo.Lines.Strings[line] := left + Text + right;
2018 Memo.Lines.EndUpdate;
2019 //
\81@
\83L
\83\83\83\8c\83b
\83g
\82Ì
\88Ê
\92u
\82ð
\8dX
\90V
\82·
\82é
2020 Memo.SelStart := sel + Length(text);
2021 //
\83L
\83\83\83\8c\83b
\83g
\82Ì
\88Ê
\92u
\82Ü
\82Å
\83X
\83N
\83\8d\81[
\83\8b
2022 Memo.Perform(EM_SCROLLCARET, 0, 0);
2026 procedure TEditorForm.ApplicationEvents1Message(var Msg: tagMSG;
2027 var Handled: Boolean);
2034 if (Self.Active) then begin
2036 //
\83L
\81[
\89\9f\89º
\82Ì
\82Ý
\8eó
\82¯
\8eæ
\82é
2039 //
\83^
\83u
\82ª
\81h
\95Ò
\8fW
\81h
\82ÅCtrl
\83L
\81[
\82ª
\89\9f\82³
\82ê
\82Ä
\82¢
\82é
\82Ì
\82ð
\8am
\94F
\82·
\82é
2040 if (EditorPage.ActivePageIndex = 0)
2041 and (GetKeyState( VK_CONTROL ) < 0) then begin
2042 wmMsg.Msg := Msg.message;
2043 wmMsg.CharCode := Word(Msg.wParam);
2044 wmMsg.KeyData := Msg.lParam;
2045 if (wmMsg.CharCode = 229) and (wmMsg.KeyData = 3735553) then begin
2046 IMC := ImmGetContext(BodyEdit.Handle); //
\83R
\83\93\83e
\83L
\83X
\83g
\8eæ
\93¾
2047 Len := ImmGetCompositionString(IMC, GCS_COMPSTR, nil, 0); //
\82Ü
\82¸
\92·
\82³
\82ð
\8eæ
\93¾
2048 if (Len > 0) then begin
2049 SetLength(Str, Len + 1); //Buffer
\82Ì
\83\81\83\82\83\8a\82ð
\90Ý
\92è
2050 ImmGetCompositionString(IMC, GCS_COMPSTR, PChar(Str), Len + 1); //
\82Ü
\82¸
\92·
\82³
\82ð
\8eæ
\93¾
2051 SetLength(Str, Len);
2052 FInputAssistKey := Str;
2053 InputAssistActionExecute(nil);
2056 ImmReleaseContext(BodyEdit.Handle, IMC); //
\83R
\83\93\83e
\83L
\83X
\83g
\89ð
\95ú
2065 procedure TEditorForm.ShowInputAssistFormExecute(Sender: TObject);
2067 form : TInputAssistForm;
2069 form := TInputAssistForm.Create(nil);
2071 if TopAction.Checked then begin //
\83X
\83e
\83C
\8fó
\91Ô
\82É
\90Ý
\92è
2072 SetWindowPos(form.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
2074 form.SetUpFromEditor;
2075 if (form.ShowModal = mrOk) then begin
2076 InsertText(BodyEdit, form.GetInsertText);
2082 //! Cookie
\8fî
\95ñ
\8dí
\8f\9c
2083 procedure TEditorForm.ReleaseCookieActionExecute(Sender: TObject);
2087 //
\83X
\83\8c\83b
\83h
\82ª
\96³
\82¢
\81@
\83X
\83\8c\97§
\82Ä
\82Ì
\82Æ
\82«
\82ÍFBoard
\82ð
\92¼
\90Ú
\8eg
\82¤
2090 //
\83N
\83b
\83L
\81[
\82Ì
\8fî
\95ñ
\82ð
\8eÌ
\82Ä
\82é
2094 // 0
\82É
\8aª
\82«
\96ß
\82·
2097 //!
\94Â
\8fî
\95ñ
\8eæ
\93¾Update
\83C
\83x
\83\93\83g
2098 procedure TEditorForm.GetSETTINGTXTActionUpdate(Sender: TObject);
2100 //
\8eÀ
\8ds
\92\86\82Í
\8eÀ
\8ds
\95s
\89Â
2101 GetSETTINGTXTAction.Enabled := not FWork;
2103 //!
\83\8d\81[
\83J
\83\8b\83\8b\81[
\83\8b\8eæ
\93¾Update
\83C
\83x
\83\93\83g
2104 procedure TEditorForm.GetHeadTXTActionUpdate(Sender: TObject);
2106 //
\8eÀ
\8ds
\92\86\82Í
\8eÀ
\8ds
\95s
\89Â
2107 GetSETTINGTXTAction.Enabled := not FWork;
2110 //! Samba
\83^
\83C
\83}
\81[
\83C
\83x
\83\93\83g
2111 procedure TEditorForm.SambaTimer(Sender: TObject);
2114 if FSambaTimer.WriteDeta = ZERO_DATE then
2115 StatusBar.Panels[1].Text := '
\8f\89\8f\91'
2117 FNow := IncMilliSecond(FNow, 500);
2118 StatusBar.Panels[1].Text :=
2119 Format('%8.0f
\95b
\8co
\89ß', [SecondSpan(FNow, FSambaTimer.WriteDeta)]);
2123 \brief
\83E
\83B
\83\93\83h
\83E
\82Ì
\88Ê
\92u
\82Æ
\83T
\83C
\83Y
\82Ì
\90Ý
\92è
2125 procedure TEditorForm.SetWindowRect;
2127 wp: TWindowPlacement;
2129 //
\83E
\83B
\83\93\83h
\83E
\82Ì
\88Ê
\92u
\90Ý
\92è
2130 wp.length := sizeof(wp);
2131 wp.rcNormalPosition.Top := GikoSys.Setting.EditWindowTop;
2132 wp.rcNormalPosition.Left := GikoSys.Setting.EditWindowLeft;
2134 wp.rcNormalPosition.Bottom := GikoSys.Setting.EditWindowTop + GikoSys.Setting.EditWindowHeight;
2135 wp.rcNormalPosition.Right := GikoSys.Setting.EditWindowLeft + GikoSys.Setting.EditWindowWidth;
2136 wp.showCmd := SW_HIDE;
2137 SetWindowPlacement(Handle, @wp);
2139 if GikoSys.Setting.EditWindowMax then begin
2140 WindowState := wsMaximized;
2143 //
\83E
\83B
\83\93\83h
\83E
\82ª
\89æ
\96Ê
\8aO
\82È
\82ç
\89æ
\96Ê
\93à
\82É
\88Ú
\93®
\82·
\82é
2144 if (Left + Width) > Screen.Width then begin
2147 if (Top + Height) > Screen.Height then begin
2150 if Left < 0 then begin
2153 if Top < 0 then begin
2157 //
\8c»
\8dÝ
\82Ì
\83E
\83B
\83\93\83h
\83E
\82Ì
\88Ê
\92u
\82ð
\95Û
\91¶
2158 GikoSys.Setting.EditWindowTop := Top + WINDOWMOVE_V; //
\8e\9f\82É
\8aJ
\82
\83E
\83B
\83\93\83h
\83E
\82Í
2159 GikoSys.Setting.EditWindowLeft := Left + WINDOWMOVE_H; //
\81@
\81@
\81@
\89E
\8eÎ
\82ß
\89º
\82É
\82¸
\82ç
\82·
2160 //
\83E
\83B
\83\93\83h
\83E
\82Ì
\95\9d\82Æ
\8d\82\82³
\82ª
\8f¬
\82³
\82·
\82¬
\82¢
\82ê
\82Î
\8c³
\82É
\96ß
\82·
2161 if GikoSys.Setting.EditWindowHeight < 144 then begin
2164 if GikoSys.Setting.EditWindowWidth < 144 then begin
2169 \brief
\8ag
\92£
\83^
\83u
\90Ý
\92è
2171 procedure TEditorForm.SetExtraTab;
2173 SECTION = 'EditorForm';
2177 ini := TMemIniFile.Create(GikoSys.Setting.GetFileName);
2179 BoardtopTab.TabVisible := ini.Readbool(SECTION, 'BoardTopTab', False);
2180 BoardTop.Checked := BoardtopTab.TabVisible;
2181 RocalRuleTab.TabVisible := ini.ReadBool(SECTION, 'LocalRuleTab', False);
2182 LocalRule.Checked := RocalRuleTab.TabVisible;
2189 \return
\83\8c\83X
\83G
\83f
\83B
\83^
\82ª
\93\8a\8de
\82µ
\82æ
\82¤
\82Æ
\82µ
\82Ä
\82¢
\82é
\94Â
2191 function TEditorForm.GetBoard : TBoard;
2193 //
\83X
\83\8c\83b
\83h
\83A
\83C
\83e
\83\80\82ªnull
\82Ì
\8e\9e\82ÍFBoard
2194 if FThreadItem = nil then begin
2197 Result := FThreadItem.ParentBoard;
2201 \brief GikoForm
\82É
\83\81\83b
\83Z
\81[
\83W
\82ð
\92Ç
\89Á
\82·
\82é
2202 \param icon
\83\81\83b
\83Z
\81[
\83W
\82É
\82Â
\82
\83A
\83C
\83R
\83\93
2204 procedure TEditorForm.AddFormMessageNew(icon: TGikoMessageIcon);
2206 if FThreadItem = nil then begin
2207 GikoForm.AddMessageList(FBoard.Title + ' ' + GikoSys.GetGikoMessage(gmNewSure), nil, icon)
2209 GikoForm.AddMessageList(FThreadItem.Title + ' ' + GikoSys.GetGikoMessage(gmNewRes), nil, icon);
2214 \brief
\83\8d\81[
\83J
\83\8bfusiana
\83g
\83\89\83b
\83v
2215 \return true:
\91\97\90M
\92\86\8e~ false:
\91\97\90M
2217 function TEditorForm.isLocalFusianaTrap: Boolean;
2222 if GikoSys.Setting.LocalTrapAtt then begin
2223 Namae := THTMLCreate.RepHtml(NameComboBox.Text);
2224 if (LFusianaGet(Namae)) or (Namae = '
\8eR
\8dè
\8fÂ') then begin
2225 if FusianaMsgBox = IDNO then begin
2232 \brief
\83\8a\83\82\81[
\83gfusiana
\83g
\83\89\83b
\83v
2233 \return true:
\91\97\90M
\92\86\8e~ false:
\91\97\90M
2235 function TEditorForm.isRemoteFusianaTrap: Boolean;
2243 Namae := THTMLCreate.RepHtml(NameComboBox.Text);
2244 if (GikoSys.Setting.RemoteTrapAtt) and (Length(Namae) = 0) then begin
2247 if Board = nil then Exit;
2249 if not FileExists(Board.GetSETTINGTXTFileName) then begin
2250 //Setting.txt
\82ª
\82È
\82©
\82Á
\82½
\82ç
\8eæ
\93¾
2251 //
\8eI
\82É
\95\89\89×
\82ª
\82©
\82©
\82è
\82»
\82¤...
2253 GetSETTINGTXTAction.Execute;
2259 if FileExists(Board.GetSETTINGTXTFileName) then begin
2260 body := TStringList.Create;
2262 body.LoadFromFile(Board.GetSETTINGTXTFileName);
2263 Remote := GetFusianaName(body, Board);
2269 if LFusianaGet(Remote) then begin
2270 if FusianaMsgBox = IDNO then begin
2277 \brief Header
\95¶
\8e\9a\97ñ
\8eæ
\93¾
2278 \param ACOOKIE Cookie
2282 \return Header
\95¶
\8e\9a\97ñ
2284 function TEditorForm.getHeaderStr(const ACOOKIE: string; const SPID : string;
2285 const PON : string; Board : TBoard) : string;
2289 Result := Result + 'SPID=' + SPID + '; ';
2291 Result := Result + 'PON=' + PON + '; ';
2293 //
\83z
\83X
\83g
\82ª2ch
\82Å
\81ABe
\82ÉLogin
\82µ
\82Ä
\82¢
\82ê
\82ÎBE
\82Ì
\83f
\81[
\83^
\82ð
\91\97\82é
2294 //GikoSys.ParseURI( URL, Protocol,Host, Path, Document, Port, Bookmark );
2295 //if GikoSys.Is2chHost(Host) and GikoSys.Setting.BeLogin then
2296 if (Board.Is2ch) then begin
2297 //
\8cÅ
\92è
\82Ì
\83N
\83b
\83L
\81[
\82ª
\82 \82ê
\82Î
\90H
\82í
\82¹
\82é
2298 if Length(GikoSys.Setting.FixedCookie) > 0 then begin
2299 //
\83z
\83X
\83g
\82ª2ch
\82Ì
\8fê
\8d\87\81C
\8cÅ
\92è
\82Ì
\83N
\83b
\83L
\81[
\82ð
\90H
\82í
\82¹
\82é
2300 Result := Result + GikoSys.Setting.FixedCookie + '; ';
2302 if (GikoSys.Setting.BeLogin) then begin
2303 Result := Result + 'MDMD=' + GikoSys.Setting.BeCode + '; '
2304 + 'DMDM=' + GikoSys.Setting.BeUserID + '; ';
2309 Result := 'Cookie: ' + Result + 'NAME=' + NameComboBox.Text + '; MAIL=' + MailComboBox.Text;
2313 \brief fusiana
\8cx
\8d\90\83_
\83C
\83A
\83\8d\83O
2314 \return IDYES
\8f\91\82«
\8d\9e\82Þ IDNO
\92\86\8e~
2316 function TEditorForm.FusianaMsgBox: Integer;
2318 MSG_FUSIANA : string = '
\83\8a\83\82\81[
\83g
\83z
\83X
\83g
\82ð
\95\
\8e¦
\82·
\82é
\8b@
\94\
\82ª
\8eg
\82í
\82ê
\82Ä
\82¢
\82Ü
\82·'#13#10 +
2319 '
\82à
\82µ
\82à
\8aÔ
\88á
\82Á
\82Ä
\82±
\82Ì
\95û
\96@
\82Å
\83z
\83X
\83g
\82ª
\95\
\8e¦
\82³
\82ê
\82½
\82Æ
\82µ
\82Ä
\82à
\81A
\8e©
\8cÈ
\90Ó
\94C
\82È
\82Ì
\82Å
\8dí
\8f\9c\88Ë
\97\8a\82É
\82Í
\89\9e\82¶
\82Ü
\82¹
\82ñ
\81B' +
2320 #13#10#13#10'
\90Ó
\94C
\82ð
\95\89\82¤
\82±
\82Æ
\82ð
\8f³
\91ø
\82µ
\82Ä
\8f\91\82«
\8d\9e\82Ý
\82Ü
\82·
\82©
\81H';
2322 Result := MsgBox(Handle, MSG_FUSIANA, '
\8fî
\95ñ',
2323 MB_YESNO or MB_ICONQUESTION);