ho scritto questo codice per la classe
unit CLASSProgetto;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
var
NomeProggetto : string;
DimensioneX : integer;
DimensioneY : integer;
Stage : tpaintbox;
ColoreStage : tColor;
public;
function readnome () :string;
procedure putnome(value : string);
function readx () :integer;
procedure putx(Value:integer);
function ready () :integer;
procedure puty(Value:integer);
function readcolst () :integer;
procedure putcolst(Value:integer);
property Nomeprogetto: string read readnome write putnome;
property DimensioneX : integer read readX write putX;
property DimensioneY : integer read readY write PutY;
property ColoreStage : color read readcolst write Putcolst;
implementation
begin
function readnome () Value: string;
begin
value := nomeprogetto;
end;
procedure putnome(Value:string )
begin
nomeprogetto = Value ;
end ;
function readx () Value; integer;
begin
value := dimensionex;
end;
procedure putx(Value:integer);
begin
dimensionex = Value ;
end ;
function ready () Value; integer;
begin
value := dimensioney;
end;
procedure puty(Value:integer);
begin
dimensioney = Value ;
end ;
function readcolst () Value; color;
begin
value := colorestage;
end;
procedure puty(Value:color);
begin
colorestage = Value ;
end ;
constructor Create (VNomeProgetto: string,VDimensioneX : integer, VDimensioneY :integer; ColoreST ; color);
begin
nomeprogetto := vnomeprogetto;
dimensionex : = vdimensionex;
dimensioney := vdimensioney;
colorestage := vcoloreST;
stage := Tscrollbar1.create(Form1)
stage := Tscrollbar2.create(Form1)
//tscrollbar1.Ancors := [aktop,akleft]
tscrollbar1.kind : sbHorizontal;
tscrollbar2.kind : sbvertical;
//tscrollbar1.align := altop;
//tscrollbar2.alin := alleft;
stage := TPaintBox.Create(Form1);
stage.Top :=10;
stage.Left :=10;
stage.Height :=50;
stage.Width := 100;
stage.Parent := Form1;
stage.Color := VcoloreST;
stage.Canvas.Ellipse(10,10,20,20);
end;
end;
end.
e creo un oggetto
unit unitoption;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ComCtrls, ExtCtrls,ClassProgetto;
type
{ TOpzioni }
TOpzioni = class(TForm)
ButtonSave: TButton;
ButtonExecute: TButton;
EditLarghezza: TEdit;
EditAltezza: TEdit;
PCopzioni1: TPageControl;
Shape1: TShape;
Shape2: TShape;
StaticText1: TStaticText;
StaticText2: TStaticText;
StaticText3: TStaticText;
TabSheet1: TTabSheet;
TSproprieta: TTabSheet;
procedure ButtonExecuteClick(Sender: TObject);
private
public
end;
var
Opzioni: TOpzioni;
implementation
{$R *.lfm}
{ TOpzioni }
procedure TOpzioni.ButtonExecuteClick(Sender: TObject);
var
Ival1 : integer;
Ival2 : integer;
Code : integer;
app: CLASSprogetto;
begin
vaL(editlarghezza.text,Ival1,Code);
if Code <> 0 then
begin
ShowMessage('Error in "with" This is iferior by 1 or null : ' + editlarghezza.text + '!''' );
end;
val( editaltezza.text,Ival2,Code);
if Code <> 0 then
begin
ShowMessage('Error in "Heigth" This is inferior by 1 or null : ' + editaltezza.text + '!''' );
end;
if ival1 < 1 then
begin
ShowMessage('Error in "with" This is iferior by 1 or null : ' + editlarghezza.text + '!''' );
end;
if ival2 < 1 then
begin
ShowMessage('Error in "Heigth" This is inferior by 1 or null : ' + editaltezza.text + '!''' );
end;
app := CLASSprogetto('pippo',50,100,clred).create;
a.show;
end;
purtroppo non mi funziona e mi da' diversi errori, fra cui
Compila il progetto, Destinazione: PaintFreeShapes: Codice di uscita 256, Errori: 10, suggerimenti: 3
classprogetto.pas(15,9) Error: Identifier not found "tpaintbox"
classprogetto.pas(15,18) Error: Error in type definition
classprogetto.pas(16,15) Error: Identifier not found "tColor"
classprogetto.pas(16,21) Error: Error in type definition
classprogetto.pas(30,10) Error: Duplicate identifier "DimensioneX"
classprogetto.pas(30,10) Hint: Identifier already defined in classprogetto.pas at line 13
classprogetto.pas(31,10) Error: Duplicate identifier "DimensioneY"
classprogetto.pas(31,10) Hint: Identifier already defined in classprogetto.pas at line 14
classprogetto.pas(32,10) Error: Duplicate identifier "ColoreStage"
classprogetto.pas(32,10) Hint: Identifier already defined in classprogetto.pas at line 16
classprogetto.pas(32,24) Error: Identifier not found "color"
classprogetto.pas(32,45) Error: Illegal symbol for property access
classprogetto.pas(32,59) Error: Illegal symbol for property access
....
....
e creo un oggetto
unit unitoption;
........
........
procedure TOpzioni.ButtonExecuteClick(Sender: TObject);
var
Ival1 : integer;
Ival2 : integer;
Code : integer;
app: CLASSprogetto;
begin
.......
.......
app := CLASSprogetto('pippo',50,100,clred).create;
a.show;
..........
..........
Incominciamo da unitoption, dovrebbe andare tutto bene eccetto le due linee dove appare "app: CLASSProgetto" e "app := CLASS...." e la linea con "a.show"
"a.Show" ha senso se "a" è definito. Non essendo esposto il tipo non sò dirti ...
L'uso di CLASSProgetto è errato perchè CLASSProgetto è il nome di una unità. Non può essere usato in quel modo.
In ogni caso non puoi chiamare il Create (o qualsiasi altro metodo) così:
app := CLASSprogetto('pippo',50,100,clred).create;
ma così eventualmente:
app := CLASSprogetto.Create('pippo',50,100,clred); // COMUNQUE CLASSprogetto è errato
Il "codice della classe" (il primo sorgente) è errato, non hai scritto ne definizioni valide ne classi.
Come nella unita unitoption, devi usare in modo similare lo stesso scheletro di struttura della classe.
Fai inoltre attenzione alla sintassi, alle virgole, punti e virgola, due punti, begin .....
Prova a correggere e poi se non riesci ancora a compilare riposta ciò che hai fatto.
Ciao
purtroppo non è la prima volta che mi trovo in difficolta' con le classsi in Lazarus.
ho anche altri errori che non capisco es
Stage : tpaintbox;
ColoreStage : tColor;
non vengono riconosciute
poi mi da doppia dichiarazione nelle variabili che ho tolto ma rimane
property ColoreStage : color read readcolst write Putcolst;
e anche che non riconosce
e anche property ColoreStage : color read readcolst write Putcolst;
che non accetta
poi non capisco perche una unit non puo essere una classe, cè un altro modo per dichiararle?
razie dell' aiuto
francesco
poi non capisco perche una unit non puo essere una classe, cè un altro modo per dichiararle?
Se come ti ho detto osservi l'unità "unitoption", vedrai che è definita la classe TOpzioni, quello è l'unico modo per definire una classe (ovviamente non per forza devi derivarla da TForm, anzi normalmente non và fatto con TForm).
type
{ TOpzioni }
TOpzioni = class(TForm)
ButtonSave: TButton;
ButtonExecute: TButton;
EditLarghezza: TEdit;
EditAltezza: TEdit;
PCopzioni1: TPageControl;
Shape1: TShape;
Shape2: TShape;
StaticText1: TStaticText;
StaticText2: TStaticText;
StaticText3: TStaticText;
TabSheet1: TTabSheet;
TSproprieta: TTabSheet;
procedure ButtonExecuteClick(Sender: TObject);
private
public
end;
Purtroppo il PASCAL, come più o meno tutti i linguaggi di programmazione hanno delle sintassi che vanno rispettate.
Il Pascal ha il pregio di essere sicuramente il più "leggibile" in quanto la sintassi è abbastanza essenziale anche se molto rigorosa e stringente.
Per quello che riguarda le altre segnalazioni, devi prestare attenzione e pensarci un attimo sopra: il TColor ad esempio se lo usi deve da qualche parte essere definito. Quindi devi trovare in quale unità viene definito.
Quando si è all'inizio e non si hanno usate molte unità, ci si sente un attimo spaesati ma mettendoci un pò di energia se ne esce.
TColor essendo un elemento descrittore usato nella grafica probabilmente sarà definito nella unit "Graphics", unit che devi includere nelle USES (nella sezione interface).
TPaintBox è un componente, e c'è l'hai sulla paletta dei componenti. Se lo vuoi usare a runtime, senza averlo nella Form, dovrai sempre nelle USES (e sempre nella sezione interface) inserire l'unità "ExtCtrls" (ossia controlli extra). Attenzione però, essendo un componente non esposto a design time, dovrai curare la creazione compreso anche l'abbinamento con una superficie grafica, ed eventualmente la distruzione dell'istanza creata (che normalmente viene abbinata ad una variabile).
E questo per ogni istanza, ossia per ogni variabile che dichiari come TPaintBox che istanzi (cioè che crei).
Un suggerimento: se clicchi due volte sulla Form, viene creato il metodo Create della Form ... li scrivi TColor e premi il tasto F1 ... comparirà l'Help con tutte le indicazioni utili per poterlo usare. Poi ovviamente cancella TColor.
Puoi fare così per qualsiasi elemento che non conosci, se è inserito nell'Help di Lazarus ti verrà visualizzato aiuto.
Ciao
Ho rifatto la classe
nit CLASSProgetto;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type
progetto = class
public
NomeProggetto : string;
public constructor Create (VNomeProgetto: string;VDimensioneX : integer; VDimensioneY :integer);
function readnome () :string;
procedure putnome(value : string);
function readx () :integer;
procedure putx(Value:integer);
function ready () :integer;
procedure puty(Value:integer);
function readTOP () :integer;
procedure putTOP(Value:integer);
function readleft () :integer;
procedure putleft(Value:integer);
property Nomeprogetto: string read readnome write putnome;
property DimensioneX : integer read readX write putX;
property DimensioneY : integer read readY write PutY;
property DIMtop : integer read readTOP write PutTOP;
property DIMleft : integer read readleft write Putleft;
end;
implementation
function progetto.readleft () :integer;
begin
readleft := dimleft;
end;
procedure progetto.putleft(Value:integer);
begin
dimleft := Value ;
end ;
function progetto.readTOP () : integer;
begin
readtop := dimtop;
end;
procedure progetto.putTOP(Value:integer);
begin
dimTOP := Value ;
end ;
function progetto.readnome () : string;
begin
readnome := nomeprogetto;
end;
procedure progetto.putnome(Value:string ) ;
begin
nomeprogetto := Value ;
end ;
function progetto.readx () : integer;
begin
readx := dimensionex;
end;
procedure progetto.putx(Value:integer);
begin
dimensionex := Value ;
end ;
function progetto.ready () : integer;
begin
ready := dimensioney;
end;
procedure progetto.puty(Value:integer);
begin
dimensioney := Value ;
end ;
end.
ma mi da' errore in costructor:
Compila il progetto, Destinazione: PaintFreeShapes: Codice di uscita 256, Errori: 1
classprogetto.pas(17,20) Error: Forward declaration not solved "constructor Create(AnsiString;LongInt;LongInt);"
e non mi riesce a mettere color come proprieta'
function readcolst () :color;
procedure putcolst(Value:color);
property DIMlcol : color read readcol write Putcol;
function progetto.readcol () : color;
begin
ready := dimcol;
end;
procedure progetto.putcol(Value:color);
begin
dimcol := Value ;
end ;