[Resolvido]Dúvida com Strings no Delphi 7

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

[Resolvido]Dúvida com Strings no Delphi 7

Mensagem por Super Maker em Dom 17 Fev 2013, 15:45

Olá criadoes!
Faz tempo que não crio um tópico, agora preciso tirar uma dúvida com vocês...
É que eu comecei a usar Delphi 7 e não sei exatamente como fazer loops e nem tenho certesa se pro que eu to fazendo é preciso, pois não conheço as APIs também. Por isso achei que por a caso exista funções melhores que as do GM.

É o seguinte. Em uma parte do meu programa tem um botão que converte cada string do texto pra outro e eu tentei isso:
Código:
Tx_Replace := StringReplace(Tx_Input.Text,'a','letra: a',[rfReplaceAll, rfIgnoreCase]);
Tx_Replace := StringReplace(Tx_Input.Text,'b','letra: b',[rfReplaceAll, rfIgnoreCase]);
Tx_Replace := StringReplace(Tx_Input.Text,'c','letra: c',[rfReplaceAll, rfIgnoreCase]);
Funciona, mas só a última linha é executada claro, por isso "acho" que preciso fazer um loop assim com eu fiz no GM, vejam:
Código:
for (pos=0; pos<string_length(global.frase)+1; pos+=1) {
    switch(string_char_at(global.frase,pos)){
        case "a": global.frase = string_replace(global.frase,string_char_at(global.frase,pos),a); continue;
        case "b": global.frase = string_replace(global.frase,string_char_at(global.frase,pos),b); continue;
        case "c": global.frase = string_replace(global.frase,string_char_at(global.frase,pos),c); continue;
        case "d": global.frase = string_replace(global.frase,string_char_at(global.frase,pos),d); continue;
        case "etc..
    }
}
E aí?... Alguém sabe como eu posso fazer isso no Delphi 7 da maneira que eu fiz no GM?


Última edição por Super Maker em Sab 23 Fev 2013, 15:23, editado 4 vez(es)

Super Maker

Número de Mensagens : 646
Idade : 32
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por L0l-King em Dom 17 Fev 2013, 16:40

Você pode fazer um loop de 65 a 90 e dentro desse for você fazer o seguinte:
Código:

