



Muitas vezes é necessário criar algum indexificador único
em nossas aplicações.
Para resolver de modo fácil este problema, é possível
fazer uso da função abaixo:
Obs: É necessário estas declarado System.SysUtils na seção uses.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | function GetNewID(Prefix: String): string; var reg: array [1 .. 7] of word; i: integer; begin { EDIT: Vou por mais estas linhas abaixo, para que o prefixo nunca tenha mais de 2 caracteres, e assim fique fixo o tamanho 16 bytes } if length(Prefix) > 2 then Prefix := Copy(Prefix, 1, 2) else while length(Prefix) < 2 do Prefix := ' ' + Prefix; Result := ''; DecodeDate(Date, reg[1], reg[2], reg[3]); reg[1] := StrToInt(Copy(IntToStr(reg[1]), 3, 2)); { Esta corrige o ano para apenas dois digitos, por forma a ser inferior a 255. em vez de reg[1] estava a variavel ano. } DecodeTime(Time, reg[4], reg[5], reg[6], reg[7]); reg[7] := reg[7] div 4; // esta corrige os milisegundos randomize; for i := 1 to 7 do begin if (i >= 2) and (i <= 6) then reg[i] := reg[i] + random(100); { O random é uma segurança adicional, pois como o ano e os milisegundos não são usados na totalidade, havia uma pequena possibilidade de sair duplicado... Assim é quase impossivel } Result := Result + IntToHex(reg[i], 2); end; Result := Prefix + Result; end; |
Veja um exemplo de uso:
1 2 3 4 | procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage( GetNewID('SD') ); end; |
no meu caso funcionou perfeitamente e acredito que o código seja compatível
com qualquer versão do Delphi ou Lazarus.
Referência: https://www.portugal-a-programar.pt/forums/topic/44358-criar-id-%C3%BAnico-delphi/
Caso tenha alguma dúvida ou sugestão deixe seu comentário.
Você precisa fazer o login para publicar um comentário.
eu utilizo dessa forma, acho que também serve
uses
System.DateUtils,…
function GenerateUniqueName(const pPrefix: string = ”): string;
var
LMilsSince: Int64;
begin
if pPrefix.Trim.IsEmpty then
Result := ‘xyz’
else
Result := pPrefix.Trim;
Sleep(1);
LMilsSince := MilliSecondsBetween(DateDelta, Now);
Result := Result + LMilsSince.ToString;
end;
Obrigado Ivan, vamos criar outra dica com sua sugestão.