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

Anatoliy

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

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

  • Посещение

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

  1. Like
    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 и в нем и находишь последнюю версию на маркете. 
  2. Like
    Anatoliy отреагировална enatechno в [Андроид]не видно картинки   
    Проверьте наличие файла  if(FileExists(path)) перед LoadFromFile(path);
  3. Like
    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
     
  4. Like
    Anatoliy отреагировална Равиль Зарипов (ZuBy) в Окончание подписки   
    ага, все верно
  5. Like
    Anatoliy отреагировална Равиль Зарипов (ZuBy) в Окончание подписки   
    так и должно быть, это чтобы не делать мусорку в аппстор.
  6. Like
    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
  7. Like
    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;  
  8. Like
    Anatoliy отреагировална Равиль Зарипов (ZuBy) в TPushClient - нашёл чудесную вещь   
    у меня есть заготовка, но не помню на чем остановился. надо будет посмотреть и выложить
  9. Like
    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 := '';
    Но и без этого работает.
     
  10. Like
    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 или смотрите видео.
     
  11. Like
    Anatoliy отреагировална enatechno в [ListView] DynamicAppearance   
    Посмотрите эту тему. Там на дельфи, но думаю, общий смысл поймете.
  12. Like
    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;  
  13. Like
    Anatoliy отреагировална Vitaldj в Встреча в Питере!   
  14. Like
    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;
     
  15. Like
    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';  
     
  16. Like
    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 ;
     
     
     
  17. Like
    Anatoliy отреагировална krapotkin в Подскажите какой выбрать компонент   
    Ну почти никто не пользуется этим гридом. Хотя у меня есть проект на windows. данные берет из http-запроса. все в принципе работает, но не айс, конечно, не VCL. Зато красиво
    если на андроиде, то тем более там и смысла нет использовать грид.
    Здесь есть ListView - наше всё. А еще ModernLV от ZuBy, который еще более наше всё
  18. Like
    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;  
  19. Like
    Anatoliy отреагировална Евгений Корепов в Цифровая подпись   
    Не действительны сертификаты SSL Certificates (для web-серверов).
    У них все сертификаты всегда были бесплатными (поэтому их американские монстры и прижали), платная только проверка пользователя - т.е. один раз проходишь валидацию нужного тебе класса и целый год выпускаешь сертификаты бесплатно.
  20. Like
    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-вской графике, программа бы и не пошевелилась)
  21. Like
    Anatoliy отреагировална Евгений Корепов в Tethering тормиозит   
    apptethering довольно убогий (его реализация в дельфи) - написали по быстрому модную технологию и забросили. Если не ошибаюсь, за все время существования компонента ни разу он не был исправлен или доделан.
    Для вашего случая проще и быстрее использовать Indy (UDP сервер и клиент) - для одновременного получения клиентами сообщения отсылаете его сервером в multicast режиме на какой нибудь порт, клиенты получат его одновременно. В apptethering не знают про multicast, по крайней мере в исходниках не нашел и потоки используются только временами и не предсказуемо.
  22. Like
    Anatoliy отреагировална krapotkin в Долго загружаются данные в Grid   
    вот вообще ничего не менялось в стринггриде в этой конкретно строке
    StringGrid1.Cells[ACol, ARow] := myString;
    перед этим нужно только добавить в грид нужное количество колонок
  23. Like
    Anatoliy отреагировална krapotkin в Web камера (win)   
    у меня ТРИ подключенных камеры - Logitech, ChinaNoName и встроенная web-камера
    все три нормально запускаются и нормально останавливаются в простейшем варианте из примеров.
    Берлин
  24. Like
    Anatoliy отреагировална RoschinSpb в Форма не на весь экран   
    Форма должна иметь значение свойства FormStyle равное fsPopup. См. также Всплывающие формы в XE5
  25. Like
    Anatoliy отреагировална #WAMACO в Топ игровых приложений   
    Здравствуйте!
    Порекомендуйте годные игры, в которые играете (играли) больше всего!
    Формат сообщений:
    официальное название жанр ОС ссылка AppStore / Google Play стоимость (платная/бесплатная) 
×
×
  • Создать...