* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 29, 2024, 09:40:26 pm

Inserisci il nome utente, la password e la durata della sessione.

485 Visitatori, 0 Utenti

Autore Topic: classi in Lazarus  (Letto 1250 volte)

panfra

  • Newbie
  • *
  • Post: 30
  • Karma: +0/-0
classi in Lazarus
« il: 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.           

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1267
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:classi in Lazarus
« Risposta #1 il: Aprile 14, 2021, 10:19:32 am »
@panfra
Dammi mezz'ora che sono fuori ufficio, poi ti spiego alcune cose.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1267
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:classi in Lazarus
« Risposta #2 il: 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.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

panfra

  • Newbie
  • *
  • Post: 30
  • Karma: +0/-0
Re:classi in Lazarus
« Risposta #3 il: 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

panfra

  • Newbie
  • *
  • Post: 30
  • Karma: +0/-0
Re:classi in Lazarus
« Risposta #4 il: 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

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1267
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:classi in Lazarus
« Risposta #5 il: 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.



:) Ogni alba è un regalo, ogni tramonto è una conquista :)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1267
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:classi in Lazarus
« Risposta #6 il: 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).
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

panfra

  • Newbie
  • *
  • Post: 30
  • Karma: +0/-0
Re:classi in Lazarus
« Risposta #7 il: 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

panfra

  • Newbie
  • *
  • Post: 30
  • Karma: +0/-0
Re:classi in Lazarus
« Risposta #8 il: 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

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:classi in Lazarus
« Risposta #9 il: 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) ;)
Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:classi in Lazarus
« Risposta #10 il: 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
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:classi in Lazarus
« Risposta #11 il: Aprile 16, 2021, 02:04:16 pm »
Guarda che lo so che di Ctrl+D tu ne abusi  ;D
Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:classi in Lazarus
« Risposta #12 il: Aprile 16, 2021, 03:41:15 pm »
 ;D ;D ;D ;D
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

panfra

  • Newbie
  • *
  • Post: 30
  • Karma: +0/-0
Re:classi in Lazarus
« Risposta #13 il: 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?

panfra

  • Newbie
  • *
  • Post: 30
  • Karma: +0/-0
Re:classi in Lazarus
« Risposta #14 il: 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;
                                       


 

Recenti

How To

Utenti
Stats
  • Post in totale: 18781
  • Topic in totale: 2235
  • Online Today: 443
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 485
Total: 485

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.