Olá
galera, nesta Quick Tips, irei continuar falando de resourcestring.
Meu
propósito final para esta Quick, não seria mostrar como funciona um resourcestring,
mas sim como podemos interagir com as mensagens que temos no Delphi, quando
fazemos um sistema em português, e colocamos um MessageDlg, fica sempre os
botões Yes / No, e o título Warning ou Error, dependendo do tipo de mensagem,
mas o que quero é traduzir estas mensagens. Já vimos por ai que muitos programadores
já traduziram as mensagens através do .pas, de cada unit, porém ao mudarmos uma
versão do Delphi por exemplo, estes .pas, podem ter sofrido alteração da
Embarcadero, e daí não veremos estas por estar utilizando versão antiga do
.pas. Sendo assim tive esta idéia para traduzir, porém eu não vou traduzir
todas as mensagens, vou mostrar como traduz e ao surgir a necessidade de uma
nova tradução fica a critério de vocês a tradução. É a historia de não dar o
peixe, mas sim ensinar a pescar. Então
vamos ao final.
Vamos
criar uma nova unit e salvar com o nome uTraducao.pas, e nela incluiremos
dois métodos como mostra abaixo, e suas implementações
unit uTraducao;
interface
uses
Windows, consts;
Type
TTraducao = Class
public
procedure SetResourceString(xOldResourceString:
PResStringRec;
xValueChanged: PChar);
procedure ChangeValues;
End;
Implementation
{Método utilizado para podermos fazer a conversão em tempo
de execução das mensagens do Delphi}
procedure TTraducao.SetResourceString(xOldResourceString:
PResStringRec;
xValueChanged: PChar);
var
POldProtect: DWORD;
begin
VirtualProtect(xOldResourceString,
SizeOf(xOldResourceString^),
PAGE_EXECUTE_READWRITE,
@POldProtect);
xOldResourceString^.Identifier
:= Integer(xValueChanged);
VirtualProtect(xOldResourceString,
SizeOf(xOldResourceString^), POldProtect,
@POldProtect);
end;
{Método utilizado para podemos efetuar a mudança das
mensagens}
procedure TTraducao.ChangeValues;
begin
SetResourceString(@SMsgDlgYes, 'Sim');
SetResourceString(@SMsgDlgWarning,'Atenção');
SetResourceString(@SMsgDlgError, 'Erro');
SetResourceString(@SMsgDlgInformation,'Information');
SetResourceString(@SMsgDlgConfirm , 'Confirm');
SetResourceString(@SMsgDlgYes
, '&Sim');
SetResourceString(@SMsgDlgNo
, '&Não');
SetResourceString(@SMsgDlgOK
, 'OK');
SetResourceString(@SMsgDlgCancel
, 'Cancelar');
SetResourceString(@SMsgDlgHelp
, '&Ajuda');
SetResourceString(@SMsgDlgHelpHelp
, 'Ajuda');
SetResourceString(@SMsgDlgAbort
, '&Abortar');
SetResourceString(@SMsgDlgRetry
, '&Repetir');
SetResourceString(@SMsgDlgIgnore
, '&Ignorar');
SetResourceString(@SMsgDlgAll
, '&Tudo');
SetResourceString(@SMsgDlgNoToAll
, 'N&ao para Tudo');
SetResourceString(@SMsgDlgYesToAll
, 'Sim para &Tudo');
SetResourceString(@SMsgDlgClose
, '&Fechar');
end;
End.
Deste
ponto em diante vamos agora testar as mensagens traduzidas, veja que todas as
mensagens do método changeValue ao ser executado, será traduzido as suas resourcestrings
contidas nele.
Vamos
então testar este método.
Em
um formulário, vamos dar uses em uTraducoes.
implementation
uses uTraducao;
{$R *.dfm}
procedure TForm2.Button1Click(Sender:
TObject);
Var
Traducao : TTraducao;
begin
Traducao := TTraducao.Create;
Traducao.ChangeValues;
MessageDlg('Minha Mensagem',mtWarning,mbYesNo,0);
end;
Veja
o resultado ao executar o programa

Fico
por aqui ate à próxima Quick Tips.
Um
abraço
Wesley
Y
wyamazack@rwsolution.com.br