ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

{resolvido} sequencia alfa numerica

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
leo_bruno
Profissional
Profissional


Registrado: Sexta-Feira, 16 de Abril de 2010
Mensagens: 666

MensagemEnviada: Qui Mai 10, 2018 1:15 pm    Assunto: {resolvido} sequencia alfa numerica Responder com Citação

Olá Pessoal:

Preciso de ajuda com um algorítmo pra retornar a proxima sequencia alfanumerica valida.

Eu quero passar uma string com o valor atual, o tamanho da string e receber a proxima sequencia valida.

a constante com as posicoes seria:

Código:

const
  cSeq = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';


Deste modo, teriamos:

001, 002, 003 ... 009, 00A e assim sucessivamente.

Após 00Z seria 011, 012, 013 ... 019, 01A, 01B etc.

Alguem pode me ajudar?

Obrigado


Editado pela última vez por leo_bruno em Sex Mai 11, 2018 3:06 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Mai 10, 2018 8:09 pm    Assunto: Responder com Citação

Código:
function GeradorSequenciaAlfaNum(index: integer): string;
const
  cSeq = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

var
  a, b, c: integer;
  ix: integer;
begin
  ix := 0;
  result := '';
  for a := 1 to length(cSeq) do
    for b := 1 to length(cSeq) do
      for c := 1 to length(cSeq) do
      begin
        inc(ix);
        if ix = index then
        begin
          result := cSeq[a] + cSeq[b] + cSeq[c];
          exit;
        end;
      end;
end;



modo de uso

Código:
edit1.text:=GeradorSequenciaAlfaNum(100); // 100 é a sequencia de numero 100 ou seja '02R'

ou

for x:=1 to 500 do
memo1.lines.add(GeradorSequenciaAlfaNum(x));  // neste caso o memo vai receber as 500 primeiras seguencias


Deste modo, teriamos:
001, 002, 003 ... 009, 00A e assim sucessivamente.
Após 00Z seria 011, 012, 013 ... 019, 01A, 01B etc. // obs depois do 00Z o proximo deveria ser 010 e não 011




Espero que lhe ajude no que estar a precisar.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
leo_bruno
Profissional
Profissional


Registrado: Sexta-Feira, 16 de Abril de 2010
Mensagens: 666

MensagemEnviada: Sex Mai 11, 2018 2:56 pm    Assunto: Responder com Citação

Obrigado pela resposta amigo.
Acabei chegando num algoritmo diferente do seu.

Código:

class function TStrUtils.GetSeqAlfaNum(var aStrAtual: string): string;
var
  I: integer;
  _Novo: char;
begin
  I := length(aStrAtual);
  result := aStrAtual;

  while I > 0 do
  begin
    if GetChar(aStrAtual[I], _Novo) then
    begin
      result[I] := _Novo;
      I := 0;
    end
    else
    begin
      result[I] := '0';
      Dec(I);
    end;
  end;
end;

function GetChar(aAtual: char; var ret: char): boolean;
const
  cSeq = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
begin
  result := false;
  if (Pos(aAtual, cSeq) + 1) <= length(cSeq) then
  begin
    ret := cSeq[Pos(aAtual, cSeq)+1];
    result := true;
  end;
end;


o método getchar, retorna false se o indice da posicao atual +1 estiver fora da constante cSeq.

Desta forma, no método GetSeqAlfaNum, desce uma posição e chama o metodo interno mais uma vez, sucessivamente ate um resultado ser encontrado,


strak2012 escreveu:
Código:
function GeradorSequenciaAlfaNum(index: integer): string;
const
  cSeq = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

var
  a, b, c: integer;
  ix: integer;
begin
  ix := 0;
  result := '';
  for a := 1 to length(cSeq) do
    for b := 1 to length(cSeq) do
      for c := 1 to length(cSeq) do
      begin
        inc(ix);
        if ix = index then
        begin
          result := cSeq[a] + cSeq[b] + cSeq[c];
          exit;
        end;
      end;
end;



modo de uso

Código:
edit1.text:=GeradorSequenciaAlfaNum(100); // 100 é a sequencia de numero 100 ou seja '02R'

ou

for x:=1 to 500 do
memo1.lines.add(GeradorSequenciaAlfaNum(x));  // neste caso o memo vai receber as 500 primeiras seguencias


Deste modo, teriamos:
001, 002, 003 ... 009, 00A e assim sucessivamente.
Após 00Z seria 011, 012, 013 ... 019, 01A, 01B etc. // obs depois do 00Z o proximo deveria ser 010 e não 011




Espero que lhe ajude no que estar a precisar.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB