Erro em pesquisa de dados de arquivos tipados
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
Curtidas 0
Respostas
Lucas Silva
25/03/2004
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;
GOSTEI 0
Tatuweb
25/03/2004
Mesmo assim os erros continuam.
GOSTEI 0