Fórum Objeto é inserido em todos os índices do array #399302
16/04/2011
0
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
Curtir tópico
+ 0Posts
16/04/2011
Emerson Nascimento
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
16/04/2011
Olocobixo
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
17/04/2011
Emerson Nascimento
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
19/04/2011
Emerson Nascimento
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)