Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: SauroTicciati - Marzo 28, 2025, 10:39:54 am

Titolo: Strano comportamento di una classe
Inserito da: SauroTicciati - Marzo 28, 2025, 10:39:54 am
Buongiorno
ho creato una semplice classe contenente due Variabili, ID di tipo Integer e Descrizione di tipo string String.
Così come indicato:
Codice: [Seleziona]
unit Unit1;

{$mode objfpc}{$H+}

interface

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



type

  { tMyClass }

  tMyClass =class(tobject)
    Private
      Fdescrizione: String;
      Fid: Integer;
      procedure Setdescrizione(AValue: String);
      procedure Setid(AValue: Integer);
    Public
      constructor create;
      destructor Destroy; override;
      Property id:Integer read Fid write Setid;
      Property descrizione:String read Fdescrizione write Setdescrizione;
      Procedure Clear;
  end;


Sulla form creo due variabili che istanziano questa classe:
Codice: [Seleziona]
  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    a:tMyClass;
    b:tMyClass;

Tutto funziona bene fino a quando non faccio una assegnazione del tipo  A:=B 
Da quel momento in poi le due variabili contengono sempre lo stesso valore.

Cosa sto sbagliando?
Grazie a chi risponderà.
Titolo: Re:Strano comportamento di una classe
Inserito da: nomorelogic - Marzo 28, 2025, 10:59:07 am
Ciao Sauro

A e B sono in realtà 2 puntatori (in quanto sono di tipo tMyClass)

con l'operazione A:=B

dopo aver fatto questa assegnazione è normale che il contenuto di A e B sia lo stesso

Titolo: Re:Strano comportamento di una classe
Inserito da: SauroTicciati - Marzo 28, 2025, 12:47:38 pm
Grazie per la risposta,
ma come faccio ad assegnare al contenuto di A il contenuto di B lasciando che le due variabili rimangano distinte?
Titolo: Re:Strano comportamento di una classe
Inserito da: DragoRosso - Marzo 28, 2025, 02:16:42 pm
Ciao.

Dipende da ciò che vuoi fare, potrebbe convenirti lavorare con i record se non necessiti di classi reali.

L'assegnazione tra record è per valore sui tipi integrati (comprese le stringhe).
In alternativa devi crearti un metodo nella classe per l'assegnazione dei membri (oppure devi assegnare ogni singolo membro o tramite la sua proprietà se è privato o direttamente se è pubblico).

P.S.: nel caso tu abbia più membri da condividere, magari facenti parte di un gruppo logico, la scelta più opportuna generalmente sono i record (guarda anche gli advanced record): https://wiki.freepascal.org/Record (https://wiki.freepascal.org/Record)
Titolo: Re:Strano comportamento di una classe
Inserito da: SauroTicciati - Marzo 28, 2025, 04:40:29 pm
Grazie,
dopo la prima risposta mi sono messo a cercare sul forum ed in effetti avevo visto che potevo lavorare anche con i record e penso farò così.
Interessante l'idea di creare un metodo per risolvere il problema, proverò per spirito di curiosità anche se penso sia più semplice usare il metodo che mi hai consigliato.
Ad ogni modo siete tutti gentilissimi e molto competenti sarà un piacere condividere questo spazio.