Commit 21d230654ef80ebc21dff540e00145a52a1d8a72
1 parent
f8cf50c5
Exists in
master
add feedback of player points for admin and implement time interval between messages
Showing
2 changed files
with
211 additions
and
41 deletions
Show diff stats
units/game_control.pas
| @@ -40,7 +40,7 @@ type | @@ -40,7 +40,7 @@ type | ||
| 40 | function GetSelectedColorF(AStringGrid : TStringGrid) : UTF8string; | 40 | function GetSelectedColorF(AStringGrid : TStringGrid) : UTF8string; |
| 41 | function GetSelectedRowF(AStringGrid : TStringGrid) : UTF8string; | 41 | function GetSelectedRowF(AStringGrid : TStringGrid) : UTF8string; |
| 42 | function MessageHas(const A_CONST : UTF8string; AMessage : TStringList; I:ShortInt=0): Boolean; | 42 | function MessageHas(const A_CONST : UTF8string; AMessage : TStringList; I:ShortInt=0): Boolean; |
| 43 | - procedure CreatePlayerBox(P:TPlayer; Me:Boolean); | 43 | + procedure CreatePlayerBox(P:TPlayer; Me:Boolean;Admin:Boolean = False); |
| 44 | procedure DeletePlayerBox(AID : string); | 44 | procedure DeletePlayerBox(AID : string); |
| 45 | procedure SetMatrixType(AStringGrid : TStringGrid; AMatrixType:TGameMatrixType; | 45 | procedure SetMatrixType(AStringGrid : TStringGrid; AMatrixType:TGameMatrixType; |
| 46 | var ARowBase:integer; var ADrawDots, ADrawClear : Boolean); | 46 | var ARowBase:integer; var ADrawDots, ADrawClear : Boolean); |
| @@ -58,7 +58,6 @@ type | @@ -58,7 +58,6 @@ type | ||
| 58 | procedure CleanMatrix(AEnabled : Boolean); | 58 | procedure CleanMatrix(AEnabled : Boolean); |
| 59 | procedure EnablePlayerMatrix(AID:UTF8string; ATurn:integer; AEnabled:Boolean); | 59 | procedure EnablePlayerMatrix(AID:UTF8string; ATurn:integer; AEnabled:Boolean); |
| 60 | private | 60 | private |
| 61 | - | ||
| 62 | function ShouldStartExperiment: Boolean; | 61 | function ShouldStartExperiment: Boolean; |
| 63 | function ShouldEndCycle : Boolean; | 62 | function ShouldEndCycle : Boolean; |
| 64 | function ShouldEndGeneration : Boolean; | 63 | function ShouldEndGeneration : Boolean; |
| @@ -68,6 +67,7 @@ type | @@ -68,6 +67,7 @@ type | ||
| 68 | procedure NextLineage(Sender: TObject); | 67 | procedure NextLineage(Sender: TObject); |
| 69 | procedure NextCondition(Sender: TObject); | 68 | procedure NextCondition(Sender: TObject); |
| 70 | procedure Interlocking(Sender: TObject); | 69 | procedure Interlocking(Sender: TObject); |
| 70 | + procedure TargetInterlocking(Sender: TObject); | ||
| 71 | procedure Consequence(Sender: TObject); | 71 | procedure Consequence(Sender: TObject); |
| 72 | procedure EndExperiment(Sender: TObject); | 72 | procedure EndExperiment(Sender: TObject); |
| 73 | procedure StartExperiment; | 73 | procedure StartExperiment; |
| @@ -116,9 +116,14 @@ const | @@ -116,9 +116,14 @@ const | ||
| 116 | 116 | ||
| 117 | implementation | 117 | implementation |
| 118 | 118 | ||
| 119 | -uses ButtonPanel,Controls,ExtCtrls,StdCtrls, | ||
| 120 | - LazUTF8, Forms, strutils, zhelpers, | ||
| 121 | - form_matrixgame, form_chooseactor, game_resources, string_methods ; | 119 | +uses ButtonPanel,Controls,ExtCtrls,StdCtrls,LazUTF8, Forms, strutils |
| 120 | + , zhelpers | ||
| 121 | + , form_matrixgame | ||
| 122 | + , presentation_classes | ||
| 123 | + , form_chooseactor | ||
| 124 | + , game_resources | ||
| 125 | + , string_methods | ||
| 126 | + ; | ||
| 122 | 127 | ||
| 123 | const | 128 | const |
| 124 | GA_ADMIN = 'Admin'; | 129 | GA_ADMIN = 'Admin'; |
| @@ -172,7 +177,7 @@ end; | @@ -172,7 +177,7 @@ end; | ||
| 172 | 177 | ||
| 173 | procedure TGameControl.NextCycle(Sender: TObject); | 178 | procedure TGameControl.NextCycle(Sender: TObject); |
| 174 | begin | 179 | begin |
| 175 | - FormMatrixGame.LabelExpCountCycle.Caption:=IntToStr(FExperiment.Condition[FExperiment.CurrentCondition].Cycles.Count+1); | 180 | + FormMatrixGame.LabelExpCountCycle.Caption:= IntToStr(FExperiment.Cycles+1); |
| 176 | {$IFDEF DEBUG} | 181 | {$IFDEF DEBUG} |
| 177 | WriteLn('cycle:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'); | 182 | WriteLn('cycle:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'); |
| 178 | {$ENDIF} | 183 | {$ENDIF} |
| @@ -197,9 +202,17 @@ begin | @@ -197,9 +202,17 @@ begin | ||
| 197 | end; | 202 | end; |
| 198 | 203 | ||
| 199 | procedure TGameControl.Interlocking(Sender: TObject); | 204 | procedure TGameControl.Interlocking(Sender: TObject); |
| 205 | +var i : integer; | ||
| 200 | begin | 206 | begin |
| 201 | - FormMatrixGame.LabelExpCountInterlocks.Caption:= IntToStr(FExperiment.Condition[FExperiment.CurrentCondition].Interlocks.Count+1); | 207 | + i := StrToInt(FormMatrixGame.LabelExpCountInterlocks.Caption); |
| 208 | + FormMatrixGame.LabelExpCountInterlocks.Caption:= IntToStr(i+1); | ||
| 209 | +end; | ||
| 202 | 210 | ||
| 211 | +procedure TGameControl.TargetInterlocking(Sender: TObject); | ||
| 212 | +var i : integer; | ||
| 213 | +begin | ||
| 214 | + i := StrToInt(FormMatrixGame.LabelExpCountTInterlocks.Caption); | ||
| 215 | + FormMatrixGame.LabelExpCounTtInterlocks.Caption:= IntToStr(i+1); | ||
| 203 | end; | 216 | end; |
| 204 | 217 | ||
| 205 | procedure TGameControl.Consequence(Sender: TObject); | 218 | procedure TGameControl.Consequence(Sender: TObject); |
| @@ -242,7 +255,7 @@ begin | @@ -242,7 +255,7 @@ begin | ||
| 242 | FormMatrixGame.LabelExpCountTurn.Caption:=IntToStr(FExperiment.Condition[FExperiment.CurrentCondition].Turn.Count+1); | 255 | FormMatrixGame.LabelExpCountTurn.Caption:=IntToStr(FExperiment.Condition[FExperiment.CurrentCondition].Turn.Count+1); |
| 243 | 256 | ||
| 244 | // cycle | 257 | // cycle |
| 245 | - FormMatrixGame.LabelExpCountCycle.Caption:=IntToStr(FExperiment.Condition[FExperiment.CurrentCondition].Cycles.Count+1); | 258 | + FormMatrixGame.LabelExpCountCycle.Caption := IntToStr(FExperiment.Cycles+1); |
| 246 | 259 | ||
| 247 | // generation | 260 | // generation |
| 248 | FormMatrixGame.LabelExpCountGeneration.Caption:=IntToStr(FExperiment.Condition[FExperiment.CurrentCondition].Cycles.Generation+1); | 261 | FormMatrixGame.LabelExpCountGeneration.Caption:=IntToStr(FExperiment.Condition[FExperiment.CurrentCondition].Cycles.Generation+1); |
| @@ -251,7 +264,10 @@ begin | @@ -251,7 +264,10 @@ begin | ||
| 251 | FormMatrixGame.LabelExpCountCondition.Caption:= FExperiment.Condition[FExperiment.CurrentCondition].ConditionName; | 264 | FormMatrixGame.LabelExpCountCondition.Caption:= FExperiment.Condition[FExperiment.CurrentCondition].ConditionName; |
| 252 | 265 | ||
| 253 | // interlocks | 266 | // interlocks |
| 254 | - FormMatrixGame.LabelExpCountInterlocks.Caption:= IntToStr(FExperiment.Condition[FExperiment.CurrentCondition].Interlocks.Count+1); | 267 | + FormMatrixGame.LabelExpCountInterlocks.Caption:= '0'; |
| 268 | + | ||
| 269 | + // target interlocks | ||
| 270 | + FormMatrixGame.LabelExpCountTInterlocks.Caption:= '0'; | ||
| 255 | 271 | ||
| 256 | // wait for players | 272 | // wait for players |
| 257 | end; | 273 | end; |
| @@ -307,10 +323,10 @@ begin | @@ -307,10 +323,10 @@ begin | ||
| 307 | Result := Pos(A_CONST,AMessage[I])>0; | 323 | Result := Pos(A_CONST,AMessage[I])>0; |
| 308 | end; | 324 | end; |
| 309 | 325 | ||
| 310 | -procedure TGameControl.CreatePlayerBox(P: TPlayer; Me: Boolean); | 326 | +procedure TGameControl.CreatePlayerBox(P: TPlayer; Me: Boolean; Admin: Boolean); |
| 311 | var i1 : integer; | 327 | var i1 : integer; |
| 312 | begin | 328 | begin |
| 313 | - with TPlayerBox.Create(FormMatrixGame.GBLastChoice,P.ID) do | 329 | + with TPlayerBox.Create(FormMatrixGame.GBLastChoice,P.ID,Admin) do |
| 314 | begin | 330 | begin |
| 315 | if Me then | 331 | if Me then |
| 316 | Caption := P.Nicname+SysToUtf8(' (Você)' ) | 332 | Caption := P.Nicname+SysToUtf8(' (Você)' ) |
| @@ -481,17 +497,23 @@ procedure TGameControl.ShowConsequenceMessage(AID, S: string; ForGroup: Boolean) | @@ -481,17 +497,23 @@ procedure TGameControl.ShowConsequenceMessage(AID, S: string; ForGroup: Boolean) | ||
| 481 | var | 497 | var |
| 482 | LConsequence : TConsequence; | 498 | LConsequence : TConsequence; |
| 483 | begin | 499 | begin |
| 484 | - if FActor = gaPlayer then | ||
| 485 | - begin | ||
| 486 | - LConsequence := TConsequence.Create(nil,S); | ||
| 487 | - LConsequence.GenerateMessage(ForGroup); | ||
| 488 | - LConsequence.PresentMessage; | 500 | + LConsequence := TConsequence.Create(nil,S); |
| 501 | + LConsequence.GenerateMessage(ForGroup); | ||
| 502 | + LConsequence.PresentMessage; | ||
| 503 | + case FActor of | ||
| 504 | + gaPlayer: | ||
| 489 | if ForGroup then | 505 | if ForGroup then |
| 490 | LConsequence.PresentPoints | 506 | LConsequence.PresentPoints |
| 491 | else | 507 | else |
| 492 | if Self.ID = AID then | 508 | if Self.ID = AID then |
| 493 | LConsequence.PresentPoints; | 509 | LConsequence.PresentPoints; |
| 494 | - end; | 510 | + |
| 511 | + gaAdmin: | ||
| 512 | + begin | ||
| 513 | + WriteLn(S); | ||
| 514 | + LConsequence.PresentPoints(GetPlayerBox(AID)); | ||
| 515 | + end; | ||
| 516 | + end; | ||
| 495 | end; | 517 | end; |
| 496 | 518 | ||
| 497 | procedure TGameControl.DisableConfirmationButton; | 519 | procedure TGameControl.DisableConfirmationButton; |
| @@ -763,12 +785,12 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList); | @@ -763,12 +785,12 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList); | ||
| 763 | end; | 785 | end; |
| 764 | 786 | ||
| 765 | procedure MovePlayerQueue; | 787 | procedure MovePlayerQueue; |
| 766 | - var P : TPlayer; | 788 | + var |
| 789 | + P : TPlayer; | ||
| 767 | begin | 790 | begin |
| 768 | P := FExperiment.PlayerFromString[AMessage[1]]; // new | 791 | P := FExperiment.PlayerFromString[AMessage[1]]; // new |
| 769 | - CreatePlayerBox(P,Self.ID = P.ID); | ||
| 770 | - | ||
| 771 | - if FActor = gaPlayer then | 792 | + CreatePlayerBox(P,Self.ID = P.ID, FActor=gaAdmin); |
| 793 | + if FActor=gaPlayer then | ||
| 772 | begin | 794 | begin |
| 773 | FExperiment.Player[FExperiment.PlayerIndexFromID[AMessage[2]]] := P; | 795 | FExperiment.Player[FExperiment.PlayerIndexFromID[AMessage[2]]] := P; |
| 774 | EnablePlayerMatrix(Self.ID,0, True); | 796 | EnablePlayerMatrix(Self.ID,0, True); |
| @@ -846,22 +868,18 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList); | @@ -846,22 +868,18 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList); | ||
| 846 | i : integer; | 868 | i : integer; |
| 847 | MID : string; | 869 | MID : string; |
| 848 | begin | 870 | begin |
| 849 | - case FActor of | ||
| 850 | - gaPlayer:begin | ||
| 851 | - if AMessage.Count > 1 then | 871 | + if AMessage.Count > 1 then |
| 872 | + begin | ||
| 873 | + for i := 2 to AMessage.Count -1 do | ||
| 852 | begin | 874 | begin |
| 853 | - for i := 2 to AMessage.Count -1 do | ||
| 854 | - begin | ||
| 855 | - MID := ExtractDelimited(1,AMessage[i],['+']); | ||
| 856 | - ShowConsequenceMessage(MID, ExtractDelimited(2,AMessage[i],['+']),MID = 'M'); | 875 | + MID := ExtractDelimited(1,AMessage[i],['+']); |
| 876 | + ShowConsequenceMessage(MID, ExtractDelimited(2,AMessage[i],['+']),MID = 'M'); | ||
| 857 | 877 | ||
| 858 | - {$IFDEF DEBUG} | ||
| 859 | - WriteLn('A Prompt consequence should have shown.'); | ||
| 860 | - {$ENDIF} | ||
| 861 | - end; | 878 | + {$IFDEF DEBUG} |
| 879 | + WriteLn('A Prompt consequence should have shown.'); | ||
| 880 | + {$ENDIF} | ||
| 862 | end; | 881 | end; |
| 863 | end; | 882 | end; |
| 864 | - end; | ||
| 865 | ResumeNextTurn; | 883 | ResumeNextTurn; |
| 866 | end; | 884 | end; |
| 867 | 885 | ||
| @@ -949,7 +967,7 @@ procedure TGameControl.ReceiveRequest(var ARequest: TStringList); | @@ -949,7 +967,7 @@ procedure TGameControl.ReceiveRequest(var ARequest: TStringList); | ||
| 949 | end; | 967 | end; |
| 950 | 968 | ||
| 951 | // create/config playerbox | 969 | // create/config playerbox |
| 952 | - CreatePlayerBox(P,False); | 970 | + CreatePlayerBox(P,False,True); |
| 953 | 971 | ||
| 954 | // Request is now a reply with the following standard: | 972 | // Request is now a reply with the following standard: |
| 955 | // [Requester.ID 0, ' ' 1, ReplyTag 2, PlayerData 3, PlayersPlaying 4 .. n, ChatData Last] | 973 | // [Requester.ID 0, ' ' 1, ReplyTag 2, PlayerData 3, PlayersPlaying 4 .. n, ChatData Last] |
| @@ -1157,6 +1175,7 @@ procedure TGameControl.ReceiveReply(AReply: TStringList); | @@ -1157,6 +1175,7 @@ procedure TGameControl.ReceiveReply(AReply: TStringList); | ||
| 1157 | LConsequence : TConsequence; | 1175 | LConsequence : TConsequence; |
| 1158 | LCount, | 1176 | LCount, |
| 1159 | i : integer; | 1177 | i : integer; |
| 1178 | + LAnnouncer : TIntervalarAnnouncer; | ||
| 1160 | //P : TPlayer; | 1179 | //P : TPlayer; |
| 1161 | begin | 1180 | begin |
| 1162 | if Self.ID = AReply[0] then | 1181 | if Self.ID = AReply[0] then |
| @@ -1167,6 +1186,9 @@ procedure TGameControl.ReceiveReply(AReply: TStringList); | @@ -1167,6 +1186,9 @@ procedure TGameControl.ReceiveReply(AReply: TStringList); | ||
| 1167 | {$ENDIF} | 1186 | {$ENDIF} |
| 1168 | FZMQActor.SendMessage([K_CHOICE,AReply[0],AReply[3],AReply[4],AReply[5]]); | 1187 | FZMQActor.SendMessage([K_CHOICE,AReply[0],AReply[3],AReply[4],AReply[5]]); |
| 1169 | 1188 | ||
| 1189 | + LAnnouncer := TIntervalarAnnouncer.Create(nil); | ||
| 1190 | + LAnnouncer.OnStart := @FZMQActor.SendMessage; | ||
| 1191 | + LAnnouncer.Interval := 2000; | ||
| 1170 | LCount := WordCount(AReply[6],['+']); | 1192 | LCount := WordCount(AReply[6],['+']); |
| 1171 | if LCount > 0 then | 1193 | if LCount > 0 then |
| 1172 | for i := 1 to LCount do | 1194 | for i := 1 to LCount do |
| @@ -1174,7 +1196,8 @@ procedure TGameControl.ReceiveReply(AReply: TStringList); | @@ -1174,7 +1196,8 @@ procedure TGameControl.ReceiveReply(AReply: TStringList); | ||
| 1174 | LConsequence := TConsequence.Create(nil,ExtractDelimited(i,AReply[6],['+'])); | 1196 | LConsequence := TConsequence.Create(nil,ExtractDelimited(i,AReply[6],['+'])); |
| 1175 | LConsequence.GenerateMessage(False); | 1197 | LConsequence.GenerateMessage(False); |
| 1176 | if LConsequence.ShouldPublishMessage then | 1198 | if LConsequence.ShouldPublishMessage then |
| 1177 | - FZMQActor.SendMessage([K_MESSAGE,Self.ID,ExtractDelimited(i,AReply[6],['+']),BoolToStr(False)]) | 1199 | + //FZMQActor.SendMessage([K_MESSAGE,Self.ID,ExtractDelimited(i,AReply[6],['+']),BoolToStr(False)]) |
| 1200 | + LAnnouncer.Append([K_MESSAGE,Self.ID,ExtractDelimited(i,AReply[6],['+']),BoolToStr(False)]) | ||
| 1178 | else | 1201 | else |
| 1179 | begin | 1202 | begin |
| 1180 | LConsequence.PresentMessage; | 1203 | LConsequence.PresentMessage; |
| @@ -1183,7 +1206,6 @@ procedure TGameControl.ReceiveReply(AReply: TStringList); | @@ -1183,7 +1206,6 @@ procedure TGameControl.ReceiveReply(AReply: TStringList); | ||
| 1183 | {$IFDEF DEBUG} | 1206 | {$IFDEF DEBUG} |
| 1184 | WriteLn('A consequence should have shown.'); | 1207 | WriteLn('A consequence should have shown.'); |
| 1185 | {$ENDIF} | 1208 | {$ENDIF} |
| 1186 | - //Sleep(1000); | ||
| 1187 | end; | 1209 | end; |
| 1188 | 1210 | ||
| 1189 | if AReply.Count > 7 then | 1211 | if AReply.Count > 7 then |
| @@ -1194,19 +1216,23 @@ procedure TGameControl.ReceiveReply(AReply: TStringList); | @@ -1194,19 +1216,23 @@ procedure TGameControl.ReceiveReply(AReply: TStringList); | ||
| 1194 | begin | 1216 | begin |
| 1195 | LConsequence := TConsequence.Create(nil,ExtractDelimited(i,AReply[7],['+'])); | 1217 | LConsequence := TConsequence.Create(nil,ExtractDelimited(i,AReply[7],['+'])); |
| 1196 | LConsequence.GenerateMessage(True); | 1218 | LConsequence.GenerateMessage(True); |
| 1197 | - FZMQActor.SendMessage([K_MESSAGE,'',ExtractDelimited(i,AReply[7],['+']),BoolToStr(True)]); | ||
| 1198 | - | 1219 | + //FZMQActor.SendMessage([K_MESSAGE,'',ExtractDelimited(i,AReply[7],['+']),BoolToStr(True)]); |
| 1220 | + LAnnouncer.Append([K_MESSAGE,'',ExtractDelimited(i,AReply[7],['+']),BoolToStr(True)]); | ||
| 1199 | {$IFDEF DEBUG} | 1221 | {$IFDEF DEBUG} |
| 1200 | WriteLn('A metaconsequence should have shown.'); | 1222 | WriteLn('A metaconsequence should have shown.'); |
| 1201 | {$ENDIF} | 1223 | {$ENDIF} |
| 1202 | - //Sleep(1000); | ||
| 1203 | end; | 1224 | end; |
| 1204 | 1225 | ||
| 1205 | if AReply[8] <> #32 then | 1226 | if AReply[8] <> #32 then |
| 1206 | - FZMQActor.SendMessage([K_QUESTION,AReply[8],AReply[9]]) | 1227 | + //FZMQActor.SendMessage([K_QUESTION,AReply[8],AReply[9]]) |
| 1228 | + LAnnouncer.Append([K_QUESTION,AReply[8],AReply[9]]) | ||
| 1207 | else | 1229 | else |
| 1208 | - FZMQActor.SendMessage([K_RESUME,AReply[9]]); | 1230 | + //FZMQActor.SendMessage([K_RESUME,AReply[9]]); |
| 1231 | + LAnnouncer.Append([K_RESUME,AReply[9]]); | ||
| 1209 | end; | 1232 | end; |
| 1233 | + | ||
| 1234 | + LAnnouncer.Reversed; | ||
| 1235 | + LAnnouncer.Enabled := True; | ||
| 1210 | end; | 1236 | end; |
| 1211 | end; | 1237 | end; |
| 1212 | 1238 |
| @@ -0,0 +1,144 @@ | @@ -0,0 +1,144 @@ | ||
| 1 | +{ | ||
| 2 | + Stimulus Control | ||
| 3 | + Copyright (C) 2014-2016 Carlos Rafael Fernandes Picanço, Universidade Federal do Pará. | ||
| 4 | + | ||
| 5 | + The present file is distributed under the terms of the GNU General Public License (GPL v3.0). | ||
| 6 | + | ||
| 7 | + You should have received a copy of the GNU General Public License | ||
| 8 | + along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 9 | +} | ||
| 10 | +unit presentation_classes; | ||
| 11 | + | ||
| 12 | +{$mode objfpc}{$H+} | ||
| 13 | + | ||
| 14 | +interface | ||
| 15 | + | ||
| 16 | +uses | ||
| 17 | + Classes, SysUtils, ExtCtrls; | ||
| 18 | + | ||
| 19 | +type | ||
| 20 | + | ||
| 21 | + { TAnnouncerStartEvent } | ||
| 22 | + | ||
| 23 | + TAnnouncerStartEvent = procedure (AMessage : array of UTF8String) of object; | ||
| 24 | + | ||
| 25 | + { TAnnoucerMessages } | ||
| 26 | + | ||
| 27 | + TAnnoucerMessages = array of array of UTF8String; | ||
| 28 | + | ||
| 29 | + { TIntervalarAnnouncer } | ||
| 30 | + | ||
| 31 | + TIntervalarAnnouncer = class(TComponent) | ||
| 32 | + private | ||
| 33 | + FMessages: TAnnoucerMessages; | ||
| 34 | + FTimer : TTimer; | ||
| 35 | + FOnStart: TAnnouncerStartEvent; | ||
| 36 | + function GetEnabled: Boolean; | ||
| 37 | + function GetInterval: integer; | ||
| 38 | + procedure NextMessage; | ||
| 39 | + procedure SetEnabled(AValue: Boolean); | ||
| 40 | + procedure SelfDestroy(Sender: TObject); | ||
| 41 | + procedure SetInterval(AValue: integer); | ||
| 42 | + procedure StartTimer(Sender:TObject); | ||
| 43 | + public | ||
| 44 | + constructor Create(AOwner : TComponent); override; | ||
| 45 | + procedure Append(M : array of UTF8String); | ||
| 46 | + procedure Reversed; | ||
| 47 | + property Messages : TAnnoucerMessages read FMessages write FMessages; | ||
| 48 | + property OnStart : TAnnouncerStartEvent read FOnStart write FOnStart; | ||
| 49 | + property Interval : integer read GetInterval write SetInterval; | ||
| 50 | + property Enabled : Boolean read GetEnabled write SetEnabled; | ||
| 51 | + end; | ||
| 52 | + | ||
| 53 | +implementation | ||
| 54 | + | ||
| 55 | +{ TIntervalarAnnouncer } | ||
| 56 | + | ||
| 57 | +procedure TIntervalarAnnouncer.SetEnabled(AValue: Boolean); | ||
| 58 | +begin | ||
| 59 | + if FTimer.Enabled=AValue then Exit; | ||
| 60 | + FTimer.Enabled:= AValue; | ||
| 61 | +end; | ||
| 62 | + | ||
| 63 | +function TIntervalarAnnouncer.GetEnabled: Boolean; | ||
| 64 | +begin | ||
| 65 | + Result := FTimer.Enabled; | ||
| 66 | +end; | ||
| 67 | + | ||
| 68 | +function TIntervalarAnnouncer.GetInterval: integer; | ||
| 69 | +begin | ||
| 70 | + Result := FTimer.Interval; | ||
| 71 | +end; | ||
| 72 | + | ||
| 73 | +procedure TIntervalarAnnouncer.NextMessage; | ||
| 74 | +begin | ||
| 75 | + SetLength(FMessages,Length(FMessages)-1); | ||
| 76 | +end; | ||
| 77 | + | ||
| 78 | +procedure TIntervalarAnnouncer.SelfDestroy(Sender : TObject); | ||
| 79 | +var LAnnouncer : TIntervalarAnnouncer; | ||
| 80 | +begin | ||
| 81 | + if Length(FMessages) > 0 then | ||
| 82 | + begin | ||
| 83 | + LAnnouncer := TIntervalarAnnouncer.Create(nil); | ||
| 84 | + LAnnouncer.Messages := FMessages; | ||
| 85 | + LAnnouncer.OnStart:= FOnStart; | ||
| 86 | + LAnnouncer.Enabled:=True; | ||
| 87 | + end; | ||
| 88 | + Free; | ||
| 89 | +end; | ||
| 90 | + | ||
| 91 | +procedure TIntervalarAnnouncer.SetInterval(AValue: integer); | ||
| 92 | +begin | ||
| 93 | + if FTimer.Interval=AValue then Exit; | ||
| 94 | + FTimer.Interval:= AValue; | ||
| 95 | +end; | ||
| 96 | + | ||
| 97 | +procedure TIntervalarAnnouncer.StartTimer(Sender: TObject); | ||
| 98 | +var M : array of UTF8String; | ||
| 99 | +begin | ||
| 100 | + M := FMessages[High(FMessages)]; | ||
| 101 | + NextMessage; | ||
| 102 | + if Assigned(FOnStart) then FOnStart(M); | ||
| 103 | +end; | ||
| 104 | + | ||
| 105 | +constructor TIntervalarAnnouncer.Create(AOwner: TComponent); | ||
| 106 | +begin | ||
| 107 | + inherited Create(AOwner); | ||
| 108 | + FTimer := TTimer.Create(Self); | ||
| 109 | + FTimer.Enabled := False; | ||
| 110 | + FTimer.Interval := 5000; | ||
| 111 | + FTimer.OnTimer:=@SelfDestroy; | ||
| 112 | + //FTimer.OnStopTimer:=@SelfDestroy; | ||
| 113 | + FTimer.OnStartTimer:=@StartTimer; | ||
| 114 | +end; | ||
| 115 | + | ||
| 116 | +procedure TIntervalarAnnouncer.Append(M: array of UTF8String); | ||
| 117 | +var | ||
| 118 | + H : TAnnoucerMessages; | ||
| 119 | + i: Integer; | ||
| 120 | +begin | ||
| 121 | + SetLength(H,1,Length(M)); | ||
| 122 | + | ||
| 123 | + for i := Low(M) to High(M) do | ||
| 124 | + H[0,i] := M[i]; | ||
| 125 | + | ||
| 126 | + SetLength(FMessages,Length(FMessages)+1); | ||
| 127 | + FMessages[High(FMessages)] := H[0]; | ||
| 128 | +end; | ||
| 129 | + | ||
| 130 | +procedure TIntervalarAnnouncer.Reversed; | ||
| 131 | +var | ||
| 132 | + i : integer; | ||
| 133 | + M : TAnnoucerMessages; | ||
| 134 | +begin | ||
| 135 | + for i := High(FMessages) downto Low(FMessages) do | ||
| 136 | + begin | ||
| 137 | + SetLength(M,Length(M)+1); | ||
| 138 | + M[High(M)] := FMessages[i] | ||
| 139 | + end; | ||
| 140 | + FMessages := M; | ||
| 141 | +end; | ||
| 142 | + | ||
| 143 | +end. | ||
| 144 | + |