Unit diagramm; INTERFACE Uses graph,graph2; Const MaxAdat=1000; Type TAdat = Record Adat : Byte; end{record}; TAdatSor = Record Db : Byte; MaxErt : Byte; Sor : Array[1..MaxAdat] of Word; end{record}; TTerulet = Record X1,Y1 : Word; X2,Y2 : Word; end{record}; TOszlDiag = object {DIAGRAMM ADATOK:} DiagCim : String[50];{Diagramm cime} VanEDiagCim : Boolean;{Latszik-e a diagramm cime} AdatSor : TAdatSor;{az oszlopok adatai} DiagTer : TTerulet;{diagramm terulete feliratokkal egyutt} DiagTerHSzin : Word; {diagramm-terulet hatterszine} {OSZLOPOKHOZ TARTOZO ADATOK:} OszlSzelArany : Word; {Megadja, hogy oszlopszelesseg az oszlopszelesseg ketszeresenek h ny sz zal‚ka} VanETerhatas : Boolean; {az oszlopok terhatasuak-e} OszlKitoltes : FillSettingsType; {oszlop kitoltesi mintaja es szine} VanEOszlKeret : Boolean;{van-e az oszlopoknak keretuk} AdatTer : TTerulet;{diagramm adatterulete (csak az oszlopok)} AdatTerHSzin : Word; {adatterulet hatterszine} {TENGELYEK} DiagSzin : Word; {tengelyek, segedvonalak, jelzesek szine} KoordTer : TTerulet;{koordinata-rendszer razjolasi terulete} KoordTerHSzin : Word; {koordintaterendszer-terulet hatterszine} {Kategoria-tengely (x):} KategTengCim : String[50]; OszlopKoz : Word; {egymas mellett levo oszlopok kozepe kozotti tavolasag pixelben} VanEXBeoszt : Boolean; {latszodjon-e az x tengelyen a beosztas} VanEXFelirat : Boolean; {latszodjon-e az x tengelyen a felirat} VanEXRacs : Boolean; {Van-e az x tengelyre meroleges segedracs} {Ertek-tengely (y):} ErtekTengCim : String[50]; PixelPerErtek : {priv}Real; {hany pixel tartozik egy ertekhez} VanEYBeoszt : Boolean; {latszodjon-e az y tengelyen a beosztas} BeosztGyak : 1..100; {beosztas gyakorisaga szazalekban} VanEErtek : Boolean; {ki legyen-e jelezve az ertek-nagysag} VanEYFelirat : Boolean; {latszodjon-e az y tengelyen a felirat} VanEYRacs : Boolean; {Van-e az y tengelyre meroleges beosztas} Procedure AdatBevitel; Procedure OszlopDiagRajz; Function AktOszlopRajz:Boolean; Private AktAdatSorSz : Word; {adatsor aktualisan kivalasztott adata} AktAdatTerHely : Word; {X tengely aktualis helyzete} MaxHely : Word; {oszlopok maximalis szama} ErtekPerBeoszt : Real; {mekkora ertek tartozik egy beosztashoz} GyakPixel : Real; {beosztasok tavolsaga az Y tengelyen} end{object}; IMPLEMENTATION Procedure TOszlDiag.AdatBevitel; var i : Word; begin AdatSor.Db:=250; AdatSor.MaxErt:=200; Randomize; For i:=1 to AdatSor.Db do AdatSor.Sor[i]:=Random(AdatSor.MaxErt); end{AdatBevitel}; {Irany= 1:fel, 2:jobbra, 3:le, 4:balra} Procedure NyilRajzolas(X,Y:Integer;Szin:Word;Irany:Byte); var i : Byte; begin Case Irany of 1 : begin PutPixel2(X,Y,Szin); For i:=0 to 7 do PutPixel2(X,Y-i,Szin); Y:=Y-2; For i:=0 to 6 do begin PutPixel2(X-1,Y-i,Szin); PutPixel2(X+1,Y-i,Szin); end; Y:=Y-2; For i:=0 to 4 do begin PutPixel2(X-2,Y-i,Szin); PutPixel2(X+2,Y-i,Szin); end; Y:=Y-2; For i:=0 to 2 do begin PutPixel2(X-3,Y-i,Szin); PutPixel2(X+3,Y-i,Szin); end; end{1}; 2 : begin PutPixel2(X,Y,Szin); For i:=0 to 7 do PutPixel2(X-i,Y,Szin); X:=X-2; For i:=0 to 6 do begin PutPixel2(X-i,Y-1,Szin); PutPixel2(X-i,Y+1,Szin); end; X:=X-2; For i:=0 to 4 do begin PutPixel2(X-i,Y-2,Szin); PutPixel2(X-i,Y+2,Szin); end; X:=X-2; For i:=0 to 2 do begin PutPixel2(X-i,Y-3,Szin); PutPixel2(X-i,Y+3,Szin); end; end{2}; 3 : begin PutPixel2(X,Y,Szin); end{3}; 4 : begin PutPixel2(X,Y,Szin); end{4}; end{case}; end{NyilRajzolas}; Function TOszlDiag.AktOszlopRajz:Boolean; var Mag : Word; OldColor : Word; FillInfo : FillSettingsType; AASSz : Word; OszlSzel : Word; begin SetViewPort2(AdatTer.X1,AdatTer.Y1,AdatTer.X2,AdatTer.Y2,True); OldColor:=GetColor;{elozo szin elmentese} SetColor(DiagSzin);{kovetkezo szin betoltese} GetFillSettings(FillInfo); {kitoltesi minta es szin elmentese} SetFillStyle(OszlKitoltes.Pattern,OszlKitoltes.Color); {kovetkezo kitoltesi minta betoltese} If AktAdatSorSz<=AdatSor.Db Then begin Mag:=Round((AdatSor.Sor[AktAdatSorSz]/ErtekPerBeoszt)*GyakPixel); If AktAdatTerHely<=MaxHely Then begin OszlSzel:=Round((OszlopKoz/100)*OszlSzelArany); Bar3D2((OszlopKoz*AktAdatTerHely)-(OszlSzel Div 2),0, (OszlopKoz*AktAdatTerHely)+(OszlSzel Div 2),Mag,0,VanEOszlKeret); Inc(AktAdatTerHely); end{then} Else begin AktAdatTerHely:=1; {ReadLn;} AASSz:=AktAdatSorSz; {el kell menteni, mert az OszlopDiagRajz kezdoerteket ad neki} OszlopDiagRajz; AktAdatSorSz:=AASSz; OszlSzel:=Round((OszlopKoz/100)*OszlSzelArany); Bar3D2((OszlopKoz*AktAdatTerHely)-(OszlSzel Div 2),0, (OszlopKoz*AktAdatTerHely)+(OszlSzel Div 2),Mag,0,VanEOszlKeret); Inc(AktAdatTerHely); end{else}; Inc(AktAdatSorSz); AktOszlopRajz:=True; end{then} Else AktOszlopRajz:=False; SetFillStyle(FillInfo.Pattern,FillInfo.Color);{elozo kitoltesi minta visszaallitasa} SetColor(OldColor);{el“z“ sz¡n vissza ll¡t sa} end{AktOszlopRajz}; Procedure TOszlDiag.OszlopDiagRajz; var YKoz : Word; XKoz : Word; Size : Word; procedure DiagTerRajz; var i : Integer; j : Word; Szov : String; Szam : Integer; SzovVegHelyX : Word; SzovHelyX : Word; SzovHelyY : Word; FillInfo : FillSettingsType; begin SetViewPort2(DiagTer.X1,DiagTer.Y1,DiagTer.X2,DiagTer.Y2,True); GetFillSettings(FillInfo); {kitoltesi minta es szin elmentese} SetFillStyle(1,DiagTerHSzin); {kovetkezo kitoltesi minta betoltese} Bar2(0,0,WinMaxX,WinMaxY); {Diagrammcim:} SzovHelyX:=(WinMaxX Div 2) - (TextWidth(DiagCim) Div 2); SzovHelyY:=WinMaxY - 3 - (TextHeight(DiagCim)); If VanEDiagCim Then OutTextXY2(SzovHelyX,SzovHelyY,DiagCim); {FELIRATOK:} {Koordinata-rendszer es adat-terulet parametereinek beallitasa:} If VanEYFelirat Then begin Str(AdatSor.MaxErt,Szov); KoordTer.X1:=DiagTer.X1+TextWidth(Szov)+6;{6 a vonal-szoveg miatt} end Else KoordTer.X1:=DiagTer.X1+10; {10 a sz‚ps‚g miatt} AdatTer.X1:=KoordTer.X1+4; {4 a beosztas fele} If VanEXFelirat Then KoordTer.Y1:=DiagTer.Y1+TextHeight('1')+6{6 a vonal-szoveg elvalas miatt} Else KoordTer.Y1:=DiagTer.Y1+10;{10 a sz‚ps‚g miatt} AdatTer.Y1:=KoordTer.Y1+4; {4 a beosztas fele} KoordTer.X2:=DiagTer.X2-10; {10 a szepseg miatt} AdatTer.X2:=KoordTer.X2-8-10; {8 a nyil miatt, 10 azert, hogy az utolso szam is kiferjen} If VaneDiagCim Then KoordTer.Y2:=DiagTer.Y2-3-TextHeight(DiagCim)-3 {} Else KoordTer.Y2:=DiagTer.Y2-10; AdatTer.Y2:=KoordTer.Y2-8-10; {8 a nyil miatt, 10 azert, hogy az utolso szam is kiferjen} {X tengely feliratai:} SetViewPort2(AdatTer.X1,DiagTer.Y1+3,AdatTer.X2,AdatTer.Y2,True); j:=0; If VanEXFelirat Then {nyil miatt kell kivonni 8-at} For i:=1 to WinMaxX do If i mod OszlopKoz=0 Then begin j:=j+1; Str(j,Szov); SzovHelyX:=i - (TextWidth(Szov) Div 2); OutTextXY2(SzovHelyX,0,Szov); end; {Y tengely feliratai:} SetViewPort2(DiagTer.X1,AdatTer.Y1,AdatTer.X2,AdatTer.Y2,True); GyakPixel:=(WinMaxY/100)*BeosztGyak; SzovVegHelyX:=KoordTer.X1-DiagTer.X1-3; j:=0; ErtekPerBeoszt:=AdatSor.MaxErt/(WinMaxY/GyakPixel); If VanEYFelirat Then For i:=1 to WinMaxY do If i mod Round(GyakPixel)=0 Then begin j:=j+1; Szam:=j*Round(ErtekPerBeoszt); Str(Szam,Szov); SzovHelyY:=i - (TextHeight(Szov) Div 2); SzovHelyX:=SzovVegHelyX-TextWidth(Szov); OutTextXY2(SzovHelyX,SzovHelyY,Szov); end; SetFillStyle(FillInfo.Pattern,FillInfo.Color);{elozo kitoltesi minta visszaallitasa} Size:=ImageSize(AdatTer.X1,AdatTer.Y1,AdatTer.X2,AdatTer.Y2); end{DiagRajz}; procedure KoordTerRajz; var i : Word; FillInfo : FillSettingsType; begin SetViewPort2(KoordTer.X1,KoordTer.Y1,KoordTer.X2,KoordTer.Y2,True); GetFillSettings(FillInfo); {kitoltesi minta es szin elmentese} SetFillStyle(1,KoordTerHSzin); {kovetkezo kitoltesi minta betoltese} Bar2(0,0,WinMaxX,WinMaxY); {koordinata-tengelyek:} Line2(3,0,3,WinMaxY); {Y koordinata-tengely} NyilRajzolas(3,WinMaxY,DiagSzin,1); Line2(0,3,WinMaxX,3); {X koordinata-tengely} NyilRajzolas(WinMaxX,3,DiagSzin,2); {beosztas:} If VanEXBeoszt Then begin SetViewPort2(AdatTer.X1,KoordTer.Y1,AdatTer.X2,AdatTer.Y2,True); For i:=1 to WinMaxX do If i mod OszlopKoz=0 Then Line2(i,0,i,6); end{then}; If VanEYBeoszt Then begin SetViewPort2(KoordTer.X1,AdatTer.Y1,AdatTer.X2,AdatTer.Y2,True); GyakPixel:=(WinMaxY/100)*BeosztGyak; For i:=1 to WinMaxY do If i mod Round(GyakPixel)=0 Then Line2(0,i,6,i); end{then}; SetFillStyle(FillInfo.Pattern,FillInfo.Color);{elozo kitoltesi minta visszaallitasa} end{KoordTerRajz}; procedure AdatTerRajz; var i : Word; FillInfo : FillSettingsType; begin SetViewPort2(AdatTer.X1,AdatTer.Y1,AdatTer.X2,AdatTer.Y2,True); GetFillSettings(FillInfo); {kitoltesi minta es szin elmentese} SetFillStyle(1,AdatTerHSzin); {kovetkezo kitoltesi minta betoltese} Bar2(0,0,WinMaxX,WinMaxY); {racs:} SetLineStyle(3,0,0); If VanEXRacs Then For i:=1 to WinMaxX do If i mod OszlopKoz=0 Then Line2(i,0,i,WinMaxY); If VanEYRacs Then For i:=1 to WinMaxY do If i mod Round(GyakPixel)=0 Then Line2(0,i,WinMaxX,i); SetLineStyle(0,0,0); SetFillStyle(FillInfo.Pattern,FillInfo.Color);{elozo kitoltesi minta visszaallitasa} end{AdatTerRajz}; var OldColor : Word; begin{OszlopDiagRajz} AktAdatSorSz:=1; AktAdatTerHely:=1; OldColor:=GetColor;{elozo szin elmentese} SetColor(DiagSzin); DiagTerRajz; KoordTerRajz; AdatTerRajz; MaxHely:=WinMaxX Div OszlopKoz;{oszlopok maximalis szama - private} SetColor(OldColor);{elozo szin visszatoltese} end{OszlopDiagRajz}; Begin End.