Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: panfra - Aprile 14, 2021, 10:01:34 am

Titolo: classi in Lazarus
Inserito da: panfra - Aprile 14, 2021, 10:01:34 am
Ho guardato l'introduzione alla OPP del forum ma il codice che ho scritto mi da' sempre errori, ogni qual volta cambio qualcosa. Potreste riscrivermelo esatto...?
grazie.
Codice: [Seleziona]
unit livello;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, ExtCtrls;
type
   Tlivello = class

  protected

    cornice : Timage;

  public
     contructor: Timage;
     destructor Free();
               procedure SetLivello(valore:Timage);
               function  GetLivello(): Timage;
end;

   implementation

constructor livello(Timage);
begin
end;

Destructor livello.Free();
begin
end;

procedure livello.setlivello(valore: Timage);
begin
     cornice:=valore;
end;
function ClasseUtenti.getlivello(): string;
begin
     getlivello:= cornice;
end;

end.           
Titolo: Re:classi in Lazarus
Inserito da: DragoRosso - Aprile 14, 2021, 10:19:32 am
@panfra
Dammi mezz'ora che sono fuori ufficio, poi ti spiego alcune cose.
Titolo: Re:classi in Lazarus
Inserito da: DragoRosso - Aprile 14, 2021, 11:24:00 am
Bisogna scrivere la implementazione della classe correttamente. Come riportava @Stilgar, se nella definizione della classe premi SHIFT CTRL C allora LAZARUS ti compilerà l'implementazione dei metodi, aiutandoti notevolmente.

Per i costruttori e i distruttori non si dovrebbero usare  nomi di proprietà, funzioni o procedure comunemente usate o già definite. "Free" è una procedura comune per "liberare" la memoria usata dal componente (in pratica distruggerlo).
Per convenzione è sempre meglio usare nomi come Create e Destroy effettuando l'override o l'overload.

Per il componente TImage: è utile usare la TPicture (componente che "contiene" effettivamente la parte grafica) per passarla come parametro, l'assegnazione tra TImage non è propriamente consigliata.

Quello che segue è il codice della classe. Mi sono permesso di modificarlo rispetto al tuo precedente con il passaggio dei parametri picture, piuttosto che della TImage.

Come usarlo: dal programma principale devi prima definire una variabile e poi istanziare la classe:
Codice: [Seleziona]
//definizione della variabile
var
  livello: TLivello;

//da qualche parte devi istanziare la classe (ad esempio nella FromCreate del tuo programma principale)
  livello := TLivello.Create(self);

//poi infine devi usarla, per supponendo che tu abbia due componenti Image1 e Image2 nella tua form principale, copiamo la Image1 nella Image2
  livello.SetLivello(Image1.Picture);
  Image2.Picture := livello.GetLivello();

Unità per la difinizione della classe livello

Codice: [Seleziona]
unit Livello;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, Buttons,
  StdCtrls;

type
                  { TLivello }

  TLivello = class
  private

  protected
    cornice: TImage;
  public
    constructor Create(AOwner: TComponent); overload;
    destructor Destroy; override;
    procedure SetLivello(valore: TPicture);
    function  GetLivello(): TPicture;
  end;

implementation

{$R *.lfm}


{ TLivello }

constructor TLivello.Create(AOwner: TComponent);
begin
  inherited Create; //DEVE ESSERE LA PRIMA LINEA
  cornice := TImage.Create(nil);
  //fai qualcosa
end;

destructor TLivello.Destroy;
begin
  //fai qualcosa
  if Assigned(cornice) then
     cornice.Free;
  inherited Destroy; //DEVE ESSERE L'ULTIMA LINEA
end;

procedure TLivello.SetLivello(valore: TPicture);
begin
  cornice.Picture.Assign(valore);
end;

function TLivello.GetLivello(): TPicture;
begin
  result := cornice.Picture;
end;

end.
Titolo: Re:classi in Lazarus
Inserito da: panfra - Aprile 15, 2021, 02:45:59 pm
premetto che la classe è una unit senza la finestra ( form ).
quando lo postata e' uscito questo errore..

Codice: [Seleziona]
livello.pas(59,1) Error: Can't open resource file "C:\panfra\lazaruswin64\linees_9_4_21\livello.lfm"

grazie
Titolo: Re:classi in Lazarus
Inserito da: panfra - Aprile 15, 2021, 03:22:07 pm
Vorrei precisare anche che la classe è composta da un ana Timage che si eredita dalle classi sottostanti, e serve in pratica a inserire una Timage su cui visualizzare i disegni. in piu' questa timage dovrebbe essere cambiata a runtime..
Grazie. ;D
Titolo: Re:classi in Lazarus
Inserito da: DragoRosso - Aprile 15, 2021, 04:17:48 pm
premetto che la classe è una unit senza la finestra ( form ).
quando lo postata e' uscito questo errore..

Codice: [Seleziona]
livello.pas(59,1) Error: Can't open resource file "C:\panfra\lazaruswin64\linees_9_4_21\livello.lfm"

grazie

Errore mio, devi eliminare la riga

Codice: [Seleziona]
{$R *.lfm}

dopo implementation nella unit Livello.



Titolo: Re:classi in Lazarus
Inserito da: DragoRosso - Aprile 15, 2021, 04:21:53 pm
Vorrei precisare anche che la classe è composta da un ana Timage che si eredita dalle classi sottostanti, e serve in pratica a inserire una Timage su cui visualizzare i disegni. in piu' questa timage dovrebbe essere cambiata a runtime..
Grazie. ;D

Non ho compreso bene quello che richiedi, ma come ti ho fatto vedere puoi cambiare il CONTENUTO DELLA TIMAGE passando la TPicture.

