Доска почета


Popular Content

Showing most liked content since 20.09.2017 in Сообщения

  1. 5 likes
    На самом деле это поведение можно достаточно просто отключить var Connect : TFDConnection; Query : TFDQuery; ... Connect.ResourceOptions.SilentMode := true; Query.ResourceOptions.SilentMode := true; ...
  2. 5 likes
    Наткнулся тут на изящную штуку для приложения с 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 := ''; Но и без этого работает.
  3. 5 likes
  4. 5 likes
    Все контролы, которые вы кидаете в TScrollBox находятся в дополнительном промежуточном контроле TScrollContent. Когда вы удаляете все дочерние узлы TScrollBox, то вы удаляете все сами, стиль и контент, что делать нельзя. Похожее поведение есть и в TTreeView: При попытке создать дочерние итемы при разворачивании узла дерева, у меня возникает ошибка. В чем может быть проблема? Поэтому, удалять объекты нужно непосредственно у контента. Это можно сделать так: type TOpenScrollBox = class(TScrollBox); procedure ClearChildren(AScrollBox: TScrollBox); begin Assert(AScrollBox <> nil); TOpenScrollBox(AScrollBox).Content.DeleteChildren; AScrollBox.Repaint; end;
  5. 4 likes
    Я бы порекомендовал добавить на форму Memo и разбросать по своему коду комбинацию из моего примера для поиска места, где происходит задержка: LTime := Now; // действие Memo1.Lines.Add('Тут название действия: '+ IntToStr(MilliSecondOfTheMinute(Now - LTime)) + ' ms');
  6. 4 likes
    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;
  7. 4 likes
    Форма должна иметь значение свойства FormStyle равное fsPopup. См. также Всплывающие формы в XE5
  8. 4 likes
    Исходный код TCustomWebBrowser.FormHandleCreated исправлен? На всякий случай - привожу сам код исправления. Файл FMX.WebBrowser.pas необходимо скопировать из исходников студии себе в проект, положив его рядом с dpr. И уже в нем сделать метод FormHandleCreated следующего вида (часть проверок 100% лишняя, но когда менял - подумал "пусть будет"): procedure TCustomWebBrowser.FormHandleCreated(const Sender: TObject; const Msg: TMessage); var WBService: IFMXWBService; begin if not Assigned(Self) then Exit; if not Assigned(Self.Root) then Exit; if Sender <> Self.Root.GetObject then Exit; if not(csDesigning in ComponentState) and TPlatformServices.Current.SupportsPlatformService(IFMXWBService, WBService) then // if not Assigned(FWeb) then begin if FWeb <> nil then WBService.DestroyWebBrowser(FWeb); FWeb := nil; // possibly, this not needed... FWeb := WBService.CreateWebBrowser; FWeb.SetWebBrowserControl(Self); FWeb.UpdateContentFromControl; FWeb.URL := FURL; FWeb.Navigate; end; end;
  9. 4 likes
    у меня есть заготовка, но не помню на чем остановился. надо будет посмотреть и выложить
  10. 4 likes
    Ребята, если вам нужна кнопка с картинкой на 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;
  11. 4 likes
    ага, действительно. в коде указано что берется позиции камеры InvokeOnMap( procedure(Map: JGoogleMap) begin TJMapsInitializer.JavaClass.initialize(TAndroidHelper.Activity); // workaround for older version of gms FCameraPosition := Map.GetCameraPosition; end); а нужно указать InvokeOnMap( procedure(Map: JGoogleMap) begin TJMapsInitializer.JavaClass.initialize(TAndroidHelper.Activity); // workaround for older version of gms FCameraPosition := Map.getMyLocation; end); хорошо было бы добавить это как еще одно свойство, но пока нет времени этим заниматься
  12. 3 likes
    в делфи делается так - li:= lv.Items.Add; lii:=li.Objects.FindObjectT<TListItemImage>('Image'); lii.OwnsBitmap:=True; далее можно грузить картинку, если в потоке то TThread.Synchronize(TThread.CurrentThread, procedure() begin // присваивание битмапу картинки lii.Bitmap:= TBitmap.Create; lii.Bitmap.SetSize(ItemBitmap.Width, ItemBitmap.Height); lii.Bitmap.Clear(TAlphaColors.Null); lii.Bitmap.CopyFromBitmap(ItemBitmap); end );
  13. 3 likes
    Раз уж пошла такая пьянка - выложу сюда то, что по виртуальной клавиатуре есть у меня на текущий момент (в телеграме уже выложил). Поддерживаются операционные системы: iOS, Windows. Оттестировано на 10.1 (Berlin) Итак: архив распаковать куда угодно, в проект в uses подключить модули uCommonCustomKeyboard (отвечает за подмену "штатной виртуальной клавиатуры" на свою) и ufrCustomNumpad (отвечает за отображение цифровой клавиатуры). Алфавитную, e-mail-овскую и тому подобные виды клавиатур оставляю на ваше усмотрение. Они делаются на основе ufrCustomNumpad, там больше заморочек с красивым размещением кнопок, чем с кодом. CustomKeyboards.7z
  14. 3 likes
    Когда у бабушки будут для этого необходимые предпосылки, ее будут называть дедушкой. Речь идет о совершенно конкретной задаче. Если вы назначите обработчик OnClick edit'у, то это будет уже другая задача, и решать ее нужно с учетом всех имеющихся обстоятельств. Если вы замахнулись на "абстрактность", то вам должно быть недостаточно использовать свойство Tag, которое, очевидно, является костылем, заменяющим в мелких проектиках с прямолинейной логикой использование нормальной модели данных...
  15. 3 likes
    COM-порт это потоковая штуковина. Считайте, что с точки зрения компьютера работа с ком-портом это получение / отправка непрерывного потока данных. Ни компьютер, ни подключенное устройство не имеют ни малейшего представления о том, что вы ожидаете какой-то конкретный ограниченный по объему набор байт. Они отдают ровно то, что есть в буфере на текущий момент. Посему, правильно будет делать так: одна часть приложения постоянно что-то читает из порта и добавляет считанное в конец общего буфера. другая часть приложения выбирает с начала общего буфера данные до тех пор, пока не поймет, что "вот оно - сообщение полностью прочитано". И после этого считанное удаляет из начала буфера.
  16. 3 likes
    Если нужно просто запустить программу, нажмите на "Подробнее", появится кнопка для запуска. инфа по цифровой подписи: Code Signing сертификаты или сертификаты разработчика. Виды, как выбрать Code signing для Open Source от Certum Code Signing в Windows, просто и недорого Где приобрести сертификат : KSoftware, Comodo, Symantec ... (ссылки есть в статьях) Как подписывать
  17. 3 likes
  18. 3 likes
    Переключил режим Энергосбережения с Оптимальный на Отключено и сразу проблема с коннектом пропала
  19. 3 likes
    Официальное название: Тинькофф Официальный сайт: http://tinkoff.ru Платформы: Android, iOS
  20. 3 likes
    Нет. ReturnKeyType - это всего лишь какая надпись будет на кнопке Enter. Поведение по нажатию на эту кнопку задаете именно вы. Система Андроид не знает о том, какой порядок табуляции установлен у ваших контролов, ей это глубоко симметрично. Если переход по Enter необходим - действительно используйте SetFocus, но на всякий случай - оберните его в TThread.ForceQueue
  21. 3 likes
    Есть еще один альтернативный способ доступа к объектам. Вместо 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';
  22. 3 likes
    Огромное спасибо Равиль! Как хорошо что вы помогаете. Итак для тех кто не знает, в 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 ;
  23. 3 likes
    Ну вот! Я же говорил как-то - жаль нельзя поставить "Мне нравится" несколько раз! Кто-то тут плачется все время, "вдруг Delphi умрет" ... "Delphi уже мертв" ... "FMX не сегодня завтра умрет" ... Я программирую на Pascal с 91го года. Начинал c Turbo Pascal 5.0. И с тех пор мне пытаются втереть "погромизды" - что Pascal/Delphi давно умер ... Тоже самое касается среды RAD Studio. Так вот благодаря таким людям как Ярослав, Андрей, Равиль и многим многим другим, он не только не умер. Он еще и, в большинстве случаев!, даст форы многим другим языкам и IDE. Так-что еще раз спасибо за решение проблемы! (скажите мне - в каких средах или языках их (проблем) нет! ))))
  24. 3 likes
    Может кому пригодится https://github.com/ersanyakit/FMX.Radio
  25. 2 likes
    обычно люди с начало у гугля спрашивают а потом на форум идут. гугль сказал вот что - 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 и в нем и находишь последнюю версию на маркете.
  26. 2 likes
    Получаем call-stack в iOS - https://blog.grijjy.com/2017/02/09/build-your-own-error-reporter-part-1-ios/ Получаем call-stack в Android - https://blog.grijjy.com/2017/02/21/build-your-own-error-reporter-part-2-android/ Библиотека для Windows(и не только call-stack): DebugEngine
  27. 2 likes
    Если не ошибаюсь, 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;
  28. 2 likes
    По умолчанию в 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 или смотрите видео.
  29. 2 likes
    тут для новичка стоит сказать, что 1) этот массив нужно бы делать полем формы 2) приведенный кусок тоже должен находиться в методе этой формы 3) тогда указание Form1. не нужно 4) присваивание метода OnClick без скобок! MyButton[I].OnClick := MyOnClick; где MyOnClick это procedure TForm1.MyOnClick(Sender:TObject); 5) не обязательно, но ОБЫЧНО владельцем созданного объекта назначают не его родителя а саму форму или фрейм MyButton := TButton.Create(Self)
  30. 2 likes
    Где фотоотчет и краткое содержание? @Vitaldj , @Error Телеграм телеграмом, но далеко не все там сидят, да и темы в чате быстро уходят в небытие. Срочно зафиксировать здесь для потомков!
  31. 2 likes
  32. 2 likes
    Я получал, получаю и буду получать ;-) Все бесплатно, срок 3 месяца, но продление полностью автоматизировано (по крону запускаешь скрипт и она сам продляет). Отличная система, рекомендую.
  33. 2 likes
    Вы не прилагаете тестовый пример. Сделал это за Вас. Итак. В моем примере, откомпилированном в Delphi Berlin и запущенном на Windows, 500 строк заполняются за 13-20 миллисекунд. Запустите его на Delphi XE6 и скажите Ваш результат. Если результат соизмерим с моим, то дело не в StringGrid. tstStringGrid.rar
  34. 2 likes
    Апну тему, пусть в топе повисит, может еще кто подтянется. Все-таки 5 октября уже не за горами.
  35. 2 likes
    вот вообще ничего не менялось в стринггриде в этой конкретно строке StringGrid1.Cells[ACol, ARow] := myString; перед этим нужно только добавить в грид нужное количество колонок
  36. 2 likes
  37. 2 likes
    Края лесенкой и эффекты... На некоторых девайсах получится полный факап)
  38. 2 likes
    Проблема в MUI. Предполагаю, что надо искать решение в запросе разрешений на уведомления, разбудить телефон, показать приложение поверх других окон, еще что-нибудь такое. Потому что в MUI большой упор на энергосбережение, безопасность и спам. Я замучился уже с MUI, не для разработчиков ось =)
  39. 2 likes
    с нового года пользуюсь приложением для подсчета расходов на автомобиль. довольно неплохое приложение Авто Расходы - Car Expenses
  40. 2 likes
    Обратите внимание на модуль System.IOUtils, а в частности на класс TDirectory. Там Вы найдёте все что Вам нужно.
  41. 1 like
    Вот так можно узнать, какая кнопка нажата (в продолжение предыдущего сообщения): procedure TForm1.OnMyClick(Sender: TObject); var MyButton: TButton absolute Sender; begin ShowMessage(MyButton.Name + ' ' + MyButton.Tag.ToString); end;
  42. 1 like
    Попробуйте назначать родителя браузеру после смены стиля рамки формы. Дело в том, что изменение рамки приводит к пересозданию хэндла окна и скорее всего это не отслеживается браузером что и приводит в итоге к ошибке...
  43. 1 like
    Завтра!!! 5 октября, в 19:00, на "Чердаке" ( https://yandex.ru/maps/-/CBUIUKb0PD Куйбышева 38/40, ближайшее метро - Горьковская ) (А то сам уже почти забыл )
  44. 1 like
    Т.е. алгоритм примерно вырисовывается такой (в приложении к моей задаче, см. выше): 1. Получение данных из БД 2. Очистка TListBox. (от предыдущих данных) 3. Вставка в нужном кол-ве TListBoxItem (в цикле). На каждый TListBoxItem кладем сколько надо TText, которые заполняем чем надо. Можно сюда же положить TChecBox или TSwitch для наглядности. Здесь навскидку вопрос. При очистке достаточно удалить TListBoxItem с TListBox, или надо удалять все, что там лежит (я имею ввиду Free). Не будет ли утечки памяти?
  45. 1 like
    Ну, 25%! Для дельфин не плохой результат)))
  46. 1 like
    В синхронизации. С чего вы решили, что по ReadFile ваш прибор, подключенный к ком порту должен передать или иметь в буфере сом порта именно "правильную" строку? Думаю, надо после приема производить разборку принятой строки и формировать требуемую вам.
  47. 1 like
    в FMX нету datasource и в принципе не будет, хотя бы потому, что этот вариант слабо реализуем и даже вреден на мобилах так что вам всяко нужно хранить как минимум ключ к каждой записи. Вы конечно можете в гриде колонку держать с ключом, но это не всегда нормально Подключать Objects и пихать туда integer, как на VCL, тоже не будет работать. Так что привыкайте создавать нормальные модели данных и работать с ними...
  48. 1 like
  49. 1 like
    Спустя полгода решение проблемы все-таки нашлось. Благодарю эксперта kami!
  50. 1 like
    Soccerstand (результаты матчей онлайн) http://www.soccerstand.com Android
This leaderboard is set to Москва/GMT+03:00