Ir para conteúdo

POWERED BY:

Arquivado

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

Jerfs

Esclarecimento sobre Array

Recommended Posts

Consigo criar uma array em tempo de execução? quero poder criar quantas arrays forem necessárias enquanto tiver executando o programa, consigo?! Como?

Compartilhar este post


Link para o post
Compartilhar em outros sites

var

MeuArray: array[0..5] of string;

x: SmallInt;

begin

For x:= 0 to 5 do

begin

MeuArray[x]= 'A Posicao aqui é a : ' + IntToStr(x);;;

end;

 

ShowMessage(MeuArray(4));

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rodrigo valeu a ajuda, mas essa rotina que você me passou está criando apenas uma matriz não é!? Desculpe minha ignorância mas estou iniciando. O que eu preciso é criar matrizes de acordo com um parametro que é pesquisado através de um arquivo TXT. por exemplo, quando o txt tiver 5 grupos, eu terei de criar 5 arrays...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Jerfs.

 

A única coisa que eu sei, é que voce pode redimencionar arrays dinâmicos.

 

O que é um array estático e array dinâmico ?

 

Array estático é quando ele é declarado com os seus índices já definidos, assim:

 

var MeuArray: array[1..10] of String;

Aqui o array é estático porque o array já está delimitado com os índices de 1 a 10.

 

Array dinâmico é quando ele é declarado sem a definição dos seus índices, assim:

 

var MeuArray: array of String;

Nesse caso o array dinâmico pode ser redimensionado a todo instante, e bom disso tudo é que, quando voce o dimensiona pela primeira vez e atribuir valores aos seus índices, ao redimensioná-lo novamente, os dados anteriormente atribuídos não se apagam. Mas como eu redimensiono um array dinâmico ? Com a função SetLength, assim:

 

var MeuArray: array of String;
  begin
	  SetLength(MeuArray, 10); // aqui os índices são definidos de 0 a 9;
	  MeuArray[0] := 'Jorge Abreu';
	  MeuArray[1] := 'Jerfs';
	  .......
	  .......
	  SetLength(MeuArray, 20); // aqui eu aumento os índices sem apagar os dados
	  MeuArray[11] := 'iMasters';
	  .....
	  .....
	  MeuArray[19] := 'Delphi'; // aqui o último índice do array até o momento
end;

Agora a única desvantagem disso tudo é que os arrays (estáticos ou dinâmicos) só podem ser declarados como um tipo de dado, ou seja, mesmo voce o redimensionado a toda hora, ele só poderá armazenar o mesmo tipo de dado pelo qual foi declarado, se foi declarado como String, sempre armazenará String e se foi declarado como Integer, sempre armazenará Integer, etc.

 

Pelo teor da sua pergunta, presumo que voce pretende criar vários arrays de diversos tipos, estou certo ?

 

Neste caso, creio eu que a solução para o seu caso não é utilizar o array puro simplesmente, mas sim declarar um array como um tipo de dado, que muito embora já esteja obsoleto na linguagem Object Pascal do Delphi, ele ainda funciona nas suas novas versões, e acredito até que muitos usuários ainda o utilizam, este tipo tornou-se obsoleto por causa dos bancos de dados, ou seja, ele inicialmente fora criado para criar tabelas (array com tipos de dados diferentes), eu estou falando do tipo Record e ele tem que ser definido com a cláusula Type, assim:

 

type
	 TMeuRegistro = Record
		 Nome: String;
		 Endereco: String;
		 ...
		 ...
		 Data_Nasc: TDate;
		 Cliente_Especial: Boolean;
	 end;

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

Agora vai pode declarar um array dinâmico como o tipo TMeuRegistro e redimensioná-lo quantas vezes quiser, assim:

 

var 
	 MeuRegistro: array of TMeuRegistro;
	 I: Integer;   
  begin
	  SetLength(MeuRegistro, 10);
	  for I := 0 to 9 do
	  begin
		   MeuRegistro[I].Nome := 'Jerfs';
		   MeuRegistro[I].Endereco := 'Av. Paulista.....';
		   ....
		   .......
		   .......
		   MeuRegistro[I].ClienteEspecial := True;
		   ....
	  end;
	  SetLength(MeuRegistro, 20);
	  for I := 10 to 19 do
	  begin
		 MeuRegistro[I].Nome := 'Delphi';
		 .....
		 .....
	  end;
end;

Bom, espero que isto sirva para o que voce pretende fazer.

 

Um abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Discorpio, muito bom o que escreveu, certamente vou usar muito isso aqui valeu mesmo! Mas o que preciso no momento é: eu tenho um TXT, nele tenho vários parametros, atraves desses parametros (que são váriaveis) vou saber quantas arrays vou precisar, então ora precisarei de 4 arrays, ora precisarei de 200 arrays, uma coisa que não mudará é o tipo de dados, sempre serão string. Programo em Action Script, e lá é bem fácil fazer, simplesmente colocamos dentro de um for os delimitadores e podemos criar quantas arrays forem necessárias, mas em Delphi eu não tenho nem idéia de como fazer isso... uma outra coisa, depois de eu criar as arrays, para alimentá-las, eu consigo referenciar ao nome da array de forma dinamica?! por exemplo:

 

