Перейти к содержанию
Fire Monkey от А до Я

Axbor

Пользователи
  • Постов

    159
  • Зарегистрирован

  • Посещение

  • Победитель дней

    6

Активность репутации

  1. Like
    Axbor получил реакцию от Kitty в Как реализовать Edit с автозаполнением на С++   
    Решил проблему с добавлением Unit  вот такого вида:
    unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Controls.Presentation, FMX.Edit; procedure setmodeldata(Edit: TEdit); implementation uses System.Rtti; procedure setmodeldata(Edit: TEdit); var SuggestionList: TArray<string>; begin SuggestionList := ['Россия', 'Украина', 'Белорусь', 'Азербайджан', 'Армения', 'Грузия', 'Казахстан', 'Киргизстан', 'Латвия', 'Литва', 'Молдавия']; Edit.Model.Data['suggestion_list'] := TValue.From < TArray < string >> (SuggestionList); end; end. и вызвал функцию setmodeldata с моей формы.
  2. Like
    Axbor получил реакцию от Rusland в Как реализовать Edit с автозаполнением на С++   
    Решил проблему с добавлением Unit  вот такого вида:
    unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Controls.Presentation, FMX.Edit; procedure setmodeldata(Edit: TEdit); implementation uses System.Rtti; procedure setmodeldata(Edit: TEdit); var SuggestionList: TArray<string>; begin SuggestionList := ['Россия', 'Украина', 'Белорусь', 'Азербайджан', 'Армения', 'Грузия', 'Казахстан', 'Киргизстан', 'Латвия', 'Литва', 'Молдавия']; Edit.Model.Data['suggestion_list'] := TValue.From < TArray < string >> (SuggestionList); end; end. и вызвал функцию setmodeldata с моей формы.
  3. Like
    Axbor получил реакцию от Rusland в Ошыбка Bitmap size too big   
    Сами задаем сами отвечаем.
    Изменения высоты
    Latifa1Layout->Height = Latifa1Caption->Height + Latifa1Text->Height + 20; сделал в Label(OnResize) и всё. Ошибка исчез.
  4. Thanks
    Axbor получил реакцию от PowerOwl в Диалоговое окно на Андроид.   
    Хотел бы поделиться опытом. Рассмотрим случай, когда вам необходимо использовать кастомное диалоговое окно с затемнением. Вроде вот такого:
    Первое, что приходит в голову, это использование Rectangle’ов. Но такой подход показался мне очень сложным, и я нашёл другой способ (многие о нём уже знают) создания кастомного окна.
    Сам способ:
    Создаем вторую форму, и изменяем следующие свойства:
    Transparency = True Fill->Color = #78000000 Fill->Kind = Solid Поместим туда один TLayout, выставим свойство «Align» в значение «Center». И зададим нужный размер. Потом кидаем на TLayout компонент «TRectangle» со свойством «Align – Content». Чтобы TLayout не мешался во время design-time, присвоим свойству Locked значение True. Кидаем остальные компоненты, чтобы получить окно нужного нам вида.
    В итоге у меня получилась вот такая иерархия компонентов:

    Компонент TRectAnimation используем для анимирования процесса появления окна. Вы можете придумать свою анимацию. В данном случае анимируется свойства формы «Padding».
    Напишем следующий код, для того, чтобы при клике на тёмную область формы окно закрылось (событие формы OnTap работает на сенсорных экранах, если вам нужен OnClick тогда воспользуйтесь Layout’ми или Rectangle’ми):
    void __fastcall TForm2::FormTap(TObject *Sender, const TPointF &Point) { Close(); } Вот и всё. К сообщению, я приложил демо приложение с примером такого окна.
    У администраторов просил бы поправить допущенные ошибки так как я не владею русским языком очень хорошем уровне. Или же добавит кое какие дополнительные информации ссылки и т.д.
      Demo.zip
  5. Like
    Axbor получил реакцию от Rusland в Диалоговое окно на Андроид.   
    Хотел бы поделиться опытом. Рассмотрим случай, когда вам необходимо использовать кастомное диалоговое окно с затемнением. Вроде вот такого:
    Первое, что приходит в голову, это использование Rectangle’ов. Но такой подход показался мне очень сложным, и я нашёл другой способ (многие о нём уже знают) создания кастомного окна.
    Сам способ:
    Создаем вторую форму, и изменяем следующие свойства:
    Transparency = True Fill->Color = #78000000 Fill->Kind = Solid Поместим туда один TLayout, выставим свойство «Align» в значение «Center». И зададим нужный размер. Потом кидаем на TLayout компонент «TRectangle» со свойством «Align – Content». Чтобы TLayout не мешался во время design-time, присвоим свойству Locked значение True. Кидаем остальные компоненты, чтобы получить окно нужного нам вида.
    В итоге у меня получилась вот такая иерархия компонентов:

    Компонент TRectAnimation используем для анимирования процесса появления окна. Вы можете придумать свою анимацию. В данном случае анимируется свойства формы «Padding».
    Напишем следующий код, для того, чтобы при клике на тёмную область формы окно закрылось (событие формы OnTap работает на сенсорных экранах, если вам нужен OnClick тогда воспользуйтесь Layout’ми или Rectangle’ми):
    void __fastcall TForm2::FormTap(TObject *Sender, const TPointF &Point) { Close(); } Вот и всё. К сообщению, я приложил демо приложение с примером такого окна.
    У администраторов просил бы поправить допущенные ошибки так как я не владею русским языком очень хорошем уровне. Или же добавит кое какие дополнительные информации ссылки и т.д.
      Demo.zip
  6. Like
    Axbor получил реакцию от Кирилл в Диалоговое окно на Андроид.   
    Хотел бы поделиться опытом. Рассмотрим случай, когда вам необходимо использовать кастомное диалоговое окно с затемнением. Вроде вот такого:
    Первое, что приходит в голову, это использование Rectangle’ов. Но такой подход показался мне очень сложным, и я нашёл другой способ (многие о нём уже знают) создания кастомного окна.
    Сам способ:
    Создаем вторую форму, и изменяем следующие свойства:
    Transparency = True Fill->Color = #78000000 Fill->Kind = Solid Поместим туда один TLayout, выставим свойство «Align» в значение «Center». И зададим нужный размер. Потом кидаем на TLayout компонент «TRectangle» со свойством «Align – Content». Чтобы TLayout не мешался во время design-time, присвоим свойству Locked значение True. Кидаем остальные компоненты, чтобы получить окно нужного нам вида.
    В итоге у меня получилась вот такая иерархия компонентов:

    Компонент TRectAnimation используем для анимирования процесса появления окна. Вы можете придумать свою анимацию. В данном случае анимируется свойства формы «Padding».
    Напишем следующий код, для того, чтобы при клике на тёмную область формы окно закрылось (событие формы OnTap работает на сенсорных экранах, если вам нужен OnClick тогда воспользуйтесь Layout’ми или Rectangle’ми):
    void __fastcall TForm2::FormTap(TObject *Sender, const TPointF &Point) { Close(); } Вот и всё. К сообщению, я приложил демо приложение с примером такого окна.
    У администраторов просил бы поправить допущенные ошибки так как я не владею русским языком очень хорошем уровне. Или же добавит кое какие дополнительные информации ссылки и т.д.
      Demo.zip
  7. Like
    Axbor получил реакцию от rareMax в Диалоговое окно на Андроид.   
    Хотел бы поделиться опытом. Рассмотрим случай, когда вам необходимо использовать кастомное диалоговое окно с затемнением. Вроде вот такого:
    Первое, что приходит в голову, это использование Rectangle’ов. Но такой подход показался мне очень сложным, и я нашёл другой способ (многие о нём уже знают) создания кастомного окна.
    Сам способ:
    Создаем вторую форму, и изменяем следующие свойства:
    Transparency = True Fill->Color = #78000000 Fill->Kind = Solid Поместим туда один TLayout, выставим свойство «Align» в значение «Center». И зададим нужный размер. Потом кидаем на TLayout компонент «TRectangle» со свойством «Align – Content». Чтобы TLayout не мешался во время design-time, присвоим свойству Locked значение True. Кидаем остальные компоненты, чтобы получить окно нужного нам вида.
    В итоге у меня получилась вот такая иерархия компонентов:

    Компонент TRectAnimation используем для анимирования процесса появления окна. Вы можете придумать свою анимацию. В данном случае анимируется свойства формы «Padding».
    Напишем следующий код, для того, чтобы при клике на тёмную область формы окно закрылось (событие формы OnTap работает на сенсорных экранах, если вам нужен OnClick тогда воспользуйтесь Layout’ми или Rectangle’ми):
    void __fastcall TForm2::FormTap(TObject *Sender, const TPointF &Point) { Close(); } Вот и всё. К сообщению, я приложил демо приложение с примером такого окна.
    У администраторов просил бы поправить допущенные ошибки так как я не владею русским языком очень хорошем уровне. Или же добавит кое какие дополнительные информации ссылки и т.д.
      Demo.zip
  8. Like
    Axbor отреагировална Равиль Зарипов (ZuBy) в Mail.ru своими руками   
    на сколько помню протокол закрыли для третьих лиц еще в 12 году, т.к. раньше у меня был собственный клиент
    MRA или MMP точно не помню как назывался
  9. Like
    Axbor отреагировална Равиль Зарипов (ZuBy) в RAD 11 на подходе?   
    1) Кастомный стиль в виде плитки *
    2) ListView с горизонтальной прокруткой, профиксил баги, которые появились из-за этого *
    3) Отступ сверху от первого Itema, задается вручную. (нужно было сделать, чтобы решить без многочисленных костылей одну ситуацию)
    4) Кастомные цвета для отдельных Item'ов
    5) разные хелперы и внутренние настройки
    * можно посмотреть тут
    скрин выполненной работы

  10. Like
    Axbor получил реакцию от pill в Собственный TListBoxItem на C++   
    Очень не хватает примеров на C++. Решил поделится опытом.
    Рассмотрим создание собственного "ListBoxItem"а на C++.
    И так начнем.
    Для начало создадим стиль для нашего "ListItem"а. В моем случае оно выглядит так:

    Структура выглядеть следующим образом:

    А вы сразу можете создать собственный стиль.
    Создадим класс для нашего "Item"а. Я назвал его TMyListBoxItem.
    Нужно знать следующие вещи:
    ApplyStyle() вызывается когда стиль загружен.
    FreeStyle() когда стиль выгружен.
    GetDefaultStyleLookupName() когда стиль не задано берется названые стиля по умолчанию.
    FindStyleResource("стиль") ищет в стиле ресурс с заданным названием.
     
    ListBox автоматически очищает из невидимых "Item"ов стиль что бы избежать от расходы на память. И заново загружает когда оно видимо. При этом вызывается соответствующие функции приведенные выше
     
    я приведу только некоторые кусочки кода. Остальное всё можете посмотреть в прикреплённых файлах.
    class TMyListBoxItem : public TListBoxItem { private: // Переменные для хранения данных System::UnicodeString FTimeTo; System::UnicodeString FTimeFrom; //.... // Визуальные компоненты TText* FTextTimeTo; TText* FTextTimeFrom; //... // Функции для присваивания данных, это нужно при написании "properties" void __fastcall SetTimeTo(const System::UnicodeString Value); void __fastcall SetTimeFrom(const System::UnicodeString Value); protected: void __fastcall ApplyStyle(); void __fastcall FreeStyle(); System::UnicodeString __fastcall GetDefaultStyleLookupName(); virtual void UpdateStyleData(); __published: __property System::UnicodeString TimeTo = {read=FTimeTo, write=SetTimeTo}; __property System::UnicodeString TimeFrom = {read=FTimeFrom, write=SetTimeFrom}; public: __fastcall TMyListBoxItem(System::Classes::TComponent* AOwner); }; Теперь напишем сами функции.
    void __fastcall TMyListBoxItem::ApplyStyle() { // Вызов метода предка TListBoxItem::ApplyStyle(); TFmxObject *StyleObject; // Поиск ресурса из стиля. Посмотрите в скрине, там есть ресурс с названием "timeto" типа TText StyleObject = FindStyleResource("timeto"); // dynamic_cast нужен для корректного преобразования типов. Если тип найденного ресурса не является TText то указателю будет присвоен NULL FTextTimeTo = dynamic_cast<TText*>(StyleObject); StyleObject = FindStyleResource("timefrom"); FTextTimeFrom = dynamic_cast<TText*>(StyleObject); UpdateStyleData(); } void __fastcall TMyListBoxItem::FreeStyle() { // Стиль выгружен из памяти. Нужно очистить указатели что бы избежать ошибок FTextTimeTo = NULL; FTextTimeFrom = NULL; TListBoxItem::FreeStyle(); } System::UnicodeString __fastcall TMyListBoxItem::GetDefaultStyleLookupName() { // название стиля для нашего "Item"а по умолчанию return "mylistboxitemstyle"; } void TMyListBoxItem::UpdateStyleData() { if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; if(FTextTimeFrom) FTextTimeFrom->Text = FTimeFrom; } void __fastcall TMyListBoxItem::SetTimeTo(const System::UnicodeString Value) { FTimeTo = Value; if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; } Вот и всё. Остается только добавит в наш проект ListBox и button для проверки.
    Вот функция создания нашего "Item"а:
    void __fastcall TForm1::Button1Click(TObject *Sender) { TMyListBoxItem *Item = new TMyListBoxItem(this); Item->Parent = ListBox1; Item->StyleLookup = "customstyle1"; Item->TimeFrom = "11:20"; Item->TimeTo = "12:50"; } Скриншот программы:

    В архиве мой класс и стиль. Для корректного отображения некоторых символов нужен fontcustom
    Какие вопросы задавайте. Отдельное спасибо Ярославу за мануал на дельфи: 
    http://blogs.embarcadero.com/yaroslavbrovin/2012/10/15/listboxitem_styling_part2/
    Администраторы и модераторы, прошу подкорректировать если что то неправильно.
    ListBoxItem.zip
  11. Like
    Axbor получил реакцию от Rusland в Расчет высоты объекта на основе высоты TLabel   
    Я предлагаю создать свой собственный класс для таких целей. Обработаем свойство Resize и всё, никаких проблем не будет. http://fire-monkey.ru/topic/2280-sobstvennyi-tlistboxitem-na-c/ тут я описал как создать собственный класс для ListBoxItem там же есть ссылка и для Delphi. Ниже приведен класс который я создал, только на C++. Посмотрите там обработчик события ApplyStyleLookup() и Resize(). И еще предлагаю вместо TLabel использовать TText.
    Если всё таки хотите своим путём тогда вычислите высоты с помощью TTextLayout, это делается так:
    var L : TTextLayout; begin L := TTextLayoutManager.DefaultTextLayout.Create; L.BeginUpdate; L.Text := FtextType.Text; {Вместо FTextType будет ваш Label} L.MaxSize := TPointF(FtextType.Width, 1000); L.Font := FTextType.Font; {} L.WordWrap := FTextType.WordWrap; L.HorizontalAlign := FTextType.HorzTextAlign; L.VerticalAlign := FTextType.VertTextAlign; L.EndUpdate; height := L.Height; end; Я не силён в Delphi, но думаю вы поймете.
    ListBoxItem.zip
  12. Like
    Axbor получил реакцию от Alex7wrt в Прозрачная форма с заголовком и рамками, Windows   
    На VCL это очень легко делается. Сделаете TransparentColor = true, и color формы сделаете одинаково со свойством TransparentColorValue
    На FMX пока не нашел
  13. Like
    Axbor отреагировална Alex7wrt в как отловить перемещение формы по экрану, Windows   
    После долгого поиска все-таки нашел тему на этом же форуме )). Хотя раньше искал, но не находил.
    Тема: http://fire-monkey.ru/topic/1452-kak-poimat-peremeschenie-formy/
     
    Суть решения - необходимо перекрыть виртуальный метод формы SetBounds, который выполняется каждый раз при перемещении формы
    procedure TCommonCustomForm.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); virtual; Для этого в описании методов формы пишем
    type TForm1 = class(TForm) ........ procedure SetBounds(ALeft, ATop, AWidth, AHeight: integer); override; ....... end; и в теле процедуры выполняем необходимые действия
    procedure TForm1.SetBounds(ALeft, ATop, AWidth, AHeight: integer); begin  inherited; if assigned(form2) then begin form2.Left:=ALeft; form2.top:=ATop; end; end; В данном случае - присвоение второй форме координат первой.
  14. Like
    Axbor получил реакцию от zairkz в Расчет высоты объекта на основе высоты TLabel   
    Я предлагаю создать свой собственный класс для таких целей. Обработаем свойство Resize и всё, никаких проблем не будет. http://fire-monkey.ru/topic/2280-sobstvennyi-tlistboxitem-na-c/ тут я описал как создать собственный класс для ListBoxItem там же есть ссылка и для Delphi. Ниже приведен класс который я создал, только на C++. Посмотрите там обработчик события ApplyStyleLookup() и Resize(). И еще предлагаю вместо TLabel использовать TText.
    Если всё таки хотите своим путём тогда вычислите высоты с помощью TTextLayout, это делается так:
    var L : TTextLayout; begin L := TTextLayoutManager.DefaultTextLayout.Create; L.BeginUpdate; L.Text := FtextType.Text; {Вместо FTextType будет ваш Label} L.MaxSize := TPointF(FtextType.Width, 1000); L.Font := FTextType.Font; {} L.WordWrap := FTextType.WordWrap; L.HorizontalAlign := FTextType.HorzTextAlign; L.VerticalAlign := FTextType.VertTextAlign; L.EndUpdate; height := L.Height; end; Я не силён в Delphi, но думаю вы поймете.
    ListBoxItem.zip
  15. Like
    Axbor отреагировална Axbor в Ошыбка Bitmap size too big   
    Сами задаем сами отвечаем.
    Изменения высоты
    Latifa1Layout->Height = Latifa1Caption->Height + Latifa1Text->Height + 20; сделал в Label(OnResize) и всё. Ошибка исчез.
  16. Like
    Axbor получил реакцию от Равиль Зарипов (ZuBy) в Ошибка при подключении к MySQL Windows   
    Проблема решилась обновлением libmysql.dll
    libmysql.zip
  17. Like
    Axbor отреагировална Axbor в Ошибка при подключении к MySQL Windows   
    Проблема решилась обновлением libmysql.dll
    libmysql.zip
  18. Like
    Axbor получил реакцию от Brovin Yaroslav в Размер приложения на разных устройствах   
    Вы посмотрите там сам APK файл сколько весит? Одинаково?! Скорее всего подсчет у всех устройствах по разному.
  19. Like
    Axbor отреагировална Brovin Yaroslav в [Статья][Android] Приложение будильник. Использование AlarmManager в FireMonkey на Андроиде   
    Ссылка: http://yaroslavbrovin.ru/using-alarmmanager-in-firemonkey-on-android-ru/ Автор: Бровин Ярослав Статья посвящена использованию Андроид AlarmManager в delphi приложения, позволяющего выполнять код в назначенное время даже, когда приложение закрыто. Все это рассматривается на примере приложения Будильник.
  20. Like
    Axbor отреагировална Alex7wrt в Отображение значка дочерней формы на панели задач, Windows   
    Нашел решение в другой теме. 
    http://fire-monkey.ru/topic/504-neskolko-okon-prilozheniia-v-paneli-zadach/
     
  21. Like
    Axbor получил реакцию от Ingalime в Собственный TListBoxItem на C++   
    Очень не хватает примеров на C++. Решил поделится опытом.
    Рассмотрим создание собственного "ListBoxItem"а на C++.
    И так начнем.
    Для начало создадим стиль для нашего "ListItem"а. В моем случае оно выглядит так:

    Структура выглядеть следующим образом:

    А вы сразу можете создать собственный стиль.
    Создадим класс для нашего "Item"а. Я назвал его TMyListBoxItem.
    Нужно знать следующие вещи:
    ApplyStyle() вызывается когда стиль загружен.
    FreeStyle() когда стиль выгружен.
    GetDefaultStyleLookupName() когда стиль не задано берется названые стиля по умолчанию.
    FindStyleResource("стиль") ищет в стиле ресурс с заданным названием.
     
    ListBox автоматически очищает из невидимых "Item"ов стиль что бы избежать от расходы на память. И заново загружает когда оно видимо. При этом вызывается соответствующие функции приведенные выше
     
    я приведу только некоторые кусочки кода. Остальное всё можете посмотреть в прикреплённых файлах.
    class TMyListBoxItem : public TListBoxItem { private: // Переменные для хранения данных System::UnicodeString FTimeTo; System::UnicodeString FTimeFrom; //.... // Визуальные компоненты TText* FTextTimeTo; TText* FTextTimeFrom; //... // Функции для присваивания данных, это нужно при написании "properties" void __fastcall SetTimeTo(const System::UnicodeString Value); void __fastcall SetTimeFrom(const System::UnicodeString Value); protected: void __fastcall ApplyStyle(); void __fastcall FreeStyle(); System::UnicodeString __fastcall GetDefaultStyleLookupName(); virtual void UpdateStyleData(); __published: __property System::UnicodeString TimeTo = {read=FTimeTo, write=SetTimeTo}; __property System::UnicodeString TimeFrom = {read=FTimeFrom, write=SetTimeFrom}; public: __fastcall TMyListBoxItem(System::Classes::TComponent* AOwner); }; Теперь напишем сами функции.
    void __fastcall TMyListBoxItem::ApplyStyle() { // Вызов метода предка TListBoxItem::ApplyStyle(); TFmxObject *StyleObject; // Поиск ресурса из стиля. Посмотрите в скрине, там есть ресурс с названием "timeto" типа TText StyleObject = FindStyleResource("timeto"); // dynamic_cast нужен для корректного преобразования типов. Если тип найденного ресурса не является TText то указателю будет присвоен NULL FTextTimeTo = dynamic_cast<TText*>(StyleObject); StyleObject = FindStyleResource("timefrom"); FTextTimeFrom = dynamic_cast<TText*>(StyleObject); UpdateStyleData(); } void __fastcall TMyListBoxItem::FreeStyle() { // Стиль выгружен из памяти. Нужно очистить указатели что бы избежать ошибок FTextTimeTo = NULL; FTextTimeFrom = NULL; TListBoxItem::FreeStyle(); } System::UnicodeString __fastcall TMyListBoxItem::GetDefaultStyleLookupName() { // название стиля для нашего "Item"а по умолчанию return "mylistboxitemstyle"; } void TMyListBoxItem::UpdateStyleData() { if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; if(FTextTimeFrom) FTextTimeFrom->Text = FTimeFrom; } void __fastcall TMyListBoxItem::SetTimeTo(const System::UnicodeString Value) { FTimeTo = Value; if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; } Вот и всё. Остается только добавит в наш проект ListBox и button для проверки.
    Вот функция создания нашего "Item"а:
    void __fastcall TForm1::Button1Click(TObject *Sender) { TMyListBoxItem *Item = new TMyListBoxItem(this); Item->Parent = ListBox1; Item->StyleLookup = "customstyle1"; Item->TimeFrom = "11:20"; Item->TimeTo = "12:50"; } Скриншот программы:

    В архиве мой класс и стиль. Для корректного отображения некоторых символов нужен fontcustom
    Какие вопросы задавайте. Отдельное спасибо Ярославу за мануал на дельфи: 
    http://blogs.embarcadero.com/yaroslavbrovin/2012/10/15/listboxitem_styling_part2/
    Администраторы и модераторы, прошу подкорректировать если что то неправильно.
    ListBoxItem.zip
  22. Like
    Axbor получил реакцию от Равиль Зарипов (ZuBy) в Вопрос про свайп в лево свайп в право   
    Есть компонент GestureManager. Бросим его в проект. Указываем у TImage->Touch->GestureManager на наш GestureManager. Включаем в TImage->Touch->Gestures нужные нам жесты (на вашем случае Left и Right). Потом в событии OnGesture TImage запишем следующее:
    void __fastcall TForm1::Image1Gesture(TObject *Sender, const TGestureEventInfo &EventInfo, bool &Handled) { switch(EventInfo.GestureID) { case sgiLeft: // произошло свайп в лево Handled = true; break; case sgiRight: // произошло свайп в право Handled = true; break; } }
  23. Like
    Axbor получил реакцию от egorkozz в Вопрос про свайп в лево свайп в право   
    Есть компонент GestureManager. Бросим его в проект. Указываем у TImage->Touch->GestureManager на наш GestureManager. Включаем в TImage->Touch->Gestures нужные нам жесты (на вашем случае Left и Right). Потом в событии OnGesture TImage запишем следующее:
    void __fastcall TForm1::Image1Gesture(TObject *Sender, const TGestureEventInfo &EventInfo, bool &Handled) { switch(EventInfo.GestureID) { case sgiLeft: // произошло свайп в лево Handled = true; break; case sgiRight: // произошло свайп в право Handled = true; break; } }
  24. Like
    Axbor получил реакцию от Anatoliy в Собственный TListBoxItem на C++   
    Очень не хватает примеров на C++. Решил поделится опытом.
    Рассмотрим создание собственного "ListBoxItem"а на C++.
    И так начнем.
    Для начало создадим стиль для нашего "ListItem"а. В моем случае оно выглядит так:

    Структура выглядеть следующим образом:

    А вы сразу можете создать собственный стиль.
    Создадим класс для нашего "Item"а. Я назвал его TMyListBoxItem.
    Нужно знать следующие вещи:
    ApplyStyle() вызывается когда стиль загружен.
    FreeStyle() когда стиль выгружен.
    GetDefaultStyleLookupName() когда стиль не задано берется названые стиля по умолчанию.
    FindStyleResource("стиль") ищет в стиле ресурс с заданным названием.
     
    ListBox автоматически очищает из невидимых "Item"ов стиль что бы избежать от расходы на память. И заново загружает когда оно видимо. При этом вызывается соответствующие функции приведенные выше
     
    я приведу только некоторые кусочки кода. Остальное всё можете посмотреть в прикреплённых файлах.
    class TMyListBoxItem : public TListBoxItem { private: // Переменные для хранения данных System::UnicodeString FTimeTo; System::UnicodeString FTimeFrom; //.... // Визуальные компоненты TText* FTextTimeTo; TText* FTextTimeFrom; //... // Функции для присваивания данных, это нужно при написании "properties" void __fastcall SetTimeTo(const System::UnicodeString Value); void __fastcall SetTimeFrom(const System::UnicodeString Value); protected: void __fastcall ApplyStyle(); void __fastcall FreeStyle(); System::UnicodeString __fastcall GetDefaultStyleLookupName(); virtual void UpdateStyleData(); __published: __property System::UnicodeString TimeTo = {read=FTimeTo, write=SetTimeTo}; __property System::UnicodeString TimeFrom = {read=FTimeFrom, write=SetTimeFrom}; public: __fastcall TMyListBoxItem(System::Classes::TComponent* AOwner); }; Теперь напишем сами функции.
    void __fastcall TMyListBoxItem::ApplyStyle() { // Вызов метода предка TListBoxItem::ApplyStyle(); TFmxObject *StyleObject; // Поиск ресурса из стиля. Посмотрите в скрине, там есть ресурс с названием "timeto" типа TText StyleObject = FindStyleResource("timeto"); // dynamic_cast нужен для корректного преобразования типов. Если тип найденного ресурса не является TText то указателю будет присвоен NULL FTextTimeTo = dynamic_cast<TText*>(StyleObject); StyleObject = FindStyleResource("timefrom"); FTextTimeFrom = dynamic_cast<TText*>(StyleObject); UpdateStyleData(); } void __fastcall TMyListBoxItem::FreeStyle() { // Стиль выгружен из памяти. Нужно очистить указатели что бы избежать ошибок FTextTimeTo = NULL; FTextTimeFrom = NULL; TListBoxItem::FreeStyle(); } System::UnicodeString __fastcall TMyListBoxItem::GetDefaultStyleLookupName() { // название стиля для нашего "Item"а по умолчанию return "mylistboxitemstyle"; } void TMyListBoxItem::UpdateStyleData() { if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; if(FTextTimeFrom) FTextTimeFrom->Text = FTimeFrom; } void __fastcall TMyListBoxItem::SetTimeTo(const System::UnicodeString Value) { FTimeTo = Value; if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; } Вот и всё. Остается только добавит в наш проект ListBox и button для проверки.
    Вот функция создания нашего "Item"а:
    void __fastcall TForm1::Button1Click(TObject *Sender) { TMyListBoxItem *Item = new TMyListBoxItem(this); Item->Parent = ListBox1; Item->StyleLookup = "customstyle1"; Item->TimeFrom = "11:20"; Item->TimeTo = "12:50"; } Скриншот программы:

    В архиве мой класс и стиль. Для корректного отображения некоторых символов нужен fontcustom
    Какие вопросы задавайте. Отдельное спасибо Ярославу за мануал на дельфи: 
    http://blogs.embarcadero.com/yaroslavbrovin/2012/10/15/listboxitem_styling_part2/
    Администраторы и модераторы, прошу подкорректировать если что то неправильно.
    ListBoxItem.zip
  25. Like
    Axbor получил реакцию от DimArt в Собственный TListBoxItem на C++   
    Очень не хватает примеров на C++. Решил поделится опытом.
    Рассмотрим создание собственного "ListBoxItem"а на C++.
    И так начнем.
    Для начало создадим стиль для нашего "ListItem"а. В моем случае оно выглядит так:

    Структура выглядеть следующим образом:

    А вы сразу можете создать собственный стиль.
    Создадим класс для нашего "Item"а. Я назвал его TMyListBoxItem.
    Нужно знать следующие вещи:
    ApplyStyle() вызывается когда стиль загружен.
    FreeStyle() когда стиль выгружен.
    GetDefaultStyleLookupName() когда стиль не задано берется названые стиля по умолчанию.
    FindStyleResource("стиль") ищет в стиле ресурс с заданным названием.
     
    ListBox автоматически очищает из невидимых "Item"ов стиль что бы избежать от расходы на память. И заново загружает когда оно видимо. При этом вызывается соответствующие функции приведенные выше
     
    я приведу только некоторые кусочки кода. Остальное всё можете посмотреть в прикреплённых файлах.
    class TMyListBoxItem : public TListBoxItem { private: // Переменные для хранения данных System::UnicodeString FTimeTo; System::UnicodeString FTimeFrom; //.... // Визуальные компоненты TText* FTextTimeTo; TText* FTextTimeFrom; //... // Функции для присваивания данных, это нужно при написании "properties" void __fastcall SetTimeTo(const System::UnicodeString Value); void __fastcall SetTimeFrom(const System::UnicodeString Value); protected: void __fastcall ApplyStyle(); void __fastcall FreeStyle(); System::UnicodeString __fastcall GetDefaultStyleLookupName(); virtual void UpdateStyleData(); __published: __property System::UnicodeString TimeTo = {read=FTimeTo, write=SetTimeTo}; __property System::UnicodeString TimeFrom = {read=FTimeFrom, write=SetTimeFrom}; public: __fastcall TMyListBoxItem(System::Classes::TComponent* AOwner); }; Теперь напишем сами функции.
    void __fastcall TMyListBoxItem::ApplyStyle() { // Вызов метода предка TListBoxItem::ApplyStyle(); TFmxObject *StyleObject; // Поиск ресурса из стиля. Посмотрите в скрине, там есть ресурс с названием "timeto" типа TText StyleObject = FindStyleResource("timeto"); // dynamic_cast нужен для корректного преобразования типов. Если тип найденного ресурса не является TText то указателю будет присвоен NULL FTextTimeTo = dynamic_cast<TText*>(StyleObject); StyleObject = FindStyleResource("timefrom"); FTextTimeFrom = dynamic_cast<TText*>(StyleObject); UpdateStyleData(); } void __fastcall TMyListBoxItem::FreeStyle() { // Стиль выгружен из памяти. Нужно очистить указатели что бы избежать ошибок FTextTimeTo = NULL; FTextTimeFrom = NULL; TListBoxItem::FreeStyle(); } System::UnicodeString __fastcall TMyListBoxItem::GetDefaultStyleLookupName() { // название стиля для нашего "Item"а по умолчанию return "mylistboxitemstyle"; } void TMyListBoxItem::UpdateStyleData() { if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; if(FTextTimeFrom) FTextTimeFrom->Text = FTimeFrom; } void __fastcall TMyListBoxItem::SetTimeTo(const System::UnicodeString Value) { FTimeTo = Value; if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; } Вот и всё. Остается только добавит в наш проект ListBox и button для проверки.
    Вот функция создания нашего "Item"а:
    void __fastcall TForm1::Button1Click(TObject *Sender) { TMyListBoxItem *Item = new TMyListBoxItem(this); Item->Parent = ListBox1; Item->StyleLookup = "customstyle1"; Item->TimeFrom = "11:20"; Item->TimeTo = "12:50"; } Скриншот программы:

    В архиве мой класс и стиль. Для корректного отображения некоторых символов нужен fontcustom
    Какие вопросы задавайте. Отдельное спасибо Ярославу за мануал на дельфи: 
    http://blogs.embarcadero.com/yaroslavbrovin/2012/10/15/listboxitem_styling_part2/
    Администраторы и модераторы, прошу подкорректировать если что то неправильно.
    ListBoxItem.zip
×
×
  • Создать...