VariavelString := StringReplace(Texto, Chr(I), 'Aqui jaz um ' + Chr(I), [rfReplaceAll, rfIgnoreCase]
 //Sendo que I é a variável do for

O porque do loop de 65 a 90 é que 65 é a letra 'A' na tabela ASCII e 90 é a letra 'Z'.

L0l-King

Número de Mensagens : 148
Idade : 22
Data de inscrição : 04/04/2010
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por Super Maker em Dom 17 Fev 2013, 17:02

Pois é, eu não sei formar esse loop em Dephi e "Chr()" é do GM.
Ou existe alguma API pra prainstalar "Chr()" no Delphi 7?
Eu tentei isso agora:
FOR i := 0 TO ???lenth??? DO
Eu quero fazer como no meu exemplo que eu fiz no GM só que em Delphi.
Quero que o loop pegue a posição do char no texto e faça a alteração.
Eu não to encontrando propriedade lenth pra colocar aí, entende?

Super Maker

Número de Mensagens : 646
Idade : 32
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por L0l-King em Dom 17 Fev 2013, 17:09

Chr() é do Delphi, e os primeiros GM foram feitos em Delphi, por isso que CHr tá ali também Happy

o for tem que ficar assim:

Código:

for I := 65 to 90 do

Dentro do for execute o código do meu post acima.

L0l-King

Número de Mensagens : 148
Idade : 22
Data de inscrição : 04/04/2010
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por Super Maker em Dom 17 Fev 2013, 17:16

Verdade, acabei de encontrar o danado, mas eu acho que você ainda não reparou no que eu realmente quero. Por isso as vezes crio vídeos ao invés de escrever e postra imagens.
Acho que sou fraco ao me expressar. E não me leve a mal, eu agradeço muito por estar tentando me ajudar.
Agora deixa eu mostrar pra todos...
Em GML o que eu quero fazer no Delphi:
Código:
for (pos=0; pos<string_length(global.frase)+1; pos+=1) {
    switch(string_char_at(global.frase,pos)){
        case "a": global.frase = string_replace(global.frase,string_char_at(global.frase,pos),a); continue;
        case "b": global.frase = string_replace(global.frase,string_char_at(global.frase,pos),b); continue;
        case "c": global.frase = string_replace(global.frase,string_char_at(global.frase,pos),c); continue;
        case "d": global.frase = string_replace(global.frase,string_char_at(global.frase,pos),d); continue;
        case "etc..
    }
}
É exatamente isso que eu quero fazer, só que claro, isso não funciona no Delphi.
O loop ta descaradamente mostrando que eu quero pegar a posição atual dentre o texto. Percorrer os caracteres um a um.
Alguém sabe como posso adaptar?


Última edição por Super Maker em Seg 18 Fev 2013, 09:20, editado 2 vez(es)

Super Maker

Número de Mensagens : 646
Idade : 32
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por L0l-King em Dom 17 Fev 2013, 19:22

Delphi não tem nenhuma função que substitua especificadamente uma posição de uma String. Isso porque ela tem um meio de manipular bem bacana que vou mostrar agora:

Código:

for I := 1 to Lenght(minhaString) do //String em Delphi tem como o seu primeiro índice o 1
begin
  case Ord(minhaString[I]) of //Sim, String pode ser acessada como se fosse um array
    65: {aqui tem um A, maiúsculo}
    ..
    90: {Aqui tem um Z, maiúsculo}
end;
//E sim, você pode substituir o valor através do acesso por índice, como minhaString[1] := 'A';

L0l-King

Número de Mensagens : 148
Idade : 22
Data de inscrição : 04/04/2010
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por Super Maker em Seg 18 Fev 2013, 11:38

Isso foi maravilhoso cara...
Muitíssimo obrigado L0l-King, você não quebrou um galho, derrubou a floresta toda.
Valeu mesmo, mas tem um problema...
Olha como ficou:
Código:
procedure TFrame_Home.Bt_CopyClick(Sender: TObject);
var
  I: Integer;
  Tx_Replace: String;
begin
  Tx_Replace := Tx_Input.Text;
  for I := 1 to Length(Tx_Replace) do
    case Ord(Tx_Replace[I]) of
      Ord(97): Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--A--',[rfReplaceAll, rfIgnoreCase]);
      Ord(98): Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--B--',[rfReplaceAll, rfIgnoreCase]);
      Ord(99): Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--C--',[rfReplaceAll, rfIgnoreCase]);
    end;
    Tx_Input.Text := Tx_Replace;
end;
Isso foi o mais próximo que eu cheguei do que eu quero.
Eu não sei onde eu to errando, sei que se eu deixar pra converter pra um só caracter, funciona todas as linhas. Mas quando eu faço do jeito que mostro no código acima, só converte a primeira letra.
O loop para pelo fato de o próximo caracter ser desconhecido (-) pelo script, mas eu quero que mesmo sendo desconhecido continue até checar e converter todas as letras.
Onde ta meu erro?

Super Maker

Número de Mensagens : 646
Idade : 32
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por L0l-King em Seg 18 Fev 2013, 13:25

Primeira note:
Chr(Ord(Tx_Replace[I])) é meio desnecessário, você pode fazer só Tx_replace[I].
Seja X um integer, Ord de X sempre resulta X, então podes tirar os Ords no seu case.

O motivo dele parar é que quando você entra num For, o limitador vai pra heap(memória de valores) e a função length é executada só no começo por questões de performance, mas você está mudando o tamanho da String, mas ela não é atualizada no For(porque o valor inicial tá na heap e ninguém consegue mexer naquilo). Logo, se a string tinha 8 caracteres, I só vai até 8, por mais que tu mude tanto pra cima quanto pra baixo o tamanho da String no meio do For.

Nessa situação tu é obrigado a usar um while ou um repeat, como mostro abaixo:
Código:
var
  I: Integer;
  Tx_Replace, texto: String;

begin
  texto := 'zzazzbzzc';
  Tx_Replace := texto;
  I := 1;
  while(I <= Length(Tx_Replace)) do
  begin
    case Ord(Tx_Replace[I]) of
      97: Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--A--',[rfReplaceAll, rfIgnoreCase]);
      98: Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--B--',[rfReplaceAll, rfIgnoreCase]);
      99: Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--C--',[rfReplaceAll, rfIgnoreCase]);
    end;
    Inc(I);
  end;
  texto := Tx_Replace;
  writeln(texto);
  Readln;
end.

Nota: Esse código eu fiz pra funcionar em Console Application, precisa de uns pequenos ajustes pra funcionar em tela Happy

L0l-King

Número de Mensagens : 148
Idade : 22
Data de inscrição : 04/04/2010
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por PedroX em Seg 18 Fev 2013, 14:00

Só a última linha é executada?

Código:
Tx_Replace := StringReplace(Tx_Input.Text,'a','letra: a',[rfReplaceAll, rfIgnoreCase]);
Tx_Replace := StringReplace(Tx_Replace,'b','letra: b',[rfReplaceAll, rfIgnoreCase]);
Tx_Replace := StringReplace(Tx_Replace,'c','letra: c',[rfReplaceAll, rfIgnoreCase]);

Você começou de novo a cada linha.
Testa novamente com o código acima.

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por L0l-King em Seg 18 Fev 2013, 18:52

@PedroX: Eu sugeri isso, só que ele disse que queria fazer caractere por caractere, por isso postei esse while um tanto quanto grande.

L0l-King

Número de Mensagens : 148
Idade : 22
Data de inscrição : 04/04/2010
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

[Resolvido] Dúvida com Delphi 7 - Loop de Strings

Mensagem por Super Maker em Ter 19 Fev 2013, 02:19

Eu não sabia como fazer esse incremento, nem imaginava que podia ser assim.
Ficou perfeito agora, olha:
Código:
procedure TFrame_Home.Bt_CopyClick(Sender: TObject);
var
  I: Integer;
  Tx_Replace: String;
begin
  Tx_Replace := Tx_Input.Text;
  I := 1;
  while(I <= Length(Tx_Replace)) do
  begin
    case Ord(Tx_Replace[I]) of
      97: Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--A--',[rfReplaceAll, rfIgnoreCase]);
      98: Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--B--',[rfReplaceAll, rfIgnoreCase]);
      99: Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--C--',[rfReplaceAll, rfIgnoreCase]);
      100: Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--D--',[rfReplaceAll, rfIgnoreCase]);
      101: Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--E--',[rfReplaceAll, rfIgnoreCase]);
      102: Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--F--',[rfReplaceAll, rfIgnoreCase]);
      103: Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--G--',[rfReplaceAll, rfIgnoreCase]);
      104: Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--H--',[rfReplaceAll, rfIgnoreCase]);
      105: Tx_Replace := StringReplace(Tx_Replace,Chr(Ord(Tx_Replace[I])),'--I--',[rfReplaceAll, rfIgnoreCase]);
    end;
    Inc(I);
  end;
  Tx_Input.Text := Tx_Replace;
end;
Agradeço muito pela ajuda de vocês!

Super Maker

Número de Mensagens : 646
Idade : 32
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por L0l-King em Ter 19 Fev 2013, 08:02

Para otimização, só um ponto a tratar:

Ao invés de um case gigante, você pode fazer o seguinte
Código:

for J := 97 to 132 do //percorre todas as letras minúsculas
  if (J = Ord(Tx_Replace)) then
  //execute o código de substituição aqui

L0l-King

Número de Mensagens : 148
Idade : 22
Data de inscrição : 04/04/2010
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por Super Maker em Sex 22 Fev 2013, 14:17

To com um probleminha chato usando o método numérico pro reconhecimento.
O problema é que o "a" e o "A" estão sendo convertidos pro mesmo valor:
Código:
65: Tx_Replace := StringReplace(Tx_Replace,Char(Ord(Tx_Replace[I])),'letra A-',[rfReplaceAll, rfIgnoreCase]);
      97: Tx_Replace := StringReplace(Tx_Replace,Char(Ord(Tx_Replace[I])),'letra a-',[rfReplaceAll, rfIgnoreCase]);
O resultado ta sendo: letra a-letra a-
Mas quero que seja: letra a-letra A-
Como eu posso fixar essas diferênças no código?

Super Maker

Número de Mensagens : 646
Idade : 32
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por L0l-King em Sab 23 Fev 2013, 12:07

Os números que você está usando são errados, 97 É ONDE COMEÇA AS MINÚSCULAS e 65 É ONDE COMEÇA AS MAIÚSCULAS, por isso que não tá invertendo como você quer Happy

Mas toma um pouco de cuidado, se acontecer o que você quer vai dar um loop infinito meu caro.
Por quê?
Veja, se encontrar um 'a' você coloca um 'A' algumas posições depois, e e se encontrar um 'A' você coloca 'a' algumas posições depois, ou seja, ele vai incrementando isso até dar estouro da memória!

L0l-King

Número de Mensagens : 148
Idade : 22
Data de inscrição : 04/04/2010
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por Super Maker em Sab 23 Fev 2013, 12:13

Não, eu to mostrando um destino figurativo, eu não pretendo converter pra letras. Vai ser pra outra coisa.
Eu fiz nessa ordem por que achei que fosse dar outro tipo de erro dexando maiúscula pra baixo.

Agora eu tentei assim:
Código:
97: Tx_Replace := StringReplace(Tx_Replace,Char(Ord(Tx_Replace[I])),'97',[rfReplaceAll, rfIgnoreCase]);
65: Tx_Replace := StringReplace(Tx_Replace,Char(Ord(Tx_Replace[I])),'65',[rfReplaceAll, rfIgnoreCase]);
Eu escrevi aA e o resultado foi 9797.
Eu escrevi Aa e o resultado foi 6565.

Não é o que eu quero, sabe onde eu errei?

Super Maker

Número de Mensagens : 646
Idade : 32
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por L0l-King em Sab 23 Fev 2013, 12:25

Tira o parâmetro rfIgnoreCase e vê se resolve. Happy

L0l-King

Número de Mensagens : 148
Idade : 22
Data de inscrição : 04/04/2010
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por Super Maker em Sab 23 Fev 2013, 15:22

Resolvido!
Deus te abençoe cara XD
Deu certo agora. Muitíssimo obrigado!!!

Super Maker

Número de Mensagens : 646
Idade : 32
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por L0l-King em Sab 23 Fev 2013, 15:38

Haha
De nada kra Happy
To a alguns anos programando em Delphi, qualquer coisa é só dar um toque xP

L0l-King

Número de Mensagens : 148
Idade : 22
Data de inscrição : 04/04/2010
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido]Dúvida com Strings no Delphi 7

Mensagem por Conteúdo patrocinado Hoje à(s) 22:52


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum