Форум Херсона. Форум Херсонской молодежи, флейм, фотографии Херсона, политика в Херсоне, сетевой форум, сети Херсона


Приветствуем на Форум Херсона. Форум Херсонской молодежи..

На данный момент Вы находитесь на форуме как Гость и имеете очень ограниченные возможности и права. Что бы писать или отвечать в темах, загружать картинки, файлы на форуме Вам нужно зарегистрироваться, что совершенно бесплатно. Регистрация очень быстрая, не откладывайте эту процедуру!

Если возникнут проблемы с регистрацией напишите нам.

Галерея форума Блоги пользователей Список банов
Вернуться   Форум Херсона. Форум Херсонской молодежи. > >
Регистрация СправкаСтатистика Пользователи Календарь Поиск Сообщения за день Все разделы прочитаны

Программирование Все вопросы по написанию программ

Ответ
 
Опции темы
Старый 24.01.2009, 13:29   #1 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Less Toolkit

Используясь stl, boost и различные тулкиты я пришел к выводам:

1. stl не всегда удобен( гениальный вывод - я знаю )
2. при написании gui нужно использовать шаблоны
3. все существующие концепции model-view громоздки, неудобны и также должны иметь шаблоны - у меня есть идеи как сделать все проще и вместе с тем сэкономить массу времени на синхронизацию данных и gui
4. во многих тулкитах нет банальных вещей - например удобного репозитория картинок, контейнеров для хранения данных в виде VFS и т.д.
5. нет тулкита для С++, который бы хорошо работал и на ПК( для разных ОС ) и на КПК( например на моей н810 - wxWidgets жутко тормозит и страшно выглядит ), точнее есть один - Qt, но он проприетарный( его купила Nokia ) и может быть закрыт в любой момент
6. я для себя написал реализацию dc с одним интерфейсом для PDF, HTML, SVG, LaTeX, PS и т.п. - т.е. одна и та же функция теперь легко может рисовать не только на экране, но и в PDF, HTML, на принтер( ну это понятно ) и т.д., точно также у меня есть другие полезные заготовки( например унифицированная( через VFS ) работа с rar, tar, zip и т.д. ), которые могут пригодится тем, кто не хочет искать стороние библиотеки и потом прикручивать их "сбоку"

ну и т.д.

данный тулкит ес-но разделен на gui и non-gui, здесь я буду шаг за шагом описывать то что делаю( сделал ), с целью получить максимально конструктивной критики
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 17.04.2009 в 20:29. Причина: Добавлено сообщение
Lester вне форума  
Ответить с цитированием
Старый 24.01.2009, 14:20   #2 (Ссылка на пост)
Модератор
Пол:
 
Активность Longevity
0/20 18/20
Today Сообщения
0/5 ssss11242
Благодарил(а): 2,807
Благодарили 19,030 раз в 5,788 постах
Галерея: 15
Вес репутации: 217 zwitter скоро в модераторы
zwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторы
QT - проприетарный ? ололошечки
уже все пописялись от радости что QT, который будет выпущен в марте, будет под LGPL.

zwitter добавил 24.01.2009 в 14:22
зыж - надписи PHP код забавляют да

Последний раз редактировалось zwitter, 24.01.2009 в 14:22. Причина: Добавлено сообщение
zwitter вне форума  
Ответить с цитированием
Старый 24.01.2009, 14:40   #3 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Цитата:
Сообщение от zwitter Посмотреть сообщение
QT - проприетарный ? ололошечки
уже все пописялись от радости что QT, который будет выпущен в марте, будет под LGPL.

zwitter добавил 24.01.2009 в 14:22
зыж - надписи PHP код забавляют да
спасибо, что нагадил, если по делу ничего нет - проходи

вот кстати .h и .cpp для array
array.zip
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?
Lester вне форума  
Ответить с цитированием
Старый 24.01.2009, 14:57   #4 (Ссылка на пост)
Модератор
Пол:
 
Активность Longevity
0/20 18/20
Today Сообщения
0/5 ssss11242
Благодарил(а): 2,807
Благодарили 19,030 раз в 5,788 постах
Галерея: 15
Вес репутации: 217 zwitter скоро в модераторы
zwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторы
Цитата:
Сообщение от Lester Посмотреть сообщение
Используясь stl, boost и различные тулкиты я пришел к выводам:

1. stl не всегда удобен( гениальный вывод - я знаю )
обоснуйте
Цитата:
Сообщение от Lester Посмотреть сообщение
2. при написании gui нужно использовать шаблоны
вот тут поподробнее.

Цитата:
Сообщение от Lester Посмотреть сообщение
3. все существующие концепции model-view громоздки, неудобны и также должны иметь шаблоны - у меня есть идеи как сделать все проще и вместе с тем сэкономить массу времени на синхронизацию данных и gui
контроллер забыли?
идеи в студию.

Цитата:
Сообщение от Lester Посмотреть сообщение
4. во многих тулкитах нет банальных вещей - например удобного репозитория картинок, контейнеров для хранения данных в виде VFS и т.д.
VCL: TImageList
про VFS подробнее пожалуйста. что вам надо и где хранить ?

Цитата:
Сообщение от Lester Посмотреть сообщение
5. нет тулкита для С++, который бы хорошо работал и на ПК( для разных ОС ) и на КПК( например на моей н810 - wxWidgets жутко тормозит и страшно выглядит ), точнее есть один - Qt, но он проприетарный( его купила Nokia ) и может быть закрыт в любой момент
не закроют, наоборот, открывают еще шире.

Цитата:
Сообщение от Lester Посмотреть сообщение
6. я для себя написал реализацию dc с одним интерфейсом для PDF, HTML, SVG, LaTeX, PS и т.п. - т.е. одна и та же функция теперь легко может рисовать не только на экране, но и в PDF, HTML, на принтер( ну это понятно ) и т.д., точно также у меня есть другие полезные заготовки( например унифицированная( через VFS ) работа с rar, tar, zip и т.д. ), которые могут пригодится тем, кто не хочет искать стороние библиотеки и потом прикручивать их "сбоку"
что такое DC ? постоянный ток ? клиент сети Direct Connect ?
я конечно рад что вы для себя открыли что-то похожее на Apache FOP, но только не надо пафоса с перечислением всех форматов которые умеет экспортировать сторонняя библиотека.

Цитата:
Сообщение от Lester Посмотреть сообщение
естественно заранее предопределены в самом тулките
ArrayBool, ArrayDouble, ArrayLong, ArrayID, ArrayString, ArrayBitmap, ArrayPtrVoid
vector<bool>
vector<double>
vector<long>
vector<ID???> - WTF ?
vector<string>
vcl: TImageList
....

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

как мне отсортировать массив структур в вашем тулките ?
где двоичный поиск ?
ваша операция Index ищет первое вхождение в массиве ?
где операция подсчета количества элементов в массиве ?

Цитата:
Сообщение от Lester Посмотреть сообщение
какие предложения для расширения/изменения класса?
сложить в дальнюю папку
я конечно понимаю, что каждый уважающий себя начинающий программист обязан написать свой стек, списки и библиотеку для рисования окошек.
ничего, это пройдет
zwitter вне форума  
Ответить с цитированием
Старый 24.01.2009, 15:29   #5 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
я уже сказал - хорош гадить, думай, что хочешь, но не мешай - я буду тут шаг за шагом все описывать, начал ес-но с основ, просьба или писать по сути, или не писать вообще

потому по сути:
"обоснуйте" - да хотя бы нет проверок на индексы( у меня тоже нет - добавлю, это легко - сейчас я другое делаю ), ну и сложение двух векторов, вставка 10 одинаковых значений в начало и т.п. - уже отдельные операции, да и банально:

Код:
ArrayString array;
array.Add( "item", 10 );
array.Prepend( "1" );
array.Insert( 1, "2" );
более читабельно чем:

Код:
vector<String>array;
for( size_t i = 0 ; i < 10 ; ++i )
    array.push_back( "item" );
vector<String>::iterator it = array.begin();
array.insert( it , "1" );
array.insert( ++it , "2" );


"я конечно понимаю, что каждый уважающий себя начинающий программист
обязан написать свой стек, списки и библиотеку для рисования окошек. "

да - я прошел это еще с zx48k, сейчас я хочу написать прежде всего удобный тулкит, насколько это мне удастся - будем судить потом, сейчас я жду только конструктивной критики

Lester добавил 24.01.2009 в 15:49
Цитата:
Сообщение от zwitter Посмотреть сообщение
нахрена мне ваша заготовка, если вы один хрен инкапсулируете вектор и лишь закрываете мне многие полезности вектора ?
как мне отсортировать массив структур в вашем тулките ?
где двоичный поиск ?
ваша операция Index ищет первое вхождение в массиве ?
где операция подсчета количества элементов в массиве ?
"нахрена мне ваша заготовка, если вы один хрен инкапсулируете вектор и лишь закрываете мне многие полезности вектора ?" - какие многие полезности?

"как мне отсортировать массив структур в вашем тулките ?" - странно, но Sort()

"ваша операция Index ищет первое вхождение в массиве ?" - за это спасибо, расширю поиск

"где операция подсчета количества элементов в массиве ?" - Count(), вы опять невнимательны

Lester добавил 24.01.2009 в 16:05
добавил:
Код:
virtual    long                    FindFirst( const T& item );
virtual    long                    FindNext( void );
virtual    ArrayULong              FindAll( const T& item );
Lester добавил 24.01.2009 в 16:24
Цитата:
Сообщение от zwitter Посмотреть сообщение
и по какому полю из структуры оно сортирует ?
надо задать оператор сравнения, например так:

/************************************************** ********************************************/
struct MyStruct
{
String name;
String lastName;

public://////////////////////////////////////////////////////////////////////////

bool operator<( const
MyStruct& value ) const
{
return name < value.name;
}

bool operator>( const
MyStruct& value ) const
{
return name > value.name;
}
};

вопрос понял, добавлю еще один вариант sort с параметром в виде функции для сравнения

Lester добавил 24.01.2009 в 16:26
форматирование опять побилось - сорри

