Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.02;
Скачать: CL | DM;

Вниз

Как отличать друг от друга компоненты   Найти похожие ветки 

 
Psychedelic ©   (2007-01-14 14:45) [0]

Всем привет. Хочу написать мультиязыковой компонент.
Но столкнулся с некоторыми трудностями.
т.к. в кол нету классов, то как отличать друг от друга компоненты непонятно.
У одного есть свойство caption, у другого он называеться text или
используеться Tstrings.
Если работая с vcl я бы узнавал все через RTTI, то с KOL так не получиться.
Пока есть две идеи - это различать по тегам, но это отметается сразу т.к.
теги я использую частенько.
И второе - использовать первые две - три буквы имени компонента, которые будут
обозначать тип.
В принципе это устраивает, т.к. неписаное правило у програмисстов
по первым буквам обозначать его класс называя компонент.
CheckBox - chbName.

Смотрел имеющийся компонент на сайте, но он не в какие ворота не влазит.
Вобщем не понравился вообще.

Может у кого то будут другие идеи?


 
SergeR ©   (2007-01-14 17:21) [1]

Тэги - не вариант 100%.

> использовать первые две - три буквы имени компонента, которые
> будут обозначать тип.

Недостатки:
1.Придеться использовать директиву "USE_NAMES" >> увеличение приложения на ??Кб
2. Обязательная "стандартизация" проекта.

Можно как в UMLI: Своя AddXXX для каждого типа контрола,
Недостатки:
1.В каждом проекте придеться это делать ручками, а я так понимаю, что Вы хотите от этого отказаться.


 
Psychedelic ©   (2007-01-14 17:32) [2]


> Придеться использовать директиву "USE_NAMES" >> увеличение
> приложения на ??Кб

Там считанные килобайты. У меня проект - 210 килобайт. С именами 212. Так что это ерунда.


 
Psychedelic ©   (2007-01-14 18:22) [3]

Я тут подумал :) . С Pcontrol "ом получаеться даже проще чем с vcl классами. Причем без предложенного способа - классификация по именам.
Так-с начнем-с пожалуй.


 
Dimaxx ©   (2007-01-15 20:22) [4]

Можно проще. На каждой форме ты сам знаешь - какой контрол имеет текст, нуждающийся в динамической загрузке. Напиши в его свойстве Caption некое название, которое будет соответствовать нужной строковой константе в файле локализации. Например, есть у тебя чекбокс. Допустим, он нужен для того, чтобы разрешать или запрещать программе делать какую-либо операцию. Напиши на стадии проектирования в Caption, допустим, CHECK_ENABLE_LOCK. Далее в файле локализации напиши примерно так:

CHECK_ENABLE_LOCK=Разрешить блокировать файл

Далее через Form.Children[] перебираем все контролы и смотрим их св-во Caption. Если оно непустое - читаем из файла локализации строку с именем из Caption. Если вернулась непустая строка - присваиваем ее св-ву Caption. Если пустая - не делаем ничего. И все. И не надо никаких имен, никаких тэгов и т.п. усложнений...


 
ANTPro ©   (2007-01-15 21:16) [5]

> [4] Dimaxx ©   (15.01.07 20:22)

Минус:
Прога не работает без файла локализации.


 
Psychedelic ©   (2007-01-15 21:26) [6]

Ну эт как раз и есть усложнение. А как с Tstrings тогда?
Да и у большинства придетсья переделывать проект полностью..
У меня куда компонентов, неохота, да и времени нету..
Я уже решил , все ок.
Я решил по windows class name отделять.
Имя компонента будет в любом случае (с именем на  2 -3 кило растет прога, но зато так практичней). ТО что я до этого предлагал, - отбросил (класс по имени).
Да, только стандартные будут, ну а для нестандартных тоже есть решение, ввиде расширениий.


 
[e]Bu$ter ©   (2007-01-16 11:59) [7]

Ждёмс с нетерпением!


 
dimaxx ©   (2007-01-16 15:44) [8]


> Прога не работает без файла локализации.

