Função Pos() Como encontrar a posição da primeira substring e não da última

12/04/2015

0

O problema que estou tendo nesta função é que, mesmo que eu inicialize a posição da variável para 1 (no início da string), a função retorna o valor da posição do último espaço.
Uma string tem 2 ou 3 espaços, que encontrar a posição só do primeiro espaço.

var
s, textL:string
nL, vpos2: integer;

Procedure:
textL:= memo1.lines[nL];
vpos2:=1;
vpos2:=(Pos(' ',textL));
memo3.lines.add(s);

Acho que descobri o motivo de não está dando certo:
É o problema do TAB que parece ser espaço, mas não é. O primeiro espaço é um TAB(codigo 9, segundo fontes daqui), e o segundo tembém é, mas o terceiro é espaço, e o POS detecta espaço ' '.

Como vou posicionar POS num TAB?
Joao

Joao

Responder

Post mais votado

12/04/2015

Boa Tarde

A função Pos() do delphi retorna o índice da primeira string encontrada e caso não encontre retorna zero, se tiver mais de um irá ter que ir quebrando a string para chegar na última.

Exemplo

Sintaxe : function Pos(Substr: string; S: string): Integer; 

var 
         sNome: String; 
         nPos1: Byte; 
         nPos2: Byte; 
         nPos3: Byte; 
begin 
         sNome := \'Antonio Celio Morais\'; 
         nPos1 := Pos(\'A\', sNome); // nPos1 será 1 
         nPos2 := Pos(\'Mor\', sNome); // nPos2 será 15 
         nPos3 := Pos(\'Marco\', sNome); // nPos3 sera 0 
end; 

Lucas Ramos

Lucas Ramos
Responder

Mais Posts

12/04/2015

Joao

Boa Tarde

A função Pos() do delphi retorna o índice da primeira string encontrada e caso não encontre retorna zero, se tiver mais de um irá ter que ir quebrando a string para chegar na última.

Exemplo

Sintaxe : function Pos(Substr: string; S: string): Integer; 

var 
         sNome: String; 
         nPos1: Byte; 
         nPos2: Byte; 
         nPos3: Byte; 
begin 
         sNome := \'Antonio Celio Morais\'; 
         nPos1 := Pos(\'A\', sNome); // nPos1 será 1 
         nPos2 := Pos(\'Mor\', sNome); // nPos2 será 15 
         nPos3 := Pos(\'Marco\', sNome); // nPos3 sera 0 
end; 
Tá certo, amigo. Eu acabo de descobri o problema, agora só falta resolver. Leia novamente o que eu acabei de editar. Como vou posicionar no TAB de uma string. Eu nem sabia que string guardava TAB (tabulação).
Responder

12/04/2015

Lucas Ramos

Boa Noite

Atribua o #9 em uma string e tente usar o Pos() caso deseje a posição do TAB, se não funcionar faça um for percorrendo todos os caracteres até achar a posição que deseja
function RetornaPosicao(pTexto: string;pChar: string): integer;
var
        lCont: integer;
begin
        result := 0;
        
        for lCont := 1 to Length(pTexto) do
        begin
                 if (pTexto[lCont] = pChar) then
                 begin
                          result := lCont;
                          break;
                 end;
        end;
end;


Basicamente essa função vai percorrer toda a string caracter a caracter e retornar a posição desejada, caso não encontre retorna zero, basicamente a mesma coisa que o Pos() só que com 1 caractere, verifica se é isso que você precisa?
Responder

12/04/2015

Joao

Boa Noite

Atribua o #9 em uma string e tente usar o Pos() caso deseje a posição do TAB, se não funcionar faça um for percorrendo todos os caracteres até achar a posição que deseja
function RetornaPosicao(pTexto: string;pChar: string): integer;
var
        lCont: integer;
begin
        result := 0;
        
        for lCont := 1 to Length(pTexto) do
        begin
                 if (pTexto[lCont] = pChar) then
                 begin
                          result := lCont;
                          break;
                 end;
        end;
end;


Basicamente essa função vai percorrer toda a string caracter a caracter e retornar a posição desejada, caso não encontre retorna zero, basicamente a mesma coisa que o Pos() só que com 1 caractere, verifica se é isso que você precisa?


De jeito que eu fiz, até compilou, mas na hora de executar o procedure, dá erro justamente na linha que testa o codico ASC e exibe esta mensagem.
[img:descricao=Erro Delphi]http://arquivo.devmedia.com.br/forum/imagem/424085-20150412-201839.jpg[/img]

Você quer que eu joque esta rotina dentro de um for percorrendo cada caracter da string? Você quer que eu atribua o #9 a uma string? Eu não entendi.

Assim?

vstring:=#9;
Responder

13/04/2015

Lucas Ramos

Bom Dia

No caso de atribuir o #9 numa string é para achar a posição do TAB com a função POS(), caso não funcione tente usar percorrendo em um for, caso não deseje o TAB tente usar um replace e depois usar o POS com a string que desejar.
Responder

15/04/2015

Emerson Nascimento

var
s, textL:string
nL, vpos, vpostab: integer;

Procedure:
textL:= memo1.lines[nL];

vpostab := Pos(#9,textL); // posição do tab
vpos := Pos(' ',textL); // posição do espaço

// avalia se encontrou o tab e se o tab está antes do espaço
if (vpos09 > 0) and (vpos > vpos09) then
vpos := vpos09;

// a partir daqui você trabalha com o conteúdo de vpos


memo3.lines.add(s);
Responder

17/04/2015

Joao

Fiquei OFF uns dias, mas voltei.
Antes eu olhei no help do Delphi e hoje eu pude testar outras alternativas.

Vejam o que eu fiz:
Teste1: Funcionou
c:= textL[i];
if (Ord(c)= 9) then

Teste2: Funcionou também.
c:= textL[i];
if (c = #9) then


O problema não era na função, mas sim no cálculo da posição do tab. Acho que eu estava somando uma caracter ao invés de um número. Depois que corrigir, funcionou.

A sua dica ajudeu também. Eu nunca havia usado # para trabalhar com caracter.
Responder

17/04/2015

Joao

Boa Noite

Atribua o #9 em uma string e tente usar o Pos() caso deseje a posição do TAB, se não funcionar faça um for percorrendo todos os caracteres até achar a posição que deseja
function RetornaPosicao(pTexto: string;pChar: string): integer;
var
        lCont: integer;
begin
        result := 0;
        
        for lCont := 1 to Length(pTexto) do
        begin
                 if (pTexto[lCont] = pChar) then
                 begin
                          result := lCont;
                          break;
                 end;
        end;
end;


Basicamente essa função vai percorrer toda a string caracter a caracter e retornar a posição desejada, caso não encontre retorna zero, basicamente a mesma coisa que o Pos() só que com 1 caractere, verifica se é isso que você precisa?


Bom, neste caso eu usei um While para percorrer a string. Veja:

lim:= Length(textL);
i:=0;

while i<lim do
begin
c:= textL[i];
if (c = #9) then
end;

Eu resumi, mas é basicamente isso.
Responder

25/11/2019

Gladstone Matos

excelente!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar