Anatoliy
-
Постов
176 -
Зарегистрирован
-
Посещение
Активность репутации
-
Anatoliy отреагировална haword в Обновление в Google Play
обычно люди с начало у гугля спрашивают а потом на форум идут. гугль сказал вот что -
protected String doInBackground(String... params) { try { newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + "package name" + "&hl=en") .timeout(30000) .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6") .referrer("http://www.google.com") .get() .select("div[itemprop=softwareVersion]") .first() .ownText(); } catch (IOException e) { e.printStackTrace(); } return newVersion; } то есть просто скачиваешь страницу с маркета, ищешь там определенный DIV и в нем и находишь последнюю версию на маркете.
-
Anatoliy отреагировална enatechno в [Андроид]не видно картинки
Проверьте наличие файла if(FileExists(path)) перед LoadFromFile(path);
-
Anatoliy отреагировална enatechno в libmidas.dylib для iOS
libmidas.dylib - это только для IOS-симулятора. Для реальных iOS устройств нужно деплоить libmidas.a:
C:\Program Files (x86)\Embarcadero\Studio\<версия RAD>\lib\iosDevice64\release\libmidas.a
C:\Program Files (x86)\Embarcadero\Studio\<версия RAD>\lib\iosDevice32\release\libmidas.a
http://docwiki.embarcadero.com/RADStudio/Berlin/en/DbExpress_Supported_Database_Management_Systems
-
-
Anatoliy отреагировална Равиль Зарипов (ZuBy) в Окончание подписки
так и должно быть, это чтобы не делать мусорку в аппстор.
-
Anatoliy отреагировална krapotkin в [ListView] получить список элементов у которых Checkmark=true
Все что есть на экране - это отображение чего-то в памяти. например (я в С не очень, но по смыслу поймете)
var ListAll, ListSelected: TObjectList<TFoodMenuItem>; ListAll := TObjectList<TFoodMenuItem>.Create(True); // все меню ListSelected := TObjectList<TFoodMenuItem>.Create(False); // отобранные в заказ пункты //в OnClick нам дается Item. по индексу этого item мы берем объект из ListAll и заносим в ListSelected; listSelected.add( ListAll[index] ); этот пример корявый и не учитывает количества и т.д. но общий смысл именно такой. По индексу в листе работаем с объектом в памяти
P.S.
если честно, то имеющийся чек какой-то совсем никакой. я бы его поменял на простой собственный image
-
Anatoliy отреагировална enatechno в Запуск Google Play из своего приложения
Если не ошибаюсь, TAndroidHelper появился в Androidapi.Helpers позже XE7. До его появления использовался такой способ открытия URL:
function OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean; var Intent: JIntent; begin Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, TJnet_Uri.JavaClass.parse(StringToJString(TIdURI.URLEncode(URL)))); try SharedActivity.startActivity(Intent); exit(true); except on e: Exception do begin if DisplayError then ShowMessage('Error: ' + e.Message); exit(false); end; end; end;
-
Anatoliy отреагировална Равиль Зарипов (ZuBy) в TPushClient - нашёл чудесную вещь
у меня есть заготовка, но не помню на чем остановился. надо будет посмотреть и выложить
-
Anatoliy отреагировална Евгений Корепов в TPushClient - нашёл чудесную вещь
Наткнулся тут на изящную штуку для приложения с PUSH уведомлениями на Android и Ios. Один объект, все сам делает.
Внедрил в одно боевое приложение с 100+ тысячами установок, полет нормальный.
Описание тут https://delphiworlds.com/2017/04/firebase-cloud-messaging-android-ios/
Исходный код с примером на гитхабе https://github.com/DelphiWorlds/PushClient
Использование максимально простое:
uses DW.PushClient; .... private FPushClient: TPushClient; procedure PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges); procedure PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification); .... procedure TFormMain.InitPushService; begin FPushClient := TPushClient.Create; FPushClient.GCMAppID := ConstGCMAppID; FPushClient.ServerKey := ''; FPushClient.BundleID := ''; FPushClient.UseSandbox := Debug; // Change this to False for production use! FPushClient.OnChange := PushClientChangeHandler; FPushClient.OnReceiveNotification := PushClientReceiveNotificationHandler; try FPushClient.Active := True; except SendError('FPushClient.Active Exception'); end; end; procedure TFormMain.PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges); begin if TPushService.TChange.DeviceToken in AChange then begin HDevicePushParams.DeviceID:=FPushClient.DeviceID; HDevicePushParams.DeviceToken:=FPushClient.DeviceToken; GetHTTP(CommandRegisterFCM); // Memo1.Lines.Add('DeviceID = ' + FPushClient.DeviceID); // Memo1.Lines.Add('DeviceToken = ' + FPushClient.DeviceToken); end; end; procedure TFormMain.PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification); begin // ShowMessage(ANotification.DataObject.ToString... end; Правда руки не дошли разобраться для чего ему
FPushClient.ServerKey := '';
FPushClient.BundleID := '';
Но и без этого работает.
-
Anatoliy отреагировална enatechno в [ListView]пример от embarcadero
По умолчанию в DynamicAppearance есть только один объект - Text. Соответственно, из кода вы должны убрать все упоминания AItem.Objects.TextObject, AItem.Objects.AccessoryObject и изменить заполнение текста в ListViewItem (например так):
for Item in [1..10] do ListView1.Items.Add.Data['Text1']:= Format('Regular item %d.%d', [Group, Item]); Как добавить свои объекты в LIstViewItem читайте Using the DynamicAppearance Value или смотрите видео.
-
Anatoliy отреагировална enatechno в [ListView] DynamicAppearance
Посмотрите эту тему. Там на дельфи, но думаю, общий смысл поймете.
-
Anatoliy отреагировална enatechno в [ListView]пример от embarcadero
В п.3 Вы добавляете ListViewItem с Purpose := TListItemPurpose.Header. У него Objects.AccessoryObject = nil и приложение падает в TForm1.ListView1UpdateObjects.
Могу предложить такою правку:
procedure TForm1.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem); begin if AItem.Purpose <> TListItemPurpose.Header then // проверка назначения айтема begin AItem.Objects.TextObject.Width := AItem.Objects.TextObject.Width - (5 + AItem.Objects.AccessoryObject.Width); AItem.Objects.AccessoryObject.Visible := FChecked.Contains(AItem.Index); end; end;
-
-
Anatoliy отреагировална ENERGY в Кнопки у ListVew ItemAppearance
Ребята, если вам нужна кнопка с картинкой на ListView, то это можно сделать скомбинировав картинку с кнопкой .
Сначала добавляете TTextButtonObjectAppearance, затем TImageObjectAppearance и устанавливаете картинку поверх кнопки.
Чтобы определить по какому элементу Item'a кликнул юзер:
procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex: Integer; const LocalClickPos: TPointF; const ItemObject: TListItemDrawable); begin if ItemObject = nil then exit; ShowMessage('Name: ' + ItemObject.Name + sLineBreak + 'Text: ' + (ItemObject as TListItemText).Text); end;
-
Anatoliy отреагировална ENERGY в Кнопки у ListVew ItemAppearance
Есть еще один альтернативный способ доступа к объектам.
Вместо AItem.Objects.FindDrawable('TextButton16') можно обращаться по индексам. Это гораздо быстрее. Т.к. не нужно перебирать все объекты и сравнивать их строковые имена. К примеру в моем случае их аж 16, и у каждого есть имя. Каждое строковое имя нужно перебрать и сравнить с искомым. При этом в OnUpdateObjects это может делаться несколько раз на каждый List item.
Сделать это можно так:
aItem.View.ViewList[x]
Напр:
aItem.View.ViewList[10].Height := 30;
Список можно посмотреть так:
В инспекторе объектов, найдите ListView, в нем Item. Выберите его, и в списке свойств нажмите Objects- это и будет полные список объектов. Начинается он с нуля. Отсчитаете нужный, и можно работать с ним.
Upd:
Также можно изменять объекты TListItem'a по индексу вместо Data['name']. Там тоже используется FindDrawable.
Для этого сначала нужно добавить один раз значение через Data для любого из объектов чтобы создать нужны структуры (обычно для первого Object'a ), а затем уже заполнять по индексу остальные Objects в любой последовательности (не обязательно подряд).
vItem.Data['T'] := 'Text' // Data['T'] - это текст ListItem, так он стандартно обозначен
Дальше уже добавляем текст в объекты через индекс:
(vItem.View.Drawables[5] as TListItemText).Text := 'Text 5';
(vItem.View.Drawables[1] as TListItemText).Text := 'Text 2';
-
Anatoliy отреагировална ENERGY в TListView Custom checkboxes (иконка чекбокс "избранное")
Огромное спасибо Равиль! Как хорошо что вы помогаете.
Итак для тех кто не знает, в TListView есть режим DynamicAppearance , который позволяет добавлять предустановленные элементы - картинки, текст, GlyphButon. В хелпе написано что их может быть любое количество.
Итак добавляем TListView, в панели Structure выбираем TListView > ItemAppearance > Item.
В инспекторе объектов выбрать свойство Appearance и комбобоксе Dynamic Appearance. Рядом в инспекторе появится свойство Objects - нажать на него и там уже добавляем нужные поля. Там же можно переименовать поле, в AppearanceObjectName чтобы позже использовать в RunTime. У меня периодически на этих этапах вылетает Catastrophic Failure и среду приходится терминировать с диспетчера (Berlin Update 2).
Дальше, жмем правой кнопкой мыши по ListView и выбираем Toggle Design Mode, где можно увидеть эти добавленные Custom поля и расставить их мышкой и указать выравнивание.
Это имя затем можно использовать в Runtime, для картинки это индекс в ImageList, который нужно указать в ListView таким образом (за это еще раз спасибо Равилю! :), почему это сделали так неочевидно и почему это не указано в мануале, остается загадкой..
Для TImageObjectAppearance с именем Star -
ListView1.Items.Add.Data['Star'] := Integer(1);
Например заполняем список с картинками с индексами 0 и 1:
procedure TForm5.FormShow(Sender: TObject); var I: Integer; begin for I := 0 to 9 do begin with ListView1.Items.Add do begin Text := 'Item ' + I.ToString; Data['Star'] := Integer(I mod 2 = 0); end; end; end; Переключаем с картинки с индексом 1 на 0 и наоборот. procedure TForm5.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); begin AItem.Data['Star'] := AItem.Data['Star'].AsInteger xor 1; end ;
-
Anatoliy отреагировална krapotkin в Подскажите какой выбрать компонент
Ну почти никто не пользуется этим гридом. Хотя у меня есть проект на windows. данные берет из http-запроса. все в принципе работает, но не айс, конечно, не VCL. Зато красиво
если на андроиде, то тем более там и смысла нет использовать грид.
Здесь есть ListView - наше всё. А еще ModernLV от ZuBy, который еще более наше всё
-
Anatoliy отреагировална enatechno в OnTap не меняет положение курсора
uses System.Threading; //.... procedure TForm1.Memo1Tap(Sender: TObject; const [Ref] Point: TPointF); begin TTask.Run(procedure begin TThread.Synchronize(nil, procedure begin ShowMessage(IntToStr(Memo1.SelStart)); end); end); end;
-
Anatoliy отреагировална Евгений Корепов в Цифровая подпись
Не действительны сертификаты SSL Certificates (для web-серверов).
У них все сертификаты всегда были бесплатными (поэтому их американские монстры и прижали), платная только проверка пользователя - т.е. один раз проходишь валидацию нужного тебе класса и целый год выпускаешь сертификаты бесплатно.
-
Anatoliy отреагировална Gingercat в [TCanvas] Масштабирование и перемещение
Доброго дня, а в чем собственно проблема то? Для масштабирования заведите какую нибудь float m_scale = 1.f переменную, в событии OnMouseWheel увеличивайте или уменьшайте ее значение, а потом ваши числовые значения перемножайте на m_scale, да и все. То же и с перемещением: вот код с форума, честно - переписывать леньки, уж простите))
//перемещение формы bool dragging = false; POINT MousePnt; POINT point; HWND hWnd; RECT wndrect; void __fastcall TClock::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { GetCursorPos(&MousePnt); dragging = true; SetCapture(hWnd); } //--------------------------------------------------------------------------- void __fastcall TClock::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if (dragging==true) // Если нажата кнопка, то... { // Получить текущую позицию курсора GetCursorPos(&point); // Откорректировать положение окна Clock->Left = Clock->Left+(point.x - MousePnt.x); Clock->Top = Clock->Top +(point.y - MousePnt.y); // Установить новые размеры окна //SetWindowPos(hWnd, NULL, wndrect.left, wndrect.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE); // Запоминаем текущую позицию курсора MousePnt=point; } } //--------------------------------------------------------------------------- void __fastcall TClock::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if (dragging==true) { dragging=false; ReleaseCapture(); } } Код примитивный и немного глуповатый, но смысл думаю поймете. Тут перемещение окна, но вам нужна суть - координаты Clock. Используйте их для отрисовки ваших фигур, и будут они бегать за мышкой.
P.S.Хотя, неблагодарное это дело, плавности не добиться. Наткнувшись на опенсорсную библиотеку (на основе OpenGL), теперь увы на поделки с Timage, да и вообще отрисовка сложных интерфейсов, без слез смотреть невозможно - как по плавности, так и по нагрузке, реализуй хотя бы 50% из того, что там наворотил, на Borland-вской графике, программа бы и не пошевелилась)
-
Anatoliy отреагировална Евгений Корепов в Tethering тормиозит
apptethering довольно убогий (его реализация в дельфи) - написали по быстрому модную технологию и забросили. Если не ошибаюсь, за все время существования компонента ни разу он не был исправлен или доделан.
Для вашего случая проще и быстрее использовать Indy (UDP сервер и клиент) - для одновременного получения клиентами сообщения отсылаете его сервером в multicast режиме на какой нибудь порт, клиенты получат его одновременно. В apptethering не знают про multicast, по крайней мере в исходниках не нашел и потоки используются только временами и не предсказуемо.
-
Anatoliy отреагировална krapotkin в Долго загружаются данные в Grid
вот вообще ничего не менялось в стринггриде в этой конкретно строке
StringGrid1.Cells[ACol, ARow] := myString;
перед этим нужно только добавить в грид нужное количество колонок
-
Anatoliy отреагировална krapotkin в Web камера (win)
у меня ТРИ подключенных камеры - Logitech, ChinaNoName и встроенная web-камера
все три нормально запускаются и нормально останавливаются в простейшем варианте из примеров.
Берлин
-
Anatoliy отреагировална RoschinSpb в Форма не на весь экран
Форма должна иметь значение свойства FormStyle равное fsPopup. См. также Всплывающие формы в XE5
-
Anatoliy отреагировална #WAMACO в Топ игровых приложений
Здравствуйте!
Порекомендуйте годные игры, в которые играете (играли) больше всего!
Формат сообщений:
официальное название жанр ОС ссылка AppStore / Google Play стоимость (платная/бесплатная)