Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Sistemas operativos > Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-04-2008
Avatar de matabyte
matabyte matabyte is offline
Miembro
 
Registrado: ene 2008
Ubicación: Kyoto, Japon
Posts: 177
Poder: 17
matabyte Va por buen camino
Exclamation Abrir archivos con nombres de archivos de otra codificación.

Bueno, lo pongo aquí porque creo que afecta a Windows.

Uso Windows XP y Delphi 2007.

El caso es que cuando intento abrir un archivo usando un TStream o un TOpenDialog, y el nombre del archivo está en otra codificación de la de Windows (Por ejemplo, un nombre de archivo en Japonés con Windows en Español o a la inversa), Delphi me tira el programa diciendo que el archivo no es válido.

Se que aún Dephi no es Unicode completamente (aunque se pueden usar las WideStrings). No se si es problema del propio delphi o de los componentes.

He intentado usar el OpenDialog del "TNT Unicode Controls" y funciona correctamente, pero el TFileStream de Delphi tiene la propiedad "FileName" igual a string, con lo que no puede usar el archivo unicode.

¿Sabéis algún sistema para manejar esos archivos con Delphi, a poder ser con un TStream? ¿o hay que esperar a la versión 2008?

Gracias ^_^
Responder Con Cita
  #2  
Antiguo 30-04-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
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)); // solo para obtener el nombre del primer archivo JPEG, esperando tenga su nombre en UNICODE
 Stream := TFileStream.Create(CreateFileW(@FindData.cFileName, GENERIC_READ, FILE_SHARE_READ + FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0));
 
 ...
Donde la API CreateFileW es la encargada de archivo en modo UNICODE dado el nombre brindado en este caso por FindFirstFileW.

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 GetShortPathNameW 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 FindFirstFileW, debemos utilizar la API GetOpenFileNameW abstraída de TOpenDialog con su apropiada estructura TOpenFilenameW.

Como verás depende netamente de la habilidad del programador, no así de la version del IDE

Saludos

Última edición por cHackAll fecha: 30-04-2008 a las 18:32:06. Razón: some issues
Responder Con Cita
  #3  
Antiguo 01-05-2008
Avatar de matabyte
matabyte matabyte is offline
Miembro
 
Registrado: ene 2008
Ubicación: Kyoto, Japon
Posts: 177
Poder: 17
matabyte Va por buen camino
Muchas gracias por la explicación. Como era Delphi el que tenía el objeto del TFileStream no había pensado en crear una subclase para eso! Muy buena idea, me has solucionado mucho ^_^
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
abrir archivos cfg consultasmq Varios 2 21-02-2008 20:10:02
Extensión en nombres de archivos de fuente Ñuño Martínez Varios 6 05-07-2007 15:45:56
Problemas con los nombres de los archivos Alcolea Varios 4 15-02-2007 16:49:05
como obtener los nombres de archivos de un directorio ilichhernandez Varios 3 14-07-2006 18:49:57
Abrir archivos pdf luxus OOP 1 23-10-2005 00:37:24


La franja horaria es GMT +2. Ahora son las 14:35:37.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi