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;

   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

Tatuweb

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

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar