Delphi programming blog
Источник: http://teran.karelia.pro/articles/item_4500.html
 

FireMonkey и MyShows.ru #2

Опубликовано 19.12.2011 г. 00:06

Время до окончания конкурса FireMOnkey к сожалению остается все меньше и меньше, а дела у меня особо не двигаются, а еще и очередная командировка впереди. Тем временем вышел Update 3 для Delphi XE2, и принес нам исправления некоторых ошибок.

После установки 3го обновления Delphi при открытии проекта, и после пары кликов мышкой встретил меня таким вот сообщением:
 
Последовав тому, что прочитал, больше такого я ни разу не видел. Кстати обратите внимание, какими стали текстовые надписи на фоне - такое действие AutoSize появилось после Update 3, раньше не было. Редактор стилей избавился от одного старого бесячего бага - при редактировании свойств изменялся активный элемент в дереве справа. Жаль только не появилось перетаскивание элементов. Немного странно стало себя вести выравнивание на форме в режиме проектирования. Баг показан на рисунке ниже:
 
Как видите выбранный элемент MainLayout имеет Align = alClient, и по идее должен бы растягиваться на всю форму, но это не так. Но изменения align вообще никак не влияет на отображение в режиме редактирования. Правда при запуске приложения все нормально. В прошлый раз писал, что можно искать стили с помощью FindBinding. Можно, но без вложенности, так что таки лучше использовать FindStyleResource. Еще были проблемы с понимаем того, как создавать анимации например, при наведении на элемент списка. Тут все оказалось просто, чтобы получать общий MouseMove элемента, надо отключить HitTest для всех стилевых элементов составляющих его, чтобы они не перехватывали мышь. С заполнением списка у меня до сих пор остается проблема. В первый раз список заполняется не корректно. Не знаю чем это связано, ибо код заполнения ничем не отличается совсем:

Как видно на рисунке слева, текст подписей "рейтинг" и "просмотрено" куда то явно уезжает. Применил стиль к элементам формы. Имхо тут есть одно неудобство. Когда мы загружаем стиль - он загружается в отдельный StyleBook. А я допустим хочу создать для TTabControl собственный стиль, но основанный на этом загруженном. И суть в том, что стили для своих нужд было бы удобно хранить в отдельной книге стилей. Но если я жму на Edit Custom Style, то стиль создается в общей. И не понятно как его можно перетащить в свою книгу. Хотя мб поможет переключение StyleBook свойства формы. Что касается стилей и TTabControl то тут имеется некоторый косяк отображения в редакторе:

В данном случае в дереве структуры выбрана первая вкладка, а выделение в редакторе смещено куда то вниз. Поэтому невозможно ткнуть мышью в элемент, получить контекстное меню, и нажать "Edit Custom Style" для вкладки. Кстати сказать, как то только я добавил tabControl на форму, такого не было, а появилось немного позже. Стили вкладки я хотел редактировать, чтобы изменить размер шрифта. Оказалось что шрифт настраивается просто в инспекторе объектов вкладки. Удивился. Забавно с одной стороны, что у каждой вкладки можно настроить свой шрифт. С другой стороны, в половине случаев и не удобно. Для загрузки данных с INDY использовал потоки. Вообще я решил полностью переписать клиент. Даже работу с API и вспомогательные классы представления сериалов и эпизодов. Класс потока для API имеет следующий вид, и использует анонимные методы:
    TApiExecProc = reference to procedure(api : TShowsApi; var data : pointer);
    TApiDoneProc = reference to procedure(data : pointer);

    TApiThread = class (TThread)
      strict private
        FApi : TShowsApi;
        FData : pointer;
        FExecProc : TApiExecProc;
        FDoneProc : TApiDoneProc;
        procedure Done();
      public
        constructor Create(); overload;
        constructor Create(ExecuteProc : TApiExecProc); overload;
        destructor Destroy(); override;

        procedure Execute(); override;

        property ExecProc : TApiExecProc read FExecProc write FExecProc;
        property DoneProc : TApiDoneProc read FDoneProc write FDoneProc;
        property Api : TShowsApi read FApi;
    end;
и используется например так:
procedure TMyShows.Load();
var at : TApiThread;
begin
    at := TApiThread.Create();

    at.ExecProc := procedure(api : TShowsApi; var data : pointer)
            begin
                data := api.LoadShowsList();
            end;
    at.DoneProc := procedure(data : pointer)
            begin
                self.setShows(TShowsList(data));
            end;

    at.Start();
end;
где DoneProc выполняется уже в главном потоке, т.е через Synchronize. Анонимные методы весьма клевая штука. API получает ответы в формате JSON. Для работы решил использовать DBXJSON. Недавно читал статью Влада Баженова про JSON в Delphi, так что получил первое представление, его мне впрочем достаточно оказалось (: В старом клиенте использовалась библиотека SuperObject (о ней впрочем тоже прочитал на webdelphi.ru). DBX намного лучше, имхо. При запуске приложение занимает все так же 32Мбайта памяти (по сравнению с тем как было до Update 3). покликав немного объем вырастает до 55 Мбайт. Если развернуть на полный экран, то становится 90Мбайт, и уменьшается обратно если уменьшить размер окна. Сделал выделение текущего элемента в списке, ранее мне мешали hittest в стилях. Не знаю что делать с рамкой TListBox и TTabControl (видны на скриншоте ниже). Стилями их кажется не убрать никак:

На конкурс конечно не тянет, но зато интересно (: Пока что не использовал ничего такого, что привязано к Windows. Мб и под Mac скомпилируется? (:
Метки:  MyShows API  |  Delphi XE2  |  FireMonkey 

Комментарии

Victor
19.12.2011 в 14:24
Рамка TListBox убирается прописыванием в инспекторе свойств StyleLookup = 'transparentlistboxstyle'. А у TabControl рамку убрать можно через редактирование стиля Stroke.Kind = bkNone
ter
19.12.2011 в 14:03
о, пасиб. а то я че то поискал и не нашел сходу.

зы: StyleLookup для листбокса такой юзать не получится, ибо у меня свой стиль там, так что тоже стилями. Хотя вобще можно и заюзать, ибо в моем стиле только фон bkNone стоит вроде как.
- Имя
- e-mail*
- Сайт
вы можете использовать теги [i],[b],[code],[quote]
Дополнительно