Analizando una
unidad de los propios componentes que citaste, podemos formarnos algúnas ideas a implementar;
1. Ataquemos a la clase TFileStream, la cual sobrecargada tiene un método útil de la clase padre (THandleStream), de creación que permite inicializar por manejador "
FHandle"
Código Delphi
[-]procedure TForm1.Button1Click(Sender: TObject);
var FindData: TWin32FindDataW; Stream: TFileStream;
begin
Windows.FindClose(FindFirstFileW('*.jpg', FindData)); Stream := TFileStream.Create(CreateFileW(@FindData.cFileName, GENERIC_READ, FILE_SHARE_READ + FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0));
...
Donde la API CreateFile
W es la encargada de archivo en modo UNICODE dado el nombre brindado en este caso por FindFirstFile
W.
2. Podríamos hasta realizar nuestra propia clase sobrecargando el método;
Código Delphi
[-]uses RTLConsts;
type
TFileStreamW = class(TFileStream)
constructor Create(const lpFileName: PWideChar); overload;
end;
constructor TFileStreamW.Create(const lpFileName: PWideChar);
begin
inherited Create(CreateFileW(lpFileName, GENERIC_READ, FILE_SHARE_READ + FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0));
if FHandle < 0 then
raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(lpFileName), SysErrorMessage(GetLastError)]);
end;
Utilizándola de igual forma;
Código Delphi
[-]procedure TForm1.Button1Click(Sender: TObject);
var FindData: TWin32FindDataW; Stream: TFileStreamW;
begin
Windows.FindClose(FindFirstFileW('*.jpg', FindData));
Stream := TFileStreamW.Create(@FindData.cFileName);
...
Hasta podemos idearnos una
3ra forma más sencilla sin conocimientos de POO;
Código Delphi
[-]procedure TForm1.Button1Click(Sender: TObject);
var
FindData: TWin32FindDataW;
FileName: array [0..MAX_PATH-1] of WideChar;
Stream: TFileStream;
begin
Windows.FindClose(FindFirstFileW('*.jpg', FindData));
GetShortPathNameW(@FindData.cFileName, @FileName, SizeOf(FileName));
Stream := TFileStream.Create(string(WideString(@FileName)), fmOpenRead);
...
Donde la API GetShortPathName
W está obteniendo el antigüo nombre 8.3 accesible por la VCL.
Nota; Para obtener el nombre del archivo
con la intervencion del usuario, en lugar de usar la API FindFirstFile
W, debemos utilizar la API GetOpenFileName
W abstraída de
TOpenDialog con su apropiada estructura TOpenFilename
W.
Como verás depende netamente de la habilidad del programador, no así de la version del IDE
Saludos