Documente Academic
Documente Profesional
Documente Cultură
ALAPESETEK
KÉP BETÖLTÉSE:
A betöltött kép eredeti méretben jelenik meg a TImage felületen. Ha azt szeretnénk,
hogy a grafikus felület automatikusan a betöltött kép méretét felvegye, akkor az AutoSize
tulajdonságnak True (igaz) értéket kell adni. Ilyenkor a kép már nem átméretezhető.
Ha viszont a kép méretét akarjuk változtatni –
kicsinyíteni/nagyítani -, akkor az AutoSize=False és a
Stretch=True értékeket kell az Object Inspector-ban beállítani.
A Stretch paraméter igaz értéke mellett a TImage méretét
változtatva, a bennfoglalt kép a teljes felületet automatikusan
kitölti, alkalmazkodik a képkeret változásaihoz.
VEKTOR GRAFIKA
A Canvas = rajzfelület grafika tárolására szolgál bitmap formátumban, azaz minden
egyes képpont egy-egy pixelnyi adat. Ilyen értelemben pl. egy 100x100 pixel méretű grafika
1000 adattal írható le. Egy fénykép vagy nagyon bonyolult rajz esetén nincs más
választásunk: a teljes bitmap grafikát mentenünk kell.
Image1.Picture.SaveToFile(fájlnév);
Legyen a program kissé lebutított változatában csak 3 rajz objektum szerkesztési lehetőség:
Szakasz; Négyszög és Ellipszis. A rajzelemeket tároljuk a memóriában és menthető ill.
betölthető legyen.
ADATTÁROLÁS: Az egyes rajzi objektumokat a befoglaló téglalapjuk két átellenes
sarkának koordinátáival fogjuk jellemezni.
1 2 3
TRajzObjektum = record
Tipus : integer; // Tipus: 1=szakasz; 2=négyszög; 3=ellipszis
P1,P2 : TPoint; // A befoglaló téglalap sarokpontjai;
End;
A recordok tárolására számtalan módszer alkalmas:
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
ExtCtrls, Buttons, StdCtrls, Spin, ColorGrd;
type
TRajzmod = (rNone, rSzakasz, rNegyszog, rKor);
TForm1 = class(TForm)
Panel1: TPanel;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
SpeedButton5: TSpeedButton;
SpeedButton6: TSpeedButton;
Image1: TImage;
SpeedButton7: TSpeedButton;
SpeedButton8: TSpeedButton;
SpeedButton9: TSpeedButton;
ColorGrid1: TColorGrid;
SpinEdit1: TSpinEdit;
OpenDialog1: TOpenDialog;
procedure FormCreate(Sender: TObject);
procedure SpeedButton7Click(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure SpeedButton8Click(Sender: TObject);
procedure SpeedButton9Click(Sender: TObject);
procedure ColorGrid1Change(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
Rajzmod: TRajzmod;
kezdoPont, VegPont : TPoint;
AlakzatSzam: integer;
Alakzatok : Array[0..100] of TRajzObjektum;
public
procedure Rajzolas(Rajzmod: TRajzmod; P1,P2: TPoint);
procedure Cls;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Rajzoló rutin
procedure TForm1.Rajzolas(Rajzmod: TRajzmod; P1, P2: TPoint);
begin
Case Rajzmod of
rSzakasz : begin
Image1.Canvas.MoveTo(P1.X,P1.Y);
Image1.Canvas.LineTo(P2.X,P2.Y);
end;
rNegyszog: Image1.Canvas.Rectangle(P1.X,P1.Y,P2.X,P2.Y);
rKor : Image1.Canvas.Ellipse(P1.X,P1.Y,P2.X,P2.Y);
end;
end;
// Rajz betöltése
procedure TForm1.SpeedButton2Click(Sender: TObject);
var i: integer;
f: file;
err: integer;
begin
if OpenDialog1.Execute then
Try
Rajzmod := rNone;
AssignFile(f,OpenDialog1.Filename);
Reset(f);
AlakzatSzam := -1;
repeat
Inc(AlakzatSzam);
BlockRead(f,Alakzatok[AlakzatSzam],SizeOf(TRajzObjektum),err);
until (err=0) or (err<>SizeOf(TRajzObjektum));
finally
CloseFile(f);
cls;
SpeedButton9Click(Sender);
end;
end;
// Rajz mentése
procedure TForm1.SpeedButton3Click(Sender: TObject);
var i: integer;
f: file;
err: integer;
begin
if OpenDialog1.Execute then
Try
AssignFile(f,OpenDialog1.Filename);
Rewrite(f);
for i:=0 to AlakzatSzam-1 do begin
BlockWrite(f,Alakzatok[i],SizeOf(TRajzObjektum),err);
end;
finally
CloseFile(f);
end;
end;
end.
Érdemes elemezni az iménti programot, mert számtalan hasznos megoldást tartalmaz.
A gumiszál oly módon valósítható meg, hogy a toll rajzolási módját pmNotXor-ra állítjuk,
ilyenkor az első rajzolás megjelenik, de a második rárajzolás már törli az eredeti rajzot.
Esetünkben a szakasz nyujtásakor az eredeti vonalat törölni kell, az újat meg megrajzolni.
Eközben a végpont változik, a kezdőpont viszont rögzített.
Programunk nagy fejlődésen megy át ez által, hiszen egy rajzi elem tetszőlegesen
módosíthatóvá válik.
KIVÁLASZTÁSI ELJÁRÁS:
Első lépésként meg kell oldanunk egy grafikus objektum kijelölését. Ezzel jelezzük azon
szándékunkat, hogy ezzel az objektummal további célunk van: módosítani szeretnénk.