Lester добавил 24.01.2009 в 16:31
"где двоичный поиск?" - тоже согласен, думаю надо будет ввести новый тип SortedArray, плюс, чтоб обычный Array умел помнить - отсортирован он или нет, и если да - делал быстрый поиск, вот за такую критику спасибо - на все вопросы сразу я ответить не могу( долго ), а по отдельности( как сейчас про массивы ) - буду только благодарен
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 24.01.2009 в 16:32. Причина: Добавлено сообщение
Lester вне форума  
Ответить с цитированием
Старый 25.01.2009, 01:17   #6 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
насчет массивов - будем считать, что разобрались( бинарный поиск и SortedArray занесены в TODO и обязательно будут реализованы ), пошли дальше...

Bitmap( класс для работы с изображениями )

PHP код:
/**********************************************************************************************/
class LTAPI Bitmap
{
public:
//////////////////////////////////////////////////////////////////////////
    
    // TODO: AUTO register/unregister in repository

                                
Bitmapvoid );
                                
Bitmap( const Bitmapbmp );
                                
Bitmap( const Bitmapbmp, const Rectrect );
                                
Bitmapsize_t widthsize_t height );
                                
Bitmap( const StringpathBitmapType type AUTO );
                                
Bitmapvoiddatasize_t sizeBitmapType type AUTO );
                                
Bitmap( const char* const* xpm );

virtual                            ~Bitmapvoid );

public:
//////////////////////////////////////////////////////////////////////////

        //////////////////////////////////////////////////////////////////////////
        // Information

        
size_t                    GetWidthvoid ) const;
        
size_t                    GetHeightvoid ) const;

        
bool                    IsOkvoid ) const;

        
//////////////////////////////////////////////////////////////////////////
        // Load and save

        
bool                    LoadDatavoiddatasize_t sizeBitmapType type AUTO );
        
bool                    LoadFile( const StringpathBitmapType type AUTO );

        
bool                    SaveDatavoid*& datasize_tsizeBitmapType type PNG ) const;
        
bool                    SaveFile( const StringpathBitmapType type AUTO ) const;

        
//////////////////////////////////////////////////////////////////////////
        // Filters

        
Bitmap                    Blursize_t radius ) const;
        
Bitmap&                    BlurSelfsize_t radius );

        
Bitmap                    BlurHorizontalsize_t radius ) const;
        
Bitmap&                    BlurHorizontalSelfsize_t radius );

        
Bitmap                    BlurVerticalsize_t radius ) const;
        
Bitmap&                    BlurVerticalSelfsize_t radius );

        
Bitmap                    ColourReductionsize_t colours 236 ) const;
        
Bitmap&                    ColourReductionSelfsize_t colours 236 );

        
Bitmap                    ConvertToGreyscalevoid ) const;
        
Bitmap&                    ConvertToGreyscaleSelfvoid );

        
Bitmap                    ConvertToMonovoid ) const;
        
Bitmap&                    ConvertToMonoSelfvoid );

        
Bitmap                    GetSubBitmap( const Rectrect ) const;

        
Bitmap                    MirrorHorizontalvoid ) const;
        
Bitmap&                    MirrorHorizontalSelfvoid );

        
Bitmap                    MirrorVerticalvoid ) const;
        
Bitmap&                    MirrorVerticalSelfvoid );

        
Bitmap                    Scale
                                    
size_t                width
                                    
size_t                height
                                    
bool                highQuality true ) const;

        
Bitmap&                    ScaleSelf
                                    
size_t                width
                                    
size_t                height
                                    
bool                highQuality true );

        
Bitmap                    Resize(
                                    
size_t                width,
                                    
size_t                height,
                                    
Colour                cl BLACK ) const;

        
Bitmap&                    ResizeSelf(
                                    
size_t                width,
                                    
size_t                height,
                                    
Colour                cl BLACK );

        
Bitmap                    Rotate
                                    
size_t                angle
                                    
size_t                x
                                    
size_t                y
                                    
bool                highQuality true ) const;

        
Bitmap&                    RotateSelf
                                    
size_t                angle
                                    
size_t                x
                                    
size_t                y
                                    
bool                highQuality true );

        
Bitmap                    RotateHuesize_t angle ) const;
        
Bitmap&                    RotateHueSelfsize_t angle );

        
Bitmap                    Rotate90bool clockwise true ) const;
        
Bitmap&                    Rotate90Selfbool clockwise true );

        
//////////////////////////////////////////////////////////////////////////
        // Transparency and mask

        
void                    CreateMaskFromBitmap( const BitmapmaskColour maskColour );
        
void                    CreateMaskFromColourColour mask );
        
void                    DeleteMaskvoid );

        
bool                    HasAlphavoid ) const;
        
bool                    HasMaskvoid ) const;
        
bool                    IsTransparent(
                                    
size_t                x
                                    
size_t                y
                                    
uchar                threshold 128 ) const;

        
void                    ConvertAlphaToMaskuchar threshold 128 );
        
void                    InitAlphavoid );

        
Colour                    GetMaskColourvoid ) const;
        
uchar                    GetMaskRedvoid ) const;
        
uchar                    GetMaskGreenvoid ) const;
        
uchar                    GetMaskBluevoid ) const;

        
//////////////////////////////////////////////////////////////////////////
        // Pixels

        
uchar                    GetAlphasize_t xsize_t y ) const;
        
Colour                    GetColoursize_t xsize_t y ) const;
        
uchar                    GetRedsize_t xsize_t y ) const;
        
uchar                    GetGreensize_t xsize_t y ) const;
        
uchar                    GetBluesize_t xsize_t y ) const;

        
void                    ReplaceColour c1Colour c2 );
        
void                    Replace
                                    
uchar r1uchar g1uchar b1,
                                    
uchar r2uchar g2uchar b2 );

        
void                    SetAlpha
                                    
size_t                x
                                    
size_t                y,
                                    
uchar                value );

        
void                    SetColour
                                    
size_t                x
                                    
size_t                y,
                                    
Colour                value );

        const 
uchar*            GetDatavoid ) const;

public:
//////////////////////////////////////////////////////////////////////////

        //////////////////////////////////////////////////////////////////////////
        // Operators

        
Bitmap&                    operator=( const Bitmapvalue );
        
bool                    operator==( const Bitmapvalue ) const;
  
protected:
//////////////////////////////////////////////////////////////////////////

        
BitmapData*                mpData;
}; 
как всегда форматирование побилось

поддерживаются GIF, PNG, BMP, XPM, TGA, JPEG, PCX, TIFF, загрузка и сохранение в файл/буффер, базовые фильтры - все остальные будут реализованы отдельно, работа с альфа-каналом и маской, данный класс используется везде где надо хранить и передавать изображения( например иконки для gui )

может у кого-то есть предложения по данному классу( например чего-то не хватает )
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 25.01.2009 в 01:21.
Lester вне форума  
Ответить с цитированием
Старый 25.01.2009, 02:00   #7 (Ссылка на пост)
Модератор
Пол:
 
Активность Longevity
0/20 18/20
Today Сообщения
0/5 ssss11242
Благодарил(а): 2,807
Благодарили 19,030 раз в 5,788 постах
Галерея: 15
Вес репутации: 217 zwitter скоро в модераторы
zwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторы
какой сакральный смысл у функции IsOk ?
zwitter вне форума  
Ответить с цитированием
Старый 25.01.2009, 02:04   #8 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Цитата:
Сообщение от zwitter Посмотреть сообщение
какой сакральный смысл у функции IsOk ?
простой - имеем ли мы дело с рабочим изображением, предположим ты напишешь так:

Bitmap bmp( "non-exist.png" ); // а такого файла нет

тогда IsOk вернет false
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?
Lester вне форума  
Ответить с цитированием
Старый 25.01.2009, 02:18   #9 (Ссылка на пост)
Модератор
Пол:
 
Активность Longevity
0/20 18/20
Today Сообщения
0/5 ssss11242
Благодарил(а): 2,807
Благодарили 19,030 раз в 5,788 постах
Галерея: 15
Вес репутации: 217 zwitter скоро в модераторы
zwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторы
каша полнейшая. не торт совершенно
проповедники ООП плачут крокодильими слезами.
нафига все было сбивать в 1 класс ?
в том же VCL есть три разных понятия - TBitmap, TPicture, TImage
вынесите все функции нафиг из класса, ООП тут нет.
zwitter вне форума  
Ответить с цитированием
Старый 25.01.2009, 04:21   #10 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Цитата:
Сообщение от zwitter Посмотреть сообщение
каша полнейшая. не торт совершенно
проповедники ООП плачут крокодильими слезами.
нафига все было сбивать в 1 класс ?
в том же VCL есть три разных понятия - TBitmap, TPicture, TImage
вынесите все функции нафиг из класса, ООП тут нет.
как по мне наоборот, в данном случае есть только один объект - изображение и делить тут нечего, и расскажите плз:

1. смысл разделения на TBitmap, TPicture, TImage( особенно для того кто пользуется ими - так удобнее? )
2. как вырезать из картинки в VCL подкартинку( ее произвольную часть ) , как отразить изображение, повернуть, размыть и т.д., т.е. те действия которые я добавил в класс

насчет методов - да, есть смысл убрать операции которые возвращают новые изображения, и оставить только ...Self, ес-но переименовав, так и сделаю - будет компактнее и выглядеть опрятнее

Lester добавил 25.01.2009 в 04:29
сейчас выглядит как:

PHP код:
/**********************************************************************************************/
class LTAPI Bitmap
{
public:
//////////////////////////////////////////////////////////////////////////
    
    // TODO: AUTO register/unregister in repository

                                
Bitmapvoid );
                                
Bitmap( const Bitmapbmp );
                                
Bitmap( const Bitmapbmp, const Rectrect );
                                
Bitmapsize_t widthsize_t height );
                                
Bitmap( const StringpathBitmapType type AUTO );
                                
Bitmapvoiddatasize_t sizeBitmapType type AUTO );
                                
Bitmap( const char* const* xpm );

virtual                            ~Bitmapvoid );

public:
//////////////////////////////////////////////////////////////////////////

        //////////////////////////////////////////////////////////////////////////
        // Information

        
size_t                    GetWidthvoid ) const;
        
size_t                    GetHeightvoid ) const;

        
bool                    IsOkvoid ) const;

        
//////////////////////////////////////////////////////////////////////////
        // Load and save

        
