ãŸããå°ãæŽå²ã ãããžã§ã¯ãã¯ããã£ãããããã®éçºãéå§ããããšã«ãã2012幎ã«éå§ãããŸããã ãããŠãä»®æ³å¥³ã®åãšè©±ãããšã«ã€ããŠã®ç°¡åãªãã©ãã·ã¥ã²ãŒã ã§ããSayme 2ã«åºäŒã£ãåŸãæ®å¿µãªããããã®ã²ãŒã ã®éå¿çãªç¶ç¶ããŒãžã§ã³3ã¯èœã§æ»ãã ããã§ããRIPãSayme 3ã ãã®åŸãAVã¯ã¢ããªã¹ã§ãããã¢ãã¿ãŒã®äžéšãå«ã1ã€ã®DLLã§åçãæ®åœ±ãããŸãã-ã¢ãã¿ãŒãäžèŠãªå Žåã«äœåãªã¡ã¬ãã€ããããŠã³ããŒãããªãããã«ããããã§ãã
ããããAmiga Virtualã®æåã®ããŒãžã§ã³ã®å€èŠ³ã§ãã
ãã以æ¥ãã³ã³ã»ãããå€ãããŸãã-çŸåšãAVèªäœã¯ã¢ãžã¥ãŒã«ã®æäœãæŽçããããã®ãã©ãããã©ãŒã ã«ãããŸããã ãã¹ãŠã®AIãåšå®ãã¯ã¢ãžã¥ãŒã«ã«é 眮ãããŸãã
ããã°ã©ãã³ã°èšèªã«ã€ããŠã®ããã€ãã®èšèã 2012幎ã«ãDelphiãéžæããŸããã圌以å€ã¯ã»ãšãã©äœãç¥ããªãã£ãããã§ãïŒTurbo Pascalãé€ãïŒã åŸã§å€ãã®èšèªãè©ŠããŠã¿ãŸãã...ãšãããAdaã奜ãã§ãããããã¬ãŒãã³ã°è³æãååã§ã¯ãªããããã°ã©ã ãé ãããšãããããŸããã OxygenïŒDelphi PrismïŒãè©ŠããŠã¿ãŸããããææã¯ããã«å°ãªããªã£ãŠããŸãã ç§ã¯C ++ãä»ã®Cã©ã€ã¯ãªèšèªããŸã£ãã奜ãã§ã¯ãããŸããã ãã®ãããæçµçã«ç§ã¯Delphiã«æ»ããŸãããDelphiã¯ããç¥ã£ãŠããŠãåã«ã€ã³ã¿ãŒãããäžã«ããããã®ãã¬ãŒãã³ã°è³æããããæ¢æã®ãœãªã¥ãŒã·ã§ã³ãæ°å€ããããŸãã
次ã«ãããžã§ã¯ãèªäœã«ã€ããŠã Amiga Virtualã¯ãå€ç®çãã«ããšãŒãžã§ã³ãã·ã¹ãã ã§ãã äžè¬çã«ã¯ã次ã®ããã«ç·šæãããŠããŸããç¹å®ã®ãªã¹ãããç¹å®ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã¡ã€ã³ããã°ã©ã ïŒOPïŒãšäžé£ã®ã¢ãžã¥ãŒã«ïŒDLLã®åœ¢åŒã§æ瀺ããããœãããŠã§ã¢ãšãŒãžã§ã³ãïŒããããŸãã èµ·åäžã«ãOPã¯ãã¹ãŠã®ã¢ãžã¥ãŒã«ãããŒãããŠèå¥ãïŒã¢ãžã¥ãŒã«ã®æ©èœã決å®ããããã°ã©ã ãžã®ã¢ãžã¥ãŒã«ã®å²ãåœãŠã¯å ±åãããŸãã-æå³ããããŸããïŒããŠãŒã¶ãŒã¯äœæ¥ãããã¢ãžã¥ãŒã«ãéžæããéžæããã¢ãžã¥ãŒã«ã®å ¥å/åºåã€ã³ã¿ãŒãã§ã€ã¹ã®ãã«ãã¹ã¬ããåŠçãéå§ããŸãã ããã¯ã¢ãžã¥ãŒã«ãã©ã®ããã«ããŒããããèå¥ããããã§ãïŒ
procedure LoadModules; var i: Integer; begin for i := 0 to Length(Module) - 1 do begin if Module[i].Handle > 0 then FreeModule(Module[i]); if LoadModule(Module[i]) then DetermineModuleType(Module[i]); end; end; function LoadModule(var M: TModule): boolean; var B: String; C: Integer; begin with M do begin Handle := LoadLibrary(PWideChar(FileName)); if Handle > 0 then begin @SetLanguage := GetProcAddress(Handle, 'SetLanguage'); IncAndUpdateProgress; // - @SendLanguageData := GetProcAddress(Handle, 'SendLanguageData'); IncAndUpdateProgress; @GetName := GetProcAddress(Handle, 'GetName'); IncAndUpdateProgress; // , // if @GetName <> nil then begin B := GetName; C := Pos(ControlCodeMarker, B); if C > 0 then begin Name := Copy(B, C + 1, Length(B)); ControlCode := Copy(B, 1, C - 1); ControlCodeFormated := FormatControlCode(ControlCode); end else begin Name := B; ControlCode := MainForm.LanguageData[133]; end; end else begin Name := MainForm.LanguageData[114]; ControlCode := MainForm.LanguageData[133]; end; if (@OpenWindow <> nil) and (@CloseWindow <> nil) then WindowState := closed else WindowState := window_does_not_exist; if (@Sleep <> nil) and (@WakeUp <> nil) then ModuleState := working else ModuleState := module_cant_sleep; LoadStatistics; // Result := true; end else Result := false; end; end; function DetermineModuleType(var M: TModule): TModuleType; begin with M do begin MType := undetermined; if (@SetLanguage = nil) and ... (* nil *) then MType := erroneous_or_empty else begin if (@SetSource <> nil) or (@NextData <> nil) or (@Progress <> nil) or (@RestartParsing <> nil) then MType := parser else begin if (@GetData <> nil) and (@SendData <> nil) then MType := input_and_output else if (@GetData <> nil) and (@SendData = nil) then MType := only_input else if (@GetData = nil) and (@SendData <> nil) then MType := only_output else if (@GetData = nil) and (@SendData = nil) then MType := no_input_and_no_output; end; end; Result := MType; end; end;
OPã¯ããŠãŒã¶ãŒãã¢ãžã¥ãŒã«ãšå¯Ÿè©±ããããã®ããã¹ãããŒã¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ããŸãã¯ããç°¡åã«ãã£ãããŠã£ã³ããŠã®ã¿ãå®è£ ããŸãã ãã¹ãŠã®ã¢ãžã¥ãŒã«ã¯ãã®ãã£ãããéããŠéä¿¡ããŸãããéåžžãã¢ãžã¥ãŒã«ã®æè¡çãªã¡ãã»ãŒãžã¯ãŠãŒã¶ãŒã«è¡šç€ºãããŸããã 圌ã«ã¯é¢ä¿ãããŸããïŒãããã°ã®ç®çã§ããããã®ã¡ãã»ãŒãžã衚瀺ã§ããŸãïŒã æè¡ã¡ãã»ãŒãžã¯ãè¡ã®å é ã«ããã€ãã®å°å·ã§ããªãæåãšããŠããŒã¯ãããŸãã ãã®ã³ãŒãïŒãå¶åŸ¡ã³ãŒããïŒã¯ãã¢ãžã¥ãŒã«ã®éçºè ã«ãã£ãŠèšå®ãããŸãã 1ã€ã®å¶åŸ¡ã³ãŒãã§2ã€ã®ã¢ãžã¥ãŒã«ãããŠã³ããŒããããšãã·ã¹ãã ã«ãŒããçºçããå¯èœæ§ããããŸããããã2ã€ã®ã¢ãžã¥ãŒã«ã¯ã2ã€ã®ãã©ãŒãçžäºã«èšå®ãããŠããããã«ãã¡ãã»ãŒãžãç¡éã«äº€æããŸãã èŠããã«ãã¢ãžã¥ãŒã«ããããã«å®ãŠãããŠããªãã¡ãã»ãŒãžãç¡èŠããããã«ãå¶åŸ¡ã³ãŒããå¿ èŠã§ãã ãã ããã€ã³ããªãžã§ã³ã¹ã«ãŒãã«ã¢ãžã¥ãŒã«ãªã©ãäžéšã®ã¢ãžã¥ãŒã«ã¯ãã¹ãŠã®ã¡ãã»ãŒãžãåŠçã§ããŸãã
å ¥åãåºåããŸãã¯å ¥åºåã€ã³ã¿ãŒãã§ãŒã¹ãæã€åã¢ãžã¥ãŒã«ã¯ãåå¥ã®OPã¹ããªãŒã ã§åŠçãããŸãã ããã«ãããäžéšã®ã¢ãžã¥ãŒã«ãããªãŒãºããããåã«ãèãçŽããå Žåã«ãOPã®æäœæ§ãç¶æã§ããŸãã æ®ãã®ã¢ãžã¥ãŒã«ã¯ããŠãŒã¶ãŒãç¬èªã®ãŠã£ã³ããŠã䜿çšããŠæåã¢ãŒãã§äœ¿çšããŸãã 次ã®ã¯ã©ã¹ã¯ãå ¥å/åºåã¹ããªãŒã ãå®è£ ããŸãã
TIOThread = class(TThread) public const SleepTime = 1000; var Module: TModule; SelfID: Integer; constructor Create(M: TModule; ID: Integer); protected procedure Execute; override; end;
ãããŠãI / OåŠçãã©ã®ããã«è¡ããããã次ã«ç€ºããŸãã
procedure TIOThread.Execute; procedure GetData; var M: String; begin M := String(Module.GetData); if M <> SCM_No_Message then Synchronize( procedure begin Pool.AddRecord(M, SelfID); end); end; procedure SendData; var i: Integer; begin with Pool do if not Empty then begin for i := 0 to Length(Records) - 1 do with Records[i] do if not ModuleGot[SelfID] and (AuthorID <> SelfID) then begin Module.SendData(PChar(Text)); ModuleGot[SelfID] := true; end; Synchronize( procedure begin CheckAndDeleteOddRecords; end); end; end; begin inherited; while not Terminated do begin case Module.MType of only_input: GetData; only_output: SendData; input_and_output: begin SendData; GetData; end; end; Sleep(SleepTime); end; end;
ã¡ãã»ãŒãžã³ã°ã®å ŽåãOPã¯ã¡ãã»ãŒãžããŒã«ãå®è£ ããŸãã ãã£ãããŠã£ã³ããŠãšã¢ãžã¥ãŒã«ããéä¿¡ããããã¹ãŠã®ã¡ãã»ãŒãžã¯ãã®ãŠã£ã³ããŠã«ä¿åããããã¹ãŠã®ã¢ãžã¥ãŒã«ããããã®ã¡ãã»ãŒãžãåä¿¡ãããŸã§ä¿åããããã®åŸåé€ãããŸãã 次ã®ã¯ã©ã¹ã¯ãã¡ãã»ãŒãžããŒã«ãå®è£ ããŸãã
TPoolRecord = record Text: String; AuthorID: Integer; ModuleGot: array of Boolean; end; TPool = class Records: array of TPoolRecord; Empty: Boolean; procedure AddRecord(RecordText: String; RecordAuthor: Integer); procedure CheckAndDeleteOddRecords; constructor Create; procedure Show; end; procedure TPool.AddRecord(RecordText: String; RecordAuthor: Integer); var i, RL: Integer; begin RL := Length(Records); SetLength(Records, RL + 1); with Records[RL] do begin Text := RecordText; AuthorID := RecordAuthor; SetLength(ModuleGot, OutputModulesCount); for i := 0 to OutputModulesCount - 1 do if i = AuthorID then ModuleGot[i] := true else ModuleGot[i] := false; end; with MainForm, MainForm.ChatBox.Lines do case RecordAuthor of - 1: Add(User.Name + ': ' + RecordText); else if RecordText = SCM_Dont_Know_Answer then begin if DontKnowCheckBtn.Checked then Add(LanguageData[156]); end else Add(AVirtual.Name + ': ' + RecordText); end; Empty := false; end; procedure TPool.CheckAndDeleteOddRecords; function ItsOdd(ID: Integer): Boolean; var i: Integer; begin ItsOdd := true; with Records[ID] do for i := 0 to Length(ModuleGot) - 1 do if not ModuleGot[i] then begin ItsOdd := false; exit; end; end; procedure DeleteRecord(ID: Integer); var i: Integer; begin for i := ID to Length(Records) - 2 do Records[i] := Records[i + 1]; SetLength(Records, Length(Records) - 1); end; var i: Integer; begin if not Empty then begin for i := Length(Records) - 1 downto 0 do if ItsOdd(i) then DeleteRecord(i); if Length(Records) = 0 then Empty := true; end; if MainForm.PoolShowBtn.Checked then Show; end;
次ã«ãå¯èœãªã¢ãžã¥ãŒã«ã®ã¯ã©ã¹ãšãã®æ©èœã«ã€ããŠèª¬æããŸãããã
ã¬ãŒã«ãã¬ã³ããèæ¡ããå®è£ ãããæãéèŠãªäž»èŠã¯ã©ã¹ã®ã¢ãžã¥ãŒã«ã¯ããç¥çã«ãŒãã«ãïŒIJããŸãã¯åã«ã«ãŒãã«ïŒã§ãã ã«ãŒãã«ã¯ããã£ããã«èšå®ãããã¢ã«ãŽãªãºã ã«åŸã£ãŠãã£ããã«å ¥ããã¹ãŠã®ã¡ãã»ãŒãžãåŠçããŸãã ã€ãŸãã圌ã¯äž»ãªç¥çäœæ¥ãå®è¡ããŸãã ç¹å®ã®ã¢ã«ãŽãªãºã ãšãã®å®è£ ã¯ãã«ãŒãã«éçºè ã«äŸåããŸãã åªããã«ãŒãã«ãäœæããæ¹æ³ã¯èå³æ·±ã質åã§ãããäžé£ã®ã³ã¢ãäŸãšããŠäœ¿çšããŠå¥ã®èšäºã§èª¬æããŸãã å¥ã®èå³æ·±ã質åã¯ãã«ãŒãã«ãåå¥ã®ã¢ãžã¥ãŒã«ã«åå²ããæ¹æ³ã§ãã çŸåšäœæ¥äžã®ã«ãŒãã«ã现ååããããšã¯ã§ããŸããã ãã ããååãšããŠãè€åã³ã¢ã®äœæã劚ãããã®ã¯ãããŸããã
ä»ã®ãã¹ãŠã®ã¢ãžã¥ãŒã«ã¯ããã€ãã®ã«ããŽãªã«åé¡ãããŸãïŒå容äœïŒãã£ããã§ã¡ãã»ãŒãžãçæ-ããžã§ã³ã¢ãžã¥ãŒã«ãèŽèŠã¢ãžã¥ãŒã«ãªã©ïŒããšãã§ã¯ã¿ãŒïŒãã£ããããã®ã¡ãã»ãŒãžã«å¿ããŠã¢ã¯ã·ã§ã³ãå®è¡ïŒãããŒã«ïŒAIã«çŽæ¥é©çšããããŠãŒã¶ãŒãæåã§äœ¿çšããŸãïŒ ïŒãããŒãµãŒïŒãã¬ãŒãã³ã°ã¢ãžã¥ãŒã«ãDream Fusionãã§äœ¿çšïŒãããã³ããã€ãã®ç¹å¥ãªã¢ãžã¥ãŒã«ã§äœ¿çšã§ãããã®ä»ã®ã¢ãžã¥ãŒã«ã
äžéšã®å容äœãšãšãã§ã¯ã¿ãŒã¯ããããããå¶åŸ¡ã³ãŒã+ã³ãã³ããã®ã¹ã¿ã€ã«ã§èšé²ãããã¡ãã»ãŒãžããšã³ã³ãŒãããã³ãã³ãŒãããŸãã éåžžããã®ãããªã¡ãã»ãŒãžã¯ãŠãŒã¶ãŒã«ã¯è¡šç€ºãããŸããã ãããã®ã¡ãã»ãŒãžã®æ¬è³ªã¯æ¬¡ã®ãšããã§ããå容äœã¯ããŠãŒã¶ãŒã«ãã£ãŠå®è¡ãããç¹å®ã®ã¢ã¯ã·ã§ã³ãèªèããã¡ãã»ãŒãžã«ãšã³ã³ãŒãããä¿åã®ããã«ã«ãŒãã«ã«éä¿¡ããŸãã ã«ãŒãã«ããã®ã¡ãã»ãŒãžãçºè¡ãããšã察å¿ãããšãã§ã¯ã¿ãã¡ãã»ãŒãžããã³ãŒããããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ã«å¯Ÿå¿ããã³ãã³ããåä¿¡ãããã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã ã¡ãã»ãŒãžãèšæ¶ããŠçºè¡ããã«ãŒãã«ã«éãã¯ãªããä»»æã®å容äœãšãšãã§ã¯ã¿ãŒãã·ã¹ãã ã«æ¥ç¶ã§ãããããç¥æ§ã¯æ®éçã§ããããšãããããŸããã€ãŸããäœã§ãæããããŸãã ããã§ãã
䟿å®äžãé¢é£ããå容äœãšãšãã§ã¯ã¿ãŒã1ã€ã®ã¢ãžã¥ãŒã«ã«å®è£ ã§ããããšã«çœ®ãæããŠãã ããã äŸã¯ãäžè¬çãªååããšã¢ãŒã·ã§ãã«ã¢ãã¿ãŒãïŒç§ã¯ãããããšã¢ã¿ãŒããšåŒã³ãŸãïŒã®äžã®ã¢ãžã¥ãŒã«ã®ã¯ã©ã¹ã§ãããŠãŒã¶ãŒã¯ç¹å®ã®ææ ãè¡šçŸããé¡ãããŒããââãåéããã¢ãžã¥ãŒã«ã¯éžæãããææ ããšã³ã³ãŒãããã¡ãã»ãŒãžãäœæããŸãã å容äœãšããŠæ©èœããŸãã ã«ãŒãã«ããã®ã¡ãã»ãŒãžããã£ããã«çºè¡ãããšãemotarã¯ããããã³ãŒããã察å¿ããææ ãæã€é¡ç»åãäœæããŸãã ãšãã§ã¯ã¿ãŒãšããŠæ©èœããŸãã ãšã¢ã¿ãŒã2ã€ã®å¥ã ã®ã¢ãžã¥ãŒã«ã«åããããã«ãç§ã¯ãã®ç¹ãèŠãŠããŸããã
以äžã¯ãDelphiã§ã¢ãžã¥ãŒã«ãäœæããããã®ãã³ãã¬ãŒãã®äŸã§ãã
library ; uses System.SysUtils, System.Classes, SystemControlMessagesUnit in '..\..\AmigaVirtual\SystemControlMessagesUnit.pas', MainFormUnit in 'MainFormUnit.pas', const ControlCode = ++; Name = ControlCode + '> '; Help = '' + #13 + ''; var FormState: (closed, opened); Buffer, VirtualName: String; NewMessageGot: Boolean; function GetName: PChar; stdcall; begin Result := PChar(Name); end; function GetHelp: PChar; stdcall; begin Result := PChar(Help); end; procedure OpenWindow; stdcall; begin if MainForm = nil then MainForm := TMainForm.Create(nil); MainForm.Show; FormState := opened; end; procedure CloseWindow; stdcall; begin if FormState = opened then begin MainForm.Close; FormState := closed; MainForm.Release; MainForm := nil; end; end; procedure SendData(Data: PChar); stdcall; begin Buffer := Data; end; function GetData: PChar; stdcall; begin if NewMessageGot then begin Result := PChar(Buffer); NewMessageGot := false; end else Result := PChar(SCM_No_Message); end; procedure Start; stdcall; begin NewMessageGot := false; if MainForm = nil then MainForm := TMainForm.Create(nil); end; procedure SetVirtual(Name: PChar); stdcall; begin VirtualName := Name; end; procedure LoadData; stdcall; begin // end; procedure SaveData; stdcall; begin // end; exports GetName, GetHelp, OpenWindow, CloseWindow, SendData, GetData, Start, SetVirtual, LoadData, SaveData; begin end.
çŸåš21ã®ã€ã³ã¿ãŒãã§ã€ã¹ããããŸãã
SetLanguage: function(Language: PChar): boolean; stdcall; SendLanguageData: function(Data: array of PChar): boolean; stdcall; GetName: function: PChar; stdcall; GetHelp: function: PChar; stdcall; Start: procedure; stdcall; Sleep: function: boolean; stdcall; WakeUp: procedure; stdcall; OpenWindow: procedure; stdcall; CloseWindow: procedure; stdcall; SetVirtual: procedure(Name: PChar); stdcall; SaveData: procedure; stdcall; LoadData: procedure; stdcall; Reset: procedure; stdcall; SetNewMainWindow: procedure(Position, Size: TPoint); stdcall; GetTimerInterval: function: Integer; stdcall; SendData: procedure(Data: PChar); stdcall; GetData: function: PChar; stdcall; SetSource: procedure(SourcePath: PChar); stdcall; NextData: function: PChar; stdcall; Progress: function: Real; stdcall; RestartParsing: procedure; stdcall;
ã¢ãžã¥ãŒã«ã¯ãäžèšã®ã€ã³ã¿ãŒãã§ãŒã¹ã®ä»»æã®ã»ãããå®è£ ã§ããŸãã
å žåçãªã¢ãžã¥ãŒã«ã¯ã€ã³ããªãžã§ã³ããšãŒãžã§ã³ãã§ããïŒ å®è£ ã«äŸåããŸãã å®è£ ã«ã¯2ã€ã®ãªãã·ã§ã³ããããŸãã ããžã§ã³ã¢ãžã¥ãŒã«ã®äŸã§ããããèããŠã¿ãŸãããã æåã®ãªãã·ã§ã³ã¯åçŽãªãœãããŠã§ã¢ãšãŒãžã§ã³ãã§ããç»åããã®ãŸãŸãšã³ã³ãŒãããŸããã€ãŸãããããããããããã¹ãæååã«å€æããŸãã 2çªç®ã®ãªãã·ã§ã³ã¯ãè€éãªç¥çãšãŒãžã§ã³ãã§ããããšãã°ãç»åå ã®ãªããžã§ã¯ããèªèããã¡ãã»ãŒãžå ã®åèªã§èª¬æãã人工ãã¥ãŒã©ã«ãããã¯ãŒã¯ã§ãã 2çªç®ã®ã¿ã€ãã®ã¢ãžã¥ãŒã«ãããã€ã䜿çšãããŠããå ŽåããŠãããŒãµã«AIã¯åŒ±ãAIã®ã»ããããæ§ç¯ãããŠãããšèšããŸãã ããã匷åãªç¥æ§ã§ãããã©ããã¯ãã«ãŒãã«ã®å®è£ ã«äŸåããŸãã
ãããŠä»ãã¡ã€ã³ããã°ã©ã ã®è©³çŽ°ã«ã€ããŠã ãããã®3ã€ããããŸãïŒAIããŒã¿ããŒã¹ãååã§æŽçãããçµ±èšã§ãŠãŒã¶ãŒãç»é²ãããã³ã³ãã³ããå ±æããããã®ãExchange Centerãã
ãã£ããããããã©ãããã©ãŒã iiiãç¥ã£ãŠããŸããïŒ æ¬è³ªçã«ãAmiga Virtualã¯iiiã®äœåãé«åºŠãªããŒãžã§ã³ã§ãã AIã€ã³ã¹ã¿ã³ã¹ïŒååä»ãããŒã¿ããŒã¹ïŒããInfamiãã§ã¯ãªããVirtualsããšåŒã³ãŸãã åVirtualã¯ããŠãŒã¶ãŒã«ãã£ãŠãŒããããã¬ãŒãã³ã°ãããå¥ã®ã³ã³ãã¥ãŒã¿ãŒã«ç°¡åã«è»¢éã§ããŸãã ãŸããã¢ãã¿ãŒã¢ãžã¥ãŒã«ïŒãŸãã¯ãšã¢ã¿ãŒïŒã®å©ããåããŠãä»®æ³ã®ãŠããŒã¯ãªèŠèŠã€ã¡ãŒãžãäœæã§ããŸãã Virtuals Managerã¿ãã¯æ¬¡ã®ããã«ãªããŸãã
䜿çšãããã¢ãžã¥ãŒã«ã®éžæã¯ãå¶åŸ¡ã³ãŒãã«ãã£ãŠè¡çªã«ã€ããŠãã§ãã¯ãããŸãã
type CResult = (no_collision, collision); function CheckModulesCollision: CResult; var i, j: Integer; CC: String; begin Result := no_collision; with ModulesList do for i := 0 to Items.Count - 1 do if Checked[i] then begin CC := FindModuleByFileName(ExtractDLLName(Items[i])).ControlCode; for j := 0 to Items.Count - 1 do if Checked[j] and (i <> j) and (CC = FindModuleByFileName(ExtractDLLName(Items[j])).ControlCode) then Result := collision; end; end;
ãããŸã§ã®ãšãããçµ±èšã®åéã¯å®è£ ãããŠããŸããã
Exchange CenterïŒTSïŒã¯ãã¡ã€ã³ããã°ã©ã ããå©çšã§ãããµãŒãã¹ã§ããããŠãŒã¶ãŒéã®ã¢ãžã¥ãŒã«ãVirtualsãããã³ãã®ä»ã®ã³ã³ãã³ãã®äº€æãç®çãšããŠããŸãã
ãããã³ã³ãã³ãã®ããŠã³ããŒãã®å®è£ æ¹æ³ã§ãã
procedure TMainForm.DownloadFilesButtonClick(Sender: TObject); var Dir, FileName: String; begin SetCurrentDir(ProgramPath); Dir := Category[ContentCategoryBox.ItemIndex]; Dir := UpCase(Dir[1]) + Copy(Dir, 2, Length(Dir)); if not DirectoryExists(Dir) then CreateDir(Dir); SetCurrentDir(Dir); FileName := ContentList.Items[ContentList.ItemIndex]; if FileExists(FileName) then MessageDlg(LanguageData[172], mtInformation, [mbOk], 0) else begin DownloadFile(SiteProtocol + OfficialWebsite + ExchangeCenterPage + '?c=' + Category[ContentCategoryBox.ItemIndex] + '&f=' + FileName + '&l=' + LanguageData[0], FileName); // LanguageData[0] if Copy(FileName, Length(FileName) - 2, 3) = 'zip' then UnzipFiles(FileName, GetCurrentDir); case ContentCategoryBox.ItemIndex of 0: UpdateModulesList; 1: UpdateVirtualsList; end; SetStatusMessage(LanguageData[173] + ' ' + ProgramPath + Dir + '\'); end; end; procedure TMainForm.DownloadFile(From, SaveTo: String); var LoadStream: TMemoryStream; begin Downloading := true; LoadStream := TMemoryStream.Create; IdHTTP.Get(TIdURI.URLEncode(From), LoadStream); LoadStream.SaveToFile(SaveTo); LoadStream.Free; Downloading := false; SplashScreen.Close; end;
ã³ã³ãã³ããã»ã³ãã©ã«ãªãã£ã¹ã«ã¢ããããŒãããããã«ãã¢ã«ãŠã³ãã·ã¹ãã ãå®è£ ãããŠããŸãïŒãŸã æ©èœããŠããŸããïŒã
å ¬åŒãã©ãŒã©ã ã®ã¢ã«ãŠã³ãã·ã¹ãã ã«æ¥ç¶ããäºå®ã§ããããŸã æ¹æ³ãããããŸããã
ã²ã¹ãã¢ã«ãŠã³ãã§ã¯åºæ¬ã¢ã¯ã»ã¹ïŒããŠã³ããŒãã®ã¿ïŒãæäŸãããã³ã³ãã³ããããŠã³ããŒãããã«ã¯ç»é²ããå¿ èŠããããŸãïŒã³ã³ãã³ãããŒãã¢ã«ãŽãªãºã ãå®è£ ããããŸã§ãFTPçµç±ã§æåã§ã¢ããããŒãããŸãïŒã
DHã«å ããŠããŠãŒã¶ãŒã«æè¡ãµããŒããæäŸãããã©ãŒã©ã ããããŸã-çµã¿èŸŒã¿ãã©ãŠã¶ã§éããŸãïŒDelphiã®æšæº-Tridentã«ãŒãã«ã䜿çšããŠããããã§ãããåçŽãªããŒãžãæç»ããã ãã§ã;ãã©ãŒã©ã èªäœã¯phpBBã«ãããŸãïŒã
ã¹ã¯ãªãŒã³ã·ã§ãããããããããã«ãã¢ãã¬ã¹ãå ¥åããŠããŒãžãããã¯ããŒã¯ããããšãã§ããŸãïŒããã¯ããŒã¯ã¯ãŸã å®è£ ãããŠããŸããïŒ-ãã©ãŒã©ã ã§ã®è°è«ã倱ããªãããã«ã
å¥ã®ãã€ã³ãã LanguageDataã®äžã®ã³ãŒãã«æ³šç®ããŠãã ããã ããã¯ãéžæããèšèªã«äžèŽããGUIã³ã³ããŒãã³ãã®ããã¹ãæååãæ ŒçŽããé åã§ãã ãã·ã¢èªãšè±èªã¯ãªãœãŒã¹ãšããŠ.exeã«ããã±ãŒãžåãããèµ·åæã«Languagesãã©ã«ããŒã«è§£åãããŸãã ä»ã®èšèªã®ãã¡ã€ã«ã¯ãExchange CenterããããŠã³ããŒãã§ããŸãã ãªããªã Delphiã¯UnicodeããµããŒãããŠãããèšèªã¯å¥œããªããã«èšå®ã§ããŸã-äŸãã°ãæ¥æ¬èªãã¢ã©ãã¢èªã
ããã¯ãèšèªãã¡ã€ã«ã.exeããã¢ã³ããŒããããæ¹æ³ã§ãã
procedure TMainForm.DeployDefaultLanguages; procedure DeployLanguage(LanguageName: String); var ResHandle, MemHandle: THandle; MemStream: TMemoryStream; ResPtr: PByte; ResSize: Longint; ResName: String; i: Integer; begin ResName := ''; for i := 1 to Length(LanguageName) do ResName := ResName + UpCase(LanguageName[i]); ResName := ResName + '_LP'; ResHandle := FindResource(HInstance, PWideChar(ResName), RT_RCDATA); if ResHandle = 0 then begin ShowMessage('Default language "' + LanguageName + '" not found. (' + ResName + ')'); exit; end; MemHandle := LoadResource(HInstance, ResHandle); ResPtr := LockResource(MemHandle); MemStream := TMemoryStream.Create; ResSize := SizeOfResource(HInstance, ResHandle); MemStream.SetSize(ResSize); MemStream.Write(ResPtr^, ResSize); MemStream.Seek(0, 0); MemStream.SaveToFile(LangFilesDir + '/' + LanguageName + LanguageFileExtension); FreeResource(MemHandle); MemStream.Destroy; end; begin if not DirectoryExists(LangFilesDir) then CreateDir(LangFilesDir); DeployLanguage('Russian'); DeployLanguage('English'); end;
ã芧ã®ãšãããæ°ããå®çŸ©æžã¿èšèªãåã蟌ãã«ã¯ãèšèªãã¡ã€ã«ããªãœãŒã¹ãã¡ã€ã«ã«æ¿å ¥ããDeployLanguageã¿ã€ãïŒãèšèªåãïŒã®è¡ãè¿œå ããŠããããžã§ã¯ããåã³ã³ãã€ã«ããã ãã§ã-䟿å©ã§ãã
ãããèšèªã®ããŒãæ¹æ³ã§ãã
procedure TMainForm.ChangeLanguageTo; function LanguageDataLoaded: Boolean; var T: TextFile; B: RawByteString; begin SetCurrentDir(ProgramPath + LangFilesDir); if FileExists(Language + LanguageFileExtension) then begin AssignFile(T, Language + LanguageFileExtension); Reset(T); SetLength(LanguageData, 1); LanguageData[0] := Language; while not eof(T) do begin SetLength(LanguageData, Length(LanguageData) + 1); ReadLn(T, B); LanguageData[Length(LanguageData) - 1] := UTF8ToWideString(B); end; CloseFile(T); if Length(LanguageData) - 1 >= LangFileMinSize then Result := true else Result := false; end else Result := false; end; procedure SetCaptions; begin with HelpForm do begin LoadHelpTexts; if CurrentTopic < HelpLast then OpenTopic(CurrentTopic) else OpenTopic(0); end; AddModulesHelpToMainProgramHelp; ChangeModulesLanguageToProgramLanguage; AuthorizationTab.Caption := LanguageData[18]; // - ... CloudSaveNow.Caption := LanguageData[181]; CloudLoadNow.Caption := LanguageData[182]; end; procedure CheckMenuItem; var Item: TMenuItem; begin for Item in LanguageMenu.Items do if Item.Name = LanguageData[0] + 'Lang' then Item.Checked := true; end; begin if LanguageDataLoaded then begin if not Silent then SetStatusMessage(LanguageData[2] + ' ' + LanguageData[0]) else FormCaption.Caption := LanguageData[1]; SetCaptions; end else begin if Language <> SavedLanguage then ChangeLanguageTo(SavedLanguage) else ChangeLanguageTo(DefaultLanguage); MessageDlg(LanguageData[3] + #13 + LanguageData[2] + ' ' + LanguageData[0] + '.', mtError, [mbOk], 0); end; CheckMenuItem; end;
ãã«ããŠã£ã³ããŠããããŸãã
ãããéããŠãã¡ã€ã³ã¡ãã¥ãŒãããã¢ãžã¥ãŒã«ã«é¢ããæ å ±ã衚瀺ã§ããŸãïŒ
ãã1ã€ã®èå³æ·±ãããªãã¯ã¯ã.batã¹ã¯ãªããã䜿çšããŠäœæãããããã°ã©ã ã®èªå·±æŽæ°ã§ãã
procedure TMainForm.UpdateProgram; procedure DeployBAT; var bat: TextFile; begin if not FileExists(ProgramPath + 'update.bat') then begin AssignFile(bat, ProgramPath + 'update.bat'); Rewrite(bat); WriteLn(bat, 'taskkill /im av.exe'); WriteLn(bat, 'sleep 1'); // Windows XP WriteLn(bat, 'timeout /t 1 /nobreak'); // Windows 7+ WriteLn(bat, 'del av.exe'); WriteLn(bat, 'move ' + ZipsDir + '\av.exe %1'); WriteLn(bat, 'del /S /Q ' + ZipsDir); WriteLn(bat, 'start av.exe'); // WriteLn(bat, 'pause'); CloseFile(bat); end; end; begin DownloadFile(SiteProtocol + OfficialWebsite + '/av.zip', ProgramPath + 'av.zip'); UnzipFiles(ProgramPath + 'av.zip', ProgramPath + ZipsDir); DeployBAT; SetCurrentDir(ProgramPath); ShellExecute(Handle, nil, 'update.bat', PChar(ProgramPath), nil, SW_SHOW); end;
çµè«ãšããŠãAmiga Virtualãããžã§ã¯ãã«ã¯Windowsããã°ã©ã ã ãã§ã¯ãªãããšã«æ³šæããŠãã ããã ããã«å ããŠãAndroidïŒAVã¢ãã€ã«ïŒããããããã©ãããã©ãŒã ïŒAV OSïŒãããã³ã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒïŒAVã¹ãŒããŒïŒã®ã·ã¹ãã ãªãã·ã§ã³ãèšç»ãããŠããŸãã ãŸããã€ã³ããªãžã§ã³ã¹ã³ã¢ã¢ã«ãŽãªãºã ã䜿çšããŠãã€ã³ããªãžã§ã³ããªæ€çŽ¢ãšã³ãžã³ãäœæã§ããŸãïŒYandexãšGoogleã®æ€çŽ¢çµæãåç·šæããŸãïŒã ãããã®åéã®ããããã§ã¢ã«ãã¡çã®æºåãã§ãããããã®äœæ¥ã説æããèšäºãæžããŸãã
ãããžã§ã¯ãã®ãœãŒã¹ã³ãŒããšèšèšããã¥ã¡ã³ãã¯ã github.com / TimKruz / AVããããŠã³ããŒãã§ããŸãã
ãæž èŽããããšãããããŸããã