Delphi combinaçoes - ninguem resolve e muito dificil

Delphi

09/12/2003

tenho um txt no seguinte formato

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 18

são linhas contendo apenas 15 numeros por linhas.

gostaria de uma ajuda, quero ler este txt do seguinte modo, tenho uma combo com os seguintes itens
7p e 8i
8p e 7i
quando eu selecionar a 1 opção 7p e 8i quero que ele leia o txt e selecione apenas as linhas que existem 7 numeros pares e 8 impares e jogue esta linha em um memo.
Alguem pode me ajudar?

Snipes


Snipes

Snipes

Curtidas 0

Respostas

Tnaires

Tnaires

09/12/2003

Olá snipes

Eu não sei como puxar essas linhas do arquivo, pois nunca trabalhei com arquivos texto no delphi. Mas o complicado mesmo é implementar essa busca por pares e ímpares.
Tente o seguinte código:
procedure ParesImpares (linha: string);
  var token: string;  // Conterá o número no formato string
       npares, nimpares, i: integer;  // Para armazenar a qtd de números
begin
  // Inicializando variáveis...
  npares := 0;
  nimpares := 0;
  token := ´´;
  for i := 1 to Length(linha) do
  begin
    if linha[i] <> ´ ´ then          // Se o caractere atual não for espaço...
      token := token + linha[i]  // Acrescente o caractere ao token
    else
    begin
      if StrToInt(token) mod 2 = 0 then  // Se for par...
        Inc(npares)                             // Incremente qtd de números pares
      else                                         // Se for ímpar...
        Inc(nimpares);                         // Incremente qtd de números ímpares
      token := ´´;                                // Reinicializar token
    end;
  end;
  // O if abaixo só adiciona a linha ao memo se a opção escolhida
  //    corresponder ao número de pares e ímpares correspondente.
  if ((npares = 8) and (nimpares = 7) and (opcao8p7i.Checked)) or
     ((npares = 7) and (nimpares = 8) and (opcao7p8i.Checked)) then
    Memo1.Lines.Add(linha);
end;
  

Supondo que a opção seja determinada por dois checkboxes de nomes respectivos opcao8p7i e opcao7p8i.
He he... Deve haver maneira mais simples... Sucesso...


GOSTEI 0
Deus

Deus

09/12/2003

Acho que essa coisa de ´ninguém resolve´ é pq ninguém tentou com muita paciência, não? :) Pq não é difícil de jeito nenhum. Meu computador está quebrado, e estou usando o da minha irmã - sem Delphi - logo, este código que vou colocar aqui [b:a66262dc6c]não[/b:a66262dc6c] foi testado por mim, ou seja.. é possível, claro, que dê um erro de compilação ou que não faça a tarefa, mas acho difícil - e, se for o caso, o problema é mínimo. :) De qualquer forma:

fuction stRetornaLinhas(sArq: String; iPares, iImpares: Integer): TStringList;

  function stRetornaTexto(sArquivo: String): TStringList;
  var
    tfTexto: TextFile;
    stTexto: TStringList;
      stTmp: String;
  begin
    stTexto := TStringList.Create;

    try
      AssignFile(tfTexto, sArquivo);
      Reset(tfTexto);

      while not Eof(tfTexto) do
      begin
        ReadLn(tfTexto, stTmp);
        stTexto.Add(Trim(stTmp));
      end;
    except
    end;

    Result := stTexto;
  end;

var
               stTemp: String;
    stlTemp, stlTexto: TStringList;
  i, iiCount, ipCount: Integer;
begin
  stlTexto := TStringList.Create;
  stlTemp  := TStringList.Create;
  stlTemp  := sRetornaTexto(sArq);

  for i := 0 to Pred(stlTexto.Count) do
  begin
    iiCount := 0;
    ipCount := 0;

    stTemp := stlTexto.Strings[i];
    while (Pos(´ ´, stTemp) > 0) do
    begin
      if ((StrToInt(Trim(Copy(stTemp, 1, Pos(´ ´, stTemp))))) mod 2 = 0) then
        inc(ipCount)
      else
        inc(iiCount);

      Delete(stTemp, 1, Pos(´ ´, stTemp));
    end;

    if (iPares = ipCount) and (iImpares = iiCount) then
    begin
     stTemp := stlTemp.Strings[i];
     stlTexto.Add(stTemp);
    end;
  end;

  Result := stlTexto;
end;


Bem, se você quiser adicionar as linhas a um ComboBox, é só colocar o seguinte código no [i:a66262dc6c]OnClick[/i:a66262dc6c] do ComboBox:

Case ComboBox.ItemIndex of
  0: Memo1.Lines := RetornaLinhas(´C:\Teste.Txt´, 7, 8);
  1: Memo1.Lines := RetornaLinhas(´C:\Teste.Txt´, 8, 7);
end;


OK? Avise-me se funcionou, quero saber se meu compilador mental precisa de uns ajustes! ;) Abraços!


GOSTEI 0
POSTAR