Codice: [Seleziona]
livello.SetLivello(Image1.Picture);
Image2.Picture := livello.GetLivello();

In questo caso la Image2 assume lo stesso contenuto della Image1 (usando la classe TLivello).
Titolo: Re:classi in Lazarus
Inserito da: panfra - Aprile 15, 2021, 07:31:00 pm
Si ci dovrebbe essere una sola tpicture, che cambia nel tempo o cioe piu' canvas per una image o disegno che sia...
grazie.
ringrazio moltissimo anche per le delucidazioni precedenti.
Ciao. ;D ;D
Titolo: Re:classi in Lazarus
Inserito da: panfra - Aprile 15, 2021, 08:13:26 pm
Ho creato una altra classe seguendo i consigli che mi avete dato ( cioè tutto il codice....)

Codice: [Seleziona]
unit figure;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, controls,Graphics,ExtCtrls,livello;

type
         { Tfigure }

       Tfigure = class  (Tlivello);

protected

   private

      Altezza : integer;
      Xinizio,Xfine,Yinizio,Yfine: integer;
      spessore:integer;
      colore: Tcolor;
      TipoLinea:string;

  public   

Ma mi appare il seguente errore :

figure.pas(19,7) Fatal: Syntax error, "=" expected but "identifier ALTEZZA" found
Titolo: Re:classi in Lazarus
Inserito da: nomorelogic - Aprile 15, 2021, 08:22:26 pm
credo che devi togliere il ";" finale
Codice: [Seleziona]
 Tfigure = class  (Tlivello);


suggerimento:
quando hai finito di scrivere, schiaccia Ctrl+D (il sorgente verrà riformattato secondo le convenzioni pascal) ;)
Titolo: Re:classi in Lazarus
Inserito da: Stilgar - Aprile 15, 2021, 10:21:47 pm
Ah, io ho impostato le mie di "convenzioni".
Le 80 colonne mi stanno sulla bocca dello stomaco. :)
16/9 FullHD per lavorare come su 320x200 anche basta va :)
Ho già dato per molti anni... ;D ;D ;D




Stilgar
Titolo: Re:classi in Lazarus
Inserito da: nomorelogic - Aprile 16, 2021, 02:04:16 pm
Guarda che lo so che di Ctrl+D tu ne abusi  ;D
Titolo: Re:classi in Lazarus
Inserito da: Stilgar - Aprile 16, 2021, 03:41:15 pm
 ;D ;D ;D ;D
Titolo: Re:classi in Lazarus
Inserito da: panfra - Aprile 16, 2021, 08:22:44 pm
Scusatemi innanzitutto se non seguo il pascal_case.
Grazie per i consigli molto utili ;D
ho pero' un'altra grana :

Codice: [Seleziona]
 private
          Altezza:integer;
  public

    constructor Create(); overload;
    destructor Destroy; override;

    procedure SetAltezza(valore: integer);


    function  GetAltezza(): integer;
    procedure SetXinizio(valore: integer);
    function  GetYinizio(): integer;
    procedure SetXfine(valore: integer);
    function  GetYfine(): integer;
    procedure Spessore(valore: integer);
    function  Spessore(): integer;
    procedure Colore(valore: Tcolor);
    function  Colore (): Tcolor;
    procedure TipoLinea(valore: string);
    function  TipoLinea(): string;

  end;

implementation

 { Tfigure }

constructor Tfigure.Create();
begin
  inherited Create; //DEVE ESSERE LA PRIMA LINEA
  //cornice := TImage.Create(nil);
  //fai qualcosa
end;

destructor  Tfigure.Destroy;
begin
  //fai qualcosa
 // if Assigned(cornice) then
   //  cornice.Free;
  inherited Destroy; //DEVE ESSERE L'ULTIMA LINEA
end;

procedure Tfigure.SetAltezza(valore: integer);
begin
  figure.Altezza.Assign(valore);
end;

function Tfigure.GetAltezza(): integer;
begin
  result := Altezza.integer;
end;
             


mi da' un errore:

figure.pas(60,10) Error: Identifier not found "setAltezza"

come mai?
Titolo: Re:classi in Lazarus
Inserito da: panfra - Aprile 16, 2021, 08:25:40 pm
mi sono dimenticati di :

Codice: [Seleziona]

 procedure SetSpessore(valore: integer);
    function  GetSpessore(): integer;
    procedure SetColore(valore: Tcolor);
    function  GetColore (): Tcolor;
    procedure SetTipoLinea(valore: string);
    function  GetTipoLinea(): string;
                                       

Titolo: Re:classi in Lazarus
Inserito da: Stilgar - Aprile 16, 2021, 09:37:55 pm
Certo che diventa difficile aiutarti così 😅
Potresti caricare il file come allegato? Magri nella descrizione ci sta un dettaglio del codice che rompe le scatole, avere la visione d'insieme può renderci più incisivi nell'aiutare 😉

Almeno ostiamo e capiamo il problema😁

Stilgar
Titolo: Re:classi in Lazarus
Inserito da: nomorelogic - Aprile 17, 2021, 12:37:56 am
il problema potrebbe essere qua (cos'è "figure"?)
ma come dice Stilgar almeno una visione d'insieme (e l'indicazione di quale sia la riga che da errore) non sarebbe male :)


Codice: [Seleziona]
procedure Tfigure.SetAltezza(valore: integer);
begin
  figure.Altezza.Assign(valore);
end;
Titolo: Re:classi in Lazarus
Inserito da: panfra - Aprile 18, 2021, 11:29:04 am
ok risolto avevo fatto uno sconquasso con le procedure (proprieta')...
Grazie