Funcao quot; ; quot; ( Ponto e vírgula )

Delphi

22/03/2005

Gostaria de uma função q fizesse isso:

Eu dou uma variavel pra ela por exemplo -> A ; B ; C ; D
Então eu informaria um número pra ela ou seja um índice e ela me retornaria uma string.
Aplicando nesse exemplo eu dou o número 1 e teria o ´ A como resposta, dou o 3 e teria o ´ C ´ como resoposta asssim por diante .....

Alguém poderia me ajudar ?


Patricksc

Patricksc

Curtidas 0

Respostas

Marcio.theis

Marcio.theis

22/03/2005

Por que você não da uma variável para ele assim:

variavel:=ABCDE;

e depois vc apenas faz um for, como por exemplo:

for x:=1 to numero do
ret:=variavel[x];

numero, variável que vc iria informar, passar pale ele logalizar.
desta forma a variável ret teria a sua letra, mas tb podendo utilizar um copy, ou outras formas para localizar.


GOSTEI 0
Patricksc

Patricksc

22/03/2005

nao daria pq nesse caso eu usei só um exemplo pq na real vao conter dados de diversos formatos naum vou usar apenas A B C D.....
entende ???

poderia ter numeros ( 1245213; 15681231; 4456; 1561....) ou camops
(Clientes; Fornecedores; .bla...bla..bla.......);

Naum sei se vc me entendeu ?


GOSTEI 0
Marcio.theis

Marcio.theis

22/03/2005

Fia a seguinte função:

function TForm1.Busca(texto: string; posicao: integer): string;
var
    ret: string;
    aux, x, y: integer;
    achou: boolean;
begin
y:=1;
x:=1;
ret:=´´;
achou:=False;
aux:=Length(texto);
while not achou do
    begin
    while x <= aux do
        begin
        if texto[x] = ´;´ then
            begin
            if y = posicao then
                begin
                achou:=True;
                x:=aux + 1;
                end
            else
                begin
                Inc(x);
                Inc(y);
                ret:=´´;
                end;
            end
        else
            begin
            ret:=ret + texto[x];
            Inc(x);
            end;
        if x = aux + 1 then
            achou:=True;
        end;
    end;
Busca:=Trim(ret);
end;


no qual eu passo como parâmetro o texto(1245213; 15681231; 4456; 1561) e na posicao a posição do texto que eu quero (2), no caso ela me retorna 15681231, mas deve ainda de ser melhorada, fiz rapidinho não fiz algumas validações, mas acho que é isto que vc quer....


GOSTEI 0
Massuda

Massuda

22/03/2005

Pelo que entendi, você provavelmente está procurando um jeito de passar um número variável de argumentos de qualquer tipo para uma função/procedure.

Uma solução para isso é usar um argumento do tipo [b:8d7d2fa64d]array of const[/b:8d7d2fa64d], que é como um array dinamico de Variant´s (procure na Ajuda do Delphi pelo tópico ´variant open array parameters´). Este é o exemplo da Ajuda do Delphi:
uses
  Variants, // se for Delphi 6 ou mais recente
  ...
function MakeStr(const Args: array of const): string;
const
  BoolChars: array[Boolean] of Char = (´F´, ´T´);
var
  I: Integer;
begin
  Result := ´´;
  for I := 0 to High(Args) do
    with Args[I] do
      case VType of
        vtInteger:    Result := Result + IntToStr(VInteger);
        vtBoolean:    Result := Result + BoolChars[VBoolean];
        vtChar:       Result := Result + VChar;
        vtExtended:   Result := Result + FloatToStr(VExtended^);
        vtString:     Result := Result + VString^;
        vtPChar:      Result := Result + VPChar;
        vtObject:     Result := Result + VObject.ClassName;
        vtClass:      Result := Result + VClass.ClassName;
        vtAnsiString: Result := Result + string(VAnsiString);
        vtCurrency:   Result := Result + CurrToStr(VCurrency^);
        vtVariant:    Result := Result + string(VVariant^);
        vtInt64:      Result := Result + IntToStr(VInt64^);
    end;
end;

// exemplo de uso
MakeStr([´test´, 100, ´ ´, True, 3.14159, TForm]);
// resulta "test100 T3.14159TForm"
A função converte para texto os argumentos passados para ela. Note que a função testa o tipo de cada argumento (Args[I].VType) para decidir como converter o argumento para texto.

O exemplo veio da Ajuda do Delphi 5, talvez para Delphi 6 ou mais recente possam existir diferenças em relação ao apresentado acima.


GOSTEI 0
Patricksc

Patricksc

22/03/2005

Vlw Pessoal vcs são d++ !!!!


GOSTEI 0
Patricksc

Patricksc

22/03/2005

Ahhh outra coisa como eu faria se quisesse contar quantos ´ ; ´ ponto e vigulas tem numa string ??


GOSTEI 0
Massuda

Massuda

22/03/2005

O mais fácil é percorrer a string e contar...
var
  I: Integer;
  N: Integer;
  S: string;
....
  S := ´... algum texto ...´;
  N := 0;
  for I := 1 to Length(S) do begin
    if S[I] = ´;´ then Inc(N);
  end;



GOSTEI 0
Kapak

Kapak

22/03/2005

Se vc fizer conforme o Massuda disse, não precisa mais informar ´;´. Simplesmente chame:
Nome_da_Funcao([´asdfg´, 123, 12.345]);


GOSTEI 0
Patricksc

Patricksc

22/03/2005

é que no meu caso é diferente pq vai conter ´ ; ´ .
Mas pq ???

Pq estarei ultilizando arquivo ´CSV´ Comma Separated values entaum sao arquivos separados por ´;´ entende??

Entaum preciso saber quantos ´;´ para saber quantos campos existem e presiso separar uma string por ´;´.

Entenderam ???


GOSTEI 0
Kapak

Kapak

22/03/2005

var p:PChar; iPos:Integer; SL:TStringList;
begin
  SL := TStringList.Create;
  p := @s[1]; // s é a string c/ os ";"
  iPos := Pos(´;´, p);
  While iPos > 0 do
  begin
    SL.Add(Copy(p, 1, iPos-1));
    Inc(p, iPos);
    iPos := Pos(´;´, p);
  end;
  SL.Free;
end;
Utilize SL.Count p/ saber a quantidade de strings.


GOSTEI 0
POSTAR