Страница 2 из 2

Добавлено: Пт мар 10, 2006 04:11
SCHMaster
Не буду ни с кем спорить, что лучше, а что хуже - у каждого свое IMHO, и каждый в чем-то прав. Выскажу только свои соображения по этому поводу...
В свое время (когда был полным бараном в программировании) каких только компонентов я не перепробовал :). Чуток "поумневши" начал их (компоненты) "ковырять"... И был поражен (не во всех случаях, но в большинстве) "корявости" их работы.
Ну и как настоящий СНГ-овский программер начал сам "изобретать велосипед".
Пришел к выводу, что гибче (и при разработке, и при использовании - юзер сам может добавлять-изменять свою локализацию) формат текстового файла. Вариантов несколько -
1.TStringList - загрузил раз и "тянешь" оттель.
2.TIniFile - практически то-же, что и первый вариант (см. исходники TIniFile).
Ну а как быть, если программа на API и добавление любого из вышеуказанных классов неоправдвнно "раздует" размер?
Тут 3-й вариант
GetPrivateProfileString - работает аж со свистом... Даже на "медленных" машинах.
А подразобравшись с PrivateProfileString я вообще отказался в своих программах от TIniFile. И не жалею - работает быстрее.

Еще один момент. В качестве ключа я использую не название или Caption по дефолту компонента, а его Tag. Очень удобно, т.к. этот-же Tag используется в качестве идентификатора команды. Т.е. не на каждую кнопку-меню-и т.д. по событию OnClick, а одно OnClick на группу и дальше через case выполнение команды. Таким образом можно идентифицировать и сообщения, и внутренние команды и т.д. и т.п.

З.Ы. Кому такой подход не нравится, просьба свое "Фа" в мой адрес оставить при себе :) и прочитать первые строки этого поста :).

Добавлено: Пт мар 10, 2006 19:38
Nik
SCHMaster
А подразобравшись с PrivateProfileString я вообще отказался в своих программах от TIniFile. И не жалею - работает быстрее.
Аналогично :) В свое время нашел этот способ в исходниках InnoSetup и приспособил под свои нужны. Очень удобно (и не только для локализации)...

Добавлено: Сб мар 11, 2006 03:28
SCHMaster
Nik
Совершенно верно, зачем в очередной раз изобретать велосипед (хотя не спорю, некоторые приимущества в TIniFile есть), когда можно с успехом пользоваться "колесами" самой системы.

Добавлено: Пн мар 13, 2006 10:29
Моторокер
это же всё в цикле делается

Ничево подобного!
Почему нет? Немного можно автоматизировать. Количество проверок будет cтолько же, сколько на форме будет компонентов разных типов. Можно также сделать цикл по формам.

Код: Выделить всё

  for i:= 0 to ComponentCount-1 do begin
    if Components[i] is TButton then
      (Components[i] as TButton).Caption:= ini.ReadString(Form1.Name, (Components[i] as TButton).Name, (Components[i] as TButton).Caption);
  end; 
ini файл

Код: Выделить всё

[Form1]
Button1=Текст 1
Button2=Текст 2
Button3=Текст 3
Как вариант для большей наглядности ini файла:

Код: Выделить всё

  for i:= 0 to ComponentCount-1 do begin
    if Components[i] is TButton then
      (Components[i] as TButton).Caption:= ini.ReadString(Form1.Name, (Components[i] as TButton).Name + '.Caption', (Components[i] as TButton).Caption);
  end; 

Добавлено: Пн мар 13, 2006 11:21
Nik
Моторокер
Имхо, это не оптимально. В моем случае, например, локализуется лишь 10% компонентов формы. А такой вот алгоритм будут "бегать" по всем. Смысл?

Добавлено: Пт июн 30, 2006 16:16
Моторокер
10% – это 10 компонентов или больше?
Понятно, что если переводить много не нужно, то можно и перечислить все компоненты по порядку. Читать переводы можно даже не используя ini файлы, просто читать ReadLn из TextFile.
Но так ли уж долго выполняется данный цикл?

Смысл в том, что алгоритм универсальный, точно так же можно выгружать ini файлы для перевода. А там уже неважно, какие компоненты куда положены, добавлены, ini файл всегда актуален.

Есть ещё правда константы, но их тоже можно занести в какой-нибудь массив и читать тоже в цикле.

Добавлено: Пн июл 10, 2006 15:49
Моторокер
Можно ещё избавиться от
if Components is TButton TControl then
напрямую присваивать
try
(Components as TButton TControl).Hint:= 'ля-ля-ля';
except
end;

Добавлено: Ср июл 12, 2006 11:49
vserd
Моторокер
Можно ещё избавиться от
if Components is TButton then [\quote]
можно но не нужно. Не факт что компонент всегда будет иметь свойство которое имеет TButton. В данном случае Hint.
Всякая оптимизация должна иметь свои границы.

Добавлено: Ср июл 12, 2006 13:00
Моторокер
Не факт что компонент всегда будет иметь свойство которое имеет TButton.
Ошибочка. Исправил. Посмотрел код – там так:
try
(Components as TControl).Hint:= S;
except
end;


Прокатит только для хинтов, Caption придется всё-таки проверять на is для каждого вида контролов.
Так переделываю обычные хинты в многострочные.
Если не факт, срабатывает try..except.

Взбрело в голову – да так можно и координаты контролов менять. Допустим, надпись не помещается, сменил Width или Left в ini файле и всё путём.