unit gestore_del_form;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ActnList, ExtCtrls, ComCtrls, Menus,
generico, eccezioni, tpenna, grafica, unit_figura_base, unit_linee, unit_Cerchi,
unit_punti, unit_ellissi, unit_poligoni;
type VettoreFigura = specialize Lista<FiguraBase>; // tipo lista di figure
{ TForm1 }
Type TForm1 = class(TForm)
ColorDialogFinestraColori: TColorDialog;
ImageDisegno: TImage;
MainMenu1: TMainMenu;
MenuItemPoligoni: TMenuItem;
MenuItemPerimetri_E_Aree: TMenuItem;
MenuItemInfo: TMenuItem;
MenuItemPenna: TMenuItem;
MenuItemColoreSfondo: TMenuItem;
MenuItemModifica: TMenuItem;
MenuItemEllissi: TMenuItem;
MenuItemAnnulla: TMenuItem;
MenuItemPunti: TMenuItem;
MenuItemCerchi: TMenuItem;
MenuItemLinee: TMenuItem;
MenuItemDisegna: TMenuItem;
MenuItemEsci: TMenuItem;
MenuItemMenuPrincipale: TMenuItem;
MenuItemSalva: TMenuItem;
SaveDialogSalvaImmagine: TSaveDialog;
StatusBarInformazioni: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure ImageDisegnoMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure ImageDisegnoMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure MenuItemAnnullaClick(Sender: TObject);
procedure MenuItemCerchiClick(Sender: TObject);
procedure MenuItemColoreSfondoClick(Sender: TObject);
procedure MenuItemEllissiClick(Sender: TObject);
procedure MenuItemEsciClick(Sender: TObject);
procedure MenuItemLineeClick(Sender: TObject);
procedure MenuItemMenuPrincipaleClick(Sender: TObject);
procedure MenuItemPennaClick(Sender: TObject);
procedure MenuItemPerimetri_E_AreeClick(Sender: TObject);
procedure MenuItemPoligoniClick(Sender: TObject);
procedure MenuItemPuntiClick(Sender: TObject);
procedure MenuItemSalvaClick(Sender: TObject);
private
{ private declarations }
procedure ridisegna();
var nuova:FiguraBase;
coloreSfondo:QWord;
pennaProvvisoria, pennaDefinitiva:TipoPenna;
seme:Ttavola;
elencoFigure:VettoreFigura;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.MenuItemMenuPrincipaleClick(Sender: TObject);
begin
end;
procedure TForm1.MenuItemPennaClick(Sender: TObject);
var spessore:integer;
risposta:string;
begin
ColorDialogFinestraColori.Color:=pennaDefinitiva.colore;
if ColorDialogFinestraColori.Execute then
begin
risposta:=IntToStr(pennaDefinitiva.spessore);
if InputQuery('Geometria', 'Spessore del pennino ? ', risposta) then
begin
spessore:=StrToInt64Def(risposta, -1);
if spessore > 1 then
begin
pennaDefinitiva.colore:=ColorDialogFinestraColori.Color;
pennaDefinitiva.spessore:=spessore;
end;
end;
end;
end;
procedure TForm1.MenuItemPerimetri_E_AreeClick(Sender: TObject);
var aree,perimetri:double;
esito:string;
messaggio:Pchar;
i,fine:integer;
begin
aree:=0.0;
perimetri:=0.0;
fine:=elencoFigure.Count - 1;
for i:=0 to fine do
begin
aree:=aree + elencoFigure.Items[i].area();
perimetri:=perimetri + elencoFigure.Items[i].perimetro();
end;
esito:=Format('Somma dei perimetri: %0.3f.%sSomma delle aree: %0.3f.%sFigure presenti: %d.%s', [perimetri, #10+#13, aree, #10+#13,elencoFigure.Count, #10+#13]);
messaggio:=StrAlloc(length(esito) + 5);
StrPCopy(messaggio, esito);
Application.MessageBox(messaggio, 'Geometria');
StrDispose(messaggio);
end;
procedure TForm1.MenuItemPoligoniClick(Sender: TObject);
var lati:integer;
risposta:string;
begin
risposta:='3';
StatusBarInformazioni.Panels.Items[1].Text:='Nuovo poligono';
if InputQuery('Geometria', 'Quanti lati ha il poligono ? ', risposta) then
begin
lati:=StrToIntDef(risposta, -1);
if lati >= 3 then
begin
nuova:=TPoligoni.crea(seme);
TPoligoni(nuova).setLati(lati);
nuova.penna:=pennaProvvisoria;
end
else
nuova:=nil;
end;
ridisegna();
end;
procedure TForm1.MenuItemPuntiClick(Sender: TObject);
begin
nuova:=TPunti.crea(seme);
nuova.penna:=pennaProvvisoria;
end;
procedure TForm1.MenuItemSalvaClick(Sender: TObject);
var nome:string;
begin
if SaveDialogSalvaImmagine.Execute then
begin
nome:=SaveDialogSalvaImmagine.FileName + '.bmp';
// Application.MessageBox(Pchar(nome), 'Geometria');
ImageDisegno.Picture.SaveToFile(nome, '');
end;
end;
procedure TForm1.MenuItemEsciClick(Sender: TObject);
begin
elencoFigure.Clear;
self.Close;
end;
procedure TForm1.MenuItemLineeClick(Sender: TObject);
begin
nuova:=TLinee.crea(seme);
nuova.penna:=pennaProvvisoria;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
self.Text:='Geometria';
seme:=Ttavola.crea(ImageDisegno.Canvas, 0, 0, ImageDisegno.Canvas.Width, ImageDisegno.Canvas.Height);
seme.cancella(coloreSfondo);
StatusBarInformazioni.Panels.Items[0].Text:=' ';
StatusBarInformazioni.Panels.Items[1].Text:=' ';
coloreSfondo:=$052005;
pennaProvvisoria.colore:=$40EF20;
pennaProvvisoria.spessore:=1;
pennaDefinitiva.Colore:=$2020FF;
pennaDefinitiva.spessore:=3;
seme.cancella(coloreSfondo);
nuova:=nil;
elencoFigure:=VettoreFigura.crea(10);
SaveDialogSalvaImmagine.Filter:='Immagini |*bmp';
end;
procedure TForm1.FormResize(Sender: TObject);
var larghezza,altezza,i,fine:integer;
begin
larghezza:=self.Width - 15;
altezza:=self.Height - 60;
if (larghezza > 0) and (altezza > 0) and false then
begin
ImageDisegno.Height:=altezza;
ImageDisegno.Width:=larghezza;
seme:=Ttavola.crea(ImageDisegno.Canvas, 0, 0, ImageDisegno.Width, ImageDisegno.Height);
fine:=elencoFigure.Count - 1;
for i:=0 to fine do
begin
elencoFigure.Items[i].setFoglio(seme);
end;
ridisegna();
end;
end;
procedure TForm1.ImageDisegnoMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var ascissa:integer;
begin
ascissa:=ImageDisegno.Canvas.Height - Y;
if (nuova <> nil) and (nuova.figuraInizializzata) then
nuova.setPuntoFine(x, ascissa);
StatusBarInformazioni.Panels.Items[0].Text:=Format('X: %4d Y: %4d', [X, ascissa]);
ridisegna();
end;
procedure TForm1.ridisegna();
var i,fine:integer;
begin
i:=0;
fine:=elencoFigure.Count;
seme.cancella(coloreSfondo);
while i < fine do
begin
elencoFigure.Items[i].traccia;
i:=i + 1;
end;
if (nuova <> nil) then
begin
nuova.traccia();
StatusBarInformazioni.Panels.Items[1].Text:=nuova.denominazione;
end
else
StatusBarInformazioni.Panels.Items[1].Text:='';
end;
procedure TForm1.ImageDisegnoMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button=mbLeft) and (nuova <> nil) then
begin
if not nuova.figuraInizializzata then
nuova.setPuntoInizio(x, ImageDisegno.Canvas.Height - y)
else
begin
nuova.setPuntoFine(x, ImageDisegno.Canvas.Height - y);
nuova.penna:=pennaDefinitiva;
elencoFigure.addItem(nuova);
nuova:=nil;
ridisegna();
end;
end;
end;
procedure TForm1.MenuItemAnnullaClick(Sender: TObject);
begin
nuova:=nil;
ridisegna();
end;
procedure TForm1.MenuItemCerchiClick(Sender: TObject);
begin
nuova:=TCerchi.crea(seme);
nuova.penna:=pennaProvvisoria;
end;
procedure TForm1.MenuItemColoreSfondoClick(Sender: TObject);
begin
if ColorDialogFinestraColori.Execute then
begin
coloreSfondo:=ColorDialogFinestraColori.Color;
ridisegna();
end;
end;
procedure TForm1.MenuItemEllissiClick(Sender: TObject);
begin
nuova:=TEllissi.crea(seme);
nuova.penna:=pennaProvvisoria;
end;
end.