Thema: Delphi NextGen und ANSI

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: NextGen und ANSI

  Alt 8. Mai 2015, 15:31
Beispiel an einer kurzen Methode:
Delphi-Quellcode:
procedure FETCP_CheckError(iErrorCode: Integer);
var
  Temp: array[0..255] of AnsiChar;
begin
  if iErrorCode < 0 then
    if FEUSB_GetErrorText(iErrorCode, @Temp[0]) < 0 then
      raise Exception.CreateFmt('FEUSB: unknown error code %d', [iErrorCode]) at ReturnAddress
    else
      raise Exception.CreateFmt('%s', [iErrorCode, string(Temp)]) at ReturnAddress;;
  end;
end;
Was Delphi früher mal alles automatisch machte, darf man jetzt selber machen.
  • Speicher reservieren
  • das Ende des PAnsiChar suchen
  • den String kopieren und nach Unicode umwandeln
Delphi-Quellcode:
procedure FEUSB_CheckError(iErrorCode: Integer);
var
  Temp: TBytes;
  Len: Integer;
begin
  if iErrorCode < 0 then begin
    SetLength(Temp, 256);
    if FEUSB_GetErrorText(iErrorCode, @Temp[0]) >= 0 then begin
      Len := 0;
      while (Len < 256) and (Temp[Len] <> 0) do
        Inc(Len)
      raise Exception.CreateFmt('%s', [iErrorCode, TEncoding.Default.GetString(Temp, 0, Len)]) at ReturnAddress; // Default heißt jetzt ANSI, was im Grunde auch besser ist, aber XE kennt es noch nicht
    end else
      raise Exception.CreateFmt('FEUSB: unknown error code %d', [iErrorCode]) at ReturnAddress;
  end;
end;
Gut, es ginge bestimmt auch so, aber wer weiß, ob sich TEncoding nicht an der #0 und den "ungültigen" Zeichen verschluckt.
Der statische Record geht auch nicht mehr, da die Pointer-Funktionen vom TEncoding im Strict-Protected versteckt sind und ich keine Lust hatte mir das erst freizuschalten, also alles immer schön in den langsamen Speichermanager, anstatt mal eben schnell auf den Stack.
Delphi-Quellcode:
procedure FEUSB_CheckError(iErrorCode: Integer);
var
  Temp: TBytes;
begin
  if iErrorCode < 0 then begin
    SetLength(Temp, 256);
    if FEUSB_GetErrorText(iErrorCode, @Temp[0]) >= 0 then
      raise Exception.CreateFmt('%s', [iErrorCode, PChar(TEncoding.Default.GetString(Temp))]) at ReturnAddress;
    else
      raise Exception.CreateFmt('FEUSB: unknown error code %d', [iErrorCode]) at ReturnAddress;
  end;
end;
Ich dachte mal, es würde mit der Zeit leichter werden, da die RTL Einem immer mehr Arbeit abnimmt.

Oder hab ich was übersehn?
$2B or not $2B

Geändert von himitsu ( 8. Mai 2015 um 15:43 Uhr)
  Mit Zitat antworten Zitat