Delphi - incrementar nome da Variavelx do tipo String
Pessoal,
gostaria de saber se no Delphi (tenho versão Xe7 mas deve ser igual pras demais) é possível armazenar várias linhas de um arquivo texto numa variável do tipo String e ir incrementando o nome da variável para não precisar declarar infinitas variáveis (uma para cada linha)... vou mostrar um pequeno exemplo do que pretendo via código pra ficar mais fácil de entender o que eu quero.
AO INVÉS DE UM CÓDIGO DESSE MODELO:
var
txt : textFile;
linhaCadastro : String;
variavel0, variavel1,variavel2, variavel3 : String; // na prática eu precisaria de mais variáveis
begin
AssignFile(txt,'C:\\CadastroGeral.txt');
reset(txt);
Readln(txt,linhaCadastro);
variavel0 := linhaCadastro;
Readln(txt,linhaCadastro);
variavel1 := linhaCadastro;
Readln(txt,linhaCadastro);
variavel2 := linhaCadastro;
Readln(txt,linhaCadastro);
variavel3 := linhaCadastro;
end;
EU GOSTARIA DE UM CÓDIGO DESSE MODELO:
var
i : Integer;
txt : textFile;
linhaCadastro : String;
variavel[] : String;
begin
i := 0;
AssignFile(txt,'C:\\CadastroGeral.txt');
reset(txt);
Readln(txt,linhaCadastro);
while not eof (linhaCadastro) do
begin
variavel[i] := linhaCadastro; // essa linha substituiria a necessidade de ter variavel0, variavel1, ... Essa variável seria seu nome mutável/incrementável
i := i +1;
end;
end;
Espero ter sido claro... será que é possível fazer algo desse tipo. No meu programa eu iria economizar muitas linhas de comando.
gostaria de saber se no Delphi (tenho versão Xe7 mas deve ser igual pras demais) é possível armazenar várias linhas de um arquivo texto numa variável do tipo String e ir incrementando o nome da variável para não precisar declarar infinitas variáveis (uma para cada linha)... vou mostrar um pequeno exemplo do que pretendo via código pra ficar mais fácil de entender o que eu quero.
AO INVÉS DE UM CÓDIGO DESSE MODELO:
var
txt : textFile;
linhaCadastro : String;
variavel0, variavel1,variavel2, variavel3 : String; // na prática eu precisaria de mais variáveis
begin
AssignFile(txt,'C:\\CadastroGeral.txt');
reset(txt);
Readln(txt,linhaCadastro);
variavel0 := linhaCadastro;
Readln(txt,linhaCadastro);
variavel1 := linhaCadastro;
Readln(txt,linhaCadastro);
variavel2 := linhaCadastro;
Readln(txt,linhaCadastro);
variavel3 := linhaCadastro;
end;
EU GOSTARIA DE UM CÓDIGO DESSE MODELO:
var
i : Integer;
txt : textFile;
linhaCadastro : String;
variavel[] : String;
begin
i := 0;
AssignFile(txt,'C:\\CadastroGeral.txt');
reset(txt);
Readln(txt,linhaCadastro);
while not eof (linhaCadastro) do
begin
variavel[i] := linhaCadastro; // essa linha substituiria a necessidade de ter variavel0, variavel1, ... Essa variável seria seu nome mutável/incrementável
i := i +1;
end;
end;
Espero ter sido claro... será que é possível fazer algo desse tipo. No meu programa eu iria economizar muitas linhas de comando.
Edney
Curtidas 0
Respostas
Robson Morais
29/10/2016
Utiliza uma StringList.
var variavel : TStringList;
variavel := TStringList.create;
...
while not eof (linhaCadastro) do
begin
variavel.add(linhaCadastro);
end;
....
GOSTEI 0
Edney
29/10/2016
Olá Rodrigo, obrigado pela ajuda.
Dessa maneira talvez funcione mas deva ser bem mais trabalhoso do que eu gostaria. Só explicando melhor... no arquivo texto irá ter centenas de nomes, e vinculados ao nome irá ter o seu email e telefone (os 3 em linhas diferentes). No arquivo irá ter várias outras linhas que não interessam, mas quando encontrar a linha NOME, irá adicionar esse nome num ListBox e armazenar as outras linhas EMAIL e TELEFONE numa variável. Quando a pessoa escolher algum dos nomes do ListBox, irá então mostrar o Email e o Telefone em Edits.
Ai eu queria fazer do tipo:
selecionou no LisBox a linha 10 => (LisBox.ItemIndex = 10)
então:
edit1.text := VariavelEmail[ListBox.ItemIndex]; //ou seja edit1 recebe a VariavelEmail[10]
edit2.text := VariavelCelularListBox.ItemIndex]; //ou seja edit2 recebe a VariavelCelular[10]
Por isso a variavel String (VariavelEmail e VariavelTelefone, na verdade) precisaria ser do tipo variavel[i]
Alguma outra dica, por favor?
Obrigado!
Dessa maneira talvez funcione mas deva ser bem mais trabalhoso do que eu gostaria. Só explicando melhor... no arquivo texto irá ter centenas de nomes, e vinculados ao nome irá ter o seu email e telefone (os 3 em linhas diferentes). No arquivo irá ter várias outras linhas que não interessam, mas quando encontrar a linha NOME, irá adicionar esse nome num ListBox e armazenar as outras linhas EMAIL e TELEFONE numa variável. Quando a pessoa escolher algum dos nomes do ListBox, irá então mostrar o Email e o Telefone em Edits.
Ai eu queria fazer do tipo:
selecionou no LisBox a linha 10 => (LisBox.ItemIndex = 10)
então:
edit1.text := VariavelEmail[ListBox.ItemIndex]; //ou seja edit1 recebe a VariavelEmail[10]
edit2.text := VariavelCelularListBox.ItemIndex]; //ou seja edit2 recebe a VariavelCelular[10]
Por isso a variavel String (VariavelEmail e VariavelTelefone, na verdade) precisaria ser do tipo variavel[i]
Alguma outra dica, por favor?
Obrigado!
GOSTEI 0
Araujo Junior.
29/10/2016
Isso que voce quer é um array de string.....declara a variavel assim:
var variavel: array[1..3] of string;
GOSTEI 0
Edney
29/10/2016
Olá,
consegui fazer o que eu queria, com a ideia parecida com o que o Robinho sugeriu:
...
while not (Copy(linhaCadastro,1,4) = '****') do // uma linha de asteriscos significa o fim do arquivo que me interessa
begin
Readln(txtCadastro,linhaCadastro);
if (Copy(linhaCadastro,1,4) = 'NOME') then // se as 4 primeiras letras = 'NOME', filtro e pego o nome
begin
ListBoxEmailMoradores.Items.Add(Copy(linhaCadastro,Pos('NOME MORADOR',linhaCadastro)+16,length(linhaCadastro)));
Readln(txtCadastro,linhaCadastro);
end;
if (Copy(linhaCadastro,1,4) = ' E-M') then // se as 4 primeiras letras = ' E-M', significa que é a linha e-mail. Filtro e armazeno
begin
ArmazenaEmail.Add(Copy(linhaCadastro,Pos(' E-MAIL: ',linhaCadastro)+9,length(linhaCadastro)));
Readln(txtCadastro,linhaCadastro);
end;
if (Copy(linhaCadastro,1,4) = ' CEL') then // se as 4 primeiras letras = ' CEL', significa que é a linha celular. Filtro e armazeno
begin
ArmazenaCelular.Add(Copy(linhaCadastro,Pos(' CELULAR: ',linhaCadastro)+10,length(linhaCadastro)));
end;
end;
Obrigado ao Robinho e ao Araujo pela ajuda!!
consegui fazer o que eu queria, com a ideia parecida com o que o Robinho sugeriu:
...
while not (Copy(linhaCadastro,1,4) = '****') do // uma linha de asteriscos significa o fim do arquivo que me interessa
begin
Readln(txtCadastro,linhaCadastro);
if (Copy(linhaCadastro,1,4) = 'NOME') then // se as 4 primeiras letras = 'NOME', filtro e pego o nome
begin
ListBoxEmailMoradores.Items.Add(Copy(linhaCadastro,Pos('NOME MORADOR',linhaCadastro)+16,length(linhaCadastro)));
Readln(txtCadastro,linhaCadastro);
end;
if (Copy(linhaCadastro,1,4) = ' E-M') then // se as 4 primeiras letras = ' E-M', significa que é a linha e-mail. Filtro e armazeno
begin
ArmazenaEmail.Add(Copy(linhaCadastro,Pos(' E-MAIL: ',linhaCadastro)+9,length(linhaCadastro)));
Readln(txtCadastro,linhaCadastro);
end;
if (Copy(linhaCadastro,1,4) = ' CEL') then // se as 4 primeiras letras = ' CEL', significa que é a linha celular. Filtro e armazeno
begin
ArmazenaCelular.Add(Copy(linhaCadastro,Pos(' CELULAR: ',linhaCadastro)+10,length(linhaCadastro)));
end;
end;
Obrigado ao Robinho e ao Araujo pela ajuda!!
GOSTEI 0