Сделай дефолтный файл, который читается из ресурса приложения. В VCL все гораздо проще. В КОЛ сложнее, потому как приходится идти к цели обходными путями. К тому же что проще: отредактировать ресурсы проги спецсофтом или написать свой файл локализации в Блокноте?? Если ты делаешь мультиязыковое приложение - выбирай наиболее простой метод. Согласен, проще сразу писать мультиязыковое приложение, чем переделывать имеющееся. Я, например, никогда не полезу локализовать приложение, у которого все строки для локализации в ресурсах. Ф топку такую локализцию. А вот когда лежит отдельный файл - сам Бог велел.

Предлагаю объединить усилия и сделать КОЛ мультиязыковым. Не городить свои способы извращений, а сделать унифицированно. То есть внести определенные свойства для простоты локализации Ваших приложений. Включать все это по символу условной компиляции.


 
Dimaxx ©   (2007-01-16 15:54) [9]

Хотя вряд ли удастся - основной модуль КОЛ"а разросся уже не на шутку - уже целые оъекты выталкиваются в КОЛадд. Скоро и он разбухнет... И будет КОЛадд2, 3, 4 и т.д.


 
Psychedelic ©   (2007-01-16 17:49) [10]


> Сделай дефолтный файл, который читается из ресурса приложения.


Да я так и делаю, - 2 варианта - из текст . файла и из ресурсов. Из ресурсов лучше к примеру для меня, т.к. проги я поджимаю упаковщиком, а текст пакуется на ура.


 
ANTPro ©   (2007-01-16 19:44) [11]

> [10] Psychedelic ©   (16.01.07 17:49)
> проги я поджимаю упаковщиком

Зря


 
ANTPro ©   (2007-01-16 19:48) [12]

> [9] Dimaxx ©   (16.01.07 15:54)

Надеюсь когда-нибудь для каждого крупного объекта будет свой *.pas файл, тем более что это не влияет на размер проги (правда надо будет кое-что предпринять ;)


 
Dimaxx ©   (2007-01-16 20:31) [13]


> Зря

+1. Дайте почитать человеку статью Рассела про упаковщики... К сожалению утерял ссылку.


 
Psychedelic ©   (2007-01-16 21:59) [14]


> [10] Psychedelic ©   (16.01.07 17:49)
> проги я поджимаю упаковщиком

Зря



> Дайте почитать человеку статью Рассела про упаковщики...
>  К сожалению утерял ссылку.
>


Ну это не вам судить зря или не зря. Все минусы я знаю, со статьей знаком - сам хотел написать подобное, времени нехватило - забросил затею. Статья эта лежит на wasm.ru, кстати сайт многим понравиться/нравиться.
Вы же смотрите на плюсы также. Все зависит от задачи, я же не пишу "фотошопы".  Ну и наконец есть секционные упаковщики.


 
AndreyRus   (2007-01-16 22:51) [15]

Жать, надо но с умом!


 
thaddy   (2007-01-17 02:09) [16]

Vladimir, I have this idea for some time,
It may be a good idea to implement a java style "equals" function in Tobj.
In java it is almost always implemented as a simple hash function.

Alexandr Shaharov made this for me two years ago:

function ElfHash_Sha(const s: string): integer;
asm
    mov   edx, eax
    xor   eax, eax
    test  edx, edx
    jz    @Ret
    sub   eax, [edx-4]
    jz    @Ret
    mov   ecx, eax
    sub   edx, eax
    xor   eax, eax
    push  ebx
@Loop:
    movzx ebx, [edx+ecx]
    add   ebx, eax
    lea   eax, [ebx+ebx]
    shr   ebx, 20
    lea   eax, [8*eax]
    and   ebx, $0F00
    xor   eax, ebx
    add   ecx, 1
    jnz   @Loop
    shr   eax, 4
    pop   ebx
@Ret:
    end;



It can easily be incorporated in Tobj and doesn"t add too much code. It is also a lot more efficient than using USE_NAMES. But I wonder if it would work for Tcontrol type instances. Still, it would work for all other poor objects.


 
thaddy   (2007-01-17 02:12) [17]

It needs some adaptation: size of Tobj instance instead of string, Self, etc, ofcourse.


 
homm ©   (2007-01-17 09:17) [18]