Para me referenciar a array grupo1 e inserir um valor na posição 10 dela... (levar em consideração a array já criada)

 

CODE
var

i := 1;

Begin

'grupo'+i[10] := 'teste';

End;

Em flash isso é possível, acredito que em delphi deva existir alguma forma de se fazer isso... enfim, não posso setar parametros fixos para meu sistema, preciso torná-lo o mais dinâmico possivel, de forma que ele se molde com o txt de parametros...

 

Conto com a colaboração de todos... http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, estou pesquisando que nem um louco para saber se é possível fazer o que quero... e cheguei a conclusão de que o que quero é 'criar váriavel em tempo de execução', isso é possível?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Jerfs.

 

Creio que no Delphi isto não será possível.

 

Mas por que ?

 

Simples, o Object Pascal do Delphi é uma das linguagens fortemente tipada, ou seja, voce precisa declarar variáveis, assim como os arrays, primeiro antes de usá-las, e esta declaração não pode ser feita dentro da implementação do código, ou seja, não é em qualquer lugar dentro do código do Delphi que voce pode declarar variáveis.

 

Já dentro do Action Script e no Flash, assim como também na Linguagem Java e no C, isto é possível porque voce declara classes e dentro do scopo dela voce pode declarar variáveis e já indo logo atribuindos valores, porém dentro do Object Pascal isto não é possível, porque voce não pode declarar variáveis dentro da implementação do código.

 

Um abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Jerfs, sou eu de novo.

 

Estive pessando que na vida tudo tem jeito, sempre há uma solução.

 

Onde encontrei uma solução para o seu caso, na própria dica que postei ai, ou seja, o tipo Record.

 

Voce não pode criar variáveis e arrays bem como os Records também em tempo de execução.

 

Entretanto voce pode declarar um tipo Record e dimensioná-lo quantas vezes quiser com um outro array dentro.

 

Assim oh:

 

type
	 TMeuRegistro = record
			MeuArray: array of string;
	 end;

	 TForm1 = class(TForm)
	 private
		  { Private declarations }
		  Grupo: array of TMeuRegistro;
	 public
		  { Public declarations }
	 end;

Repare que eu define o tipo record antes, bem como declarei um array Grupo no bloco private da classe TForm1 como sendo do tipo do Record definido como TMeuRegistro, ou seja, bem antes de implementá-los.

 

Agora eu posso dimensionar e redimensionar tantos o Record TMeuRegistro como o arrays MeuArray que está dentro dele, isto porque ambos são array dinâmicos.

 

Quando voce receber o parâmetro do seu TXT, por exemplo 100 arrays, então dimensione a instância Grupo que é um array de TMeuRegistro para 100, valendo lembrar que será os índices numerados de 0 a 99, ora dentro de cada record não tem um array MeuArray ? Então voce terá 100 arrays, resta saber agora a quantidade de índices que cada array terá, e isto voce pode também dimensionar com a função SetLength, assim:

 

var I: Integer;
  begin
	 SetLength(Grupo, 100); // aqui depende da qtd de arrays do parâmetro TXT

	 // aqui voce define o tamanho de cada array com 20 índices
	 for I := 0 to 99 do SetLength(Grupo[I].MeuArray, 20);

		// ou pode definir o tamanho de cada array com índices variados:
		SetLength(Grupo[0].MeuArray, 10);
		SetLength(Grupo[1].MeuArray, 20);
		...........

  end;

Agora voce pode atribuir bem como se referenciar a cada array desta Forma:

 

Grupo[9].MeuArray[10] := 'Delphi';

Espero que isso resolva

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque dá esse erro?

 

[ERROR] U_Princ.pas(407): Incompatible types: 'Char' and 'String'

 

Algum item desse modo que me passou só receber Char? estou trabalhando com tudo no tipo string...

 

não sei não... mas acho que não consigo tratar cada campo (MyArray como você definiu no exemplo) como array... eles são campos simplesmente... eu consegui no máximo concatenar strings no campos... mas não consegui criar indice, infelizmente! estou fazendo algo errado será?! porque quando eu coloco o indice no MyArray dá esse erro que escrevi aí em cima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Jerfs.

 

Também achei estranho porém voce precisa observar o seguinte: :o

 

Os tipos texto podem operar com caracteres simples ou grupos de caracteres. O tipo texto padrão é o tipo string.

 

O Tipo Char é um único caractere ASCII

 

String é um texto alocado dinamicamente, um vetor que pode ser limitado a 255 caracteres conforme configuração

 

PChar é uma string terminada em nulo (#0), usada geralmente nas funções da API do Windows. ;)

 

Contudo eu precisaria ver o código que voce está tentando usar com a função SetLength, pois se esse erro acontece quando voce dimensiona o array, então com certeza o erro está na passagem de parâmetros na função SetLength. :mellow:

 

Um abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Discorpio,

 

Cara fiz o seguinte, usei um memo como uma matriz temporária... então eu crio a tal "matriz" dentro do memo, e depois então que a matriz estiver pronta eu gravo em arquivo (esse seria o porque criar as tais matrizes dinâmicas). Isso me atendeu... mas quero agradecer, muito obrigado mesmo pela disponibilidade! Espero um dia poder fazer o mesmo pelos usuários do fórum, um dia eu chego lá! rs

 

Abraço

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.