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

Kitty

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

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

  • Посещение

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

    16

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

  1. Like
    Kitty получил реакцию от AngryOwl в RAD 11 на подходе?   
    Лучше пусть приложения в новой студии для Андроид станут стабильными и быстыми и без падений студии и приложений (и в дельфи и С++ среде).
    А новые не перспективные рынки лучше не охватывать: http://www.theverge.com/2016/1/28/10864034/windows-phone-is-dead
    Навести порядок в том, что есть, лучше.
  2. Like
    Kitty отреагировална Axbor в Собственный 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
  3. Like
    Kitty получил реакцию от zairkz в RAD 11 на подходе?   
    Лучше пусть приложения в новой студии для Андроид станут стабильными и быстыми и без падений студии и приложений (и в дельфи и С++ среде).
    А новые не перспективные рынки лучше не охватывать: http://www.theverge.com/2016/1/28/10864034/windows-phone-is-dead
    Навести порядок в том, что есть, лучше.
  4. Like
    Kitty получил реакцию от Равиль Зарипов (ZuBy) в RAD 11 на подходе?   
    Лучше пусть приложения в новой студии для Андроид станут стабильными и быстыми и без падений студии и приложений (и в дельфи и С++ среде).
    А новые не перспективные рынки лучше не охватывать: http://www.theverge.com/2016/1/28/10864034/windows-phone-is-dead
    Навести порядок в том, что есть, лучше.
  5. Like
    Kitty отреагировална Brovin Yaroslav в И снова про ориентацию экрана. Запрет поворота экрана.   
    В настройках проекта выведены эти опции:
    Menu -> Project -> Project options Application -> Orientation
  6. Like
    Kitty отреагировална Brovin Yaroslav в Режим звонка   
    Об этой проблеме известно, бага заведена. Локально ее пользователям не исправить. Решение будет.
  7. Like
    Kitty отреагировална Brovin Yaroslav в [Android] Как изменить цвет системного статус бара и разместить контролы под ним?   
    Поскольку тема вызывает не поддельный интерес у пользователей. Я расскажу, как это делал я для одной демо программы, которую я готовил для выступления в ИТМО. Сразу приложу скриншот, как это будет выглядеть:

     
    Сразу скажу, что это решение временное и имеет ряд определенных нюансов, которые появятся после его использования. О том, как исправить эти нюансы указано в самом конце.
    Теперь к делу. Андроид позволяет сделать статус бар прозрачным с наложением белого цвета с альфа каналом. Это значит, если мы разместим под статус баром зеленый цвет, то статус бар станет соответствующего темно зеленого цвета. Этим и воспользуемся. Основная идея такая:
    Говорим Андроиду, что хотим прозрачный статус бар. Указываем андроиду, что хотим размещать форму под статус баром. Размещаем под статус баром TRectangle нужного цвета, в тон TToolBar (если используете) Теперь по шагам:
     
    1. Говорим Андроиду, что хотим прозрачный статус бар. Указываем андроиду, что хотим размещать форму под статус баром.
    Создаем файл style.xml со стилем для нашего приложения.
    <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="AppTheme" parent="@android:style/Theme.Holo.Light"> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> <item name="android:windowBackground">@drawable/splash_image_def</item> <item name="android:windowNoTitle">true</item> </style> </resources> В стиле указываем, что мы хотим использовать прозрачный статус бар.
     
    Открываем Менеджер развертывания Menu->Project->Deployment Manager и добавляем наш файл стиля в проект только для андроид конфигураций:

    Remote Path: "res\values\" Remote Name: "styles.xml" Теперь при запуске программы, андроид будет считать, что:
      Приложение будет развернуто на весь экран Статус бар будет прозрачного цвета. 3. Размещаем под статус баром TRectangle нужного цвета, в том TToolBar (если используете)
    Я разместил вверху формы TRectangle, который залил требуемым цветом, в тон тул бару:

    Высота статус бара у андроида равна 24.
     
    Если вы делаете кроссплатформенный проект и для ios тоже, то по умолчанию скрываем этот прямоугольник и добавляем код по его отображению в конструктор формы только на андроиде
    constructor TFormMain.Create(AOwner: TComponent); begin inherited Create(AOwner); {$IFDEF ANDROID} SystemStatusBarBackground.Visible := True; {$ENDIF} end; В принципе все готово.
     
    Побочные эффекты
     
    По скольку это решение сделано сбоку, то пара моментов, которые придется в вашей программе следить:
    Нативные контролы распологаются по старому, полагая, что форма располагается под статус баром, а не под формой. Поэтому для нативных контролов таких, как TMapView, нужно корректировать позицию или отступы. {$IFDEF ANDROID} MapView.Margins.Top := -SystemStatusBarBackground.Height; {$ENDIF} Формы располагается так же и под нижними программными кнопками: Назад, домой и меню. Поэтому нужно так же иметь в виду, что расположенные снизу контролы, не будут кликабельны. Так как перекрываются нижней панелью с кнопками. Решение - это разместить TLayout под нижней панелью, чтобы сдвинуть ваши контролы к верху.
  8. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в [TidHTTP] Почему IdHttp1.Get может выдавать 404 ошибку, файл не найден?   
    function idHttpGet(const aURL: string): string; // uses System.Net.HttpClient, System.Net.HttpClientComponent, System.Net.URLClient; var Resp: TStringStream; Return: IHTTPResponse; begin Result := ''; with TNetHTTPClient.Create(nil) do begin Resp := TStringStream.Create('', TEncoding.ANSI); Return := Get( { TURI.URLEncode } (aURL), Resp); Result := Resp.DataString; Resp.Free; Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(idHttpGet('http://airnav.tj/ru/online/utdd')); end; Держи
  9. Like
    Kitty отреагировална Кривяков Виталий в Поменять цвет статус бара Delphi [XE7] - Android   
    Да, тоже столкнулся с тем, что цвет становиться белым и не меняется.
    Вот версия без необходимости менять исходники.
    SystemBar.zip
  10. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в Поменять цвет статус бара Delphi [XE7] - Android   
    Возможно это работает также как и для IOS...
     
    У меня получилось


     
    Код не изменился, изменения были в форме...
    Нужно задать цвет
    Form1.Fill.Color := TAlphaColorRec.Red; Посередине я поставил Rectangle, чтобы цвет контента не был равен цвету форме.
    и снизу стоит Rectangle с черным цветом, т.к. у меня наэкранные кнопки.
    если убрать нижняя панель тоже покрасится.
     
    И теперь вопрос, кто знает как определить высоту наэкранных кнопок и их существование?
     
    P.S. Кривяков Виталий спасибо за модуль
  11. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в SuperObject vs JSON   
    Привет Всем!
     
    Решил поделится впечатлениями по работе с SuperObject'ом и родным JSON'ом
     
    тест был файла с 2000+ объектами в JSON файле
    структура файла была такая
    { "status":"OK", "last_id":"711", "objects":[ { "obj_id":"1", "obj_acc_id":"1", "obj_cat_id":"24", "obj_title":"13 магистраль", "obj_descr":"ЖК представляет собой комфортный дом, состоящий из 14 блок-секций (подъездов). Расположен в перспективном развивающемся районе по 13 Магистрали с удобным выездом как на левый берег, так и в старую часть города. Вблизи Жилого комплекса распологается новая школа, парк отдыха и культуры.", "obj_address":"ул. Мамышулы - 104, д. 16\/1", "obj_address2":null, "obj_url":"3fa07dd73be072b049529c80c7d74732", "obj_planet":"1", "obj_country":"1", "obj_region":"1", "obj_city":"292", "obj_lat":"51.141", "obj_lon":"71.4835", "obj_insert_dt":null, "obj_update_dt":null, "obj_editted":"0", "obj_updated":"0", "obj_deleted":"0", "obj_showed":"1", "obj_rating":"0", "obj_pro_top":"0", "obj_pro_selected":"0", "obj_pro_unix_dt":"0", "obj_partner":"0", "obj_parent_id":"0", "obj_has_child":"0", "obj_currency":"0" }, // тут далее 2000+ объектов ] } SuperObject  Время выполнения:  ~01:393
    JSON родной Время выполнения: ~01:690
     
    разница не особо ощутима, тем более если будет меньше объектов
     
    JSON родной
    function JSONParse(const aJSONData: string; const aMemo: TMemo): boolean; var aJSValue: TJSONValue; aJSObject, aJSObjArr: TJSONObject; aJSArray: TJSONArray; I: integer; begin Result := false; aJSValue := TJSONObject.ParseJSONValue(aJSONData) as TJSONValue; if Assigned(aJSValue) then begin aJSObject := aJSValue as TJSONObject; aMemo.Lines.Add('status: ' + aJSObject.GetValue('status').Value); if aJSObject.GetValue('status').Value = 'OK' then begin Result := true; if Assigned(aJSObject) then begin aJSArray := aJSObject.GetValue('objects') as TJSONArray; if Assigned(aJSArray) then begin Result := true; aMemo.Lines.Add('last_id: ' + aJSObject.GetValue('last_id').Value); aMemo.Lines.Add('count: ' + aJSArray.Count.ToString); for I := 0 to aJSArray.Count - 1 do begin aJSObjArr := aJSArray.Items[I] as TJSONObject; if Assigned(aJSObjArr) then begin aMemo.Lines.Add(aJSObjArr.GetValue('obj_id').Value + ',' + aJSObjArr.GetValue('obj_acc_id').Value + ',' + aJSObjArr.GetValue('obj_cat_id').Value); aMemo.Lines.Add(aJSObjArr.GetValue('obj_title').Value); aMemo.Lines.Add(aJSObjArr.GetValue('obj_descr').Value); aMemo.Lines.Add(aJSObjArr.GetValue('obj_address').Value); aMemo.Lines.Add(aJSObjArr.GetValue('obj_url').Value); end; end; end; end; end; aJSValue.Free; end; end; SuperObject
    function JSONSOParse(const aJSONData: string; const aMemo: TMemo): boolean; var xObject: ISuperObject; xCount, I: integer; sfmt: string; begin Result := false; xObject := SO(aJSONData); aMemo.Lines.Add('status: ' + xObject['status'].AsString); if xObject['status'].AsString = 'OK' then begin Result := true; xCount := xObject['objects'].AsArray.Length; aMemo.Lines.Add('count: ' + xCount.ToString); aMemo.Lines.Add('last_id: ' + xObject['last_id'].AsInteger.ToString); for I := 0 to xCount - 1 do begin aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_id"'].AsInteger.ToString + ',' + xObject['objects[' + I.ToString + ']."obj_acc_id"'].AsInteger.ToString + ',' + xObject['objects[' + I.ToString + ']."obj_cat_id"'].AsInteger.ToString); aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_title"'].AsString); aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_descr"'].AsString); aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_address"'].AsString); aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_url"'].AsString); end; end; end; Разница ощутима когда пишешь код, SO намного легче читать
     
    Подробней почитать и скачать SO
  12. Like
    Kitty отреагировална haword в Русские буквы в английской локали.   
    по моему победил сию беду. нужно что бы в базе была таблица android_metadata
     
    CREATE TABLE "android_metadata" ("locale" TEXT)
    INSERT INTO "android_metadata" VALUES ('ru_RU')
     
    и в английской локали нормально видны русские буквы из базы. 
  13. Like
    Kitty отреагировална Andrey Efimov в [Статья][Android] Автозапуск приложения после перезагрузки ОС   
    Ссылка: http://delphifmandroid.blogspot.ru/2016/01/broadcastreceiver.html
    Автор: Андрей Ефимов
    Описание: [broadcastReceiver] Автозапуск приложения после перезагрузки ОС
  14. Like
    Kitty отреагировална Brovin Yaroslav в [TStyleBook] Как сохранить StyleBook в текстовом формате в runtime?   
    TStyleBook.Resource;
  15. Like
    Kitty отреагировална Brovin Yaroslav в [TStyleBook] [TStyleStreaming] Почему TStyleStreaming.SaveToStream не сохраняет полностью все стили на Android?   
    На андроиде идет загрузка стилей по мере необходимости. Это значит, что пока стиль не использован хотя бы раз в платформе, то он не будет грузиться в память. Это сделано для ускорения запуска приложения на мобильных телефонах. Посколько большую часть времени занимает чтение всех стилей из ресурсов в память.
  16. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в TListViewHorz   
    Давно не хватало TListView в горизонтальной ориентации, например чтобы сделать вот такую картинку

     
    zairkz сделал стиль с применением 9-patch png "технологии"
     
    С помощью жестов показано как сделать "сквозной скрол"
    как писал dreamix
     
     
    P.S. по компоненту TListViewHorz, не успел все протестить как следует со всеми параметрами
    не правильно будет отображаться Header'ы и Поиск, основной функционал сохранен
    UPDATE:  LVStyledhorz.7z
  17. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в vkbdhelper - поднятие компонентов над клавиатурой   
    Привет Всем!
     
    vkbdhelper.pas
     
    Давно пользовался vkbdhelper'ом, но он был только для андроида.
    руки добрались и до этого, теперь его можно использовать и на IOS
     
    изменения
    * почистил uses секцию
    * убрал зависимость от платформ (кросс-платформенный)
    * добавил глобальную переменную VKOffset
     
    VKOffset - расстояние между контролом и клавиатурой
                     для тех случаев когда включены подсказки/автозамена
                     и контрол оказывается под доп. панелькой
     
    Не все клавиатуры включают доп. панели в свой размер!
    Например для IOS нужно всегда прибавлять 30-32 пикселя, панель с кнопкой Done перекрывает контрол
    {$IFDEF IOS} VKOffset := 31; {$ELSE} VKOffset := 0; // на свой вкус // не знаю как определить размер доп. панельки // когда она не входит в размер клавиатуры // и определить есть ли панелька вообще... {$ENDIF} vkbdhelper.zip
  18. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в При повороте экрана закрывается приложение, Delphi XE 10   
    файл AndroidManifest.template.xml
     
    блок activity должен иметь вот такой вид
    <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:launchMode="singleTask">
  19. Like
    Kitty отреагировална Brovin Yaroslav в SQLite Mac OS, Кодировка   
    Попробуйте AsWideStrings
  20. Like
    Kitty отреагировална Axbor в SQLite Mac OS, Кодировка   
    Незнаю как на делфи. Но на с++ такая:
    Query->ParamByName('Title')->AsString = L"Заголовок";
  21. Like
    Kitty отреагировална Brovin Yaroslav в [TakePhotoFromCameraAction] Получение фотографии с камеры телефона. Ошибка Out Of Memory   
    Обычная фотография на современных моделях устройств может быть очень большой. Например, на телефоне с 10 мега пиксельной камерой, фотография будет около 10 Mb. Устройства на базе Андроид выделяют меньше оперативной памяти устройствам. Поэтому физически бывает, что более слабые устройства не способны загрузить картинку в память по причине нехватки памяти, выделенной приложению. 
     
    Google официально предлагает грузить в ваше приложение сжатые версии изображений. Чтобы в ваше приложение получать сокращенное изображение, в действии TakePhotoFromCameraAction есть свойства MaxWidth и MaxHeight для указания максимально допустимого разрешения фотографии.
     
     
  22. Like
    Kitty отреагировална Камышев Александр в Альтернатива FMX   
    Ядро Андроида - Linux Kernel, написан, в основном, на си, и серьезность проекта коррелируется скорее с навыками программера чем со средой RAD.
     
    Приложения под операционную систему Android являются программами в нестандартном байт-коде для виртуальной машины Dalvik.
     
    Программы для Dalvik пишутся на языке Java. Несмотря на это, стандартный байт-код Java не используется, вместо него Dalvik исполняет байт-код собственного формата. После компиляции исходных текстов программы на Java (при помощи javac) утилита dx из Android SDK преобразует файлы классов (расширение .class) в файлы собственного формата (с расширением .dex), которые и включаются в пакет приложения (.apk).
     
     Android Native Development Kit позволяет портировать библиотеки и компоненты приложений, написанные на Си и других языках.
     
  23. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в Application.FormFactor.Orientations   
    Options->Application->Orientation все выключено?
    еще удалить нужно файлик AndroidManifest.template.xml из папки с проектом
     
    нет свойства Text у TComboBox
  24. Like
    Kitty получил реакцию от mrseagull в Как правильно сделать сборку   
    Для C++ Builder:
    1. Project -> Options, and setting the C++ Linker option "Link with Dynamic RTL" to false
    2. Project -> Options, where you can set the Packages - Runtime Packages option "Link with runtime packages" to false
     
    Если у вас C++ Builder Seattle и осталась ошибка с BORLNDMM.DLL значит вы не установили Update 1.
    Подробности бага тут: https://forums.embarcadero.com/thread.jspa?threadID=170083&tstart=0
  25. Like
    Kitty получил реакцию от Равиль Зарипов (ZuBy) в Как правильно сделать сборку   
    Для C++ Builder:
    1. Project -> Options, and setting the C++ Linker option "Link with Dynamic RTL" to false
    2. Project -> Options, where you can set the Packages - Runtime Packages option "Link with runtime packages" to false
     
    Если у вас C++ Builder Seattle и осталась ошибка с BORLNDMM.DLL значит вы не установили Update 1.
    Подробности бага тут: https://forums.embarcadero.com/thread.jspa?threadID=170083&tstart=0
×
×
  • Создать...