> Надеюсь когда-нибудь для каждого крупного объекта будет
> свой *.pas файл, тем более что это не влияет на размер проги
> (правда надо будет кое-что предпринять ;)

Влитяет. Как минимум увеличивает на название самого модуля, которое хранится в рессурсах.


 
Dimaxx ©   (2007-01-17 10:43) [19]

На больших проектах влияние кучи модулей в отличие от одного большого модуля заметно. Код увеличивается хоть и незначительно в случае с множеством модулей (не только на имя модуля). Единый модуль предпочтительнее.


 
Psychedelic ©   (2007-01-17 11:37) [20]


> Надеюсь когда-нибудь для каждого крупного объекта будет
> свой *.pas файл, тем более что это не влияет на размер проги
>


Между прочим KOL пишется в одном модуле, как раз по этой причине (основная).


 
ANTPro ©   (2007-01-17 14:12) [21]

> [18] homm ©   (17.01.07 09:17)
> Влитяет. Как минимум увеличивает на название самого модуля,
> которое хранится в рессурсах.

Нет. Размер не увеличится и в ресурсах лишних модулей не будет...


 
ANTPro ©   (2007-01-17 14:14) [22]

> [20] Psychedelic ©   (17.01.07 11:37)

Так и будет, он будет подключать остальные объекты. В юзесах будет прописан только KOL.pas


 
homm ©   (2007-01-17 14:45) [23]

> Нет. Размер не увеличится и в ресурсах лишних модулей не
> будет...

Сколько раз встречал перечисление всех используемых модулей в экзешниках VCL проектов. Не верю что КОЛ как-то может это изменить.


 
homm ©   (2007-01-17 14:47) [24]

Даже в колбук вроде об этом было. Ну в сатье Кладова "Компактные приложения" (кажется так) точно было.


 
ANTPro ©   (2007-01-17 14:56) [25]

> [23] homm ©   (17.01.07 14:45)
> Не верю что КОЛ как-то может это изменить.

Я могу : )


 
Psychedelic ©   (2007-01-17 15:29) [26]

Размер не увеличится и в ресурсах лишних модулей не будет...

Берем да открываем resHackerom, и что видим?
все модули что использовали перечислены в секции packageinfo.
Так что если ее не удалить то все будет.
Обычно я удаляю ее (и не только) приготовленным макросом.

Я могу : )

Как?


 
ANTPro ©   (2007-01-17 21:18) [27]

> [26] Psychedelic ©   (17.01.07 15:29)
> Берем да открываем resHackerom, и что видим?
> все модули что использовали перечислены в секции packageinfo.

И еще 64 байта (для каждого модуля) в EXE закидывает компилятор


> [26] Psychedelic ©   (17.01.07 15:29)
> Обычно я удаляю ее (и не только) приготовленным макросом.

Поделишься? : )


> [26] Psychedelic ©   (17.01.07 15:29)
> Как?

Смысл на этом экономить?


 
Vladimir Kladov   (2007-01-17 22:56) [28]

initialization / finalization не будет работать. На ваше усмотрение.


 
ANTPro ©   (2007-01-18 00:31) [29]

> [28] Vladimir Kladov   (17.01.07 22:56)

Еще как будет работать


 
Psychedelic ©   (2007-01-18 17:46) [30]


> > Обычно я удаляю ее (и не только) приготовленным макросом.
>
>
> Поделишься? : )

Скачайте хелп по reshackeru там расписано как делать скрипты для него соответственно. В целом я удаляю DVCLAL и packageinfo - минус пол кило -килобайт.


> > Как?
>
> Смысл на этом экономить?


Уважаемый по моему вы не внимательно читали. Я спрашиваю о самом методе, а не о результате. Интересно просто, никто не знает, а вы знаете, так может поделитесь? (>>Нет. Размер не увеличится и в ресурсах лишних модулей не будет...).


 
Psychedelic ©   (2007-01-18 17:49) [31]

Дык это, Владимир, что на счет поста про хэш функцию [16]?


 
Psychedelic ©   (2007-01-18 18:03) [32]


> initialization / finalization не будет работать. На ваше
> усмотрение.


Что то я недопонял.
Если убрать модули с ресурсов то не будет работать initialization / finalization?
Дык работает. Проверял.


 
ANTPro ©   (2007-01-18 21:00) [33]

