Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: francesco - Gennaio 18, 2024, 07:39:30 pm

Titolo: nuova classe e creazione oetto
Inserito da: francesco - Gennaio 18, 2024, 07:39:30 pm
ho scritto questo codice per la classe

Codice: [Seleziona]

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


Codice: [Seleziona]

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

Titolo: Re:nuova classe e creazione oetto
Inserito da: DragoRosso - Gennaio 18, 2024, 09:40:04 pm
....
....
e creo un oggetto

Codice: [Seleziona]
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ì:

Codice: [Seleziona]
app := CLASSprogetto('pippo',50,100,clred).create;

ma così eventualmente:

Codice: [Seleziona]
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

Titolo: Re:nuova classe e creazione oetto
Inserito da: francesco - Gennaio 19, 2024, 07:08:35 pm
purtroppo non è la prima volta che mi trovo in difficolta' con le classsi in Lazarus.
ho anche altri errori che non capisco es

Codice: [Seleziona]
Stage : tpaintbox;
ColoreStage : tColor; 

non vengono riconosciute

poi mi da doppia dichiarazione nelle variabili che ho tolto ma rimane

Codice: [Seleziona]
property ColoreStage : color read readcolst write Putcolst; 


e anche
Codice: [Seleziona]
Stage : tpaintbox;
che non riconosce

e anche
Codice: [Seleziona]
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
Titolo: Re:nuova classe e creazione oetto
Inserito da: DragoRosso - Gennaio 19, 2024, 09:31:26 pm
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).

Codice: [Seleziona]
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
Titolo: Re:nuova classe e creazione oetto
Inserito da: francesco - Febbraio 01, 2024, 05:22:51 pm
Ho rifatto la classe

Codice: [Seleziona]

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'

Codice: [Seleziona]

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 ;   



Titolo: Re:nuova classe e creazione oetto
Inserito da: DragoRosso - Febbraio 01, 2024, 07:18:53 pm
Codice: [Seleziona]
public  constructor Create (VNomeProgetto: string;VDimensioneX : integer; VDimensioneY :integer);

implementation

//DEVI AGGIUNGERE L'IMPLEMENTAZIONE DI CREATE ... l'hai definito e devi implementarlo ...
constructor Progetto.Create (VNomeProgetto: string;VDimensioneX : integer; VDimensioneY :integer);
begin
  inherited Create;
  .......
  fai qualcosa .....
  .......
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);"

Vedi il commento nel codice sopra ....

e non mi riesce a mettere color come proprieta'

Non devi usare "color" bensi "TColor" .... TColor è il nome del tipo. Nel mio precedente POST te l'avevo spiegato ....