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

kami

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

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

  • Посещение

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

    41

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

  1. Like
    kami получил реакцию от Brovin Yaroslav в Открытие ссылки в проекте Firemonkey   
    Вы не там ифдефы пишете. Не нужно здесь много модулей.
    Для примера. (емнип - автор @Равиль Зарипов (ZuBy) ). Единая точка входа в функцию и отличаются только внутренности.
    function OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean; var {$IFDEF ANDROID} Intent: JIntent; {$ENDIF} {$IFDEF IOS} NSU: NSUrl; {$ENDIF} {$IFDEF MSWINDOWS} Res: HINST; {$ENDIF} begin {$IFDEF ANDROID} // There may be an issue with the geo: prefix and URLEncode. // will need to research Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, TJnet_Uri.JavaClass.parse(StringToJString(TIdURI.URLEncode(URL)))); try TAndroidHelper.Activity.startActivity(Intent); exit(true); except on e: Exception do begin if DisplayError then TDialog.ShowMessage('Error: ' + e.Message); exit(False); end; end; {$ENDIF} {$IFDEF IOS} // iOS doesn't like spaces, so URL encode is important. NSU := StrToNSUrl(URL); if SharedApplication.canOpenURL(NSU) then exit(SharedApplication.OpenURL(NSU)) else begin if DisplayError then TDialog.ShowMessage('Error: Opening "' + URL + '" not supported.'); exit(False); end; {$ENDIF} {$IFDEF MSWINDOWS} Res := ShellExecute(0, 'open', PChar(URL), nil, nil, SW_SHOW); Result := Res > 32; {$ENDIF} end; И теперь "снаружи" этой функции вам без разницы, под какую платформу идет сборка. В любом случае вы пишете "OpenURL('http://blablabla.net');". Безо всяких IFDEF.
  2. Like
    kami отреагировална x11 в Цикл по unicode строке   
    В общем, оказалось, что "'CharInSet' is deprecated: 'Use TCharHelper functionality'"
    Правильно вот так:
    uses System.Character; ... ... for ch in s do if ch.IsInArray(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']) then result := result + ch; или "IsDigit" если нужны только цифры for ch in s do if ch.IsDigit then result := result + ch; http://docwiki.embarcadero.com/Libraries/XE7/en/System.Character.IsDigit
  3. Like
    kami получил реакцию от ENERGY в Подскажите необходимое железо для разработки под iOS   
    На 10.2 никаких танцев не требуется. Проблемы только начиная с 11 версии, поскольку 11 симуляторы хотят работать только под 64 бита. А делфя пока не умеет мак в 64 бита.
  4. Like
    kami получил реакцию от Anatoliy в Подскажите необходимое железо для разработки под iOS   
    у нас в качестве сборщика - какой-то древний макмини.
    До iOS11 напрягало, что симулятор для отладки запускается безумно медленно.
    А как перешли на Токио + IOS11 - эта проблема перестала играть роль, поскольку симулятор теперь просто не работает . Радикальное такое решение проблемы :)))
  5. Like
    kami получил реакцию от Rusland в Убить поток TThread кроссплатформено   
    С каких пор в Delphi перестали существовать TCriticalSection, TMutex, TEvent? Которые, кстати, работают кроссплатформенно, используя штатные средства, предоставляемые ОС.
  6. Like
    kami получил реакцию от #WAMACO в Убить поток TThread кроссплатформено   
    С каких пор в Delphi перестали существовать TCriticalSection, TMutex, TEvent? Которые, кстати, работают кроссплатформенно, используя штатные средства, предоставляемые ОС.
  7. Like
    kami получил реакцию от krapotkin в Убить поток TThread кроссплатформено   
    С каких пор в Delphi перестали существовать TCriticalSection, TMutex, TEvent? Которые, кстати, работают кроссплатформенно, используя штатные средства, предоставляемые ОС.
  8. Like
    kami получил реакцию от valdemar в Запуск приложения из текущего   
    CreateProcess, StartupInfo, ProcessInformation, WaitForSingleObject, CloseHandle объявлены в  WinAPI. У других операционных систем методы запуска другие.
  9. Like
    kami получил реакцию от krapotkin в IdTCPClient, IdTCPSever - снова о кодировке   
    Зато его можно указать в конструкторе.
     
    Нет. Исходная string в версиях от 2009 и выше - это UnicodeString. В большинстве случаев можно считать как WideString или UCS-2. Кодировка по 2 байта на символ. ANSI - это 1 байт на символ.
    Действительно, получившийся у Вас код не есть супер-красив. Я продолжаю считать, что всего навсего явное указание Encoding для StringStream снимет эти проблемы. Всякие остальные преобразования, включая явные упоминания конкретных TEncoding  и функций перекодировки не нужны.
  10. Like
    kami получил реакцию от AngryOwl в Уничтожение TFrame   
    Я бы поменял их местами.
    Несколько странно сперва уничтожать объект, а потом обращаться к его полям и методам...
  11. Like
    kami получил реакцию от Равиль Зарипов (ZuBy) в Уничтожение TFrame   
    Я бы поменял их местами.
    Несколько странно сперва уничтожать объект, а потом обращаться к его полям и методам...
  12. Like
    kami получил реакцию от Вольдемар в Уничтожение TFrame   
    Я бы поменял их местами.
    Несколько странно сперва уничтожать объект, а потом обращаться к его полям и методам...
  13. Like
    kami получил реакцию от Andrey Efimov в Уничтожение TFrame   
    Я бы поменял их местами.
    Несколько странно сперва уничтожать объект, а потом обращаться к его полям и методам...
  14. Like
    kami получил реакцию от Равиль Зарипов (ZuBy) в Вызов TPopup ломает поведение TWebBrowser   
    Апну тему.
    На этот раз - Tokio upd1, с патчем под iOS11.
    Что требуется: скопировать в папку с проектом (рядом с dpr) файл FMX.WebBrowser.pas. В нем внести изменения в метод TCustomWebBrowser.FormHandleCreated, чтобы он выглядел следующим образом:
     
    procedure TCustomWebBrowser.FormHandleCreated(const Sender: TObject; const Msg: TMessage); function GetParentForm(Control: TFmxObject): TCommonCustomForm; begin if (Control.Root <> nil) and (Control.Root.GetObject is TCommonCustomForm) then Result := TCommonCustomForm(Control.Root.GetObject) else Result := nil; end; var WBService : IFMXWBService; begin if not (csDesigning in ComponentState) and ((FWeb = nil) or (Sender = GetParentForm(self as TFmxObject))) and TPlatformServices.Current.SupportsPlatformService(IFMXWBService, WBService) then begin WBService.DestroyWebBrowser(FWeb); // добавлена эта строка. FWeb := WBService.CreateWebBrowser; FWeb.SetWebBrowserControl(Self); FWeb.UpdateContentFromControl; FWeb.URL := FURL; FWeb.Navigate; end; end; Что дает правка:
    допустим, у вас есть WB на главной форме и на дочерней форме (или фрейме - без разницы), которая создается / уничтожается динамически. При создании вторичной формы метод FormHandleCreated вызывается дважды, при этом FWeb, созданный в первом вызове просто забывается, но не уничтожается (сильная ссылка в списке веббраузеров в WBService). Дальше вторичная форма уничтожается (захватывая с собой FWeb, созданный при втором вызове FormHandleCreated ), а в "забытом" FWeb остаются невалидные ссылки на родителя. Что при вызове метода TWBFactoryService.RealignBrowsers (активация / изменение размеров формы) приведет к AV.
    Внесенное изменение удаляет FWeb из списка WBService, и в дальнейшем ничего не мешает его спокойному уничтожению.
  15. Like
    kami получил реакцию от #WAMACO в Вызов TPopup ломает поведение TWebBrowser   
    Апну тему.
    На этот раз - Tokio upd1, с патчем под iOS11.
    Что требуется: скопировать в папку с проектом (рядом с dpr) файл FMX.WebBrowser.pas. В нем внести изменения в метод TCustomWebBrowser.FormHandleCreated, чтобы он выглядел следующим образом:
     
    procedure TCustomWebBrowser.FormHandleCreated(const Sender: TObject; const Msg: TMessage); function GetParentForm(Control: TFmxObject): TCommonCustomForm; begin if (Control.Root <> nil) and (Control.Root.GetObject is TCommonCustomForm) then Result := TCommonCustomForm(Control.Root.GetObject) else Result := nil; end; var WBService : IFMXWBService; begin if not (csDesigning in ComponentState) and ((FWeb = nil) or (Sender = GetParentForm(self as TFmxObject))) and TPlatformServices.Current.SupportsPlatformService(IFMXWBService, WBService) then begin WBService.DestroyWebBrowser(FWeb); // добавлена эта строка. FWeb := WBService.CreateWebBrowser; FWeb.SetWebBrowserControl(Self); FWeb.UpdateContentFromControl; FWeb.URL := FURL; FWeb.Navigate; end; end; Что дает правка:
    допустим, у вас есть WB на главной форме и на дочерней форме (или фрейме - без разницы), которая создается / уничтожается динамически. При создании вторичной формы метод FormHandleCreated вызывается дважды, при этом FWeb, созданный в первом вызове просто забывается, но не уничтожается (сильная ссылка в списке веббраузеров в WBService). Дальше вторичная форма уничтожается (захватывая с собой FWeb, созданный при втором вызове FormHandleCreated ), а в "забытом" FWeb остаются невалидные ссылки на родителя. Что при вызове метода TWBFactoryService.RealignBrowsers (активация / изменение размеров формы) приведет к AV.
    Внесенное изменение удаляет FWeb из списка WBService, и в дальнейшем ничего не мешает его спокойному уничтожению.
  16. Like
    kami получил реакцию от enatechno в Сборка приложения для IOS 11   
    Можно поподробнее, про что поподробнее?
    Скачал последний XCode, поставил, убедился что в Preferences-Locations стоит последняя версия Command line tools -> Установил патчи в PAServer и IDE -> удалил напрочь все "старые" SDK из опций IDE, удалил их из папки -> скачал SDK 11.1, убедился что SDK 11.1 активны -> скомпилировал и задеплоил (кажется, во время деплоя мне было сказано, что Bundle Identificator плох, пришлось заменить его с вида F43234.com.application.my на com.application.my.
    Это, по большому счету, всё, что касается работы с SDK 11.1, остальные танцы с бубном (на предыдущих SDK) не вижу смысла приводить. Тщательно разбирайте ошибки компиляции и деплоя и будет вам счастье
  17. Like
    kami получил реакцию от Anatoliy в Вызов TPopup ломает поведение TWebBrowser   
    Апну тему.
    На этот раз - Tokio upd1, с патчем под iOS11.
    Что требуется: скопировать в папку с проектом (рядом с dpr) файл FMX.WebBrowser.pas. В нем внести изменения в метод TCustomWebBrowser.FormHandleCreated, чтобы он выглядел следующим образом:
     
    procedure TCustomWebBrowser.FormHandleCreated(const Sender: TObject; const Msg: TMessage); function GetParentForm(Control: TFmxObject): TCommonCustomForm; begin if (Control.Root <> nil) and (Control.Root.GetObject is TCommonCustomForm) then Result := TCommonCustomForm(Control.Root.GetObject) else Result := nil; end; var WBService : IFMXWBService; begin if not (csDesigning in ComponentState) and ((FWeb = nil) or (Sender = GetParentForm(self as TFmxObject))) and TPlatformServices.Current.SupportsPlatformService(IFMXWBService, WBService) then begin WBService.DestroyWebBrowser(FWeb); // добавлена эта строка. FWeb := WBService.CreateWebBrowser; FWeb.SetWebBrowserControl(Self); FWeb.UpdateContentFromControl; FWeb.URL := FURL; FWeb.Navigate; end; end; Что дает правка:
    допустим, у вас есть WB на главной форме и на дочерней форме (или фрейме - без разницы), которая создается / уничтожается динамически. При создании вторичной формы метод FormHandleCreated вызывается дважды, при этом FWeb, созданный в первом вызове просто забывается, но не уничтожается (сильная ссылка в списке веббраузеров в WBService). Дальше вторичная форма уничтожается (захватывая с собой FWeb, созданный при втором вызове FormHandleCreated ), а в "забытом" FWeb остаются невалидные ссылки на родителя. Что при вызове метода TWBFactoryService.RealignBrowsers (активация / изменение размеров формы) приведет к AV.
    Внесенное изменение удаляет FWeb из списка WBService, и в дальнейшем ничего не мешает его спокойному уничтожению.
  18. Like
    kami получил реакцию от Rusland в Вызов TPopup ломает поведение TWebBrowser   
    Апну тему.
    На этот раз - Tokio upd1, с патчем под iOS11.
    Что требуется: скопировать в папку с проектом (рядом с dpr) файл FMX.WebBrowser.pas. В нем внести изменения в метод TCustomWebBrowser.FormHandleCreated, чтобы он выглядел следующим образом:
     
    procedure TCustomWebBrowser.FormHandleCreated(const Sender: TObject; const Msg: TMessage); function GetParentForm(Control: TFmxObject): TCommonCustomForm; begin if (Control.Root <> nil) and (Control.Root.GetObject is TCommonCustomForm) then Result := TCommonCustomForm(Control.Root.GetObject) else Result := nil; end; var WBService : IFMXWBService; begin if not (csDesigning in ComponentState) and ((FWeb = nil) or (Sender = GetParentForm(self as TFmxObject))) and TPlatformServices.Current.SupportsPlatformService(IFMXWBService, WBService) then begin WBService.DestroyWebBrowser(FWeb); // добавлена эта строка. FWeb := WBService.CreateWebBrowser; FWeb.SetWebBrowserControl(Self); FWeb.UpdateContentFromControl; FWeb.URL := FURL; FWeb.Navigate; end; end; Что дает правка:
    допустим, у вас есть WB на главной форме и на дочерней форме (или фрейме - без разницы), которая создается / уничтожается динамически. При создании вторичной формы метод FormHandleCreated вызывается дважды, при этом FWeb, созданный в первом вызове просто забывается, но не уничтожается (сильная ссылка в списке веббраузеров в WBService). Дальше вторичная форма уничтожается (захватывая с собой FWeb, созданный при втором вызове FormHandleCreated ), а в "забытом" FWeb остаются невалидные ссылки на родителя. Что при вызове метода TWBFactoryService.RealignBrowsers (активация / изменение размеров формы) приведет к AV.
    Внесенное изменение удаляет FWeb из списка WBService, и в дальнейшем ничего не мешает его спокойному уничтожению.
  19. Like
    kami получил реакцию от Rusland в Сборка приложения для IOS 11   
    XCode 9.1 + SDK 11.1 + iOS 11.1 +RAD 10.2.1 (с патчем PAServer и IDE под iOS11)
    Собрано 64 битное приложение (Universal binary file) и оно РАБОТАЕТ!!!
    Мучился довольно долго, под 11.0 сборка не хотела идти категорически (валилось на лишних разрешениях в Provision profile, про них говорилось в окне Build делфи).
    Заново ставил патч, удалял SDK 11.0, накатывал заново - не хотело идти, приложение вроде запускалось и сразу закрывалось на IPAD mini.
    А с 11.1 прокатило сразу же. Я не знаю, почему - может, из-за свежего SDK, может из-за того, что оно ставилось "в чистую" (хотя я и 11.0 SDK удалял ручками из папки документов).
    Главное - есть результат. Если нужны какие-то подробности - пишите, постараюсь ответить (хотя с моей точки зрения - всё это были танцы с бубном).
  20. Like
    kami получил реакцию от Равиль Зарипов (ZuBy) в Сборка приложения для IOS 11   
    XCode 9.1 + SDK 11.1 + iOS 11.1 +RAD 10.2.1 (с патчем PAServer и IDE под iOS11)
    Собрано 64 битное приложение (Universal binary file) и оно РАБОТАЕТ!!!
    Мучился довольно долго, под 11.0 сборка не хотела идти категорически (валилось на лишних разрешениях в Provision profile, про них говорилось в окне Build делфи).
    Заново ставил патч, удалял SDK 11.0, накатывал заново - не хотело идти, приложение вроде запускалось и сразу закрывалось на IPAD mini.
    А с 11.1 прокатило сразу же. Я не знаю, почему - может, из-за свежего SDK, может из-за того, что оно ставилось "в чистую" (хотя я и 11.0 SDK удалял ручками из папки документов).
    Главное - есть результат. Если нужны какие-то подробности - пишите, постараюсь ответить (хотя с моей точки зрения - всё это были танцы с бубном).
  21. Like
    kami отреагировална rareMax в Call-Stack на Android, iOS, Windows   
    Получаем 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
  22. Like
    kami получил реакцию от Rusland в VCL procedure to FMX   
    Your code can be replaced with:
    var Stream: TStream; begin Stream:=TMemoryStream.Create; try SourceBitmap.SaveToStream(Stream); Stream.Seek(0, soBeginning); NewBitmap.LoadFromStream(Stream); finally Stream.Free; end; end;  
  23. Like
    kami получил реакцию от Andrey Efimov в Нестандартная клавиатура для своего приложения   
    Раз уж пошла такая пьянка - выложу сюда то, что по виртуальной клавиатуре есть у меня на текущий момент (в телеграме уже выложил).
    Поддерживаются операционные системы: iOS, Windows. Оттестировано на 10.1 (Berlin)
    Итак: архив распаковать куда угодно, в проект в uses подключить модули uCommonCustomKeyboard (отвечает за подмену "штатной виртуальной клавиатуры" на свою) и ufrCustomNumpad (отвечает за отображение цифровой клавиатуры).
    Алфавитную, e-mail-овскую и тому подобные виды клавиатур оставляю на ваше усмотрение. Они делаются на основе ufrCustomNumpad, там больше заморочек с красивым размещением кнопок, чем с кодом.
    CustomKeyboards.7z
  24. Like
    kami получил реакцию от Rusland в Нестандартная клавиатура для своего приложения   
    Раз уж пошла такая пьянка - выложу сюда то, что по виртуальной клавиатуре есть у меня на текущий момент (в телеграме уже выложил).
    Поддерживаются операционные системы: iOS, Windows. Оттестировано на 10.1 (Berlin)
    Итак: архив распаковать куда угодно, в проект в uses подключить модули uCommonCustomKeyboard (отвечает за подмену "штатной виртуальной клавиатуры" на свою) и ufrCustomNumpad (отвечает за отображение цифровой клавиатуры).
    Алфавитную, e-mail-овскую и тому подобные виды клавиатур оставляю на ваше усмотрение. Они делаются на основе ufrCustomNumpad, там больше заморочек с красивым размещением кнопок, чем с кодом.
    CustomKeyboards.7z
  25. Like
    kami получил реакцию от enatechno в returnkeytype Next не работает переход между контролами   
    Нет.
    ReturnKeyType - это всего лишь какая надпись будет на кнопке Enter. Поведение по нажатию на эту кнопку задаете именно вы.
    Система Андроид не знает о том, какой порядок табуляции установлен у ваших контролов, ей это глубоко симметрично. Если переход по Enter необходим - действительно используйте SetFocus, но на всякий случай - оберните его в TThread.ForceQueue
×
×
  • Создать...