Вопрос № 21184: 1. Как дать ответ на вопрос.
2. Ответ на вопрос №20956, возможно, необходимо изменить названия компонентов RAVE в програме (не должны названия повторяться в каждой!!! програме, только оригинальные).
С уважением, Wolfstar....Вопрос № 21194: Мир вам, уважаемые эксперты.
Делаю в программе мультиязычный интерфейс, особо мудрить не стал, подгружаю из инишки:
Form1.L_L_n.Caption:=ini.ReadString('label','L_L_n','');
и так для каждого объекта на форме.
Но как-то это не универса...Вопрос № 21220: Доброе время суток! Подскажите: в свойстве DatabaseName, например для Table, выпадает список алиасов баз, прописанных в BDE. Надо такой же список на форму. Также и с TableName. Заранее благодарю....
Вопрос № 21184
1. Как дать ответ на вопрос.
2. Ответ на вопрос №20956, возможно, необходимо изменить названия компонентов RAVE в програме (не должны названия повторяться в каждой!!! програме, только оригинальные).
С уважением, Wolfstar.
Отправлен: 22.05.2005, 15:58
Вопрос задал: Володимир (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: Jadd
Здравствуйте, Володимир!
Чтобы отвечать здесь на вопросы, нужно зарегистрироваться как эксперт.
Ответ отправил: Jadd (статус: 4-ый класс)
Отправлен: 23.05.2005, 09:05 Оценка за ответ: 4 Комментарий оценки: Thanks! Where is a registration of expert?
Отвечает: sir henry
Здравствуйте, Володимир!
Первое - это был вопрос или утверждение? :)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 23.05.2005, 09:07
Отвечает: VBA
Здравствуйте, Володимир!
Подпишись на рассылку как эксперт.
Ответ отправил: VBA (статус: 3-ий класс)
Отправлен: 23.05.2005, 13:46
Вопрос № 21194
Мир вам, уважаемые эксперты.
Делаю в программе мультиязычный интерфейс, особо мудрить не стал, подгружаю из инишки:
Form1.L_L_n.Caption:=ini.ReadString('label','L_L_n','');
и так для каждого объекта на форме.
Но как-то это не универсально... Может подскажете, как это можно сделать по-правильному, что б потом не трогать код, а только добавлять строку в файл. Наверняка можно, задача-то типовая.
Отправлен: 22.05.2005, 19:24
Вопрос задал: Лука (статус: Посетитель)
Всего ответов отправлено: 6
Отвечает: Master89
Здравствуйте, Лука!
Лучше использовать компоненты, специально предназначенные для внедрения мультиязоквой поддержки в программы. Один из неплохих таких компонент есть в пакете Globus.Lib (http://cpr.biblio-globus.ru/). Если всё-таки решено делать функцию самостоятельно, предлагаю перебирать все нужные компоненты через FindComponent(). Например, если на форме 5 TLabel, то их загрузку можно прописать так:
For I:=1 To 5 Do
TLabel(FindComponent('Label'+IntToStr(I))).Caption:=INI.ReadString('Labels','Label'+IntToStr(I),'');
Если на форме много разных компонентов, класса не TLabel (а это уж наверняка - на текстовых метках программу не построишь), то вместо определённого класса (TLabel) можно использовать классы TControl и TWinControl. Здесь можно будет также обращаться к Caption. Ну а если компоненты не пронумерованы, то можно в массив записать все их имена (Name) и по очереди читать. Также можно обращаться к разным свойствам разных классов компонент. Например, на форме есть 3 TLabel с именами: LName, LSurname, LEmail и 3 TEdit:
UName, USurname, UEmail. Требуется перевести Caption этих TLabel'ов и Text у TEdit'ов. Объявим массив:
const CNames: Array[1..6] of string = ('LName','LSurname','LEmail','UName','USurname','UEmail');
Здесь мы храним имена компонентов.
Далее объявляем типы всех этих компонентов (например, условимся, что TLabel - это 0, а TEdit - это 1):
const CTypes: Array[1..6] of integer = (0,0,0,1,1,1);
А вот и загрузка:
For I:=1 To 6 Do
If CTypes[I]=0 Then TLabel(FindComponent(CNames[I])).Caption:=INI.ReadString('Labels',CNames[I],'')
Else TEdit(FindComponent(CNames[I])).Text:=INI.ReadString('Edits',CNames[I],'');
Файл INI будет иметь вид:
[Labels]
LName=Имя:
LSurname=Фамилия:
LEmail=Электронная почта:
[Edits]
UName=Введите своё имя
USurname=Введите свою фамилию
UEmail=Введите свой e-mail
И всё-таки, повторюсь, используйте готовые компоненты для этих целей. Например, тот компонент из Globus.Lib просто читает файл, который ему укажут и заменяет во всём модуле текущей формы найденные строки на их замены, например, по предыдущему примеру файл языка должен быть следующим:
LName=Имя:
LSurname=Фамилия:
LEmail=Электронная почта:
UName=Введите своё имя
USurname=Введите свою фамилию
UEmail=Введите свой e-mail
При этом все компоненты должны иметь в Caption/Text то, что находится перед знаком "=" в файле языкового модуля.
Надеюсь, вся технология понятна.
Ответ отправил: Master89 (статус: 3-ий класс)
Отправлен: 22.05.2005, 22:08
Отвечает: CJ
Здравствуйте, Лука!
Да нет, вполне разумное решение. Я делаю так же. Это простой и без примудростей способ. :)
Ответ отправил: CJ (статус: Студент)
Отправлен: 22.05.2005, 23:23
Отвечает: Jadd
Здравствуйте, Лука!
Конечно типовая. Способ нумбер уан. Качаем компоненты, работающие с локализацией и делаем MUI на свой манер. Способ нумбер ту. Открываем хелп по дельфям и ищем раздел про библиотеки ресурсов (Resource library). Там все детально описано, а главное профессионально получится.
Ответ отправил: Jadd (статус: 4-ый класс)
Отправлен: 23.05.2005, 09:09
Отвечает: streetcat
Здравствуйте, Лука!
В Delphi имеются специальные средства для создания мультиязычных приложений.
Для этих целей используй Translation Manager из дистрибутива Delphi.
В окне выбора создаваемого обьекта выбери Resource DLL wizard
о том как с ними работать читай в хелпе на страницах:
About the Resource DLL wizard или
Creating international applications
(P.S. английский хорошо знаем? ;))
Ответ отправил: streetcat (статус: 3-ий класс)
Отправлен: 23.05.2005, 15:32
Отвечает: And1
Здравствуйте, Лука!
Ваш вопрос хорошо расписан в журнале Хакер спец (№04 (53) апрель 2005), через некоторое время после выхода его выложат на сайт (www.xakep.ru) обязательно почитайте... Самое удобное хранить переводы в текстовах файлах (т.е. Ini), т.к. очень высокая редактируемость языка и возможность менять надписи без перекомпиляции программы, но есть один минус: если необходимо хранить вместе с переводом графику, звук и т.п., то Ini здесь не спасёт (хотя, можно просто в отдельную папку "накидать" картинок/звуков
и потом от туда грузить программой, но это "некрасиво"). для того, чтобы иметь возможность вместе с переводом хранить и графику/звук, то лучшим способом является dll (динамически библиотеки). Так же есть 3-й способ "вшить" в е языки в саму программу, например создать массив строк с переводом, но это неудобно. ИМХО, самое лучшее хранить перевод в Ini-файле, можно создать отдельную процедуру для смены языка и всё будет замечательно, кстати ini-шки лучше пе
реименовать в .lng, так будет "правильнее". Выбор за Вами... :)
Удачи!
Ответ отправил: And1 (статус: 2-ой класс)
Отправлен: 24.05.2005, 08:18
Отвечает: Pushkin
Здравствуйте, Лука!
Читайте СпецХакер апрельский номер если купить негде, то скоро появится электронная версия на http://wisesoft.ru/
Ответ отправил: Pushkin (статус: 2-ой класс)
Отправлен: 24.05.2005, 09:28
Вопрос № 21220
Доброе время суток! Подскажите: в свойстве DatabaseName, например для Table, выпадает список алиасов баз, прописанных в BDE. Надо такой же список на форму. Также и с TableName. Заранее благодарю.
Отправлен: 23.05.2005, 12:18
Вопрос задала: fati (статус: Посетитель)
Всего ответов отправлено: 6
Отвечает: Jadd
Здравствуйте, fati!
Не понятно что требуется. Нужно вывести такой же список в какой-нить listbox на форме? Проще пареной репы.
Вот пример:
procedure FillAliasList;
var
session: TSession;
List: TStringList;
begin
List = TStringList.Create;
session.Open;
Session.GetAliasNames(List);
{ fill a list box with alias names for the user to select from }
for I := 0 to List.Count - 1 do
ListBox1.Items.Add(List[I]);
session.Close;
end;
Вот, собственно, и все. Можно, конечно, через БДЕшные функции, но это сложнее (правда не на много). Читайте хелп внимательно. А еще пользу принесет "рытье" в исходниках компонент (например ctrl+левая кнопка мыши на имени класса покажет исходник класса). Удачи.
Ответ отправил: Jadd (статус: 4-ый класс)
Отправлен: 23.05.2005, 12:53 Оценка за ответ: 4
Отвечает: sir henry
Здравствуйте, fati!
Прямо на форму? Некрасиво будет. Лучше для этого использовать компоненет ListBox.
Получить список алиасов можно так:
(См пример 1 в приложении)
Список таблиц для полученного алиаса - см пример 2 в приложении.
Приложение:
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 23.05.2005, 13:14 Оценка за ответ: 5
Отвечает: uzertt
Здравствуйте, fati!
Кидаем на форму TButton, TComboBox, TListBox и Tsession из вкладки DataAccess
1-я часть вопроса
//Список алиасов
procedure TForm1.Button1Click(Sender: TObject);
begin
Session1.GetDatabaseNames(ComboBox1.Items);
end;
//Свойства выбранного алиаса
procedure TForm1.ComboBox1Change(Sender: TObject);
var
s: string;
begin
with ComboBox1 do
begin
if ItemIndex = -1 then Exit;
s := Items[ItemIndex];
end;
Session.GetAliasParams(s, ListBox1.Items);
end;
2-я часть вопроса
procedure TForm1.ComboBox1Change(Sender: TObject);
var
s: string;
begin
ListBox1.Items.Clear;
with ComboBox1 do
begin
if ItemIndex = -1 then Exit;
s := Items[ItemIndex];
end;
Session.GetTableNames(s, '*.*', False, False, ListBox1.Items);
end;
Ответ отправил: uzertt (статус: 1-ый класс)
Отправлен: 23.05.2005, 14:33
Отвечает: streetcat
Здравствуйте, fati!
Легко:
все функции есть в компоненте BDE TSession
чтобы получить список алиасов: (помещает в List)
TSession.GetAliasNames(List: TStrings); { в качестве параметра например свойство Items компонента TListBox }
список таблиц в базе:
TSession.GetTableNames(const DatabaseName, Pattern: String; Extensions, SystemTables: Boolean; List: TStrings); { 1-й имя БД, 2: разделитель (можно оставить пустым),
3: Флаг - показывать ли расширения файлов таблиц, 4: Показывать ли системные таблицы
5: опять же куда выводить }
В ентом компоненте есть еще множество функций для управления БД с помощью BDE
удачи ;)
Ответ отправил: streetcat (статус: 3-ий класс)
Отправлен: 23.05.2005, 15:32
Отвечает: Pushkin
Здравствуйте, fati!
Надо смотреть файл %ProgramFileDir%Common FilesBorland SharedBDEidapi32.cfg. там все альясы находятся,
Чтобы посмотреть все имена таблиц нужно брать путь из файла idapi32.cfg и смотреть все файлы *.db, *.dbf по этому пути (FindFirst, FindNext)
Ответ отправил: Pushkin (статус: 2-ой класс)
Отправлен: 24.05.2005, 09:29
Отвечает: Ballon
Здравствуйте, fati!
Чтобы вытащить все алиасы используй: Session.GetAliasNames(ComboBox1.Items);
Чтобы вытащить все таблицы используй: Session.GetTableNames(ComboBox1.Text,'*.*',false,false,ComboBox2.Items);
Например:
procedure TForm1.FormCreate(Sender: TObject);
begin
Session.GetAliasNames(ComboBox1.Items);
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
Session.GetTableNames(ComboBox1.Text,'*.*',false,false,ComboBox2.Items);
end;
Ответ отправил: Ballon (статус: 2-ой класс)
Отправлен: 24.05.2005, 10:14