Problema com loop !!!!

Delphi

30/08/2005

Cod:

LBArquivos:

Parte da string:


O problema é o seguinte:

O usuario colocou a orden do LBArquivos oposta a da string, o no meu cod. so
alteraria a 1ª linha da string alguem sabe como que posso resolver isso ?????


Guilherme

Guilherme

Curtidas 0

Respostas

Rjun

Rjun

30/08/2005

Eu não consegui entender o pq q so alteraria a 1ª linha. Você não esta procurando por todo o html?


GOSTEI 0
Massuda

Massuda

30/08/2005

Fiquei com a impressão que você quer trocar o ¬20 que tem no nome do arquivo por espaço... normalmente, isso quem faz é o navegador quando vai decodificar a url... Se não for isso, estou como o Rogério, sem entender qual a lógica de trocar apenas a primeira linha.


GOSTEI 0
Guilherme

Guilherme

30/08/2005

pq tipo o primeiro ´registro´ do LBArquivos nao da certo na string ne ai ele vai para o 2ª ai sim deu certo ai substitui so ki o 1º registro do LBArquivos ki dah certo na 2º linha do html jah fico para traz e o loop acabou !!!


GOSTEI 0
Guilherme

Guilherme

30/08/2005

Fiquei com a impressão que você quer trocar o ¬20 que tem no nome do arquivo por espaço... normalmente, isso quem faz é o navegador quando vai decodificar a url... Se não for isso, estou como o Rogério, sem entender qual a lógica de trocar apenas a primeira linha.


a principio era so o nome do arquivo sem caminho so que ai entrou mais coisas tipo o cid: o cod ki completo para fazer a alteraçao eh esse :

  
var 
 Htm,Newarq : TStringList;
  I, J, l, t: Integer;
  PosIni: Integer;
  PosFim: Integer;
  ContaCaract: Integer;
  MeuTexto: string;
  MinhaFrase,resultado: string;
