Fórum Erro em pesquisa de dados de arquivos tipados #222310
25/03/2004
0
Já vi e revi o código várias vezes mas não sei o que está ocasionando o erro. Estou trabalhando com arquivos tipados
Objetivo do codigo:
Quando o usuario digitar parte do nome da pessoa quero que todos os nomes sejam exibidos em uma StringGrid. Ex: Se for digitado Fernanda na caixa de texto irá aparecer todos os nomes das pessoas que começam com Fernanda no StringGrid.
// EDT_01 é um componente TEdit;
// Grid é um componenente StringGrid
// Cadastro: TCadastro;
// FCadastro: File of TCadastro;
Os seguintes erros aparecem:
[b:3501b538ea]List index out of bounds (X); >>X é um numero que varia, as vezes é 2, as vezes é 0, etc. .
Read beyound end of file[/b:3501b538ea]
Quando não aparece erro o Grid mostra os indices errados. Enfim, ocódigo acima nunca funciona. Claro que falta alguns detalhes no codigo tipo tratamento de erros se não for encontrado nada mas isso eu ponho depois. O fato é que o código acima não funciona.
:(
Objetivo do codigo:
Quando o usuario digitar parte do nome da pessoa quero que todos os nomes sejam exibidos em uma StringGrid. Ex: Se for digitado Fernanda na caixa de texto irá aparecer todos os nomes das pessoas que começam com Fernanda no StringGrid.
// EDT_01 é um componente TEdit;
// Grid é um componenente StringGrid
// Cadastro: TCadastro;
// FCadastro: File of TCadastro;
TCadastro = record
Nome: string[20];
Fone: string[08];
UF: string[02];
Salario: real;
end;
... // O arquivo ja foi aberto em outro evento e será fechado em outro evento.
procedure TForm1.BTN_05Click(Sender: TObject);
var
FStr: TStrings;
k: integer;
begin
// Cria uma variavel do tipo TStrings que ira armazenar dados a serem exibidos no GRID
FStr := TStringList.Create;
// Move o ponteiro para o primeiro registro
Seek (FCadastro, 0);
// Enquanto não chegar ao fim do arquivo
while not EOF (FCadastro) do
begin
Read (FCadastro, Cadastro);
if Copy (Cadastro.Nome, 0, Length (EDT_01.Text)) = EDT_01.Text then
FStr.Append (IntToStr (FilePos (FCadastro)));
end;
// Defino o numero de linha do StringGrid igual a quantidade de registros encontrados + 1
Grid.RowCount := FStr.Count + 1;
{ Aqui espero que os indices tenham sido armazenados no conteudo da TStrings
Ex: FStr.strings[0] contém 4 porque um dos nomes procurados está na posicao 4 do arquivo tipado;
FStr.strings[1] contem 7 porque um dos nomes procurados está na posicao 7 do arquivo tipado;
No loop abaixo quero exibir SOMENTE os indice que estiverem armazenados no FStr}
for k := 1 to FStr.Count do
begin
// Move o ponteiro para a posição cujo valor esta armazenada no conteudo de FStr
Seek (FCadastro, StrToInt (FStr.Strings[k-1]));
// Entao leio
Read (FCadastro, Cadastro);
Grid.Cells[0,k] := Cadastro.Nome;
Grid.Cells[1,k] := Cadastro.Fone;
Grid.Cells[2,k] := FloatToStr (Cadastro.Salario);
Grid.Cells[3,k] := Cadastro.UF;
end;
FStr.Free;
end;
Os seguintes erros aparecem:
[b:3501b538ea]List index out of bounds (X); >>X é um numero que varia, as vezes é 2, as vezes é 0, etc. .
Read beyound end of file[/b:3501b538ea]
Quando não aparece erro o Grid mostra os indices errados. Enfim, ocódigo acima nunca funciona. Claro que falta alguns detalhes no codigo tipo tratamento de erros se não for encontrado nada mas isso eu ponho depois. O fato é que o código acima não funciona.
:(
Tatuweb
Curtir tópico
+ 0
Responder
Posts
25/03/2004
Lucas Silva
Tenta mudar este código.
for k := 0 to FStr.Count -1 do begin // Move o ponteiro para a posição cujo valor esta armazenada no conteudo de FStr Seek (FCadastro, StrToInt (FStr.Strings[k])); // Entao leio Read (FCadastro, Cadastro); Grid.Cells[0,k+1] := Cadastro.Nome; Grid.Cells[1,k+1] := Cadastro.Fone; Grid.Cells[2,k+1] := FloatToStr (Cadastro.Salario); Grid.Cells[3,k+1] := Cadastro.UF; end; FStr.Free;
Responder
Gostei + 0
25/03/2004
Tatuweb
Mesmo assim os erros continuam.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)