Objeto é inserido em todos os índices do array
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
Curtidas 0
Respostas
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.
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
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.
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
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.
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
16/04/2011
e aí? resolveu?
GOSTEI 0