bool                    LoadDatavoiddatasize_t sizeBitmapType type AUTO );
        
bool                    LoadFile( const StringpathBitmapType type AUTO );

        
bool                    SaveDatavoid*& datasize_tsizeBitmapType type PNG ) const;
        
bool                    SaveFile( const StringpathBitmapType type AUTO ) const;

        
//////////////////////////////////////////////////////////////////////////
        // Filters

        
Bitmap&                    Blursize_t radius );

        
Bitmap&                    ColourReductionsize_t colours 236 );
        
Bitmap&                    ConvertToGreyscalevoid );
        
Bitmap&                    ConvertToMonovoid );

        
Bitmap                    GetSubBitmap( const Rectrect ) const;

        
Bitmap&                    MirrorHorizontalvoid );
        
Bitmap&                    MirrorVerticalvoid );

        
Bitmap&                    Scale
                                    
size_t                width
                                    
size_t                height
                                    
bool                highQuality true );

        
Bitmap&                    Resize(
                                    
size_t                width,
                                    
size_t                height,
                                    
Colour                cl BLACK );

        
Bitmap&                    Rotate
                                    
size_t                angle
                                    
size_t                x
                                    
size_t                y
                                    
bool                highQuality true );

        
Bitmap&                    Rotate90bool clockwise true );
        
Bitmap&                    RotateHuesize_t angle );

        
//////////////////////////////////////////////////////////////////////////
        // Transparency and mask

        
void                    CreateMaskFromBitmap( const BitmapmaskColour maskColour );
        
void                    CreateMaskFromColourColour mask );
        
void                    DeleteMaskvoid );

        
bool                    HasAlphavoid ) const;
        
bool                    HasMaskvoid ) const;
        
bool                    IsTransparent(
                                    
size_t                x
                                    
size_t                y
                                    
uchar                threshold 128 ) const;

        
void                    ConvertAlphaToMaskuchar threshold 128 );
        
void                    InitAlphavoid );

        
Colour                    GetMaskColourvoid ) const;

        
//////////////////////////////////////////////////////////////////////////
        // Pixels

        
uchar                    GetAlphasize_t xsize_t y ) const;
        
Colour                    GetColoursize_t xsize_t y ) const;

        
void                    ReplaceColour c1Colour c2 );

        
void                    SetAlpha
                                    
size_t                x
                                    
size_t                y,
                                    
uchar                value );

        
void                    SetColour
                                    
size_t                x
                                    
size_t                y,
                                    
Colour                value );

        const 
uchar*            GetDatavoid ) const;

public:
//////////////////////////////////////////////////////////////////////////

        //////////////////////////////////////////////////////////////////////////
        // Operators

        
Bitmap&                    operator=( const Bitmapvalue );
        
bool                    operator==( const Bitmapvalue ) const;

protected:
//////////////////////////////////////////////////////////////////////////

        
BitmapData*                mpData;
}; 
Lester добавил 25.01.2009 в 13:10
кстати разделение таки будет, но разумное - будет BitmapEx( туда будут вынесены ColourReduction, RotateHue и Rotate ), в котором будут реализованы изменения яркости/контрастности, дополнительные фильтры( скопирую алгоритмы из gimp ) и т.п., то что надо редко, но может пригодится, например для создания анимаций

Lester добавил 25.01.2009 в 13:41
ну и забыл добавить - пути в именах файлов для загрузки могут быть относительными. По умолчанию от папки программы, но базовый путь может быть выставлен через SetResourcesPath:

PHP код:
// Show splash
SetResourcesPath"resources" ); // так-же может быть относительным, ес-но от папки программы
Splash splashBitmap"splash.png" ) );
...
Bitmap bmp"sample/sample.gif" ); // будет читать из resources/sample/sample.gif 
Lester добавил 25.01.2009 в 13:56
добавил еще операторы "+" и "+=", может пригодится, например есть набор иконок для объектов( БД, таблица и т.п. ), надо еще для тех же объектов иконки - добавить/удалить/флушить/заблокировать/разблокировать и т.п., чтоб не иметь зоопарк иконок в папке ресурсов создаем только иконки самих объектов + отдельные( с маской ) иконки - добавить/удалить/флушить/заблокировать/разблокировать, а потом накладываем одни на другие, например так:

PHP код:
Bitmap dbIcon"db.png" );
Bitmap tableIcon"table.png" );
...
Bitmap addIcon"add.png" );
Bitmap deleteIcon"delete.png" );
...
Bitmap addDbIcon dbIcon addIcon;
Bitmap addTableIcon tableIcon addIcon;
... 
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 25.01.2009 в 14:35. Причина: Добавлено сообщение
Lester вне форума  
Ответить с цитированием
Старый 25.01.2009, 20:46   #11 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
ну и ес-но раз есть изображения, то должно быть удобное хранилище для них:

PHP код:
/**********************************************************************************************/
interface LTAPI I_BitmapRepository
{
public:
//////////////////////////////////////////////////////////////////////////

        //////////////////////////////////////////////////////////////////////////
        // Add bitmaps

virtual    void                    AddBitmap( const Bitmapbmp, const Stringname ) = 0;
virtual    void                    AddBitmap( const Bitmapbmpsize_t idsize_t size ) = 0;
virtual    void                    AddBitmap( const Bitmapbmp, const Stringnamesize_t idsize_t size ) = 0;

        
//////////////////////////////////////////////////////////////////////////
        // Load from files

virtual    void                    LoadFromDir( const Stringpath, const Stringmask "*.*" ) = 0;
virtual    void                    SmartLoad( const Stringpathsize_t id ) = 0;

virtual    void                    LoadFromFile( const Stringname ) = 0;
virtual    void                    LoadFromFile( const Stringnamesize_t idsize_t size ) = 0;

virtual    void                    SetBasePath( const Stringpath ) = 0;

        
//////////////////////////////////////////////////////////////////////////
        // Retrieve bitmaps

virtual    bool                    IsExistsize_t idsize_t size ) = 0;
virtual    bool                    IsExist( const Stringname ) = 0;

virtual    const Bitmap&            GetBitmapsize_t idsize_t size ) = 0;
virtual    const Bitmap&            GetBitmap( const Stringname ) = 0;

        
//////////////////////////////////////////////////////////////////////////
        // Combine/Modify bitmaps

virtual    void                    GenerateBitmap
                                    
size_t                id
                                    
size_t                idSource,
                                    
size_t                idAddedFirst 0
                                    
size_t                idAddedSecond 0
                                    
size_t                idAddedThird ) = 0;

virtual    void                    GenerateDisabledBitmap(
                                    
size_t                id
                                    
size_t                idSource ) = 0;
}; 
это интерфейс, в тулките есть его реализация - BitmapRepository, также есть глобальный объект theBitmapRepository, который создается автоматом при старте приложения и может быть доступен из любого места в программе

доступ к картинкам воможен по:
  • имени
PHP код:
theBitmapRepository->AddBitmapBitmap"test.png"), "test" );
Bitmap bmp theBitmapRepository->GetBitmap"test" ); 
  • идентификатору
PHP код:
theBitmapRepository->AddBitmapBitmap"test.png"), ID_BMP_TEST );
Bitmap bmp theBitmapRepository->GetBitmapID_BMP_TEST ); 
  • идентификатору и размеру
PHP код:
theBitmapRepository->AddBitmapBitmap"test_16.png"), ID_BMP_TEST16 );
theBitmapRepository->AddBitmapBitmap"test_32.png"), ID_BMP_TEST32 );
  
Bitmap bmp32 theBitmapRepository->GetBitmapID_BMP_TEST32 ); 
некоторые методы:
  • LoadFromDir( const String& path, const String& mask = "*.*" )
загружает все изображения из папки, потом изображения можно получить по имени, например - test_16
  • SmartLoad( const String& path, size_t id )
небольшая отсебятина, часто надо иметь одно изображения разных размеров, и чтоб не писать:

PHP код:
theBitmapRepository->AddBitmapBitmap"test_16.png"), ID_BMP_TEST16 );
theBitmapRepository->AddBitmapBitmap"test_32.png"), ID_BMP_TEST32 );
theBitmapRepository->AddBitmapBitmap"test_48.png"), ID_BMP_TEST48 );
... 
можно один раз написать:

PHP код:
theBitmapRepository->SmartLoad"test_*.png"ID_BMP_TEST ); 
будут добавлены все файлы по маске - размер будет взят из части имени на месте *
  • GenerateBitmap
см. выше про объединение нескольких изображений в одно
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 25.01.2009 в 20:49.
Lester вне форума  
Ответить с цитированием
Старый 25.01.2009, 23:35   #12 (Ссылка на пост)
Щас сменю себе статус
 
Аватар для TIGR
Пол:
 
Активность Longevity
0/20 18/20
Today Сообщения
0/5 sssss4687
Благодарил(а): 9,926
Благодарили 6,148 раз в 2,096 постах
Галерея: 0
Вес репутации: 82 TIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторыTIGR скоро в модераторы
Цитата:
Сообщение от Lester Посмотреть сообщение
как по мне наоборот, в данном случае есть только один объект - изображение и делить тут нечего, и расскажите плз:

1. смысл разделения на TBitmap, TPicture, TImage( особенно для того кто пользуется ими - так удобнее? )
2. как вырезать из картинки в VCL подкартинку( ее произвольную часть ) , как отразить изображение, повернуть, размыть и т.д., т.е. те действия которые я добавил в класс
если мне не изменяет память - от того что это разные вещи их и разделили в vcl TPicture вроде как вообще просто компонент, который умеет показывать TImage.

в vcl делать над изображениями эффекты наверное так же как и везде... если нужен эффект берешь и пишешь его
__________________
TIGR вне форума  
Ответить с цитированием
Старый 26.01.2009, 00:41   #13 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Цитата:
Сообщение от TIGR Посмотреть сообщение
если мне не изменяет память - от того что это разные вещи их и разделили в vcl TPicture вроде как вообще просто компонент, который умеет показывать TImage.
в том же wx есть два класса wxBitmap, wxImage - но там идет разделение на платформозависимое и платформонезависимое( первое по сути оббертка для HBITMAP, PicHandle, GdkImage, а второе - уже честно хранит все изображение в буфере ), для билдера такое не нужно - т.к. целевая ОС одна

