// Getestet mit D4 unter WinME

// Um Interger-Werte in hexadezimale Form zu bringen, nutzt man in
// der Regel die Funktion
IntToHex(). Diese läßt sich leicht nachbilden:

function AuchInToHex(Zahl: Int64; MindestStellen: Integer): string;  
begin  
  result := Format('%.*x', [MindestStellen, Zahl]);  
end;

// Beide Funktionen liefern Ziffern und Großbuchstaben in einem String zurück
// (was meist auch gewollt ist).
// Man kann aber auch durch eine andere Funktion Kleinbuchstaben erhalten:

function IntToHexKG(Zahl, MindestStellen: integer; Klein: Boolean): string;  
begin  
  setlength(result, 16);  
  if not (MindestStellen in [1..16]) then MindestStellen := 1;  
  setlength(result, wvsprintf(pchar(result), pchar('%.' +  
    inttostr(MindestStellen) + chr(88 + ord(klein) * 32)), pchar(@Zahl)));  
end; 

// Falls man eine alte Delphiversion hat (oder auch aus lauter Freude)
// kann man die Umwandlung auch "zu Fuß" programmieren:

function ToHex(Zahl: Int64; MindestStellen: integer): string;  
const  
  Chars: array[0..15] of char = '0123456789ABCDEF';  
var  
  x: integer;  
  p: ^byte;  
begin  
  p := @Zahl;  
  result := '';  
  for x := 1 to sizeof(Int64) do begin  
    result := Chars[p^ shr 4] + Chars[p^ and 15] + result;  
    inc(p);  
  end;  
  if not (MindestStellen in [1..16]) then MindestStellen := 1;  
  for x := 1 to length(result) - MindestStellen do  
    if result[x] <> '0' then begin  
      result := copy(result, x, 16);  
      exit;  
    end;  
  result := copy(result, length(result) - MindestStellen + 1, 16);  
end; 
// Braucht man keine "Mindeststellen", kann man so etwas machen:
function Hex(zahl: DWord): string; 
var i: DWord; 
begin 
  result := ''; 
  repeat 
    i := zahl mod 16; 
    zahl := zahl div 16; 
    case i of 
      0..9: result := chr(i + ord('0')) + result; 
      10..15: result := chr(i - 10 + ord('A')) + result; 
    end; 
  until zahl = 0; 
  if length(result) mod 2 <> 0 then result := '0' + result; 
end;

//--------------------------------------------------------------------

// Will man im umgekehrten Fall hexadezimale Darstellungen aus Strings
// in Integer-Werte wandeln, sollte man beachten, dass Hex-Werte oft
// durch zusätzliche Zeichen ('#','$','H','h') gekennzeichnet sind.

function HexToInt(const st: string; var i: integer): boolean;  
var s: string;  
begin  
  s := lowercase(st);  
  s := stringreplace(s, '$', '', [rfreplaceall]);  
  s := stringreplace(s, '#', '', [rfreplaceall]);  
  s := stringreplace(s, 'h', '', [rfreplaceall]);  
  try  
    i := strtoint('$' + s);  
  except  
    result := false;  
    exit;  
  end;  
  result := true;  
end;  


// Beispielaufruf  
procedure TForm1.Button3Click(Sender: TObject);  
var  
  i: integer;  
  s: string;  
begin  
  s := '#FF00CC';  
  if HexToInt(s, i) then  
    showmessage(inttostr(i)) // 16711884  
  else  
    showmessage('Es liegt keine Hexadezimalzahl vor');  
end;

// siehe auch: Dezimalzahlen in andere Zahlensysteme konvertieren


Zugriffe seit 6.9.2001 auf Delphi-Ecke