Вот примерчик
Если определен ALLINONE, то все модули будут инклудится, если не определен - юзаться. (Я вделывал в WINDOWS.PAS еще два модуля MESSAGES.PAS и TYPES.PAS)
Есть много граблей при таких извращенниях.
(Думаю основной смысл будет понятен, поясню если что)

WINDOWS.PAS:

unit Windows;
....
interface

{$IFDEF ALLINONE}
 {$IFDEF LINUX}uses Libc;{$ENDIF}
{$ELSE ALLINONE}
uses Types {$IFDEF LINUX}, Libc {$ENDIF};
{$ENDIF ALLINONE}

{$IFDEF ALLINONE}
 {$DEFINE ALLINONE1}
 {$I Types}
{$ENDIF ALLINONE}

.....

{$IFDEF ALLINONE}{$I Messages}{$ENDIF ALLINONE}

implementation

{$IFDEF ALLINONE}
 {$UNDEF ALLINONE1}
 {$DEFINE ALLINONE2}
 {$I Types}
{$ENDIF ALLINONE}

.....

end.

TYPES.PAS:

{$IFNDEF ALLINONE}
unit Types;

interface
 {$DEFINE ALLINONE1}
 {$DEFINE ALLINONE2}
{$ENDIF ALLINONE}
{$IFDEF ALLINONE1}
// инклуд секции interface ...
{$ENDIF ALLINONE1}
{$IFNDEF ALLINONE}
implementation
{$ENDIF ALLINONE}
{$IFDEF ALLINONE1}
// инклуд секции implementation ...
{$ENDIF ALLINONE2}
{$IFNDEF ALLINONE}
 {$UNDEF ALLINONE1}
 {$UNDEF ALLINONE2}
end.
{$ENDIF ALLINONE}


 
Vladimir Kladov   (2007-01-18 21:41) [34]

Насчет хэш-функции я вообще не понял, куда это. К strlist"у? А что хэшить-то (и зачем)?

Вариант с ALLINONE не нужен. Я уже точно знаю большую часть траблов от такого юзанья. Пропадает быстрая навигация в Delphi, ломается AutoCompletion, найти нужное слово поиском становится большой проблемой... Не было бы в Delphi ограничения на 65536 строк в модуле, я бы оставил KOL.pas в 1 модуле, и все дела.


 
ANTPro ©   (2007-01-18 22:50) [35]

> [34] Vladimir Kladov   (18.01.07 21:41)
> Пропадает быстрая навигация в Delphi, ломается AutoCompletion,
> найти нужное слово поиском становится большой проблемой...

В топку редактор делфевый. Эх... если бы KOL к VS2005 прикрутить %)


 
Psychedelic ©   (2007-01-18 23:05) [36]


> то все модули будут инклудится


Да не, лучше уж удалятьуже в скомпилированном exe... :)
Там всего то один щелчок...
Ну а как трассировать то их??..Замучиться можно..
Но вариант все таки..


 
ANTPro ©   (2007-01-18 23:31) [37]

> [36] Psychedelic ©   (18.01.07 23:05)
> Ну а как трассировать то их??..Замучиться можно..

Перед Release компиляцией определять ALLINONE, а в DEBUG пользовать как обычно


 
Vladimir Kladov   (2007-01-19 14:29) [38]

опять непонятки. Проблемы начинаются, не когда опция (символ) компиляции добаляется, а раньше, когда вы этаких IFDEF"ов натыкаете.



Страницы: 1 вся ветка

Текущий архив: 2007.09.02;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.032 c
2-1186458973
Roun
2007-08-07 07:56
2007.09.02
При удалении строки из ListView - удалялось из txt


15-1186119392
shlst
2007-08-03 09:36
2007.09.02
Как запустить программу, что бы её не закрыли?


2-1186495479
Pal
2007-08-07 18:04
2007.09.02
глюк с Oracle


3-1178351086
RomanH
2007-05-05 11:44
2007.09.02
Случайный disconect c СУБД


8-1164552655
Vovan#2
2006-11-26 17:50
2007.09.02
Звук и запись звука