Google говорит, что TPicture класс для хранения изображения, а TImage - виджет, странно, что zwitter привел его в пример

Цитата:
Сообщение от TIGR Посмотреть сообщение
в vcl делать над изображениями эффекты наверное так же как и везде... если нужен эффект берешь и пишешь его
скорее всего там это через канву делается

Lester добавил 26.01.2009 в 03:57
в продолжении темы про BitmapRepository, в тулките есть большой набор предопределенных ID - например ID_BMP_CUT, ID_BMP_PRINT, ID_BMP_BACK и т.п., стандартый набор иконок для этих ID с разными размерами лежит в отдельном расширении к тулкиту( .so, .dll, .dylib ), можно использовать его( а также иметь несколько таких расширений - и выбирать тему ), можно самому загружать иконки для используемых ID, можно использовать тему иконок KDE/Gnome( в том числе и в виндовс - достаточно указать путь ) - для них есть десятки отличных тем, т.е. можно писать, например, так:

PHP код:
Menu menu;
menu.AddID_ACTION_NEW"New...", , CTRL 'N' )->SetBitmaptheBitmapRepository->GetBitmapID_BMP_NEW16 ) );
menu.AddID_ACTION_OPEN"Open..."CTRL 'O' )->SetBitmaptheBitmapRepository->GetBitmapID_BMP_OPEN16 ) );
menu.AddID_ACTION_PREVIEW"Preview..." )->SetBitmaptheBitmapRepository->GetBitmapID_BMP_PREVIEW16 ) );
menu.Popup(); 
и вообще не думать об загрузке иконок

Lester добавил 26.01.2009 в 08:52
добавил макрос - BITMAP, теперь пример выглядит так:

PHP код:
Menu menu;
menu.AddID_ACTION_NEW"New...", , CTRL 'N' )->SetBitmapBITMAPID_BMP_NEW16 ) );
menu.AddID_ACTION_OPEN"Open..."CTRL 'O' )->SetBitmapBITMAPID_BMP_OPEN16 ) );
menu.AddID_ACTION_PREVIEW"Preview..." )->SetBitmapBITMAPID_BMP_PREVIEW16 ) );
menu.Popup(); 
Lester добавил 26.01.2009 в 11:40
добавил возможность связать action с bitmap, для всех стандартных это можно включить( при старте приложения ) через:

theSystemOptions->Write( "/Actions/EnableDefaultAutoBitmaps", true );

для своих actions можно создать связку через:

AssignActionBitmap( MY_ID_ACTION_NEW, MY_ID_BMP_NEW );

пока это тестовый вариант, потом подумаю как сделать( назвать ) лучше

пример:

PHP код:
    theSystemOptions->Write"/Actions/EnableDefaultAutoBitmaps"true );

    
// Нестандартные ID
    
AssignActionBitmapvsID_ACTION_NEW_DATABASE,  vsID_BMP_NEW_DATABASE );
    
AssignActionBitmapvsID_ACTION_OPEN_DATABASEvsID_BMP_OPEN_DATABASE );
     ...

    
MenuBarbar = new MenuBarthis );
         
//////////////////////////////////////////////////////////////////////////
     // File
    
Menumenu bar->Add"File" );
    
menu->AddID_ACTION_NEW_WINDOW,               "New Window",                CTRL SHIFT 'N' );
    
menu->AddID_ACTION_CLOSE_WINDOW,             "Close Window",              CTRL SHIFT 'W' );
    
menu->AddID_ACTION_CLOSE_TAB,                "Close Tab",                   CTRL 'W' );
    
menu->AddSeparator(); //---------------------------------------------------------------------
    
menu->AddID_ACTION_SAVE_FILE,                "Save",                            CTRL 'S' );
    
menu->AddID_ACTION_SAVE_ALL_FILES,           "Save All",                   CTRL SHIFT 'S' );
    
menu->AddSeparator(); //---------------------------------------------------------------------
    
menu->AddvsID_ACTION_NEW_DATABASE,           "New Database...",           CTRL 'N' );
    
menu->AddvsID_ACTION_OPEN_DATABASE,          "Open Database...",          CTRL 'O' );
    
menu->Add( -1,                                 "Open Recent Database" );
    
menu->AddvsID_ACTION_CLOSE_DATABASE,         "Close Database",            CTRL ALT 'W' );
    
menu->AddvsID_ACTION_CLOSE_ALL_DATABASES,    "Close All Databases" );
    
menu->AddSeparator(); //---------------------------------------------------------------------
    
menu->AddID_ACTION_IMPORT,                   "Import..." );
    
menu->AddID_ACTION_EXPORT,                   "Export..." );
    
menu->AddSeparator(); //---------------------------------------------------------------------
    
MenudumpMenu menu->AddMenu(                "Dump Database..." );
    
dumpMenu->AddvsID_ACTION_DUMP_SQL,           "SQL..." );
    
dumpMenu->AddvsID_ACTION_DUMP_XML,           "XML..." );
    
MenuloadMenu menu->AddMenu(                "Load Dump..." );
    
loadMenu->AddvsID_ACTION_LOAD_SQL,           "SQL..." );
    
loadMenu->AddvsID_ACTION_LOAD_XML,           "XML..." );
    
menu->AddSeparator(); //---------------------------------------------------------------------
    
menu->AddID_ACTION_PRINT_SETUP,              "Page Setup..." );
    
menu->AddID_ACTION_PRINT,                    "Print...",                 CTRL 'P' );
    
menu->AddID_ACTION_PRINT_PREVIEW,            "Print preview" );
    
menu->AddSeparator(); //---------------------------------------------------------------------
    
menu->AddID_ACTION_QUIT,                     "Exit",                     ALT 'X' ); 
форматирование как всегда побилось
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 26.01.2009 в 11:43. Причина: Добавлено сообщение
Lester вне форума  
Ответить с цитированием
Старый 26.01.2009, 12:53   #14 (Ссылка на пост)
Модератор
Пол:
 
Активность Longevity
0/20 18/20
Today Сообщения
0/5 ssss11242
Благодарил(а): 2,807
Благодарили 19,030 раз в 5,788 постах
Галерея: 15
Вес репутации: 217 zwitter скоро в модераторы
zwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторы
месье хардкодит меню ?

как это пошло....
zwitter вне форума  
Ответить с цитированием
Старый 26.01.2009, 14:06   #15 (Ссылка на пост)
Местные мы
 
Аватар для Marchello
Пол:
 
Активность Longevity
0/20 17/20
Today Сообщения
0/5 ssssss509
Благодарил(а): 457
Благодарили 620 раз в 179 постах
Галерея: 0
Вес репутации: 23 Marchello известное всем имяMarchello известное всем имяMarchello известное всем имяMarchello известное всем имяMarchello известное всем имя
zwitter, ну что ты язвишь человек старается, пишет, хочет поделится своими трудами. Тут можно долго спорить где ООП, а где нет, тут уже зависит от человека который это пишет.
Вот у нас тоже проект - работа с изображениями. Там столько классов, враперы, враперы над враперами, менеджеры, класс команды, класс аргументов для команды, классы валидаторы, куча enum-ов и т.д. И это все нада дернуть чтобы наложить там эффект какой-то для изображения.
Но "в самом низу" этого месива юзается одна несложная либа, вот класс Лестера (который Bitmap) чем-то её напоминает. Я это к чему, что на уровне тулкита - это нормально. Все просто, есть клаас с кучей методов которые делают все что нужно, а в приложении заворачивай этот класс во что угодно - обычно так и делают, чтобы не нарушать архитектуру приложения и не подстраиваться под либу/тулкит.
Теперь к пану Lesterу, огласите весь список пожалуйста.
В смысле расскажите нам с высоты птичьего полета про ваш тулкит, а не по одному классу. Например список классов с кратчайшем описанием что для чего, ну в таком ключе.. А аудитория будет выбирать наиболее интересные вещи и просить их огласки (вот как с массивом). Это конечно если вы захотите.
Я вот тоже например пишу свой "велосипед", не так глобально конечно... больше для развлечения я бы сказал.
Поэтому наезжать с критикой мне даж как-то не удобно что ли, так как
я знаю что мой "велосипед" можно критиковать до бесконечности, но я им пользуюсь, мне нравится
Marchello вне форума  
Ответить с цитированием
Старый 26.01.2009, 14:40   #16 (Ссылка на пост)
Модератор
Пол:
 
Активность Longevity
0/20 18/20
Today Сообщения
0/5 ssss11242
Благодарил(а): 2,807
Благодарили 19,030 раз в 5,788 постах
Галерея: 15
Вес репутации: 217 zwitter скоро в модераторы
zwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторыzwitter скоро в модераторы
ну язвлю, да.
мне не нравится стиль автора.
сделал класс меню ?
ну засунь ты все меню в xml, там пропиши все пункты, иконки, action'ы, hot-key'и.
вгрузи его 1 вызовом и будет щастье.

вот тогда я скажу - да, это удобная штука, с радостью бы использовал
zwitter вне форума  
Ответить с цитированием
Сказали Спасибо пользователю zwitter за этот пост:
Lester (26.01.2009)
Старый 26.01.2009, 18:02   #17 (Ссылка на пост)
Местные мы
 
Аватар для Marchello
Пол:
 
Активность Longevity
0/20 17/20
Today Сообщения
0/5 ssssss509
Благодарил(а): 457
Благодарили 620 раз в 179 постах
Галерея: 0
Вес репутации: 23 Marchello известное всем имяMarchello известное всем имяMarchello известное всем имяMarchello известное всем имяMarchello известное всем имя
(обращение к Лестеру)
Так, посмотрел я массив. Я конечно не гуру Срр, но осмелюсь высказаться ))
Ну сразу - объявление всего класса как макроса конечно интересно...
дебажить невозможно, да и пользоваться неудобно (я чуть-чуть попробовал )) ).
Нужно где-то тулить DECLARE_ARRAY, потом DEFINE_ARRAY, а потом и саму переменную объявить.
Почему бы просто не написать шаблонный класс сразу? (собственно как vector<>).
Тогда пишем CustomArray<MyType> A; и готово. Может я не усмотрел где-то глубинный смысл задумки, но добавлять макросы в проект для каждого нового типа - реально неудобно.
Ладно.., дальше:
Код:
 T& operator[]( size_t index );
 T   operator[]( size_t index ) const;
