{------------------------------------------------------------------------------} { Unit Name: kBox Purpose : Class for a box in xy-plane. Box coordinates goes like in real xy-plane. Author : Vesa Lappalainen Date : 15.2.1998 Changed : 15.3.1998 + Read/Write to ini-file ToDo : } {------------------------------------------------------------------------------} unit kBox; interface uses Windows,Classes,kPoint, kscale; type TLinkDirX = (ldLeft,ldMid,ldRight); TLinkDirY = (ldBottom,ldCenter,ldTop); TLinkRef = record x : TLinkDirX; y : TLinkDirY; end; TDBox = class; TInformDBox = procedure (const p:TDBox) of object; TDBox = class(TPersistent) private Fp : TDPoint; Fdp : TDPoint; Ftp : TDPoint; FOrigo : TDPoint; FInform : TInformDBox; FDoInform : boolean; FOrigoRefX : TLinkDirX; FOrigoRefY : TLinkDirY; protected public constructor Create; virtual; constructor Create5(ix,iy,idx,idy:double;IInform:TInformDBox); virtual; destructor Destroy; override; procedure PChange(const p:TDPoint); virtual; procedure FromWin(ix,iy,idx,idy:integer; const scale:TScale); virtual; procedure ToWin(var ip,idp : TPoint; const scale:TScale); virtual; procedure ToWinDXY(var ip,idp : TPoint; const scale:TScale; idx,idy:integer); virtual; procedure SetDoInform(value:boolean); virtual; property DoInform : boolean read FDoInform write SetDoInform; procedure Set4(x,y,dx,dy:double); virtual; procedure ExtAsString(var value:string); virtual; function GetAsString:string; virtual; procedure GetOrigoRef(var dx,dy:double); virtual; procedure SetOrigoRefX(value:TLinkDirX); virtual; procedure SetOrigoRefY(value:TLinkDirY); virtual; published property p : TDPoint read Fp write Fp; property dp : TDPoint read Fdp write Fdp; property Origo : TDPoint read FOrigo write FOrigo; property OrigoRefX : TLinkDirX read FOrigoRefX write SetOrigoRefX default ldLeft; property OrigoRefY : TLinkDirY read FOrigoRefY write SetOrigoRefY default ldBottom; end; implementation uses kdouble,SysUtils; //----------------------------------------------------------------------------- constructor TDBox.Create; // override; begin Create5(0,0,5,5,nil); end; //----------------------------------------------------------------------------- constructor TDBox.Create5(ix,iy,idx,idy:double;IInform:TInformDBox); // virtual; begin inherited Create; Fp := TDPoint.Create3(ix,iy,PChange); Fdp := TDPoint.Create3(idx,idy,PChange); FOrigo := TDPoint.Create3(0,0,PChange); Ftp := TDPoint.Create3(0,0,nil); Finform := IInform; FDoInform := true; end; //----------------------------------------------------------------------------- procedure TDBox.PChange(const p:TDPoint); // virtual; begin if Assigned(FInform) and FDoInform then FInform(self); end; //----------------------------------------------------------------------------- destructor TDBox.Destroy; // override; begin Ftp.Free; FOrigo.Free; Fdp.Free; Fp.Free; inherited; end; //----------------------------------------------------------------------------- procedure TDBox.GetOrigoRef(var dx,dy:double); begin case OrigoRefX of ldLeft: dx := 0; ldMid: dx := dp.x/2; ldRight: dx := dp.x; end; case OrigoRefY of ldBottom: dy := 0; ldCenter: dy := dp.y/2; ldTop: dy := dp.y; end; end; //----------------------------------------------------------------------------- procedure TDBox.FromWin(ix,iy,idx,idy:integer; const scale:TScale); // virtual; var ip,idp : TPoint; oldInfo : boolean; dx,dy:double; begin if ( Scale = nil ) then begin p.SetXYnu(ix+Origo.x,iy+Origo.y); dp.SetXY(idx,idy); exit; end; ip.x := ix ; ip.y := iy; idp.x := idx; idp.y := idy; if ( Scale.Fac.x < 0 ) then ip.x := ip.x + idx; if ( Scale.Fac.y > 0 ) then ip.y := ip.y + idy; oldInfo := DoInform; DoInform := false; Scale.UpScaleP(ip,p); p.AddV(Origo); Scale.UpScaleDP(idp,dp); GetOrigoRef(dx,dy); p.AddXY(dx,dy); DoInform := oldInfo; PChange(nil); end; //----------------------------------------------------------------------------- procedure TDBox.ToWinDXY(var ip,idp : TPoint; const scale:TScale; idx,idy:integer); // virtual; var dx,dy:double; begin if ( Scale = nil ) then begin ip.x := trunc(p.x-Origo.x); ip.y := trunc(p.y-Origo.y); idp.x := trunc(dp.x); idp.y := trunc(dp.y); exit; end; Ftp.Assign(p); Ftp.SubV(Origo); GetOrigoRef(dx,dy); Ftp.AddXY(-dx,-dy); ip := Scale.DownScaleP(Ftp); idp := Scale.DownScaleDP(dp); if ( Scale.Fac.x < 0 ) then begin idp.x := abs(idp.x); ip.x := ip.x - idp.x - idx; end else ip.x := ip.x + idx; if ( Scale.Fac.y > 0 ) then ip.y := ip.y - idp.y - idy else begin idp.y := abs(idp.y); ip.y := ip.y + idy; end; end; //----------------------------------------------------------------------------- procedure TDBox.ToWin(var ip,idp : TPoint; const scale:TScale); // virtual; begin ToWinDXY(ip,idp,scale,0,0); end; //----------------------------------------------------------------------------- procedure TDBox.SetDoInform(value:boolean); // virtual; begin FDoInform := value; PChange(nil); end; //----------------------------------------------------------------------------- procedure TDBox.Set4(x,y,dx,dy:double); // virtual; var oldInfo : boolean; begin oldInfo := DoInform; DoInform := false; p.x := x; p.y := y; dp.x := dx; dp.y := dy; DoInform := oldInfo; PChange(nil); end; //----------------------------------------------------------------------------- procedure TDBox.ExtAsString(var value:string); // virtual; var s:string; begin p.ExtAsString(value); dp.ExtAsString(value); origo.ExtAsString(value); s := ExtractString(value,';',''); OrigoRefX := TLinkDirX(ExtractInt(s,',',ord(OrigoRefX))); OrigoRefY := TLinkDirY(ExtractInt(s,';',ord(OrigoRefY))); end; //----------------------------------------------------------------------------- function TDBox.GetAsString:string; // virtual; var s:string; begin s := IntToStr(ord(OrigoRefX)) + ',' + IntToStr(ord(OrigoRefY)) + ';'; Result := p.GetAsString + dp.GetAsString + origo.GetAsString + s; end; //----------------------------------------------------------------------------- procedure TDBox.SetOrigoRefX(value:TLinkDirX); // virtual; begin FOrigoRefX := value; PChange(nil); end; //----------------------------------------------------------------------------- procedure TDBox.SetOrigoRefY(value:TLinkDirY); // virtual; begin FOrigoRefY := value; PChange(nil); end; end.