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

Pax Beach

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

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

  • Посещение

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

    12

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

  1. Like
    Pax Beach отреагировална krapotkin в Исключить устройства с Intel Atom как не поддерживаемые   
    там стоит заглушка, которая выводит надпись "ваша платформа не поддерживается, до свидания"
    но факт в том, что на большом кол-ве интел стоит библиотека houdini которая поддерживает запуск программ, написанных для ARM
    в результате и ваша программа тоже имеет шанс запуститься. поэтому, убрав эту птицу, вы можете "без программирования", как это принято в RAD Studio ))) получить хороший результат )))
  2. Like
    Pax Beach получил реакцию от dnekrasov в Фотография стандартной камерой смартфона   
    Проблема решалась очень просто.
    Оказывается нужно при вызове startActivityForResult использовать requestCode отличный от занятых в FMX, я использую REQUEST_IMAGE_CAPTURE = 1001 тогда обработчик сообщений FMX поймет, что сообщение не для него и передаст его в систему. 
     
     
  3. Like
    Pax Beach отреагировална Barbanel в Запуск компилированного приложения.   
    Это ирония)))
  4. Like
    Pax Beach отреагировална krapotkin в Get запросы в iOS   
    нажать ОК
    кликнуть два раза в строку где написано DCC Error и посмотреть, что за строка такая с ошибкой
  5. Like
    Pax Beach отреагировална Равиль Зарипов (ZuBy) в Get запросы в iOS   
    проверка интернета
    function CheckInet: boolean; var aResp: IHTTPResponse; aHTTP: THTTPClient; begin Result := false; aHTTP := THTTPClient.Create; try try aResp := aHTTP.Head('http://google.com'); Result := aResp.StatusCode < 400; except Result := false; end; finally FreeAndNil(aHTTP); end; end; get запрос
    function HTTPGet(const aURL: string): string; var aHTTP: THTTPClient; aResp: TStringStream; begin Result := 'Error'; aResp := TStringStream.Create('', TEncoding.UTF8); aHTTP := THTTPClient.Create; try try aHTTP.Get(aURL, aResp); Result := aResp.DataString; except Result := 'Error'; end; finally FreeAndNil(aHTTP); FreeAndNil(aResp); end; end;  
  6. Like
    Pax Beach отреагировална Евгений Корепов в TSearchBox кнопка очистки   
    Подскажите как добраться до кнопки очистки содержимого TSearchBox? Сам TSearchBox у TListView благодаря теме "Можно ли программно передать фокус на SearchBox и очистить строку?" доступен без проблем, но кнопка не обнаруживается в ListViewProducts.SearchEdit.Children.Items :-(
     
    Хочу изменить логику ее появления - сделать видимой всегда, когда есть текст в ListViewProducts.SearchEdit.Text. По умолчанию ее поведение малость загадочное - она исчезание при любой возможности (потеря фокуса, Resize, смена ориентации и т.д.). Что бы очистить поле поиска, пользователю приходится в данный момент производить следующие манипуляции:
    Кликнуть на SearchBox Ввести любой символ Нажать на появившуюся "кнопку с крестиком" Пока написан костыль на все возможные манипуляции - добавляю пробел в конец SearchBox, удаляю добавленный пробел, но иногда он не срабатывает и вводит пользователя в ступор.
    Пытался решить проблему добавлением отдельной кнопки очистки, с нормальным поведением, но опять же встает вопрос как навсегда скрыть родную кнопку.
    Сейчас пытаюсь отказаться от встроенного в TListView TSearchBox, сделать отдельное поле ввода поиска, но с наскока не пойму как передавать строку фильтрации в TListView.
  7. Like
    Pax Beach отреагировална Alexey Lovchikov в Можно ли программно передать фокус на SearchBox и очистить строку?   
    Используй Helper
    uses   FMX.SearchBox; type   TListViewMyHelper = class helper for TListView   public     function SearshBox: TSearchBox;   end; { TListViewMyHelper } function TListViewMyHelper.SearshBox: TSearchBox; var   AIdx: Integer; begin   for AIdx := 0 to Self.ComponentCount - 1 do     if Self.Components[AIdx] is TSearchBox then     begin       Result := TSearchBox(Self.Components[AIdx]);       Break;     end; end; Или просто функцию 
    function SearshBox(AListView: TListView): TSearchBox; var AIdx: Integer; begin for AIdx := 0 to AListView.ComponentCount - 1 do if AListView.Components[AIdx] is TSearchBox then begin Result := TSearchBox(AListView.Components[AIdx]); Break; end; end;  
    Primer.zip
  8. Like
    Pax Beach отреагировална bigjorj в TSearchBox кнопка очистки   
    procedure TMainForm.SearchChanelEditChangeTracking(Sender: TObject); var Lower: string; begin Lower := SearchChanelEdit.Text.Trim.ToLower; if Lower = '' then begin if Assigned(listView.Items.Filter) then begin // Clear filter listView.Items.Filter := nil; end; end else begin // Start or update filter listView.ItemIndex := -1; listView.Items.Filter := function(X: string): Boolean begin Result := Lower.IsEmpty or X.ToLower.Contains(Lower); end; end; end; Передача фильтра в ListView
  9. Like
    Pax Beach отреагировална Nik в Seattle Android Ошибка exited with code 1   
    Тем, что на телефоне Android 4.2.2. Версию выше не пробовал ставить, а так работает точно )
  10. Like
    Pax Beach отреагировална Nik в Seattle Android Ошибка exited with code 1   
  11. Like
    Pax Beach получил реакцию от Kitty в Seattle Android Ошибка exited with code 1   
    Создание Android приложений с NDK R13
    Не мог смириться с суевериями ), и решил сам проверить. Delphi не дружит с линкером (компоновщиком) версии 4.9, а с 4.8 дружит нормально.
    Все остальное на вкладке NDK использую из последнего релиза.
    С сегодняшнего дня, я живу вот так:
     

     
    PS: Интересно, если компоновщик брать из каталога другой архитектуры, приложения заработают корректно на устройствах с Intel?
     
  12. Like
    Pax Beach получил реакцию от Brovin Yaroslav в Seattle Android Ошибка exited with code 1   
    Создание Android приложений с NDK R13
    Не мог смириться с суевериями ), и решил сам проверить. Delphi не дружит с линкером (компоновщиком) версии 4.9, а с 4.8 дружит нормально.
    Все остальное на вкладке NDK использую из последнего релиза.
    С сегодняшнего дня, я живу вот так:
     

     
    PS: Интересно, если компоновщик брать из каталога другой архитектуры, приложения заработают корректно на устройствах с Intel?
     
  13. Like
    Pax Beach получил реакцию от Rusland в Seattle Android Ошибка exited with code 1   
    Создание Android приложений с NDK R13
    Не мог смириться с суевериями ), и решил сам проверить. Delphi не дружит с линкером (компоновщиком) версии 4.9, а с 4.8 дружит нормально.
    Все остальное на вкладке NDK использую из последнего релиза.
    С сегодняшнего дня, я живу вот так:
     

     
    PS: Интересно, если компоновщик брать из каталога другой архитектуры, приложения заработают корректно на устройствах с Intel?
     
  14. Like
    Pax Beach отреагировална Rusland в Снимок экрана в полноэкранном приложении DirectX   
    Класс для снятия скриншотов не подойдет?
  15. Like
    Pax Beach отреагировална Вячеслав в [Win] [FMX] Создать Bitmap, имея в памяти массив Byte   
    Все, окончательно осознал механизм работы, теперь все стало на свои места. Все дело в том, что моя камера выдает данные в формате AARRGGBB, только вот значение старших двух бит равно $00, а не $FF. Поэтому картинка и воспринимается прозрачной для TImage. В итоге пробежался в цикле по памяти, поменял нули на $FF и все заработало. 
  16. Like
    Pax Beach получил реакцию от PowerOwl в Использование нативных LocalBroadcastManager и BroadcastReceiver   
    Из PlatformSDK (PlatformSDKs\android-sdk-windows\sources\android-23\android\support\v4\content\) портировал в Delphi класс TJLocalBroadcastManager.
    Это очень полезный класс, если вы не хотите рассылать сообщения по всей системе, а есть необходимость общаться только внутри приложения или между хост-приложением и сервисом.
    Во вложении сам класс, в своем приложении убедитесь, что в Target Platforms (Android) → Android → Libraries включена библиотека android-support-v4.dex.jar.
     
    Прилагаю пример, для изучения и использования в работе, который демонстрирует работу обычного BroadcastReceiver и LocalBroadcastReceiver.
    В примере демонстрируется работа сообщений в приложении и сервисе. Сначала делаем build проекта LBCRService, потом будет доступна возможность собрать LocalBCR.
    Собираю в Berlin 10.1, но на младших версиях тоже должно работать, по крайней мере в Seatlle.
     
    В реализации методов
    procedure RegisterReceiver(); procedure UnRegisterReceiver(); необходимо снять комментарий с соответствующих строчек, в зависимости от того, какой тип ресивера вы хотите использовать.
     
     
    Androidapi.JNI.LocalBroadcastManager.pas.zip
    LocalBroadCastReceiver.zip
  17. Like
    Pax Beach получил реакцию от david_yusupov в Убить поток TThread?   
    Посмотрите класс, реализующий альтернативный Sleep (под катом).
    соль в следующем:
    создаем потомка TThread, запускаем, ждем завершения:
    class function TDelays.Delay(aDuration: integer): TDelay; begin if not Assigned(FList) then FList := TList<TDelay>.Create; Result := TDelay.Create(aDuration); FList.Add(Result); Result.FreeOnTerminate := false; Result.OnTerminate := OnTerminateItem; Result.Start; Result.WaitFor; end; Работаем с ним нежно
    procedure TDelay.Execute; begin inherited; while (not Terminated) and (MilliSecondsBetween(now, FStart) < FDelay) do begin sleep(100); end; end; По завершении работы убиваем:
    class procedure TDelays.OnTerminateItem(Sender: TObject); begin TTask.Run( procedure begin try if Assigned((Sender as TDelay)) then begin (Sender as TDelay).Free; FList.Remove((Sender as TDelay)); end; except end; end); end; А можем убить и досрочно:
    (TObject as TDelay).Free; потому что в деструкторе стоит такой код:
    destructor TDelay.Destroy; begin Terminate; if (not Suspended) then WaitFor; inherited; end;  
    uDelays.zip
  18. Like
    Pax Beach отреагировална Равиль Зарипов (ZuBy) в Как определить отсутствие изображения как такового в TBitmap?   
    У TBitmap есть такой метод, посмотрите его
    function TBitmap.EqualsBitmap(const Bitmap: TBitmap): Boolean; var MyMap, BitmapMap: TBitmapData; I: Integer; begin if IsEmpty or Bitmap.IsEmpty then begin Result := IsEmpty and Bitmap.IsEmpty; Exit; end; Result := (Width = Bitmap.Width) and (Height = Bitmap.Height) and (PixelFormat = Bitmap.PixelFormat); if Result then begin if Map(TMapAccess.Read, MyMap) then try if Bitmap.Map(TMapAccess.Read, BitmapMap) then try for I := 0 to Height - 1 do if not CompareMem(MyMap.GetScanline(I), BitmapMap.GetScanline(I), MyMap.BytesPerLine) then begin Result := False; Exit; end; finally Bitmap.Unmap(BitmapMap); end; finally Unmap(MyMap); end; end; end;  
  19. Like
    Pax Beach отреагировална Равиль Зарипов (ZuBy) в [Windows] Глобальный хук на клавиши возможно ли FMX   
    Изменить нужно
    WM_GETMINMAXINFO На 
    WM_HOTKEY
  20. Like
    Pax Beach отреагировална Brovin Yaroslav в Обработка WM_GETMINMAXINFO   
    Нет.
    Как вариант, можно модифицировать FMX.Platform.Win и просто добавить пересылку Dispatch сообщений прямо форме. Тогда в самой форме можно будет по VCL-ному перехватывать сообщения.
    Открываем модуль FMX.Platform.Win.pas и находим процедуру ориентировочно 2088 строчка:
    function WndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; В тело добавляем код по пересылке сообщения:
    begin { TODO -okewald -cVerify : We need to ensure Result is initialized. } Result := 0; LForm := FindWindow(hwnd); // Вставка по пересылке сообщения форме if LForm <> nil then begin TMsg.Msg := uMsg; TMsg.WParam := wParam; TMsg.LParam := lParam; TMsg.Result := 0; LForm.Dispatch(TMsg); uMsg := TMsg.Msg; wParam := TMsg.WParam; lParam := TMsg.LParam; end; После этого в форме можно перехватывать сообщение:
    uses ..., Winapi.Messages; type TForm19 = class(TForm) private procedure WMGetMinMaxInfo(var AMessage: TMessage); message WM_GETMINMAXINFO; end; var Form19: TForm19; implementation {$R *.fmx} { TForm19 } procedure TForm19.WMGetMinMaxInfo(var AMessage: TMessage); begin end; Если надо возвращать результат, как в случае с WM_GETMINMAXINFO, то в FMX.Platform
  21. Like
    Pax Beach отреагировална Равиль Зарипов (ZuBy) в Фотография стандартной камерой смартфона   
    если используется SDK > 23, то приложение должно запросить права у пользователя.
    Но стандартный SDK студии < 23 так что достаточно использовать старый способ (указать в настройках проекта)
  22. Like
    Pax Beach отреагировална ENERGY в Фотография стандартной камерой смартфона   
    По поводу удаления из Gallery. Это виртуальная папка, это значит что недостаточно удалить файл из SharedCameraPath - т.к. он может быть в другом месте, т.к. MediaScanner собирает фотки со многих других папок,  но обычно достаточно этого пути.
    Но, даже если его удалить оттуда, он все равно останется в Gallery - его нужно удалять из SQL базы андроида.
     
    В общем идея следующая (описана тут) - до вызова интента сначала прочитать последний Image ID (ContentResolver.Query ) который лежит там, сохранить эту цифру.
    Затем после вызова интента камеры, запросить все id что больше сохраненного, как правило там должен появится один файл (одна запись с ID больше сохраненного) - и удалить его через ContentResolver.Delete. Параллельно можно сразу скопировать этот готовый jpeg файл, до удаления, чтобы не тратить время на создание своего из битмапа, т.к. можно получит и путь к нему.
     
     
  23. Like
    Pax Beach отреагировална ENERGY в Фотография стандартной камерой смартфона   
    Сделал решение для описанного выше варианта.
    Добавил его на Stackoverflow
     
    unit Misc.Android; interface uses SysUtils, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNIBridge, Androidapi.JNI.Provider; type TGallery = class public class function GetLastImageID: integer; class function GetNextImageIDFromID(aFromID: integer; out aImagePath: string): integer; class function DeleteImageByID(aID: integer): boolean; end; implementation const _ID = '_id'; // TJBaseColumns.JavaClass._ID // uri in Androidapi.JNI.Provider { TGallery } {If you're using action TakePhotoFromCameraAction remember to set NeedSaveToAlbum to true. It does not work, because of Android problems, but it can work in future.} class function TGallery.GetLastImageID: integer; var vContent: JContentResolver; vValues: TJavaObjectArray<JString>; vOrderBy: JString; vCursor: JCursor; begin Result := -1; vContent := TAndroidHelper.Activity.getContentResolver; vValues := TJavaObjectArray<JString>.Create(1); vValues[0] := TJBaseColumns.JavaClass._ID; vOrderBy := StringToJString(_ID + ' DESC'); vCursor := vContent.query(TJImages_Media.JavaClass.EXTERNAL_CONTENT_URI, vValues, nil, nil, vOrderBy); try if vCursor.moveToFirst then Result := vCursor.getInt( vCursor.getColumnIndex(TJBaseColumns.JavaClass._ID) ); finally vCursor.close; end end; // Result is next Image ID and its aImagePath - is path to jpg image class function TGallery.GetNextImageIDFromID(aFromID: integer; out aImagePath: string): integer; var vContent: JContentResolver; vValues: TJavaObjectArray<JString>; vFilter: JString; vOrderBy: JString; vArgs : TJavaObjectArray<JString>; vCursor: JCursor; begin Result := -1; aImagePath := ''; vContent := TAndroidHelper.Activity.getContentResolver; vValues := TJavaObjectArray<JString>.Create(2); vValues[0] := TJMediaStore_MediaColumns.JavaClass.DATA; vValues[1] := TJBaseColumns.JavaClass._ID; // vValues[1] := TJMediaStore_MediaColumns.JavaClass.SIZE; // vValues[1] := TJImages_ImageColumns.JavaClass.DATE_TAKEN; vOrderBy := StringToJString(_ID + ' DESC'); vFilter := StringToJString(_ID + '>?'); vArgs := TJavaObjectArray<JString>.Create(1); vArgs[0] := StringToJString(aFromID.ToString); vCursor := vContent.query(TJImages_Media.JavaClass.EXTERNAL_CONTENT_URI, vValues, vFilter, vArgs, vOrderBy); try if (vCursor.getCount > 0) and vCursor.moveToFirst then begin Result := vCursor.getInt( vCursor.getColumnIndex(TJBaseColumns.JavaClass._ID) ); // vCursor.getLong(imageCursor.getColumnIndex(MediaStore.Images.Media.DATE_TAKEN)); //vSize := wCursor.getLong(wCursor.getColumnIndex(TJMediaStore_MediaColumns.JavaClass.SIZE)); aImagePath := JStringToString(vCursor.getString( vCursor.getColumnIndex(TJMediaStore_MediaColumns.JavaClass.DATA) )); end; finally vCursor.close; end; end; class function TGallery.DeleteImageByID(aID: integer): boolean; var vContent: JContentResolver; begin vContent := TAndroidHelper.Activity.getContentResolver; Result := vContent.delete(TJImages_Media.JavaClass.EXTERNAL_CONTENT_URI, StringToJString(_ID + '=' + aID.ToString), nil) = 1; end; end.
  24. Like
    Pax Beach получил реакцию от ENERGY в Простой пример работы с MS Word в Delphi FMX   
    Сделал пример приложения для работы с Microsoft Word из приложения Delphi.
    Такое приложение может использоваться для обмена данными между объектами семейства Microsoft Office.
     
    Исходные коды приложения помогут вам понять, как работать с объектной моделью Microsoft Word.
    Чтобы лучше разобраться с нюансами Word, предлагаю ознакомиться со справочником Word VBA reference на MSDN.
    Проект создан в среде FireMonkey Delphi Berlin 10.1
    Протестирован в MS Word 2010, 2016, Windows 7x64 и 10x64.
    Чтобы посмотреть пример, просто распакуйте zip-файл проекта и щелкайте по порядку кнопки на форме.

     
    Скачать Delphi Word Test
     
    WordTest.zip
  25. Like
    Pax Beach получил реакцию от aleksandrguru в Простой пример работы с MS Word в Delphi FMX   
    Сделал пример приложения для работы с Microsoft Word из приложения Delphi.
    Такое приложение может использоваться для обмена данными между объектами семейства Microsoft Office.
     
    Исходные коды приложения помогут вам понять, как работать с объектной моделью Microsoft Word.
    Чтобы лучше разобраться с нюансами Word, предлагаю ознакомиться со справочником Word VBA reference на MSDN.
    Проект создан в среде FireMonkey Delphi Berlin 10.1
    Протестирован в MS Word 2010, 2016, Windows 7x64 и 10x64.
    Чтобы посмотреть пример, просто распакуйте zip-файл проекта и щелкайте по порядку кнопки на форме.

     
    Скачать Delphi Word Test
     
    WordTest.zip
×
×
  • Создать...