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.
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.
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:
//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
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.
premetto che la classe è una unit senza la finestra ( form ).
quando lo postata e' uscito questo errore..
livello.pas(59,1) Error: Can't open resource file "C:\panfra\lazaruswin64\linees_9_4_21\livello.lfm"
grazie
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.
livello.SetLivello(Image1.Picture);
Image2.Picture := livello.GetLivello();
In questo caso la Image2 assume lo stesso contenuto della Image1 (usando la classe TLivello).
Ho creato una altra classe seguendo i consigli che mi avete dato ( cioè tutto il codice....)
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
credo che devi togliere il ";" finale
Tfigure = class (Tlivello);
suggerimento:
quando hai finito di scrivere, schiaccia Ctrl+D (il sorgente verrà riformattato secondo le convenzioni pascal) ;)
Scusatemi innanzitutto se non seguo il pascal_case.
Grazie per i consigli molto utili ;D
ho pero' un'altra grana :
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?
mi sono dimenticati di :
procedure SetSpessore(valore: integer);
function GetSpessore(): integer;
procedure SetColore(valore: Tcolor);
function GetColore (): Tcolor;
procedure SetTipoLinea(valore: string);
function GetTipoLinea(): string;
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 :)
procedure Tfigure.SetAltezza(valore: integer);
begin
figure.Altezza.Assign(valore);
end;