Почему второй метод (константный) возвращает это, а не const T& ?
Ведь с константной ссылкой мы ничего не поменяем в классе name и в T - и это не нарушит иммутабельность. Вот этот момент хотелось бы подробней знать.
Потом еще момент, есть конструктор который принимает указатель и кол-во элементов и создает массив.
Так вот ИМХО не помешало бы и такой метод иметь.
Например я создал массив (твой), поработал с ним, удалил все с него,
а потом хочу туда засунуть уже готовый массив (типа int a[64]) -
прийдется уже по одному делать Add(). То есть, можно добавить метод типа:
Код:
void FillFrom(size_t count, T* value );
ну это не критично конечно.
И последнее, метод Export, строка:
Код:
for( size_t i = 0 ; i < count ; ++i ) 
    res[ i ] = (T) ( mVector[ i ] );
Опять таки, почему (Т) ?
Ведь даже оператор присваивания принимает const name&, а так выходит что создается временный объект - он попадает в оператор присваивания, а потом удаляется.
И тут же момент, обычно Срр-шники юзают new/delete, а тут память выделяется через malloc, если этого не знать а потом вызвать
указателю delete [] - сам знаешь что будет. Но хотя если там написать
res = new T[count] - повызываются лишний раз конструкторы, тоже не хорошо.

ps. это я смотрел там на первый класс name (а то там внизу еще один есть, дома погляжу...)

Последний раз редактировалось Marchello, 26.01.2009 в 18:06.
Marchello вне форума  
Ответить с цитированием
Сказали Спасибо пользователю Marchello за этот пост:
Lester (26.01.2009)
Старый 26.01.2009, 18:14   #18 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Цитата:
Сообщение от zwitter Посмотреть сообщение
месье хардкодит меню ?
как это пошло....
"если уж вы окончательно перешли на французский язык, то называйте меня не месье, а ситуайен, что значит — гражданин"

как один из вариантов - почему нет, как мне по мне - вполне наглядное и легко настраиваемое решение

Lester добавил 26.01.2009 в 18:43
Цитата:
Сообщение от Marchello Посмотреть сообщение
Теперь к пану Lesterу, огласите весь список пожалуйста.
В смысле расскажите нам с высоты птичьего полета про ваш тулкит, а не по одному классу. Например список классов с кратчайшем описанием что для чего, ну в таком ключе.. А аудитория будет выбирать наиболее интересные вещи и просить их огласки (вот как с массивом). Это конечно если вы захотите.
это будет долго, толком начал я в принципе только в начале январе - многое еще не раз поменяется, ну и реализую я сейчас самые основы( базовые классы и виджеты уже есть, сейчас сайзеры делаю ) но базовое:
  • я отказался от монолитности - есть LT.so( dll ), он содержит все не связанное с gui напрямую( сайзеры, массивы, хэш-мапы, конфиг, контейнеры и т.д. и т.п. ), вся ОС специфическая часть с помощью интерфейсов вынесена в отдельные( автоматом подгружаемые ) библиотеки, я постарался свести к минимуму то, что там должно быть, что это дает - нет кучи #ifdef для разных ОС и как дополнительный бонус - можно использовать сторонний тулкит для создания виджетов, сейчас у меня есть такое дополнительное расширение для FLTK, будут для Qt, GTK, wxWidgets( это будет мега монстроидально ), Juce, Glui, Fox и т.п., благо писать много для реализации расширения не надо - сейчас расширение для FLTK статично с ним слинкованное весит 260Кб, т.е. всего-лишь указав параметр при инициализации можно получить гуй с использованием лишь winapi, cocoa, xlib, гуй для гнома, гуй для КДЕ и т.п., т.е. такой который впишется в любую ОС и DE, без всякого усилия от разработчика
  • упор сделан на минимизации труда при использовании тулкита, т.е. есть набор интефейсов, например рассмотрим I_TreeItem, реализовав который( пронаследовавшись от I_TreeItemImpl, в котором реализована вся логика ) - самому писать практически ничего не надо, можно просто указать виджетам( Tree, ColumnBrowser, List И т.п. ) его в качестве аргумента, и:
  1. мы автоматом покажем всю структуру
  2. мы не будем думать о синхронизации, можно иметь свой объект Table, наследованный от TreeItemImpl, если мы его удалим - он автоматом удалится везде из гуя, мы его создадим, указав в конструкторе "папу" - он автоматом добавится в гуй, точно также при изменении его свойств( иконка, подпись )
продолжать можно долго, я наверное все-таки буду писать тут последовательно - как и писал

Lester добавил 26.01.2009 в 18:47
Цитата:
Сообщение от zwitter Посмотреть сообщение
ну язвлю, да.
мне не нравится стиль автора.
сделал класс меню ?
ну засунь ты все меню в xml, там пропиши все пункты, иконки, action'ы, hot-key'и.
вгрузи его 1 вызовом и будет щастье.

вот тогда я скажу - да, это удобная штука, с радостью бы использовал
сомневаюсь, что это будет:
1. удобнее
2. читабельнее

но такое будет реализовано - причем не только для меню, но и для всего gui, ну и когда через пару месяцев будет рабочий вариант( с устоявшимися классами и интерфейсами ) я с удовольствием приму любые наработки( ес-но с сохранением всех авторских прав - и добавлением их автора в список разработчиков )

Lester добавил 26.01.2009 в 19:03
Цитата:
Сообщение от Marchello Посмотреть сообщение
Нужно где-то тулить DECLARE_ARRAY, потом DEFINE_ARRAY, а потом и саму переменную объявить.
Почему бы просто не написать шаблонный класс сразу? (собственно как vector<>).
Тогда пишем CustomArray<MyType> A; и готово. Может я не усмотрел где-то глубинный смысл задумки, но добавлять макросы в проект для каждого нового типа - реально неудобно.
тоже вариант - сделаю так отдельно

Цитата:
Сообщение от Marchello Посмотреть сообщение
Ладно.., дальше:
Код:
 T& operator[]( size_t index );
 T   operator[]( size_t index ) const;
Почему второй метод (константный) возвращает это, а не const T& ?
Ведь с константной ссылкой мы ничего не поменяем в классе name и в T - и это не нарушит иммутабельность. Вот этот момент хотелось бы подробней знать.
да - зевнул, уже исправил, спасибо

Цитата:
Сообщение от Marchello Посмотреть сообщение
Потом еще момент, есть конструктор который принимает указатель и кол-во элементов и создает массив.
Так вот ИМХО не помешало бы и такой метод иметь.
Например я создал массив (твой), поработал с ним, удалил все с него,
а потом хочу туда засунуть уже готовый массив (типа int a[64]) -
прийдется уже по одному делать Add(). То есть, можно добавить метод типа:
Код:
void FillFrom(size_t count, T* value );
ну это не критично конечно.
добавил - Import называется

Цитата:
Сообщение от Marchello Посмотреть сообщение
И последнее, метод Export, строка:
Код:
for( size_t i = 0 ; i < count ; ++i ) 
    res[ i ] = (T) ( mVector[ i ] );
Опять таки, почему (Т) ?
Ведь даже оператор присваивания принимает const name&, а так выходит что создается временный объект - он попадает в оператор присваивания, а потом удаляется.
И тут же момент, обычно Срр-шники юзают new/delete, а тут память выделяется через malloc, если этого не знать а потом вызвать
указателю delete [] - сам знаешь что будет. Но хотя если там написать
res = new T[count] - повызываются лишний раз конструкторы, тоже не хорошо.
исправил, надо будет мне пройтись по уже написанному - такие моменты найти и поисправлять, большое спасибо за критику и помощь

Lester добавил 26.01.2009 в 19:54
в том же Array в конструкторе name( size_t count, ... ) исправил на:

Код:
for( size_t i = 0 ; i < count ; ++i ) 
    Add( va_arg( vl, T ) );
было лишнее копирование
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 26.01.2009 в 19:55. Причина: Добавлено сообщение
Lester вне форума  
Ответить с цитированием
Старый 27.01.2009, 02:32   #19 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Интерфейс для хранения структурированных данных:

PHP код:
/**********************************************************************************************/
interface LTAPI I_Container
{
public:
//////////////////////////////////////////////////////////////////////////

virtual                            ~I_Containervoid )                            {}

public:
//////////////////////////////////////////////////////////////////////////

        //////////////////////////////////////////////////////////////////////////
        // Structure/Navigation

virtual void                    SetPath( const Stringpath ) = 0;
virtual String                    GetPathvoid ) const = 0;
 
virtual    ArrayString                GetGroupsvoid ) = 0;
virtual    ArrayString                GetEntriesvoid ) = 0;

virtual String                    GetFirstGroupvoid ) = 0;
virtual String                    GetNextGroupvoid ) = 0;
virtual String                    GetFirstEntryvoid ) = 0;
virtual String                    GetNextEntryvoid ) = 0;

virtual size_t                    GetNumberOfEntriesbool recursive false ) const = 0;
virtual size_t                    GetNumberOfGroupsbool recursive false ) const = 0;

virtual bool                    Delete( const Stringpath ) = 0;
virtual bool                    DeleteAllvoid ) = 0;

virtual bool                    Exist( const Stringpath ) const = 0;

virtual bool                    Rename( const StringoldName, const StringnewName ) = 0;

        
//////////////////////////////////////////////////////////////////////////
        // Read/Write single value

virtual bool                    Read( const Stringkeylongvaluelong defVal ) const = 0;
virtual long                    Read( const Stringkeylong defVal ) const = 0;

virtual bool                    Read( const Stringkeyboolvaluebool defVal ) const = 0;
virtual bool                    Read( const Stringkeybool defVal ) const = 0;

virtual bool                    Read( const Stringkeydoublevaluedouble defVal ) const = 0;
virtual double                    Read( const Stringkeydouble defVal ) const = 0;

virtual bool                    Read( const StringkeyStringvalueString defVal L"" ) const = 0;
virtual String                    Read( const Stringkey ) const = 0;

virtual bool                    Read( const Stringkeyvoid*& valuesize_tsize ) const = 0;
virtual bool                    Read( const StringkeyBitmapvalue ) const = 0;

