Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2011, 22:52   #21
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Цитата:
Сообщение от ArtGrek Посмотреть сообщение
попалось в процессе поисков,думаю ето по вашеи теме
Многоязычный интерфейс приложений в Delphi
http://www.codenet.ru/progr/delphi/stat/multilang.php
Видел это тоже, но не особо нравится мне такой способ - обходить все контролы на всех формах...та у меня программа скорее загнется пока все формы обойдет...

Неужели все же нельзя делать подмену этих resourcestring - ведь языковые движки как-то подменяют...
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 21.02.2011 в 22:55.
spamer вне форума Ответить с цитированием
Старый 21.02.2011, 23:03   #22
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

а зачем все?

Просто есть класс TComponent.Tcontrol.Text Для всех компонентов имеющих EDIT
TComponent.Tcontrol.Hint для хинтов всех компонентов

Перебери все компоненты по этим свойствам.

Зачем же перебор по классам компонент, когда у всех есть родитель по крайней мере Tcontrol .
Человек_Борща вне форума Ответить с цитированием
Старый 21.02.2011, 23:07   #23
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Ну это ясно, но ведь все равно необходимо делать перебор...а хотелось бы этаким одним махом что-ли...
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 21.02.2011, 23:10   #24
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

вас что смушает, то что будет долго происходить процесс замены цаптионов?

вы их по 1 загружаете или скачиваете разом весь фаил в строковыи массив,
а потом из него разбираете что куда, что б не обрашаца каждыи раз к фаилу?
VirusN13

Последний раз редактировалось ArtGrek; 21.02.2011 в 23:13.
ArtGrek вне форума Ответить с цитированием
Старый 21.02.2011, 23:19   #25
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от spamer Посмотреть сообщение
veniside, а у вас данный код работает? Ибо я не смог добиться нужного результата. А в дебаге если смотреть, то видно, что r.Module^ не меняется...
Да, работает. Проверьте, что ДЛЛ в том же каталоге лежит, где и ехе.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 21.02.2011, 23:44   #26
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

ArtGrek, файл читается один раз...

Цитата:
Да, работает. Проверьте, что ДЛЛ в том же каталоге лежит, где и ехе.
Интересно, а какая тогда у вас Delphi?
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 21.02.2011, 23:56   #27
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Писал в 2010, только что проверил в Д7, все ок. А чё там не работать, я ж ничего не делаю, просто заменяю в PResStringRec, который привязан к каждой resoursestring, значения Module на хендл только что загруженной ДЛЛ. Проверьте, LoadLibrary() точно не 0 возвращает?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 22.02.2011, 00:30   #28
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Мистика какая-то...пишу также в Д2010.
На данный момент вот такой код (длл и программа):
dll
Код:
library lang;

uses
  SysUtils,
  Classes;

{$R *.res}

resourcestring
  a = 'Foo.ENG';
  b = 'Bar.ENG';

var
  s: string;
begin
  {$O-}
  s := a + b;
end.
program
Код:
...

var
  Form1: TForm1;
  g_m: hModule;

implementation

{$R *.dfm}

resourcestring
  a = 'Foo.Neutral';
  b = 'Bar.Neutral';

procedure patchStrings(const module: string; strings: array of pointer);
var
  i: integer;
  r: PResStringRec;
begin
  g_m := LoadLibrary(PChar(module));
  for i := low(strings) to high(strings) do
  begin
    r := PResStringRec(strings[i]);
    r.Module^ := g_m;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  patchStrings('lang.dll', [@a, @b]);
  s := a + ', ' + b;	
  Form1.Caption := s;
end;
Вроде бы все уже аналогично сделал. Но s как была пустой, так и осталась.
Если не затруднит, можете выложить свой проект...
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 22.02.2011, 00:37   #29
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

А, не, так никакой мистики. У меня же чистый проект, без VCL.
Я там написал в начальном сообщении, что VCL переколбасит все номера строк. Т.е. в ДЛЛ нужно подключать Forms, Controls и так далее, и не факт, что поможет. В общем с этим пока затык. Если бы можно было в resourcestring сказать, какой номер присвоить начальной строке.. Сижу, думаю, как это обойти.

ЗЫ. Придумал ) Щас отпишу.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 22.02.2011 в 00:39.
veniside вне форума Ответить с цитированием
Старый 22.02.2011, 00:51   #30
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

В общем, ДЛЛ остаётся такой же, как и была. Ниче юзать там не надо, даже наоборот, если что-то заюзать, типа Forms, будет беда.

Дополнительно создаём модуль, в который выносим все наши строки, и заодно процедуру patchStrings().

Код:
unit
  strRes;

interface

resourcestring
  a = 'Foo.Neutral';
  b = 'Bar.Neutral';

// --  --
procedure patchStrings(const module: string; strings: array of pointer);

implementation

uses
  Windows;

var
  g_m: hModule;

procedure patchStrings(const module: string; strings: array of pointer);
var
  i: integer;
  r: PResStringRec;
begin
  g_m := LoadLibrary(PChar(module));
  for i := low(strings) to high(strings) do
  begin
    r := PResStringRec(strings[i]);
    r.Module^ := g_m;
  end;
end;

end.
Теперь, самое важное. В исходник проекта подключаем этот модуль со строками самым первым.

Код:
program Project2;

uses
  strRes,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Все, теперь можно в любое время переключиться на другой язык, загрузив строки из требуемой ДЛЛ и вызвав patchStrings().

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

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

var
  Form1: TForm1;

implementation

uses
  strRes;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  patchStrings('str.ENG.dll', [@a, @b]);
  //
  Caption := a + ', ' + b;
end;

end.
В принципе, особого преимущества перед ini файлами, например, я не вижу, зато прикольно )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание TImage в Run-time mrbadge Помощь студентам 9 03.02.2011 22:48
Run-time error 13 olimpus Microsoft Office Excel 11 25.12.2010 22:49
Создание компонентов Run Time Serebah Общие вопросы Delphi 13 08.12.2010 22:02
Заполнение cxLookupComboBox в run time fake2 БД в Delphi 0 17.05.2010 08:31
ActionManager - работа в run - time chingiz Компоненты Delphi 0 10.10.2009 08:48