Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gilcimar

[Resolvido] Variavel ponteiro recebendo valor de ListBox

Recommended Posts

Olá Pessoal,

 

Estou com um problemão por aqui, preciso fazer uma variavel do tipo ponteiro receber um valor de um ListBox (um por vez), mas estou com dificuldades para fazer isto. Será que alguém poderia me ajudar ? Estou passando o código abaixo e indicando onde estou com problema.

 

for X := 1 to QNT do

begin

ListBox1.Items.Add(IntToStr(RandomRange(N, N2)));

new(atual);

atual^.numero := ListBox1.Items.IndexOf(ListBox1.Items[x]); // ONDE ESTOU COM PROBLEMA

atual^.prox := nil;

if pri = nil then

begin

pri := atual;

ult :=atual;

atual^.ant := nil

end

else

begin

ult^.prox := atual;

atual^.ant := ult;

ult := atual;

end;

end;

 

Não sei se estou fazendo certo ali, mas o problema dá erro de "LIST INDEX OUT OF BOUNDS(1).

Por favor, preciso de ajuda.

 

Obrigado

 

Gilcimar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gilcimar, você debugou o código para ver se existe valor no listbox na posição que está tentando acessar no trecho onde ocorre o erro? Tente carregar seu listbox com os valores antes do for onde vai pegar os dados, algo tipo isto:

 

procedure TForm1.Button1Click(Sender: TObject);
var i, QNT : Integer;
begin
  QNT := 10;
  Randomize;
  //Jogando valores randômicos entre 0 e 20 no listbox
  For i := 0 to QNT do
	  ListBox1.Items.Add(IntToStr(Random(20)));

  //Mostrando os dados do listbox para teste
  For i := 0 to QNT do
	  Showmessage(IntToStr(ListBox1.Items.IndexOf(ListBox1.Items[i])));
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gilcimar, você debugou o código para ver se existe valor no listbox na posição que está tentando acessar no trecho onde ocorre o erro? Tente carregar seu listbox com os valores antes do for onde vai pegar os dados, algo tipo isto:

 

procedure TForm1.Button1Click(Sender: TObject);
var i, QNT : Integer;
begin
  QNT := 10;
  Randomize;
  //Jogando valores randômicos entre 0 e 20 no listbox
  For i := 0 to QNT do
	  ListBox1.Items.Add(IntToStr(Random(20)));

  //Mostrando os dados do listbox para teste
  For i := 0 to QNT do
	  Showmessage(IntToStr(ListBox1.Items.IndexOf(ListBox1.Items[i])));
end;

 

Olá Chrnos,

 

Debuguei o programa sim, até então eu havia feito o programa sem utilizar os ponteiros e estava funcionando sem problemas, ai adicionei a rotina utilizando eles. Eu tinha feito até aqui e estava ok:

 

for X := 1 to QNT do

begin

ListBox1.Items.Add(IntToStr(RandomRange(N, N2)));

end;

 

Daqui pra baixo, quando criei a area de memória " new(atual) " e comecei a tentar jogar os valores para a variavel " atual^.numero " começou a dar pau, ele não tá conseguindo indexar os valores do ListBox.

Alguma sugestão ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas você debugou a linha de erro pra ver o que trás antes de jogar no ponteiro? O valor do ponteiro é um int ou string?

 

Talvez o problema seja porque você está adicionando o dado no listbox e já tentando associar tudo no mesmo for... talvez assim funcione:

 

for X := 1 to QNT do
	 ListBox1.Items.Add(IntToStr(RandomRange(N, N2)));

for X := 1 to QNT do
begin
	 new(atual);
	 atual^.numero := ListBox1.Items.IndexOf(ListBox1.Items[x-1]); // ONDE ESTOU COM PROBLEMA
	 atual^.prox := nil;
	 if pri = nil then
	 begin
		 pri := atual;
		 ult :=atual;
		 atual^.ant := nil
	 end
	 else
	 begin
		 ult^.prox := atual;
		 atual^.ant := ult;
		 ult := atual;
	 end;
end;

Mas você de todo modo tem que debugar e ver o valor deste trecho ListBox1.Items.IndexOf(ListBox1.Items[x]) antes de jogar no ponteiro e ver se há algum dado na linha referenciada por X... geralmente o erro que ocorre pra você é porque está tentando acessar um dado que não existe. E outra coisa: a contagem de itens no listbox começa em 0, não em 1.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas você debugou a linha de erro pra ver o que trás antes de jogar no ponteiro? O valor do ponteiro é um int ou string?

 

Talvez o problema seja porque você está adicionando o dado no listbox e já tentando associar tudo no mesmo for... talvez assim funcione:

 

for X := 1 to QNT do
	 ListBox1.Items.Add(IntToStr(RandomRange(N, N2)));

for X := 1 to QNT do
begin
	 new(atual);
	 atual^.numero := ListBox1.Items.IndexOf(ListBox1.Items[x-1]); // ONDE ESTOU COM PROBLEMA
	 atual^.prox := nil;
	 if pri = nil then
	 begin
		 pri := atual;
		 ult :=atual;
		 atual^.ant := nil
	 end
	 else
	 begin
		 ult^.prox := atual;
		 atual^.ant := ult;
		 ult := atual;
	 end;
end;

Mas você de todo modo tem que debugar e ver o valor deste trecho ListBox1.Items.IndexOf(ListBox1.Items[x]) antes de jogar no ponteiro e ver se há algum dado na linha referenciada por X... geralmente o erro que ocorre pra você é porque está tentando acessar um dado que não existe. E outra coisa: a contagem de itens no listbox começa em 0, não em 1.

 

[]'s

 

Olá Chrnos,

 

Realmente, um dos problemas deveria estar no for, tentando fazer tudo de uma vez, agora o problema se resume em buscar os dados do ListBox. Do jeito que está, não está trazendo nada...provavelmente minha sintaxe está errada. Uma pergunta, para mim usar o IndexOf()...eu não preciso de um array ? Acho que é por ali que estou errando. Alguma sugestão ?

Por enquanto agradeço,

 

Gilcimar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ops... agora que reparei uma coisa aqui (sono atrasado é fogo hehehe)... o IndexOf não vai te retornar o dado do ListBox... pra acessar o valor basta você passar pra função este código na linha que dá o erro:

 

atual^.numero := StrToInt(ListBox1.Items[x-1]);

A função do IndexOf agora não lembro qual é seu uso... quando lembrar eu posto aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ops... agora que reparei uma coisa aqui (sono atrasado é fogo hehehe)... o IndexOf não vai te retornar o dado do ListBox... pra acessar o valor basta você passar pra função este código na linha que dá o erro:

 

atual^.numero := StrToInt(ListBox1.Items[x-1]);

A função do IndexOf agora não lembro qual é seu uso... quando lembrar eu posto aqui.

 

E ai Chrnos,

 

É isto mesmo, agora a rotina funcionou. Obrigado mesmo, me quebrasse um baita galho !!

Valeu !!

 

Gilcimar

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.