Kitty
-
Постов
792 -
Зарегистрирован
-
Посещение
-
Победитель дней
16
Активность репутации
-
Kitty получил реакцию от AngryOwl в RAD 11 на подходе?
Лучше пусть приложения в новой студии для Андроид станут стабильными и быстыми и без падений студии и приложений (и в дельфи и С++ среде).
А новые не перспективные рынки лучше не охватывать: http://www.theverge.com/2016/1/28/10864034/windows-phone-is-dead
Навести порядок в том, что есть, лучше.
-
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
-
Kitty получил реакцию от zairkz в RAD 11 на подходе?
Лучше пусть приложения в новой студии для Андроид станут стабильными и быстыми и без падений студии и приложений (и в дельфи и С++ среде).
А новые не перспективные рынки лучше не охватывать: http://www.theverge.com/2016/1/28/10864034/windows-phone-is-dead
Навести порядок в том, что есть, лучше.
-
Kitty получил реакцию от Равиль Зарипов (ZuBy) в RAD 11 на подходе?
Лучше пусть приложения в новой студии для Андроид станут стабильными и быстыми и без падений студии и приложений (и в дельфи и С++ среде).
А новые не перспективные рынки лучше не охватывать: http://www.theverge.com/2016/1/28/10864034/windows-phone-is-dead
Навести порядок в том, что есть, лучше.
-
Kitty отреагировална Brovin Yaroslav в И снова про ориентацию экрана. Запрет поворота экрана.
В настройках проекта выведены эти опции:
Menu -> Project -> Project options Application -> Orientation -
Kitty отреагировална Brovin Yaroslav в Режим звонка
Об этой проблеме известно, бага заведена. Локально ее пользователям не исправить. Решение будет.
-
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 под нижней панелью, чтобы сдвинуть ваши контролы к верху. -
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; Держи
-
Kitty отреагировална Кривяков Виталий в Поменять цвет статус бара Delphi [XE7] - Android
Да, тоже столкнулся с тем, что цвет становиться белым и не меняется.
Вот версия без необходимости менять исходники.
SystemBar.zip
-
Kitty отреагировална Равиль Зарипов (ZuBy) в Поменять цвет статус бара Delphi [XE7] - Android
Возможно это работает также как и для IOS...
У меня получилось
Код не изменился, изменения были в форме...
Нужно задать цвет
Form1.Fill.Color := TAlphaColorRec.Red; Посередине я поставил Rectangle, чтобы цвет контента не был равен цвету форме.
и снизу стоит Rectangle с черным цветом, т.к. у меня наэкранные кнопки.
если убрать нижняя панель тоже покрасится.
И теперь вопрос, кто знает как определить высоту наэкранных кнопок и их существование?
P.S. Кривяков Виталий спасибо за модуль
-
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
-
Kitty отреагировална haword в Русские буквы в английской локали.
по моему победил сию беду. нужно что бы в базе была таблица android_metadata
CREATE TABLE "android_metadata" ("locale" TEXT)
INSERT INTO "android_metadata" VALUES ('ru_RU')
и в английской локали нормально видны русские буквы из базы.
-
Kitty отреагировална Andrey Efimov в [Статья][Android] Автозапуск приложения после перезагрузки ОС
Ссылка: http://delphifmandroid.blogspot.ru/2016/01/broadcastreceiver.html
Автор: Андрей Ефимов
Описание: [broadcastReceiver] Автозапуск приложения после перезагрузки ОС
-
Kitty отреагировална Brovin Yaroslav в [TStyleBook] Как сохранить StyleBook в текстовом формате в runtime?
TStyleBook.Resource; -
Kitty отреагировална Brovin Yaroslav в [TStyleBook] [TStyleStreaming] Почему TStyleStreaming.SaveToStream не сохраняет полностью все стили на Android?
На андроиде идет загрузка стилей по мере необходимости. Это значит, что пока стиль не использован хотя бы раз в платформе, то он не будет грузиться в память. Это сделано для ускорения запуска приложения на мобильных телефонах. Посколько большую часть времени занимает чтение всех стилей из ресурсов в память.
-
Kitty отреагировална Равиль Зарипов (ZuBy) в TListViewHorz
Давно не хватало TListView в горизонтальной ориентации, например чтобы сделать вот такую картинку
zairkz сделал стиль с применением 9-patch png "технологии"
С помощью жестов показано как сделать "сквозной скрол"
как писал dreamix
P.S. по компоненту TListViewHorz, не успел все протестить как следует со всеми параметрами
не правильно будет отображаться Header'ы и Поиск, основной функционал сохранен
UPDATE: LVStyledhorz.7z
-
Kitty отреагировална Равиль Зарипов (ZuBy) в vkbdhelper - поднятие компонентов над клавиатурой
Привет Всем!
vkbdhelper.pas
Давно пользовался vkbdhelper'ом, но он был только для андроида.
руки добрались и до этого, теперь его можно использовать и на IOS
изменения
* почистил uses секцию
* убрал зависимость от платформ (кросс-платформенный)
* добавил глобальную переменную VKOffset
VKOffset - расстояние между контролом и клавиатурой
для тех случаев когда включены подсказки/автозамена
и контрол оказывается под доп. панелькой
Не все клавиатуры включают доп. панели в свой размер!
Например для IOS нужно всегда прибавлять 30-32 пикселя, панель с кнопкой Done перекрывает контрол
{$IFDEF IOS} VKOffset := 31; {$ELSE} VKOffset := 0; // на свой вкус // не знаю как определить размер доп. панельки // когда она не входит в размер клавиатуры // и определить есть ли панелька вообще... {$ENDIF} vkbdhelper.zip
-
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"> -
-
Kitty отреагировална Axbor в SQLite Mac OS, Кодировка
Незнаю как на делфи. Но на с++ такая:
Query->ParamByName('Title')->AsString = L"Заголовок";
-
Kitty отреагировална Brovin Yaroslav в [TakePhotoFromCameraAction] Получение фотографии с камеры телефона. Ошибка Out Of Memory
Обычная фотография на современных моделях устройств может быть очень большой. Например, на телефоне с 10 мега пиксельной камерой, фотография будет около 10 Mb. Устройства на базе Андроид выделяют меньше оперативной памяти устройствам. Поэтому физически бывает, что более слабые устройства не способны загрузить картинку в память по причине нехватки памяти, выделенной приложению.
Google официально предлагает грузить в ваше приложение сжатые версии изображений. Чтобы в ваше приложение получать сокращенное изображение, в действии TakePhotoFromCameraAction есть свойства MaxWidth и MaxHeight для указания максимально допустимого разрешения фотографии.
-
Kitty отреагировална Камышев Александр в Альтернатива FMX
Ядро Андроида - Linux Kernel, написан, в основном, на си, и серьезность проекта коррелируется скорее с навыками программера чем со средой RAD.
Приложения под операционную систему Android являются программами в нестандартном байт-коде для виртуальной машины Dalvik.
Программы для Dalvik пишутся на языке Java. Несмотря на это, стандартный байт-код Java не используется, вместо него Dalvik исполняет байт-код собственного формата. После компиляции исходных текстов программы на Java (при помощи javac) утилита dx из Android SDK преобразует файлы классов (расширение .class) в файлы собственного формата (с расширением .dex), которые и включаются в пакет приложения (.apk).
Android Native Development Kit позволяет портировать библиотеки и компоненты приложений, написанные на Си и других языках.
-
Kitty отреагировална Равиль Зарипов (ZuBy) в Application.FormFactor.Orientations
Options->Application->Orientation все выключено?
еще удалить нужно файлик AndroidManifest.template.xml из папки с проектом
нет свойства Text у TComboBox
-
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
-
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