begin 
 Htm:=TStringList.Create;
 Newarq:=TStringList.Create;
 Htm.LoadFromFile(edtlocal.Text);
  for J := 0 to Htm.Count-1 do
  begin
    MeuTexto := htm[J]; //não pra colocar "I" no Lines e sim "J" era Memo1.Lines[I];
    if Pos(´src="´, MeuTexto) > 0 then //Linha adicionada
    begin
      PosIni := Pos(´src="´, MeuTexto) + 5;
      ContaCaract := 0;
      for I := PosIni to Length(MeuTexto) do
      begin
        if MeuTexto[I] = ´"´ then // fim da src
        begin
          MinhaFrase := Copy(MeuTexto, PosIni, ContaCaract);
          for t := 0 to LBArquivos.Lines.Count-1 do
           if Pos(ExtractFileName(LBArquivos.lines[t]),MeuTexto) <> 0 then begin
           resultado:=´cid:´+LBArquivos.lines[t];
           Newarq.Add(StringReplace(MeuTexto, MinhaFrase, resultado, []));
           LBArquivos.lines.Delete(t);
        end;
        end;
        Inc(ContaCaract);
      end;
    end
    else //else adicionado
    begin
      Newarq.Add(htm[J]);
      Continue;
    end;
  end;
end;




GOSTEI 0
Massuda

Massuda

30/08/2005

O problema é que você está deletando itens do LBArquivos enquanto percorre os itens o LBArquivos... nesse tipo de situação, percorra a lista de itens de trás para frente, caso contrário você acaba deixando de percorrer alguns itens da lista...
...
for t := LBArquivos.Lines.Count-1 downto 0 do
  if Pos(ExtractFileName(LBArquivos.lines[t]),MeuTexto) <> 0 then begin
    resultado:=´cid:´+LBArquivos.lines[t];
    Newarq.Add(StringReplace(MeuTexto, MinhaFrase, resultado, []));
    LBArquivos.lines.Delete(t);
  end;
end;
...



GOSTEI 0
Guilherme

Guilherme

30/08/2005

mais i se o usuario colocar na orden certa ???? o usuario nao sabe de nada ele so quer adicionar os arquivos ali e enviar o e-mail agora si tipo eu nao verificar si ali eh o lugar certo o e-mail vai sair tudo fora de ´orbita´ intao tenho ki arrumar um jeito dele zerar a variavel do loop e começar d novo ate o lbarquivos ficar vazio !!!!


GOSTEI 0
Massuda

Massuda

30/08/2005

...vai sair tudo fora de ´orbita´ intao tenho ki arrumar um jeito dele zerar a variavel do loop e começar d novo ate o lbarquivos ficar vazio !!!!
Não entendi nada... pelo que vi no seu código para cada ´frase´ vai testar se tem algum item igual em LBArquivos, se tiver remove da lista; outra coisa que eu não entendi é porque remove da lista de LBArquivos, já que, a princípio, seria possível um mesmo arquivo aparecer mais de uma vez no texto.


GOSTEI 0
Guilherme

Guilherme

30/08/2005

intao si eu nao excluir da lista como ki eu faço para substituir todos ?? pq nao to conseguindo nao dah certo !


GOSTEI 0
Massuda

Massuda

30/08/2005

Assim me parece mais razoável...
...
  for J := 0 to Htm.Count - 1 do begin

    MeuTexto := htm[J];

    if Pos(´src="´, MeuTexto) > 0 then begin

      PosIni := Pos(´src="´, MeuTexto) + 5;

      ContaCaract := 0;
      for I := PosIni to Length(MeuTexto) do begin
        if MeuTexto[I] = ´"´ then begin
          Break;
        end;
        Inc(ContaCaract);
      end;

      if ContaCaract > 0 then begin

        MinhaFrase := Copy(MeuTexto, PosIni, ContaCaract);

        for t := 0 to LBArquivos.Lines.Count - 1 do begin
          if Pos(ExtractFileName(LBArquivos.lines[t]), MeuTexto) <> 0 then begin
            resultado := ´cid:´ + LBArquivos.lines[t];
            Newarq.Add(StringReplace(MeuTexto, MinhaFrase, resultado, []));
            Break;
          end;
        end;
        // pode acontecer de não encontrar MinhaFrase em LBArquivos
      end
      else begin
        // se o HTML estiver errado, pode acontecer de ContaCaract = 0
      end;
    end
    else begin
      Newarq.Add(MeuTexto);
    end;
  end;
...
Retirei seus comentários e anotei alguns erros que você deve/deveria saber como tratar.


GOSTEI 0
Guilherme

Guilherme

30/08/2005

refis o cod e deu certo ....

var 
 Htm,Newarq : TStringList;
  lhtml,LAcharFinal,Larq: Integer;
  PosIni: Integer;
  PosFim: Integer;
  ContaCaract: Integer;
  MeuTexto: string;
  MinhaFrase,resultado: string;
begin 
 for LHtml := 0 to Htm.Count -1 do begin
      MinhaFrase:= htm[LHtml];
      if  pos(´SRC="´,UpperCase(MinhaFrase)) <> 0 then begin
       PosIni:=pos(´SRC="´,UpperCase(MinhaFrase)) + 5;
       ContaCaract:=0;
      for LAcharFinal := PosIni to length(MinhaFrase) do begin
       if MinhaFrase[LAcharFinal] = ´"´ then begin {eh o fim do texto dentro das aspas}
        MeuTexto:= copy(MinhaFrase,PosIni,ContaCaract);
         MeuTexto:=StringReplace(MeuTexto,´¬20´,´ ´,[rfReplaceAll]);
         MinhaFrase:=StringReplace(MinhaFrase,´¬20´,´ ´,[rfReplaceAll]);
        for Larq := 0 to LbArquivos.Lines.Count -1 do
           if Pos(ExtractFileName(LbArquivos.Lines[Larq]),MeuTexto) <> 0 then begin
           resultado:=´cid:´+ LbArquivos.Lines[Larq];
           Newarq.Add(StringReplace(MinhaFrase,MeuTexto,resultado,[rfReplaceAll]));
           resultado:=´´;
           Break;
         end; {1º if dentro do loop Larq}
        Break;
        end else {si ainda nao cababo o texto dentro das aspas intao}
       Inc(ContaCaract)

       end; {2º laço for tag >> for LAcharFinal := PosIni to length(MinhaFrase) do begin }
      end else begin  {end da 1º compareçao "if" }
       Newarq.Add(Htm[Lhtml]);
       Continue;
       end; {end do else}
      end ; {end do 1º laço for referente a tag >> for LHtml := 0 to Htm.Count -1 do begin}
end;



vlw ai todo mundo mais so resumindo nao tava dando certo por falta de um break !!!!![/code]


GOSTEI 0
POSTAR