ich wollte ein "TFileStreamUTF8" erzeugen, dazu habe ich folgenden Code aus den Lazarus Sourcen kopiert und entsprechend abgeändert:
Code: Alles auswählen
Interface
Type
TFileStreamUTF8 = class(THandleStream)
Private
FFileName : String;
public
constructor Create(const AFileName: string; Mode: Word);
constructor Create(const AFileName: string; Mode: Word; Rights: Cardinal);
destructor Destroy; override;
property FileName : String Read FFilename;
end;
const // Baucht es sonst nicht kompilierbar:
AccessMode: array[0..2] of Cardinal = (
GENERIC_READ,
GENERIC_WRITE,
GENERIC_READ or GENERIC_WRITE);
ShareModes: array[0..4] of Integer = (
0,
0,
FILE_SHARE_READ,
FILE_SHARE_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE);
ResourceString
SFCreateError = 'Unable to create file "%s"';
SFOpenError = 'Unable to open file "%s"';
implementation
Function FileOpenUTF8 (Const FileName : string; Mode : Integer) : THandle;
begin
result := CreateFileW(PWideChar(UTF8Decode(FileName)), dword(AccessMode[Mode and 3]),
dword(ShareModes[(Mode and $F0) shr 4]), nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
end;
Function FileCreateUTF8 (Const FileName : String; ShareMode : Integer; Rights : Integer) : THandle;
begin
FileCreateUTF8 := CreateFileW(PWideChar(UTF8Decode(FileName)), GENERIC_READ or GENERIC_WRITE,
dword(ShareModes[(ShareMode and $F0) shr 4]), nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
end;
{****************************************************************************}
{* TFileStreamUTF8 *}
{****************************************************************************}
constructor TFileStreamUTF8.Create(const AFileName: string; Mode: Word);
begin
FFileName:=AFileName;
If (Mode and fmCreate) > 0 then
FHandle:=FileCreateUTF8(AFileName,Mode,438)
else
FHAndle:=FileOpenUTF8(AFileName,Mode);
If (THandle(FHandle)=feInvalidHandle) then
If Mode=fmcreate then
raise EFCreateError.createfmt(SFCreateError,[AFileName])
else
raise EFOpenError.Createfmt(SFOpenError,[AFilename]);
end;
constructor TFileStreamUTF8.Create(const AFileName: string; Mode: Word; Rights: Cardinal);
begin
FFileName:=AFileName;
If (Mode and fmCreate) > 0 then
FHandle:=FileCreateUTF8(AFileName,Mode,Rights)
else
FHAndle:=FileOpenUTF8(AFileName,Mode);
If (THandle(FHandle)=feInvalidHandle) then
If Mode=fmcreate then
raise EFCreateError.createfmt(SFCreateError,[AFileName])
else
raise EFOpenError.Createfmt(SFOpenError,[AFilename]);
end;
destructor TFileStreamUTF8.Destroy;
begin
FileClose(FHandle);
end;
Eigentlich ist das ganze so kopiert wie aus "TFileStream" aber in meiner Quelle erkennt der nicht die Variable "FHandle", die existiert nicht. In der abgeleiteten Klasse "THandleStream" ist die aber vorhanden und das ganze klappt schließlich auch mit "TFileStream".
Kann mir bitte jemand einen Tipp geben warum mein Code sich nicht kompilieren lässt
Vielen Dank im Voraus, Gruß Markus.