unit TeamUnit; interface uses ExtCtrls, StdCtrls,Controls, Sysutils,Dialogs, Classes,graphics,ExtDlgs, jpeg, math, windows; Const feditmode = 'edit.dat'; EditChar : Array[0..3] of Char = ('$','%','^','&'); NameByte : Array[0..13] of String = ('rup','rdown','bigball','smallball','pushs', 'onegoal','twogoal','balanceon','balanceoff', 'balancetwo','squish','rampbot','rblock','limbo'); Type ViewState = (vsEdit,vsShow,vsNone); tTeam = class FName : String; Objs : Array of TControl; ViewMode : ViewState; Data : Array of String; ChLink : Array of Byte; EdLink : Array of Byte; MmLink : Byte; ImLink : Byte; IMName : String; LoadPic : TOpenPictureDialog; Constructor Create( fn : string ); Procedure EditMode( X : tGroupBox ); Function ChInv(S:Byte) : Byte; Function EdInv(S:Byte) : Byte; Procedure SaveToFile; overload; Procedure SaveToFile(FileName : String); overload; Procedure SeSel(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Procedure SeOpn(Sender: TObject); //open a picture Procedure ShowImage; End; Function Chop( S : String ) : String; Function Crop( S : String ) : String; implementation uses unit1; Function Chop( S : String ) : String; var I : Integer; Begin Result :=''; If Length(S) > 1 Then for I:= 2 to Length(S) Do Result := Result + S[I]; end; Function Crop ( S : String ) : String; Begin Result := ''; Result := Copy(S,1,Pos('.',S)-1); End; Function NameToInt( S : string ) : Byte; Begin Result := 255; {0:rup 1:rdown 2:bigball 3:smallball 4:pushs 5:onegoal 6:twogoal 7:balanceon 8:balanceoff 9:balancetwo 10:squish 11:rampbot 12:rblock 13:limbo} If Pos( 'rup',S ) <> 0 Then Result := 0; If Pos( 'rdown',S ) <> 0 Then Result := 1; If Pos( 'bigball',S ) <> 0 Then Result := 2; If Pos( 'smallball',S ) <> 0 Then Result := 3; If Pos( 'pushs',S ) <> 0 Then Result := 4; If Pos( 'onegoal',S ) <> 0 Then Result := 5; If Pos( 'twogoal',S ) <> 0 Then Result := 6; If Pos( 'balanceon',S ) <> 0 Then Result := 7; If Pos( 'balanceoff',S ) <> 0 Then Result := 8; If Pos( 'balancetwo',S ) <> 0 Then Result := 9; If Pos( 'squish',S ) <> 0 Then Result := 10; If Pos( 'rampbot',S ) <> 0 Then Result := 11; If Pos( 'rblock',S ) <> 0 Then Result := 12; If Pos( 'limbo',S ) <> 0 Then Result := 13; End; Function CharToInt( S : Char ) : byte; Begin Case S Of '$' : Result := 0; '%' : Result := 1; '^' : Result := 2; '&' : Result := 3; Else Result := 255; End; end; Procedure tTeam.ShowImage; var Jpeg : tjpegimage; t : trect; x : real; Begin If pos('.JPG',uppercase(IMName) ) <> 0 Then Begin jpeg := tjpegimage.create; jpeg.loadfromfile(imname); with timage(objs[imlink]).canvas do begin timage(objs[imlink]).stretch := false; brush.color := clgray; brush.style := bssolid; fillrect(timage(objs[imlink]).clientrect); t := timage(objs[imlink]).clientrect; x := min(timage(objs[imlink]).clientwidth/jpeg.width, timage(objs[imlink]).clientheight/jpeg.height); t.right := trunc(jpeg.width * x); t.bottom := trunc(jpeg.height * x); stretchdraw(t, jpeg); end; End Else TImage(Objs[ImLink]).Picture.LoadFromFile(IMName); End; { tTeam } Procedure tTeam.SeOpn(Sender: TObject); //open a picture Begin If LoadPic.Execute Then Begin IMName := LoadPic.FileName; ShowImage; End; End; function tTeam.ChInv(S : Byte): Byte; Var I : Integer; begin Result := 255; For I := 0 to high(ChLink) do If S = ChLink[I] then Result := I; end; constructor tTeam.Create(fn: string); begin FName := fn; ViewMode := vsNone; end; function tTeam.EdInv(S: Byte): Byte; Var I : Integer; begin Result := 255; For I := 0 to high(edLink) do If S = edLink[I] then Result := I; end; procedure tTeam.EditMode(X: tGroupBox); var T : TextFile; S : String; W,H : Integer; begin //setup components LoadPic := TOpenPictureDialog.Create(X); LoadPic.Filter:='Bitmaps|*.BMP|All Images|*.BMP;*.GIF;*.JPG'; If ViewMode = vsShow then Begin //destroy other components End; If ViewMode = vsEdit Then Exit; ViewMode := vsEdit; AssignFile( T, feditmode ); Reset ( T ); ReadLn(T, W, H); //get width and height for panel X.Width := W; X.Height := H; X.Caption := Crop(fname); While Not Eof(T) do Begin SetLength( Objs, Length(Objs)+1 ); ReadLn( T, S ); If S = 'checkbox' then Begin SetLength(ChLink,Length(ChLink)+1); ChLink[High(ChLink)] := High(Objs); Objs[High(Objs)] := TCheckBox.Create(X); Objs[High(Objs)].Parent := X; ReadLn(T,S); Objs[High(Objs)].Left := StrToInt(S); ReadLn(T,S); Objs[High(Objs)].Top := StrToInt(S); ReadLn(T,S); Objs[High(Objs)].Width := StrToInt(S); ReadLn(T,S); Objs[High(Objs)].Height := StrToInt(S); ReadLn(T,S); TCheckBox(Objs[High(Objs)]).Caption := S; TCheckBox(Objs[High(Objs)]).OnMouseDown := SeSel; {ReadLn(T,S); If S = 'TRUE' Then TCheckBox( Objs[High(Objs)] ).Checked := True;} End; If S = 'image' then Begin ImLink := High(Objs); Objs[High(Objs)] := TImage.Create(X); Objs[High(Objs)].Parent := X; ReadLn(T,S); Objs[High(Objs)].Left := StrToInt(S); ReadLn(T,S); Objs[High(Objs)].Top := StrToInt(S); ReadLn(T,S); Objs[High(Objs)].Width := StrToInt(S); ReadLn(T,S); Objs[High(Objs)].Height := StrToInt(S); ReadLn(T,S); TImage( Objs[ HIgh(Objs) ] ).Stretch := True; If FileExists('bksub.jpg') then Begin IMName := 'bksub.jpg'; ShowImage; end; TImage( Objs[ HIgh(Objs) ] ).OnClick := SeOpn; End; If S = 'memo' Then Begin MmLink := High(Objs); Objs[High(Objs)] := TMemo.Create(X); Objs[High(Objs)].Parent := X; ReadLn(T,S); Objs[High(Objs)].Left := StrToInt(S); ReadLn(T,S); Objs[High(Objs)].Top := StrToInt(S); ReadLn(T,S); Objs[High(Objs)].Width := StrToInt(S); ReadLn(T,S); Objs[High(Objs)].Height := StrToInt(S); End; If S = 'edit' Then Begin SetLength(edLink,Length(edLink)+1); edLink[High(edLink)] := High(Objs); Objs[High(Objs)] := TEdit.Create(X); Objs[High(Objs)].Parent := X; ReadLn(T,S); Objs[High(Objs)].Left := StrToInt(S); ReadLn(T,S); Objs[High(Objs)].Top := StrToInt(S); ReadLn(T,S); Objs[High(Objs)].Width := StrToInt(S); ReadLn(T,S); Objs[High(Objs)].Height := StrToInt(S); ReadLn(T,S); tEdit(Objs[High(Objs)]).Text := S; End; End; CloseFile(T); If FileExists(FName) then Begin AssignFile(T,FName); Reset(T); While not eof(T) do Begin SetLength(Data,Length(Data)+1); ReadLn(T,Data[High(data)]); If Data[High(Data)][1] in ['!','#'] Then Begin tCheckBox(Objs[ ChLink[ NameToInt(Data[High(Data)]) ]]).Checked := True; If Data[High(Data)][1] = '!' Then tCheckBox(Objs[ ChLink[ NameToInt(Data[High(Data)]) ]]).Font.Style := tCheckBox(Objs[ ChLink[ NameToInt(Data[High(Data)]) ]]).font.Style + [fsBold]; End; {If CharToInt( Data[High(Data)][1] ) <> 255 then Begin tEdit( objs[ EdLink[CharToInt(Data[High(Data)][1])]]).Text := Chop( Data[High(Data)] ); End;} If Data[High(Data)][1] = '-' Then tMemo(Objs[MmLink]).Lines.Add(Data[High(Data)]); If Data[High(Data)][1] = '@' Then Begin If FileExists( Chop(Data[High(Data)]) ) Then Begin {ShowMessage('Opening '+Chop(Data[High(Data)]));} IMName := Chop(Data[High(Data)]); ShowImage; End; End; End; CloseFile(T); End; end; procedure tTeam.SaveToFile; begin SaveTofile(fname); end; procedure tTeam.SaveToFile(FileName: String); Var T : Text; I,J : Integer; begin Assignfile(t,filename); ReWrite(t); for I := 0 to High(Objs) do Begin If Objs[I] is tcheckbox Then Begin If tCheckBox(objs[i]).checked Then If fsBold in tCheckBox(Objs[I]).font.style Then WriteLn(T, '!', NameByte[ChInv(i)]) Else WriteLn(T,'#',NameByte[ChInv(i)]); End; If Objs[I] is tMemo Then Begin if tMemo(Objs[I]).Lines.Count > 0 Then For J := 0 to tMemo(Objs[I]).Lines.Count-1 Do If tMemo(Objs[I]).Lines[J][1] <> '-' then WriteLn(T, '-',tMemo(Objs[I]).Lines[J]) Else WriteLn(T,tMemo(Objs[I]).Lines[J]); End; If Objs[i] is tImage Then Begin WriteLn(T,'@',IMName); End; If Objs[i] is tEdit Then Begin WriteLn(T,EditChar[EdInv(I)],tEdit(Objs[i]).text); end; End; WriteLn(t,'<**********>'); ShowMessage(fileName+' successfully saved'); closeFile(T); end; procedure tTeam.SeSel(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin If Button = mbRight Then If Sender is TcheckBox Then With Sender as Tcheckbox Do Begin If fsBold in Font.Style Then Begin Font.Style := font.Style - [fsBold]; Checked := False; End Else Begin Font.Style := font.Style + [fsBold]; Checked := True; End; End; end; end.