virtual bool                    Write( const Stringkeylong value ) = 0;
virtual bool                    Write( const Stringkeydouble value ) = 0;
virtual bool                    Write( const Stringkeybool value ) = 0;
virtual bool                    Write( const Stringkey, const Stringvalue ) = 0;
virtual bool                    Write( const Stringkeyvoidvaluesize_t size ) = 0;
virtual bool                    Write( const Stringkey, const Bitmapvalue ) = 0;

virtual bool                    CreateIfAbsent( const Stringkeylong value ) = 0;
virtual bool                    CreateIfAbsent( const Stringkeydouble value ) = 0;
virtual bool                    CreateIfAbsent( const Stringkeybool value ) = 0;
virtual bool                    CreateIfAbsent( const Stringkey, const Stringvalue ) = 0;
virtual bool                    CreateIfAbsent( const Stringkeyvoidvaluesize_t size ) = 0;
virtual bool                    CreateIfAbsent( const Stringkey, const Bitmapvalue ) = 0;

        
//////////////////////////////////////////////////////////////////////////
        // Read/Write arrays

virtual bool                    Read( const StringkeyArrayLongvalue ) const = 0;
virtual bool                    Read( const StringkeyArrayBoolvalue ) const = 0;
virtual bool                    Read( const StringkeyArrayDoublevalue ) const = 0;
virtual bool                    Read( const StringkeyArrayStringvalue ) const = 0;
virtual bool                    Read( const StringkeyArrayBitmapvalue ) const = 0;

virtual bool                    Write( const Stringkey, const ArrayLongvalue ) = 0;
virtual bool                    Write( const Stringkey, const ArrayDoublevalue ) = 0;
virtual bool                    Write( const Stringkey, const ArrayBoolvalue ) = 0;
virtual bool                    Write( const Stringkey, const ArrayStringvalue ) = 0;
virtual bool                    Write( const Stringkey, const ArrayBitmapvalue ) = 0;

        
//////////////////////////////////////////////////////////////////////////
        // Other

virtual    void                    Flushvoid ) = 0;

public:
//////////////////////////////////////////////////////////////////////////

        //////////////////////////////////////////////////////////////////////////
        // Import/Export

virtual    String                    SaveToStringvoid ) = 0;
virtual    void                    SaveToBufvoid*& valuesize_tsize ) = 0;
virtual    void                    SaveToFile( const Stringpath ) = 0;

virtual    void                    LoadFromString( const Stringvalue ) = 0;
virtual    void                    LoadFromBufvoidvaluesize_t size ) = 0;
virtual    void                    LoadFromFile( const Stringpath ) = 0;

public:
//////////////////////////////////////////////////////////////////////////

        //////////////////////////////////////////////////////////////////////////
        // Options

virtual void                    SetCreateOnReadIfAbsentbool value ) = 0;
virtual    bool                    GetCreateOnReadIfAbsentvoid ) = 0;
}; 
Есть две реализации( которые наследуются от I_ContainerImpl, что позволяет значительно сократить код в них ): TextContainer и XMLContainer, первая хранит все в INI-формате , вторая в XML.

пример кода:
PHP код:
ArrayString list( 3"A""B""C" );

TextContainer container;
container.Write"/Arrays/List", list );
container.Write"/Simple/Long"1024 );
String export container.SaveToString();

list.
Clear();
 
TextContainer container2export );
container2.Read"/Arrays/List", list ); 
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 27.01.2009 в 09:55.
Lester вне форума  
Ответить с цитированием
Старый 27.01.2009, 10:50   #20 (Ссылка на пост)
Местные мы
 
Аватар для Marchello
Пол:
 
Активность Longevity
0/20 17/20
Today Сообщения
0/5 ssssss509
Благодарил(а): 457
Благодарили 620 раз в 179 постах
Галерея: 0
Вес репутации: 23 Marchello известное всем имяMarchello известное всем имяMarchello известное всем имяMarchello известное всем имяMarchello известное всем имя
Я как любитель gamedev-а всегда склонен к быстродействию кода, поэтому стараюсь обращать внимание на изъяны в этом.
Поэтому методы:
Код:
virtual String      GetPath( void ) const = 0;
virtual ArrayString GetGroups( void ) = 0;
virtual ArrayString GetEntries( void ) = 0;
virtual String      GetFirstGroup( void ) = 0;
virtual String      GetNextGroup( void ) = 0;
// и т.д.
у меня вызывают некоторые волнения (думаю понятно почему), а особенно те которые возвращают ArrayString.
ИМХО лучше возвращать const String& или const String* (это предпочтительней).
А если же предполагается возвращать объекты из стека метода,
то можно даже так написать:
Код:
void GetEntries( ArrayString* s)
{
  // тут мы заполняем сразу 's' и никаких стековых объектов
}
выглядит чуть уродливей но эффективно.

И еще на счет массива, у тебя все методы виртуальные, а класс определен в виде макроса. То есть, если и наследоваться от него
то только уже от конкретной реализации (с конкретным типом) - тоже не функционально. К тому же объявление методов виртуальными скорости не добавляет. А если отказаться от виртуальности (и от макросовости) - можно с половину методов сделать с inline (правда нужно чтобы эти методы были в h файле, хотя если отказаться от макроса - нужно делать шаблоном, а с шаблонами - все методы будут в h файле )) ).
Marchello вне форума  
Ответить с цитированием
Старый 28.01.2009, 01:29   #21 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Цитата:
Сообщение от Marchello Посмотреть сообщение
Я как любитель gamedev-а всегда склонен к быстродействию кода, поэтому стараюсь обращать внимание на изъяны в этом.
Поэтому методы:
Код:
virtual String      GetPath( void ) const = 0;
virtual ArrayString GetGroups( void ) = 0;
virtual ArrayString GetEntries( void ) = 0;
virtual String      GetFirstGroup( void ) = 0;
virtual String      GetNextGroup( void ) = 0;
// и т.д.
у меня вызывают некоторые волнения (думаю понятно почему), а особенно те которые возвращают ArrayString.
ИМХО лучше возвращать const String& или const String* (это предпочтительней).
А если же предполагается возвращать объекты из стека метода,
то можно даже так написать:
Код:
void GetEntries( ArrayString* s)
{
  // тут мы заполняем сразу 's' и никаких стековых объектов
}
выглядит чуть уродливей но эффективно.
согласен - теперь возвращается const String& и const ArrayString&, GetEntries и GetGroups теперь принимают в качестве аргумента ArrayString&

Цитата:
Сообщение от Marchello Посмотреть сообщение
И еще на счет массива, у тебя все методы виртуальные, а класс определен в виде макроса. То есть, если и наследоваться от него
то только уже от конкретной реализации (с конкретным типом) - тоже не функционально. К тому же объявление методов виртуальными скорости не добавляет. А если отказаться от виртуальности (и от макросовости) - можно с половину методов сделать с inline (правда нужно чтобы эти методы были в h файле, хотя если отказаться от макроса - нужно делать шаблоном, а с шаблонами - все методы будут в h файле )) ).
и опять спасибо вариант с шаблоном я пока занес в TODO
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 28.01.2009 в 08:50.
Lester вне форума  
Ответить с цитированием
Старый 31.01.2009, 13:08   #22 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
наверное в ближайшую неделю не буду здесь отписываться - пока занят работой + написанием нового кода, время на исправления( еще раз спасибо Marchello и zwitter за замечания ) не будет, пока добавил новый виджет для отображения TreeItem(s), поддержку текстур для виджетов( потом отдельно опишу, но принцип очень простой - достаточно указать картинку:

Название:  pressed.png
Просмотров: 286

Размер:  414 байт
Название:  pressed_win.png
Просмотров: 263

Размер:  2.3 Кбайт

например так:

button->SetThemeBitmap( BITMAP_BUTTON_PRESSED, Bitmap( "pressed.png" ), 3, 3, 3, 3 ); // 3, 3, 3, 3 - границы по бокам, которые не будут растягиваться

и все, также в TreeItem добавлена возможность использовать check-state, а также помимо иконки можно указать функцию для отрисовки - которой отдаются координаты, что дает возможность создавать аимации, без написания дополнительного кода для этого, если же стоит флаг использовать анимации, а функция не указана - будет масштабироваться заданная иконка )

вот видео всего этого:

1.flv ( переименовал avi в flv - чтоб загрузить на форум, но у меня открывается и с этим расширением )
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 31.01.2009 в 13:12.
Lester вне форума  
Ответить с цитированием
Сказали Спасибо пользователю Lester за этот пост:
TIGR (31.01.2009)
Старый 31.01.2009, 13:16   #23 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
кстати теперь Bitmap( "pressed.png" ) может автоматом добавлять картинку в глобальный BitmapRepository( один флаг в SystemSettings - стоит по умолчанию ), и если вызвать этот конструктор еще раз с тем же параметром( для того же файла - идет проверка по абсолютному пути + дате изменения + размеру ) - повторной загрузки и декодирования картинки не будет
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 31.01.2009 в 14:10.
Lester вне форума  
Ответить с цитированием
Старый 27.02.2009, 13:08   #24 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
В связи с загрузкой на работе долго ничего не делал, сейчас понемногу наверстываю( в основном рутинные вещи реализую ), на данный момент в общем виде сделал обработку событий, ничего нового не придумал как сдереть идею MFC и wxWidgets:

PHP код:
BEGIN_EVENT_TABLEThemedButton )
    
EVT_PAINTThemedButton::OnPaint )
END_EVENT_TABLE

...

/**********************************************************************************************/
void ThemedButton::OnPaintEventevent )
{
    
PaintDC dcthis );
    
dc.SetBrushRED );
    ... 
также можно написать:

PHP код:
button->ConnectLT_EVENT_PAINTEventHandlerThemedButton::OnPaint ) ); 
для отправки событий есть глобальные функции:

PHP код:
PostEventbuttonLT_EVENT_PAINT );
PostEventbuttonLT_EVENT_KEY_DOWNevent ); // тут мы должны сами инициализировать переменную event, чтоб передать необходимые данные в обработчик 
хотелось бы услышать пожелания по поводу как было бы удобнее организовать обработку событий, да и вообще какие есть варианты

Lester добавил 27.02.2009 в 17:29
Думаю вот реализовать такую фичу, чтоб можно было любому виджету сказать:

