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

Nix0N

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

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

  • Посещение

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

    12

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

  1. Like
    Nix0N отреагировална Brovin Yaroslav в [Windows] Как можно сделать эффект "Липкие окошки" TForm?   
    Добрый день,
     
    У FireMonkey нету готового решения из коробки. Но, можно реализовать вручную так:
    Получаем хендл окна формы: 
    uses FMX.Platform.Win; //...... var WinHandle: TWinWindowHandle; begin WinHandle := WindowHandleToPlatform(Handle); // WinHandle.Wnd < -- Хендл окна end Вешаем Hook на оконную процедуру, используя полученный хендл и функции установки хука: Hook Functions В перекрытой нами оконной процедуре перехватываем сообщение WM_WINDOWPOSCHANGING и корректируем позицию окна, используя информацию о границе экрана и других окнах на экране. Таким способом можно сделать прилипание не только к границе экрана, но и к другим окнам (так же как прилипают между собой окна виджетов).
  2. Like
    Nix0N получил реакцию от Brovin Yaroslav в [Отклонение] При попытки максимизировать стилизованного окно, окно не разворачивается   
    Установить Update 1 для XE6 "Window can't be maximized with styles, which have custom window border" выдержка из Fix list
  3. Like
    Nix0N отреагировална brunnengi в Доступно ли сглаживание на Windows XP?   
    А почему бы и нет?
    Есть какое то личное не доверие к программам на FMX?
    Выбирал FMX потому что уже давно работал на компонентах DanJetX. Но он был только под D7. И сами проект был заброшен разработчиком.
    Я давно делаю приложения с 3D моделями и 2D эффектами. Но возможности DanJetX не безграничны. И тут FMX появилась. Я лично только рад был их расширению.
    А с помощью анимаций, layout'ов и т.д. разрабатывается удобный и понятный интерфейс. Переход с VCL версии на FMX позволило значительно ускорит работу кассиров. А так же убрать (не снизить, а убрать) количество ошибок при работе, что избавило кассиров от необходимости докладывать свои деньги. Удобный, понятный интерфейс, с приятной анимацией, с боковыми панельками, адаптивными меню позволяет делать работу с программой более понятной, прозрачной.
     
    А что касается выбора FMX для терминалов, я просто привык к FMX. Разрабатывать в нем удобнее и приятнее чем в VCL. То что я делал в VCL по несколько недель, теперь в FMX делается за одну-две недели (я про визуальную часть). Да и не вести же мне одну версию в FMX, а другую в VCL. А сейчас вот АппТетринг прикручивать буду с терминальной версии. Ибо удобно не открывая сам терминал управлять им, получать информацию о ленте и т.д., т.е. небольшая помощь при инкассациях и обслуживании.
  4. Like
    Nix0N получил реакцию от Kitty в [TWebBrowser] Как получить исходный текст страницы из WebBrowser?   
    Сам когда-то спрашивал, сам же и отвечу. В составе компонентов TMS Pack for FireMonkey версии 2.5.0.2 от 4 Июля 2014 года появился компонент TTMSFMXWebBrowser, который обеспечивает данный функционал.
  5. Like
    Nix0N получил реакцию от serg557 в [TidHTTPServer] Не удается получить русские символы в idHTTPServer   
    Быстрый способ для GET-запроса:
    TIdURI.URLEncode('http://www.mysite.com/search?q=кириллица');
  6. Like
    Nix0N получил реакцию от Kitty в [Отклонение] При попытки максимизировать стилизованного окно, окно не разворачивается   
    Установить Update 1 для XE6 "Window can't be maximized with styles, which have custom window border" выдержка из Fix list
  7. Like
    Nix0N получил реакцию от Евгений Корепов в [Windows] Запуск программы с запросом прав администратора   
    1. Создаем текстовый файл и меняем расширение на manifest (название_файла.manifest), примерно с таким содержанием:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges> <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> </assembly> 2. В IDE идем по пути Project -> Options -> Application -> RunTime Themes -> Use custom manifest и указываем путь до нашего файла манифеста.
     
    Все готово ! 
     
    P.S. Делайте это в последнюю очередь при завершении проекта, иначе не удобно отлаживать программу: приходится собирать программу в IDE, а запускать отдельно из файлового менеджера. Когда попробуете - сами узнаете почему ) Или же временно, на момент разработки, установить использование стандартного манифеста.
     
    P.S.S. в файле-манифесте так же указывается разрядность приложения win32 или win64 и т.д. Не составит проблемы почитать об этом в сети.
  8. Like
    Nix0N отреагировална Brovin Yaroslav в [Windows] Поиск всех окон Windows   
    В FireMonkey у объекта TApplication нету Handle. Поэтому, как его получить читаем тему: [Windows] Как получить HWND Application?
     
    P.S. В следующий раз я такую тему закрою, так как она не соответствует правилам.
  9. Like
    Nix0N отреагировална Brovin Yaroslav в Ищу компонент для работы с ZIP архивами   
    В RTL включен уже класс по работе с ZIP-архивами: System.Zip.TZipFile
  10. Like
    Nix0N отреагировална ibaseru в Юридические вопросы о необходимости покупке лицензии   
    ZuBy, вы неправы. Триалы обычно предназначены исключительно для ознакомления, и бесплатные или платные программы на них разрабатывать нельзя.В частности, в 22м пункте лицензии на XE5 написано
    То есть, " в целях ознакомления". "В маркет" к ознакомлению ну никак не относится, как и использование ПО, созданного на триале, внутри организации.
  11. Like
    Nix0N отреагировална Brovin Yaroslav в Я не понимаю, как динамически создавать объекты.   
    Глядя на ваш проект, я могу уверенно сказать, что вы не знаете основ объектно-ориентированного языка Delphi. А раз так, то я вам порекомендовал бы вначале изучить основы, а потом уже писать код. После прочтения, хотя бы Программирование на языке Delphi. Учебное пособие. у вас у самого отпадут многие вопросы и думаю вы по другому взгляните на свой код.
     
    P.S. Пара мыслей на счет вашего кода:
    Ваша ошибка: Попытка обратиться изнутри класса формы к полям формы, через внешнюю глобальную переменную, которая просто не создана.
    Например, здесь вы создаете форму и сохраняете ее в локальной переменной AForm
    procedure TForm1.Button1Click(Sender: TObject); var Aform:TForm5; begin Aform := TForm5.Create(Application); Aform.Parent := Form1; Aform.Width := Form1.Width; Aform.Height := Form1.Height; Aform.Left := Form1.Left; Aform.Top := Form1.Top; Aform.ShowModal; Aform.Destroy; end; А тут, почему-то считаете, что в Form5 содержит вашу форму, что и в AForm (Не верно, никакой связи между этими переменными нету).
    procedure TForm5.FormCreate(Sender: TObject); begin Form5 := Button1.Parent as TForm5; Form5.Height:=300; Form5.Width:=400; end; Неправильно, Обращаться к форме внутри формы, через глобальную переменную по многим причинам.
    var Form5: TForm5; procedure TForm5.FormCreate(Sender: TObject); begin Form5 := Button1.Parent as TForm5; Form5.Height := 300; Form5.Width := 400; end; Отсюда при обращении к Form5.Height (где Form5 = nil в вашем случае) вы получите Aсcess Voiolation Правильно: напрямую обращаться внутри класса к полям формы:
    var Form5: TForm5; procedure TForm5.FormCreate(Sender: TObject); begin Height := 300; Width := 400; end;
  12. Like
    Nix0N получил реакцию от egeven в Как узнать текущие положения вертикального и горизонтального скролов в TScrollBox?   
    ScrollBox.ViewportPosition.Y - вертикаль
    ScrollBox.ViewportPosition.X - горизонталь
  13. Like
    Nix0N отреагировална Kitty в Как в Firemonkey на C++Builder использовать ява код?   
    Может кому пригодиться. Использование java классов JIntent и JNet_Uri. Спасибо разработчику Indy Remy Lebeau (TeamB)
    http://bcbjournal.org/forums/
    void PlayVideo(const String AFileName) { _di_JIntent Intent = TJIntent::JavaClass->init(TJIntent::JavaClass->ACTION_VIEW); _di_Jnet_Uri Data = StrToJURI(AFileName); Intent->setDataAndType(Data, StringToJString(L"video/mp4")); SharedActivity()->startActivity(Intent); }
  14. Like
    Nix0N получил реакцию от Вячеслав в [Windows] TnTRayIcon не визуальный компонент обеспечивающий управление значком в области System Tray   
    Набросал компонент для работы с значком в системном трее. Компонент только для FM и только для платформы Windows ! Среда: Delphi XE6 
     
    Основные моменты
     
    Свойства:
    Hint : string - отображает текст при наведении на значок в системном трее BalloonTitle : string - текст заголовка всплывающей подсказки BalloonText : string - текст содержания всплывающей подсказки IconBalloonType : TBalloonIconType - иконка всплывающей подсказки. Принимает значения: ​​​​BigError, BigWarning, Error, Info, None, User, Warning Indent : Cardinal - "косметический костыль" для нормального отображения меню при клике по значку в системном трее. Подбирается экспериментально, так как при различных стилях область отображения меню изменяется (меню уезжает вверх) PopUpMenu : TPopUpMenu - всплывающее меню, при OnClick правой кнопкой мыши по значку ​Методы:
    Show - отображать значок в системном трее Hide - скрыть значок из системного трея ShowBalloonHint - показать всплывающую подсказку События:
    OnClick - нажатие левой кнопки мыши OnDblClick - двойное нажатие левой кнопки мыши Важное замечание: необходимо обязательное наличие TForm и только один экземпляр TnTrayIcon в приложении !
     
    Установка:
    Распаковать содержимое архива Открыть файл nTrayIcon.dpk В Project Manager окне правой кнопкой мыши по nTrayIcon.bpl -> Compile В Project Manager окне правой кнопкой мыши по nTrayIcon.bpl -> Install Добавляем путь в Library: Tools -> Options -> Delphi Options -> Library -> Library Patch -> Add... В архиве компонент и пример для работы.
     
    P.S. Писал для себя, так как частенько использую... Всегда хочется простоты.
    P.S.S. Писал быстро и ночью. Возможны недочеты и ошибки. Постепенно исправлю.
    TnTrayIcon.zip
  15. Like
    Nix0N отреагировална Brovin Yaroslav в Обработка событий при создании своего компонента   
    Видимо вы меня не поняли. Обратите внимание на пункт 2.2.5 правил.
     
    Потому что на текущий момент вы мне рассказываете, что у вас якобы не работает какой-то функционал. А я проверяю на чистом проекте и все работает. Отсюда должна напрашиваться только две мысли, что вы видимо что-то не правильно делаете, либо не полностью рассказываете. Поэтому нужно прикрепить полностью проект, чтобы я мог быстро посмотреть и сразу вам ответить (если вы конечно сами заинтересованы в решении вашей задачи).
     
    Так же опять же, судя по коду, не может быть ситуации, когда ваше изображение повторяется и отображается, как Tile. Хотя вы даже прикрепили скриншот, что якобы у вас на вашем коде это воспроизводится. (опять же выкладывайте проект с минимальным кодом)
     
    Я не знаю, как вы делаете "слоеный торт". Эта метафора может содержать тысячу и один способ достижения этого. И опять же я не умею читать мысли и не смогу по такому описания помочь вам решить задачу. Выкладывание проекта с кодом, где показано, как вы это делаете, снимает все ненужные и лишние вопросы, И снижает затраты на долгое выяснение деталей.
  16. Like
  17. Like
    Nix0N отреагировална Brovin Yaroslav в Как в FM нарисовать текст на Canvas под углом?   
    В общем ничего кроме стандартных знаний линейной алгебры здесь не требуется. Согласно линейной алгебры нужно построить матрицу трансформации задать ее для канвы и рисовать все что угодно.
     
    Если вспомнить, то выполнить нужно следующее:
    Сместить Систему Координат (СК) на вектор центра поворота. Повернуть СК на угол поворота Сместить СК на обратные вектор центра поворота. В коде это будет выглядеть так:
    uses System.Math.Vectors; {$R *.fmx} procedure TForm1.ButtonDrawRotatedTextClick(Sender: TObject); var RotationMatrix: TMatrix; TranslationMatrix: TMatrix; ReverseTranslationMatrix: TMatrix; begin Image1.Bitmap.SetSize(200, 200); Image1.Bitmap.Clear(TAlphaColorRec.Null); with Image1.Bitmap.Canvas do begin BeginScene; try TranslationMatrix := TMatrix.CreateTranslation(100, 100); RotationMatrix := TMatrix.CreateRotation(-Pi / 180 * nbAngle.Value); ReverseTranslationMatrix := TMatrix.CreateTranslation(-100, -100); SetMatrix(ReverseTranslationMatrix * RotationMatrix * TranslationMatrix); Fill.Color := TAlphaColorRec.Red; Fill.Kind := TBrushKind.Solid; Font.Size := 20; FillText(TRectF.Create(50, 50, 150, 150), 'Текст', False, 1, [], TTextAlign.Center, TTextAlign.Center); finally EndScene; end; Image1.Repaint; end; end; Результат:

    Проект: DrawRotatedTextDemo.zip
  18. Like
    Nix0N получил реакцию от Kitty в Почему на билдере для регулярных выражений не работает "?:"   
    Вижу 2 ошибки:
    У Вас не верная формула для поиска. С этой формулой (? <a href=\"))(\\S+)(? \">)) Вы не найдете то, что Вам необходимо. Эта формула не работает так же в Perl и Notepad++ Я у Вас вижу 4 группы, но на выходе Вы ни к одной не обращаетесь и по-этому получаете исходную строку.  В данном случае вопрос с FireMonkey никак не связан...
     
    P.S. Если опишите какие данные в итоге хотите получить - пишите в личку. Подскажу как сделать, так как эту тему скорее всего удалят...
     
    Либо так:
    url = TRegEx::Matches(text->Text, "(?<a href=\"))(\\S+)(?\">))").Item[i].Groups[n].Value; Где n - номер группы. Группа - это данные, которые располагаются между ()
     
    Пример Delphi
    procedure TForm1.Button1Click(Sender: TObject); var RegEx: TRegEx; M: TMatchCollection; begin RegEx := TRegEx.Create('(<a href=\"(.*?)\">)'); if RegEx.IsMatch('<a href="messanger.cgi?action=read&msg=2">')then begin M := RegEx.Matches('<a href="messanger.cgi?action=read&msg=2">'); //Вторая группа содержит текст между кавычками Memo1.Lines.Add(M.Item[0].Groups[2].Value); end; end; На выходе: messanger.cgi?action=read&msg=2 
  19. Like
    Nix0N получил реакцию от rareMax в Почему на билдере для регулярных выражений не работает "?:"   
    Вижу 2 ошибки:
    У Вас не верная формула для поиска. С этой формулой (? <a href=\"))(\\S+)(? \">)) Вы не найдете то, что Вам необходимо. Эта формула не работает так же в Perl и Notepad++ Я у Вас вижу 4 группы, но на выходе Вы ни к одной не обращаетесь и по-этому получаете исходную строку.  В данном случае вопрос с FireMonkey никак не связан...
     
    P.S. Если опишите какие данные в итоге хотите получить - пишите в личку. Подскажу как сделать, так как эту тему скорее всего удалят...
     
    Либо так:
    url = TRegEx::Matches(text->Text, "(?<a href=\"))(\\S+)(?\">))").Item[i].Groups[n].Value; Где n - номер группы. Группа - это данные, которые располагаются между ()
     
    Пример Delphi
    procedure TForm1.Button1Click(Sender: TObject); var RegEx: TRegEx; M: TMatchCollection; begin RegEx := TRegEx.Create('(<a href=\"(.*?)\">)'); if RegEx.IsMatch('<a href="messanger.cgi?action=read&msg=2">')then begin M := RegEx.Matches('<a href="messanger.cgi?action=read&msg=2">'); //Вторая группа содержит текст между кавычками Memo1.Lines.Add(M.Item[0].Groups[2].Value); end; end; На выходе: messanger.cgi?action=read&msg=2 
  20. Like
    Nix0N отреагировална estra в Как в программе определить физические размеры экрана устройства?   
    DPI для Android
      uses FMX.Helpers.Android, Androidapi.JNI.Util; procedure TForm1.Button1Click(Sender: TObject); var Disp: JDisplayMetrics; NativeClientHeight, NativeClientWidth: Single; begin Disp := GetJDisplayMetrics; NativeClientWidth := ClientWidth * Disp.density; NativeClientHeight := ClientHeight * Disp.density; //Label1.Text := 'Width: ' + FloatToStr(NativeClientWidth); //Label2.Text := 'Height: ' + FloatToStr(NativeClientHeight); Label1.Text := FloatToStr( Disp.xdpi ); Label2.Text := FloatToStr( Disp.ydpi ); Label3.Text := IntToStr( Disp.densityDpi ); end;   Для IOS облом, рассчитывай сам http://www.dpi.nu/, http://www.sven.de/dpi/, http://www.pxcalc.com/, http://www.pixelcalculator.com/ и т.п.
  21. Like
    Nix0N получил реакцию от Andrey Efimov в Почему на билдере для регулярных выражений не работает "?:"   
    Вижу 2 ошибки:
    У Вас не верная формула для поиска. С этой формулой (? <a href=\"))(\\S+)(? \">)) Вы не найдете то, что Вам необходимо. Эта формула не работает так же в Perl и Notepad++ Я у Вас вижу 4 группы, но на выходе Вы ни к одной не обращаетесь и по-этому получаете исходную строку.  В данном случае вопрос с FireMonkey никак не связан...
     
    P.S. Если опишите какие данные в итоге хотите получить - пишите в личку. Подскажу как сделать, так как эту тему скорее всего удалят...
     
    Либо так:
    url = TRegEx::Matches(text->Text, "(?<a href=\"))(\\S+)(?\">))").Item[i].Groups[n].Value; Где n - номер группы. Группа - это данные, которые располагаются между ()
     
    Пример Delphi
    procedure TForm1.Button1Click(Sender: TObject); var RegEx: TRegEx; M: TMatchCollection; begin RegEx := TRegEx.Create('(<a href=\"(.*?)\">)'); if RegEx.IsMatch('<a href="messanger.cgi?action=read&msg=2">')then begin M := RegEx.Matches('<a href="messanger.cgi?action=read&msg=2">'); //Вторая группа содержит текст между кавычками Memo1.Lines.Add(M.Item[0].Groups[2].Value); end; end; На выходе: messanger.cgi?action=read&msg=2 
  22. Like
    Nix0N отреагировална Brovin Yaroslav в Редактирование стиля, как добавить "TStyleObject", "TActiveStyleObject" и т.п.?   
    По умолчанию эти объекты стиля и другие не зарегистрированы в палитре инструментов.
    Эти объекты используются только в стилях для:
    Упрощение создания стиля за счет композиции контролов для достижения наиболее часто используемых функций (смена изображений по триггеру в зависимости от состояния контрола  - кнопка с тремя состояниями, Текст с тенью) Увеличения производительности работы стиля за счет композиции контролов. Уменьшение размера стиля за счет повторного использования одного исходного изображения в однотипных контролах (TButton, TSpeedButton и тд). То есть вместо загрузки по отдельности каждого изображения в стиль каждого контрола, можно использовать изображения по ссылке. Чтобы их использовать, нужно их зарегистрировать в среде IDE RAD Studio.
    Это делает вот этот пакет: 
    RAD Studio XE5 - FMX Style Objects.zip RAD Studio XE6 - FMX Style Objects (XE6).zip После установки пакета в палитре инструментов появится вкладка "Style Object", в которой будут находится все служебные стилевые объекты среды RAD Studio XE5.
     
    Список добавляемых стилевых объектов: 
    TStyleObject - Использование изображения по ссылке на оригинал и области в этом изображении. Не загружает повторно объект. TSubImage - Использование изображения по ссылке на оригинал и области в этом изображении. Не загружает повторно объект. TActiveStyleObject - Объект для смены одного изображения на другое с указанным типом анимации и указанным триггером. TTabStyleObject - специальный объект для быстрого создания стиля вкладки TTabControl TCheckStyleObject - специальный упрощенный объект для создания стиля TCheckBox TButtonStyleObject - упрощенный объект стиля кнопки с поддержкой загрузки отдельных изображений на каждое состоянии кнопки (нормальное, фокус, под мышкой, нажатое) TSystemButtonObject - стиль системной кнопки. То же, что и TButtonStyleObject, только с дополнительным состоянием - неактивная кнопка TStyleTextObject - объект для быстрого создания стиля текст с тенью. TStyleTextAnimation - объект анимации для смены цвета и тени текста  TActiveStyleTextObject - объект стиля для создания текста с тенью и переключению цвета текста и тени на другой по анимации и триггеру. TTabStyleTextObject - объект стиля для создания вкладки с текстом для TTabControl. TButtonStyleTextObject - объект стиля для создания стиля кнопки с текстом. TActiveOpacityObject - объект для смены прозрачности контрола. TBrushObject - объект хранящий кисть TBrush TBitmapObject - объект хранящий изображение TBitmap TFontObject - хранение шрифта TFont TPathObject - хранение SVG пути TPath TColorObject - хранение цвета TAlphaColor
  23. Like
    Nix0N отреагировална Brovin Yaroslav в Мировой тур RAD Studio XE6   
    Я не знаю, но постараюсь узнать. Одно могу сказать, что скорее всего возобновим серию вебинаров, посвященных мобильной разработке с FireMonkey.
  24. Like
    Nix0N отреагировална Brovin Yaroslav в [Windows] Как получить HWND Application?   
    Для RAD Studio XE7
    Начиная с RAD Studio XE7 Доступ к хендлу приложения можно получить так FMX.Platform.Win.ApplicationHWND
     
    Для версий < XE7
    Для всех, у кого среда <= XE6 делаем следующее:
    Открываем исходный файл FMX.Platform.Win.pas (Предполагаемое место расположения файла "/Program Files(x86)/Embarcadero/Studio/14.0/Source/fmx/") В секцию interface модуля объявляем функцию:
    function ApplicationHWND: HWND; В секцию implementation модуля добавляем ее реализацию (лучше в конец модуля либо после объявления глобальной переменной PlatformWin):
    function ApplicationHWND: HWND; begin   if PlatformWin <> nil then     Result := PlatformWin.GetApplicationHWND   else     Result := 0; end; Добавляем модифицированный файл FMX.Platform.Win.pas в ваш проект. P.S. Исходники коммерческих продуктов выкладывать запрещено. Поэтому выше приведено руководство.
  25. Like
    Nix0N получил реакцию от Kitty в [Windows] TnTRayIcon не визуальный компонент обеспечивающий управление значком в области System Tray   
    Набросал компонент для работы с значком в системном трее. Компонент только для FM и только для платформы Windows ! Среда: Delphi XE6 
     
    Основные моменты
     
    Свойства:
    Hint : string - отображает текст при наведении на значок в системном трее BalloonTitle : string - текст заголовка всплывающей подсказки BalloonText : string - текст содержания всплывающей подсказки IconBalloonType : TBalloonIconType - иконка всплывающей подсказки. Принимает значения: ​​​​BigError, BigWarning, Error, Info, None, User, Warning Indent : Cardinal - "косметический костыль" для нормального отображения меню при клике по значку в системном трее. Подбирается экспериментально, так как при различных стилях область отображения меню изменяется (меню уезжает вверх) PopUpMenu : TPopUpMenu - всплывающее меню, при OnClick правой кнопкой мыши по значку ​Методы:
    Show - отображать значок в системном трее Hide - скрыть значок из системного трея ShowBalloonHint - показать всплывающую подсказку События:
    OnClick - нажатие левой кнопки мыши OnDblClick - двойное нажатие левой кнопки мыши Важное замечание: необходимо обязательное наличие TForm и только один экземпляр TnTrayIcon в приложении !
     
    Установка:
    Распаковать содержимое архива Открыть файл nTrayIcon.dpk В Project Manager окне правой кнопкой мыши по nTrayIcon.bpl -> Compile В Project Manager окне правой кнопкой мыши по nTrayIcon.bpl -> Install Добавляем путь в Library: Tools -> Options -> Delphi Options -> Library -> Library Patch -> Add... В архиве компонент и пример для работы.
     
    P.S. Писал для себя, так как частенько использую... Всегда хочется простоты.
    P.S.S. Писал быстро и ночью. Возможны недочеты и ошибки. Постепенно исправлю.
    TnTrayIcon.zip
×
×
  • Создать...