Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-05-2018
Avatar de geolife
[geolife] geolife is offline
Miembro Premium
 
Registrado: nov 2006
Ubicación: Barcelona
Posts: 87
Poder: 18
geolife Va por buen camino
ResourceString y punteros

Hola amig@s,

Estoy intentando trabajar con Gnugettext y en un programa original hay multitud constantes de array que necesitan ser traducidas;

Como las constantes no se inicializan en tiempo de ejecución en los cambios de idiomas he apuntado las mismas en forma de punteros a un ResourceString; pero delphi aunque deja ejecutar la acción no presenta ningún dato al llamar al array y al cerrar provoca una excepción;

Este sencillo código de ejemplo, funciona correctamente en Lazarus, con lo que no se si hay algo en Delphi que requiera alguna directiva especial u otro cambio en el código que desconozco.


Adjunto el código:

Código Delphi [-]
unit U_Translate;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Resourcestring

  RSEstaciones1 = 'Primavera';
  RSEstaciones2 = 'Verano';
  RSEstaciones3 = 'Otoño';
  RSEstaciones4 = 'Invierno';

Const
 CEstacion: Array [1..4] of ^String = (@RSEstaciones1,@RSEstaciones2,@RSEstaciones3,@RSEstaciones4);

var
  Form1: TForm1;


implementation


{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 ShowMessage (CEstacion[1]^);
end;

end.

Última edición por geolife fecha: 27-05-2018 a las 19:51:52.
Responder Con Cita
  #2  
Antiguo 28-05-2018
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
En mi blog tienes un par de artículos con ejemplos sobre el proceso completo con GNUGettext con Delphi.
Revísalos a ver si te son de ayuda.
Pruébalo también sobre un proyecto pequeño y luego sobre el que tú tienes a ver si eso te da pistas.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 28-05-2018
Avatar de geolife
[geolife] geolife is offline
Miembro Premium
 
Registrado: nov 2006
Ubicación: Barcelona
Posts: 87
Poder: 18
geolife Va por buen camino
Hola Neftali!

Gracias por contestar; precisamente ha sido a través de los ejemplos que nos facilitas en tu Blog como me pude iniciar en el uso de esta librería para tener una aplicación multi-idioma, y todo funciona bastante bien en general.

El único problema es que en tiempo de ejecución no es capaz de actualizar un array de constantes adheridos a un Resourcestring como el ejemplo (solo lo hace si reiniciamos la aplicación por completo).

Entonces para solventar esta cuestión está el truco de enlazar las constantes del array directamente con las posiciones de memoria (de los resourcestring) usando punteros, lo cual funciona bien en Lazurus, pero no lo hace en Delphi. El código de ejemplo compila correctamente pero el showmessage se muestra en blanco...y al cerrar provoca una expepción!




Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
En mi blog tienes un par de artículos con ejemplos sobre el proceso completo con GNUGettext con Delphi.
Revísalos a ver si te son de ayuda.
Pruébalo también sobre un proyecto pequeño y luego sobre el que tú tienes a ver si eso te da pistas.

Última edición por geolife fecha: 28-05-2018 a las 11:13:55.
Responder Con Cita
  #4  
Antiguo 28-05-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.020
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Seguramente es porque, precisamente, son constantes y no se les puede cambiar su valor.
¿Has probado si funciona igual si no son const?
Responder Con Cita
  #5  
Antiguo 28-05-2018
Avatar de geolife
[geolife] geolife is offline
Miembro Premium
 
Registrado: nov 2006
Ubicación: Barcelona
Posts: 87
Poder: 18
geolife Va por buen camino
Hola Casimiro!

Si, acabo de probar usando un Var en vez de Const; y tenemos el mismo resultado. Adjunto el ejemplo simplificado con puntero y sin el, en el primer caso Showmessage funciona bien, en el segundo caso no lo hace...

Código Delphi [-]
unit U_Translate;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
  end;

  Resourcestring
  RS1 = 'Primavera';  RS2 = 'Verano'; RS3 = 'Otoño'; RS4 = 'Invierno';

var
  Form1: TForm1;
  CEstacion: Array [1..4] of String = (RS1,RS2,RS3,RS4); // Normal
  PCEstacion: Array [1..4] of ^String = (@RS1,@RS2,@RS3,@RS4);  // Puntero

implementation {$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 ShowMessage (CEstacion[1]);
 ShowMessage (PCEstacion[1]^);
end;

end.

Cita:
Empezado por Casimiro Notevi Ver Mensaje
Seguramente es porque, precisamente, son constantes y no se les puede cambiar su valor.
¿Has probado si funciona igual si no son const?
Responder Con Cita
  #6  
Antiguo 28-05-2018
Avatar de geolife
[geolife] geolife is offline
Miembro Premium
 
Registrado: nov 2006
Ubicación: Barcelona
Posts: 87
Poder: 18
geolife Va por buen camino
@Neftali [Germán.Estévez] ; @Casimiro Notevi

Gracias por vuestra ayuda, finalmente al plantear también la cuestión en stackoverflow hay un camino que sugiere Stefan Glienke y lo dejo aquí compartido, por si cualquiera se encuentra ante el mismo problema.

https://stackoverflow.com/questions/...resourcestring

Básicamente se trata de lo siguiente:

Código Delphi [-]
Resourcestring
 RS1 = 'Primavera'; RS2 = 'Verano'; RS3 = 'Otoño'; RS4 = 'Invierno';
const
  CEstacion: array [1..4] of PResStringRec = (@RS1,@RS2,@RS3,@RS4); 
procedure show;
begin
ShowMessage(LoadResString(CEstacion[1]));
end;

Última edición por geolife fecha: 28-05-2018 a las 17:28:57.
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
punteros pepe_baile C++ Builder 4 24-07-2016 12:19:57
Punteros kotai Varios 1 09-08-2010 17:26:34
uso de punteros David OOP 19 14-12-2009 10:48:37
C++ y los punteros marcoszorrilla La Taberna 3 02-06-2008 19:31:11
Punteros davitcito Varios 2 25-04-2005 23:46:24


La franja horaria es GMT +2. Ahora son las 10:52:41.


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