dialog->Save() - и он запомнил все свои параметры + параметры всех дочерних виджетов в конфиг приложения, а по dialog->Load() - загружал, т.е. например значения текстовых полей, чекбоксов, скроллов и т.п., ну и ес-но предусмотреть сохранение/загрузку в разные форматы/места, вобщем что-то вроде сериализации

Lester добавил 28.02.2009 в 09:15
Пока делаю виджеты с поддержкой тем, раньше было просто:

PHP код:
button->SetThemeBitmapBITMAP_BUTTON_PRESSEDBitmap"pressed.png" ), 333); // 3, 3, 3, 3 - границы по бокам, которые не будут растягиваться 
теперь есть Style - набор стилей для всех виджетов, можно получить по имени, сохранить/загрузить в файл и т.п.

Он уже хранит в себе ButtonStyle, CheckButtonStyle etc., каждый из которых также может быть сохранен/загружен

Тут уже сложнее - в каждом стиле для отдельного виджета есть разные элементы, есть два варианта для их отрисовки - текстуры и метафайлы( последовательность шагов - нарисуй линию, нарисуй точку и т.п. ), второе будет быстрее работать, меньше занимать места и следовательно лучше подойдет для слабого железа( например моей n810 ). Когда будет время сделаю редактор стилей.

Каждый виджет с поддержкой стилей по умолчанию использует текущий глобальный стиль, который можно переключать, но ему можно "сказать" использовать другой Style( а также ButtonStyle и т.п. )

Lester добавил 28.02.2009 в 09:35
Пару слов про реализацию Metafile в моем тулките

MetafileDC - такой же DC( DC - то же что и канва ) как и для рисования на экране, в принтер, в ПДФ и т.д., после рисования на нем можно получить Metafile

Metafile - набор операций для рисования, что-то вроде своего формата навроде SVG( кстати добавил поддержку SVG в тулкит - теперь его можно нарисовать на DC )

MetafilePlayer - берет Metafile и рисует на любом DC, т.е. написав функцию, которая нарисует, например, график, мы берем полученный Metafile и отдав его MetafilePlayer + указав DC ( куда хотим сохранить - PDF, Postscript, Latex, ODT, PNG, SVG, HTML и т.д. - в том числе можно просто отрисовать на экране, применяя любой масштаб ) получаем экспорт в нужный формат без всякого усилия со своей стороны
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 28.02.2009 в 09:35. Причина: Добавлено сообщение
Lester вне форума  
Ответить с цитированием
Старый 13.04.2009, 08:01   #25 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
растет пока проект - много переписал, т.к. понял, что ужасно, в частности самый первый пример - массивы:

PHP код:
/**********************************************************************************************/
templatetypename T >
class 
LTEXPORT Array
{
public:
//////////////////////////////////////////////////////////////////////////

    //////////////////////////////////////////////////////////////////////////
    // Define functions types

        
typedef                 bool(*ArrayIfFunction)( const T& );
        
typedef                 bool(*ArraySortFunction)( const T&, const T& );

public:
//////////////////////////////////////////////////////////////////////////

    //////////////////////////////////////////////////////////////////////////
    // Constructors

                                
Array( ArrayKind kind ARRAY_SIMPLE );
                                Array( 
ArraySortFunction func );
                                Array( 
size_t count );
                                Array( 
size_t countT value, ... );
                                Array( 
size_t countTvalue );
                                Array( const 
std::vector<T>& value );
                                Array( const Array<
T>& value );

public:
//////////////////////////////////////////////////////////////////////////

    //////////////////////////////////////////////////////////////////////////
    // Add/Remove

        
void                    Add( const Titemsize_t count );
        
void                    Add( const Array<T>& value );

        
void                    Clearvoid );

        
void                    Insertsize_t index, const Titemsize_t count );
        
void                    Insertsize_t index, const Array<T>& value );

        
void                    Prepend( const Titemsize_t count );
        
void                    Prepend( const Array<T>& value );

        
void                    Remove( const Titem );
        
void                    Remove( const Array<T>& value );
        
void                    RemoveAtsize_t indexsize_t count );
        
void                    RemoveFirstsize_t count );
        
void                    RemoveIfArrayIfFunction func );
        
void                    RemoveLastsize_t count );
        
void                    RemoveRangesize_t startsize_t end size_t( -) );

        
void                    Resizesize_t size );

public:
//////////////////////////////////////////////////////////////////////////

    //////////////////////////////////////////////////////////////////////////
    // Items Access

        
const Array<T>&         Copysize_t startsize_t end size_t( -) ) const;
        const Array<
T>&         CopyIfArrayIfFunction func ) const;

        
size_t                  Countvoid ) const;
        
size_t                  CountIfArrayIfFunction func ) const;

        
T&                      Itemsize_t index );
        
T&                      Firstvoid );
        
T&                      Lastvoid );

        const 
T&                Itemsize_t index ) const;
        const 
T&                Firstvoid ) const;
        const 
T&                Lastvoid ) const;

public:
//////////////////////////////////////////////////////////////////////////

    //////////////////////////////////////////////////////////////////////////
    // Search

        
long                    Index( const Titem ) const;
        const Array<
size_t>&    FindAll( const Titem );
        
long                    FindFirst( const Titem );
        
long                    FindLast( const Titem );

        
long                    Index( const Array<T>& values ) const;
        const Array<
size_t>&    FindAll( const Array<T>& values );
        
long                    FindFirst( const Array<T>& values );
        
long                    FindLast( const Array<T>& values );

        
long                    FindNextvoid );

public:
//////////////////////////////////////////////////////////////////////////

    //////////////////////////////////////////////////////////////////////////
    // Sort

        
void                    MakeSortedbool sorted truebool desc false );
        
void                    MakeSortedArrayKind kind );
        
void                    MakeSortedArraySortFunction func );

        
void                    Sortbool desc false );
        
void                    Sortsize_t startsize_t end size_t( -), bool desc false );
        
void                    SortArraySortFunction func );

public:
//////////////////////////////////////////////////////////////////////////

    //////////////////////////////////////////////////////////////////////////
    // Mutators

        
void                    Fill( const Tvaluesize_t start 0size_t end size_t( -) );
        
void                    FillIf( const TvalueArrayIfFunction func );
        
void                    Replace( const Tfrom, const Tto );
        
void                    Replace( const Array<T>& from, const Array<T>& to );
        
void                    ReplaceIf( const Tfrom, const TtoArrayIfFunction func  );
        
void                    Reversesize_t start 0size_t end size_t( -) );
        
void                    Rotatelong count );
        
void                    Swapsize_t asize_t b );
        
void                    Swapsize_t start1size_t countsize_t start2 );
        
void                    Swap( Array<T>& value );
        
void                    Intersect( Array<T>& value );
        
void                    Uniquevoid );

public:
//////////////////////////////////////////////////////////////////////////

    //////////////////////////////////////////////////////////////////////////
    // Other

        
bool                    Contain( const Array<T>& value ) const;

        
bool                    Equal( const Array<T>& value ) const;
        
bool                    Equal
                                      const Array<
T>&        value
                                      
size_t                start1
                                      
size_t                count
                                      
size_t                start2 ) const;

        const 
T&                Maxvoid ) const;
        const 
T&                MaxArraySortFunction func ) const;

        const 
T&                Minvoid );
        const 
T&                MinArraySortFunction func ) const;

public:
//////////////////////////////////////////////////////////////////////////

    //////////////////////////////////////////////////////////////////////////
    // Export/Import

        
void                    FromArraysize_t countTvalue );
        
void                    FromFile( const Stringpath );
        
void                    FromString( const Stringvalue );
        
void                    FromVector( const std::vector<T>& value );
        
void                    FromXML( const Stringvalue );

        
T*                      ToArrayvoid ) const;
        
void                    ToFile( const Stringpath );
        const 
String&           ToStringvoid ) const;
        const 
std::vector<T>&   ToVectorvoid ) const;
        const 
String&           ToXMLvoid ) const;


public:
//////////////////////////////////////////////////////////////////////////

    //////////////////////////////////////////////////////////////////////////
    // Operators

        
Array<T>                operator+( const Tvalue );
        Array<
T>                operator+( const Array<T>& value );
        Array<
T>&               operator+=( const Tvalue );
        Array<
T>&               operator+=( const Array<T>& value );
        Array<
T>&               operator=( const Array<T>& value );
        
bool                    operator==( const Array<T>& value ) const;
        
bool                    operator!=( const Array<T>& value ) const;
        
T&                      operator[]( size_t index );
        const 
T&                operator[]( size_t index ) const;
}; 
пришлось частично обрезать - ограничение на длину сообщения, вообще учел все замечания zwitter'а и Marchelo, любой массив можно сделать отсортированным, новые элементы будут вставлятся так, что сохранить порядок, ес-но поиск и родственные операции( замена и т.п. ) работают с бинарным алгоритмом, вот архив:

ARRAY.ZIP

в остальном библиотека ощутимо выросла - больше 2Мб кода, не считая тестов, сейчас пишу плагин для поддержки wx, fktk уже на 80% готов, кстати отказался от идеи писать все абсолютно с нуля - за основу взят обрезанный вариант fltk, из которого выдраны все ненужные классы, благо ничего быстрее, удобнее и компактнее( статически слинкованный диалог на fltk весит около 100кб ) под все популярные ОС не найти, а мне немного надо - обработка основных событий и отрисовка примитивов + текста, ес-но плагин для использовния fltk "as is" также останется
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?
Lester вне форума  
Ответить с цитированием
Сказали Спасибо пользователю Lester за этот пост:
zwitter (13.04.2009)
Старый 17.04.2009, 20:55   #26 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Несколько моих бредовых идей по стилю написания кода гуи( ес-но это альтернативный вариант и пользоваться им необязательно ):

Пример цельного куска кода:
PHP код:
    // IDs
    
enum
    
{
        
ID_ITEMS,
        
ID_CHECK_ALL,
        
ID_UNCHECK_ALL
    
};

    
// Create
    
Dialog dlg =
    
DIALOGcaption );
    
VLAYOUT
        LABEL
ID_ANY"Select one of:" )
        
HLAYOUT
            CHK_LISTBOX
ID_ITEMSchoices )
            
