Objeto é inserido em todos os índices do array

Delphi

16/04/2011

 
Olá. estou com um problema em que quero inserir um objeto para cada indice do array mas ele está iserindo o objeto( o mesmo objeto) em todos os indices do array, e depois insere o proximo objeto em todos os indices do array e assim sucessivamente.



Aqui está o código da Unit1, o array é um array do tipo cobaia que é uma classe criada na Unit2 (que não colocarei aqui por não ser necessário)









unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, Unit2, StdCtrls;





type



    guarda =  array of cobaia;





type

  TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;

  caixa : guarda;



implementation



{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);

var



   cont : Integer;

   cob : cobaia;



   indice : Integer;



begin





   SetLength(caixa, 3);





   cont := 0;





   // insere objetos dentro do array enquanot há espaço

   while cont < length(caixa) do

   begin





   cob := cobaia.Create;

   cob.pNome := 'teste' + intToStr(cont);



   caixa[cont] := cob;



    //mostra o objeto recem inserido no array

   showmessage('o valor é:' + caixa[cont].pNome);







   cont := cont + 1;



    end;







   //mostra todos os objetos contidos dentro do array

   indice := 0;

   while indice < length(caixa) do

   begin





   showmessage('contem: ' + caixa[indice].pNome);





    indice := indice + 1;



   end;

 end;

end.












Obrigado.
Olocobixo

Olocobixo

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

16/04/2011

montei esse código aqui e funcionou perfeitamente. note que criei uma classe cobaia bem simples, já que você não achou necessário postar a sua.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  cobaia = class
  private
    FPNome: string;
  public
    property pNome: string read FPNome write FPNome;
  end;

  guarda =  array of cobaia;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  caixa : guarda;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  cont : Integer;
  cob : cobaia;
begin
  SetLength(caixa, 3);

  // insere objetos dentro do array enquanto há espaço
  for cont := 0 to high(caixa) do
  begin
    cob := cobaia.Create;
    cob.pNome := 'teste' + intToStr(cont);
    caixa[cont] := cob;

    //mostra o objeto recem inserido no array
//    showmessage('o valor é:' + caixa[cont].pNome);
  end;

  //mostra todos os objetos contidos dentro do array
  for cont := 0 to high(caixa) do
    showmessage('contem: ' + caixa[cont].pNome);
end;

end.



essa é a forma que eu utilizaria:

procedure TForm1.Button2Click(Sender: TObject);
var
  cont : Integer;
begin
  SetLength(caixa, 3);

  // cria os elementos do vetor
  for cont := 0 to high(caixa) do
  begin
    caixa[cont] := cobaia.Create;
    caixa[cont].pNome := 'teste' + intToStr(cont);
  end;

  //mostra todos os objetos contidos dentro do array
  for cont := 0 to high(caixa) do
    showmessage('contem: ' + caixa[cont].pNome);
end;

note que eu não preciso instanciar um objeto cobaia. eu instancio o próprio elemento do vetor.
GOSTEI 0
Olocobixo

Olocobixo

16/04/2011

O problema continua ocorrendo mesmo com o código que você postou. Na show message que mostra os elementos que estão no array ele retorna 4 vezes o "contem: teste2". Ocorre o mesmo com você?
Vou postar o código das duas units:



[code]

<UNIT1>


unit Unit1;
interface
uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, Unit2, StdCtrls;

type
    guarda =  array of cobaia;

type  TForm1 = class(TForm)    Button1: TButton;    procedure Button1Click(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end;
var  Form1: TForm1;  caixa : guarda;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);var  cont : Integer;begin


  SetLength(caixa, 3);
  // cria os elementos do vetor  for cont := 0 to high(caixa) do  begin    caixa[cont] := cobaia.Create;    caixa[cont].pNome := 'teste' + intToStr(cont);  end;
  //mostra todos os objetos contidos dentro do array  for cont := 0 to high(caixa) do    showmessage('contem: ' + caixa[cont].pNome);end;

end.












<UNIT2>



unit Unit2;
interface
uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs;

type
      cobaia = class
               private                   procedure setNome(x : string);                  function getNome : string;
               protected


               public
                constructor Init;                property pNome : string read getNome write setNome;               end;



type  TForm2 = class(TForm)  private    { Private declarations }  public    { Public declarations }  end;
var  Form2: TForm2;


  nome : string;
implementation
{$R *.dfm}




 constructor cobaia.Init; begin
 end;

 procedure  cobaia.setNome(x : string); begin
  nome := x;
  end;

  function cobaia.getNome : string;   begin

    result := nome;

    end;




end.









GOSTEI 0
Emerson Nascimento

Emerson Nascimento

16/04/2011

ocorre o problema com você porque a variável nome da unit2 é global. torne-a privativa da classe cobaia. assim você não terá mais problemas.

altere a unit2 para (me pergunto o porquê daquele formulário...):

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  cobaia = class
  private
    nome: string;
    procedure setNome(x : string);
    function getNome : string;
  protected
  public
    property pNome : string read getNome write setNome;
  end;

  TForm2 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure  cobaia.setNome(x : string);
begin
  nome := x;
end;


function cobaia.getNome : string;
begin
  result := nome;
end;

end.

note que agora a variável nome é private na classe cobaia e não aparece mais no escopo global da unit2.

agora uma dica: você precisa usar os métodos Get e Set quando há rotinas elaboradas no tratamento do conteúdo da propriedade. no seu caso pode-se fazer a gravação e leitura simples, como eu passei no exemplo anterior.
 

GOSTEI 0
Emerson Nascimento

Emerson Nascimento

16/04/2011

e aí? resolveu?
GOSTEI 0
POSTAR