Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 135
от 28.05.2005, 13:20

Администратор:Калашников О.А.
В номере:Вопросов: 3, Ответов: 15


Вопрос № 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Отписаться
Вспомнить пароль

В избранное