VLAYOUT
                BMP_BUTTON
ID_CHECK_ALLplus_xpm );
                
BMP_BUTTONID_UNCHECK_ALLminus_xpm );
            
END_LAYOUT
        END_LAYOUT
        STD_BUTTONS
ID_OK ID_CANCEL );
    
END_LAYOUT

    
// Pointers
    
CheckListBoxitems = (CheckListBox*) dlg->FindByIDID_ITEMS );
    
BitmapButtoncheck = (BitmapButton*) dlg->FindByIDID_CHECK_ALL );
    
BitmapButtonuncheck = (BitmapButton*) dlg->FindByIDID_UNCHECK_ALL );

    
// Actions
    
check->SetActionID_ITEMSACTION_CHKLISTBOX_CHECK_ALL );
    
uncheck->SetActionID_ITEMSACTION_CHKLISTBOX_UNCHECK_ALL );

    
// Update
    
check->EnableIfID_ITEMSIF_NON_EMPTY );
    
uncheck->EnableIfID_ITEMSIF_NON_EMPTY ); 
теперь по шагам:

1. список ID

PHP код:
    enum
    
{
        
ID_ITEMS,
        
ID_CHECK_ALL,
        
ID_UNCHECK_ALL
    
}; 
тут все понятно, каждый виджет может иметь уникальный ID, которые мы описываем перед созданием гуи, ес-но есть глобальный список преодпределенных ID - например ID_ANY

2. Создание гуи:

PHP код:
    Dialog dlg =
    
DIALOGcaption );
    
VLAYOUT
        LABEL
ID_ANY"Select one of:" )
        
HLAYOUT
            CHK_LISTBOX
ID_ITEMSchoices )
            
VLAYOUT
                BMP_BUTTON
ID_CHECK_ALLplus_xpm );
                
BMP_BUTTONID_UNCHECK_ALLminus_xpm );
            
END_LAYOUT
        END_LAYOUT
        STD_BUTTONS
ID_OK ID_CANCEL );
    
END_LAYOUT 
тут с помощью макросов создаются сайзеры и виджеты, думаю тут тоже все ясно

3. получение указателей на виджеты

PHP код:
    CheckListBoxitems = (CheckListBox*) dlg->FindByIDID_ITEMS );
    
BitmapButtoncheck = (BitmapButton*) dlg->FindByIDID_CHECK_ALL );
    
BitmapButtonuncheck = (BitmapButton*) dlg->FindByIDID_UNCHECK_ALL ); 
4. назначение действий

PHP код:
    check->SetActionID_ITEMSACTION_CHKLISTBOX_CHECK_ALL );
    
uncheck->SetActionID_ITEMSACTION_CHKLISTBOX_UNCHECK_ALL ); 
здесь мы можем привязать одни виджеты к другим - у каждого типа виджетов есть набор действий( которые в принципе дублируют методы этого типа ), мы можем связать дефолтное действие для одного виджета на произвольное действие другого, в том числе можем указать аргумент для действия, например так:

button->SetAction( ID_LABEL, ACTION_LABEL_SET_TEXT, "Sample Text" );

5. автоматическое обновление

PHP код:
    // Update
    
check->EnableIfID_ITEMSIF_NON_EMPTY );
    
uncheck->EnableIfID_ITEMSIF_NON_EMPTY ); 
здесь мы указываем, что кнопки будут активны только, если виджет с ID - ID_ITEMS не пустой( в данном случае список имеет одну или несколько строк ), варианты:

check->EnableIf( ID_TEXT, IF_VALUE_EQUAL, "Sample" );
check->ShowIf( ID_CHECKBOX, IF_CHECKED );
label->LabelIf( ID_CHECKBOX, IF_CHECKED, "Checked", "Not Checked" );
checkbox->CheckIf( ID_TEXT, IF_NON_EMPTY );


Все это, чтоб не писать лишний раз обработчики событий( ввод текста, нажатие клавиш, выбор чекбокса и т.п. ).

Lester добавил 18.04.2009 в 12:20
насчет:

PHP код:
check->EnableIfID_TEXTIF_VALUE_EQUAL"Sample" );
check->ShowIfID_CHECKBOXIF_CHECKED );
label->LabelIfID_CHECKBOXIF_CHECKED"Checked""Not Checked" );
checkbox->CheckIfID_TEXTIF_NON_EMPTY ); 
т.к. у многих виджетов будет использоваться практически одно и то же свойство( IF_CHECKED для чекбоксов, IF_NON_EMPTY для полей ввода и т.д. ), то добавил сокращенные варианты:

PHP код:
check->ShowIfID_CHECKBOX );
checkbox->CheckIfID_TEXT ); 
ес-но это все будет отражено в моем IDE в редакторе GUI
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 18.04.2009 в 12:23. Причина: Добавлено сообщение
Lester вне форума  
Ответить с цитированием
Старый 03.05.2009, 14:50   #27 (Ссылка на пост)
Местные мы
 
Аватар для Marchello
Пол:
 
Активность Longevity
0/20 17/20
Today Сообщения
0/5 ssssss509
Благодарил(а): 457
Благодарили 620 раз в 179 постах
Галерея: 0
Вес репутации: 23 Marchello известное всем имяMarchello известное всем имяMarchello известное всем имяMarchello известное всем имяMarchello известное всем имя
Цитата:
Сообщение от Lester Посмотреть сообщение
растет пока проект - много переписал, т.к. понял, что ужасно, в частности самый первый пример - массивы
Вот у меня есть пара вопросов (даже не вопросов а мыслей..). Да, массив получился навороченей некуда )) я даже все и не смотрел.
Вот например метод FromArray, ты там юзаешь memcpy для того чтобы заполнить масив в this извне.
Но ведь при таком раскладе не будут вызываться операторы '=' для
кастумных типов. Хотя может тут какой-то скрытый смысл?

И потом, скольо весит пустой такой массив? У меня в 2008 студии пустой вектор весит 20 байт (и 24 в релизе), тогда у тебя выйдет где-то:
(20+20+20) + 6*4 (bool, size_t, ArraySortFunction) + 2*sizeof(T) +
+ размер String (который будет минимум 4*2 байт) = 100 байт для типа int.
А потом еще вызывается reserve(256) в конструкторе...
Короче, такой пустой масив это == int[25]
Хотя память сейчас не критична.

Я вот думаю даже иметь две реализации класса массива - первая ну как обычно, и вторая - для типов не имеющих кастумного оператора присваивания (аля POD). Тогда для простых типов можно будет
повсевместно юзать memcpy - что упростит и ускорит это дело, ну и в таком случае конечно не использовать std::vector, будет такой себе PlainArray - конечно с меньшей функциональностью, но зато шустрый (что важно для gamedev-a).
Marchello вне форума  
Ответить с цитированием
Старый 03.05.2009, 15:24   #28 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Цитата:
Сообщение от Marchello Посмотреть сообщение
Вот например метод FromArray, ты там юзаешь memcpy для того чтобы заполнить масив в this извне.
Но ведь при таком раскладе не будут вызываться операторы '=' для
кастумных типов. Хотя может тут какой-то скрытый смысл?
нет - просто сделал под себя, С-ые массивы не нуждаются в операторе копирования( т.к. в C нет классов ), а в С++ я использую vector, согласен - я предопределю этот метод для базовых типов, а для остальных сделаю через явное копирование

Цитата:
Сообщение от Marchello Посмотреть сообщение
И потом, скольо весит пустой такой массив? У меня в 2008 студии пустой вектор весит 20 байт (и 24 в релизе), тогда у тебя выйдет где-то:
(20+20+20) + 6*4 (bool, size_t, ArraySortFunction) + 2*sizeof(T) +
+ размер String (который будет минимум 4*2 байт) = 100 байт для типа int.
обычно содержимое массива значительно больше 100 байт, в данном случае я думаю это оправданная трата ресурсов, но конечно же посмотрю где можно будет соптимизировать, спасибо за совет

Цитата:
Сообщение от Marchello Посмотреть сообщение
А потом еще вызывается reserve(256) в конструкторе...
он позволит в большинстве случаев обойтись без лишних движений по мере заполнения массива, как по мне затраты на выделение/перемещение блоков памяти для каждого нового элемента стоят большего внимания чем небольшой перерасход памяти

Цитата:
Сообщение от Marchello Посмотреть сообщение
Я вот думаю даже иметь две реализации класса массива - первая ну как обычно, и вторая - для типов не имеющих кастумного оператора присваивания (аля POD). Тогда для простых типов можно будет
повсевместно юзать memcpy - что упростит и ускорит это дело
как я уже писал - можно просто переопределить этот метод для таких типов, например - void Array<char>::FromArray, благо шаблоны позволяют такое

Цитата:
Сообщение от Marchello Посмотреть сообщение
ну и в таком случае конечно не использовать std::vector, будет такой себе PlainArray - конечно с меньшей функциональностью, но зато шустрый (что важно для gamedev-a).
лично проведенные бенчмарки( на массивах из пяти миллионов элементов ) показали, что vector ничем не уступает С-массиву по скорости, видно оптимизация все разворачивает в работу с тем же С-массивом
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?
Lester вне форума  
Ответить с цитированием
Старый 15.07.2009, 15:08   #29 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
0/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,441
Благодарили 5,833 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
давно не отписывался( но работа идет и быстрыми темпами ), сейчас закончил новую фишку - парсер для текста на разных языках программирования, работает все просто:

Lexer lexer( LEX_CPP );
lexer.Parse( text );
String html = lexer.AsHTML();

парсеру можно отдать свой список ключевых слов, переменных, типов и т.д., от парсера также можно получить список стилей( массив размером с исходную строку с индексами стилей ), в TODO - экспорт в RTF, PDF etc., простая привязка к GUI.

Вот пример использования:
Название:  111.png
Просмотров: 141

Размер:  7.8 Кбайт

тут не все видно, но строки, числа и т.п. тоже подсвечиваются как надо
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?
Lester вне форума  
Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей - 0 , гостей - 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.


Время на сервере: 06:50.

Регистрация Справка Пользователи Календарь Поиск Сообщения за день Все разделы прочитаны

vBulletin 3, Copyright © 2000-2024, Jelsoft Enterprises Ltd.
Русский перевод: zCarot, Vovan & Co