-
Постов
414 -
Зарегистрирован
-
Посещение
-
Победитель дней
12
Активность репутации
-
Pax Beach отреагировална krapotkin в Исключить устройства с Intel Atom как не поддерживаемые
там стоит заглушка, которая выводит надпись "ваша платформа не поддерживается, до свидания"
но факт в том, что на большом кол-ве интел стоит библиотека houdini которая поддерживает запуск программ, написанных для ARM
в результате и ваша программа тоже имеет шанс запуститься. поэтому, убрав эту птицу, вы можете "без программирования", как это принято в RAD Studio ))) получить хороший результат )))
-
Pax Beach получил реакцию от dnekrasov в Фотография стандартной камерой смартфона
Проблема решалась очень просто.
Оказывается нужно при вызове startActivityForResult использовать requestCode отличный от занятых в FMX, я использую REQUEST_IMAGE_CAPTURE = 1001 тогда обработчик сообщений FMX поймет, что сообщение не для него и передаст его в систему.
-
-
Pax Beach отреагировална krapotkin в Get запросы в iOS
нажать ОК
кликнуть два раза в строку где написано DCC Error и посмотреть, что за строка такая с ошибкой
-
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;
-
Pax Beach отреагировална Евгений Корепов в TSearchBox кнопка очистки
Подскажите как добраться до кнопки очистки содержимого TSearchBox? Сам TSearchBox у TListView благодаря теме "Можно ли программно передать фокус на SearchBox и очистить строку?" доступен без проблем, но кнопка не обнаруживается в ListViewProducts.SearchEdit.Children.Items :-(
Хочу изменить логику ее появления - сделать видимой всегда, когда есть текст в ListViewProducts.SearchEdit.Text. По умолчанию ее поведение малость загадочное - она исчезание при любой возможности (потеря фокуса, Resize, смена ориентации и т.д.). Что бы очистить поле поиска, пользователю приходится в данный момент производить следующие манипуляции:
Кликнуть на SearchBox Ввести любой символ Нажать на появившуюся "кнопку с крестиком" Пока написан костыль на все возможные манипуляции - добавляю пробел в конец SearchBox, удаляю добавленный пробел, но иногда он не срабатывает и вводит пользователя в ступор.
Пытался решить проблему добавлением отдельной кнопки очистки, с нормальным поведением, но опять же встает вопрос как навсегда скрыть родную кнопку.
Сейчас пытаюсь отказаться от встроенного в TListView TSearchBox, сделать отдельное поле ввода поиска, но с наскока не пойму как передавать строку фильтрации в TListView.
-
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
-
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
-
Pax Beach отреагировална Nik в Seattle Android Ошибка exited with code 1
Тем, что на телефоне Android 4.2.2. Версию выше не пробовал ставить, а так работает точно )
-
-
Pax Beach получил реакцию от Kitty в Seattle Android Ошибка exited with code 1
Создание Android приложений с NDK R13
Не мог смириться с суевериями ), и решил сам проверить. Delphi не дружит с линкером (компоновщиком) версии 4.9, а с 4.8 дружит нормально.
Все остальное на вкладке NDK использую из последнего релиза.
С сегодняшнего дня, я живу вот так:
PS: Интересно, если компоновщик брать из каталога другой архитектуры, приложения заработают корректно на устройствах с Intel?
-
Pax Beach получил реакцию от Brovin Yaroslav в Seattle Android Ошибка exited with code 1
Создание Android приложений с NDK R13
Не мог смириться с суевериями ), и решил сам проверить. Delphi не дружит с линкером (компоновщиком) версии 4.9, а с 4.8 дружит нормально.
Все остальное на вкладке NDK использую из последнего релиза.
С сегодняшнего дня, я живу вот так:
PS: Интересно, если компоновщик брать из каталога другой архитектуры, приложения заработают корректно на устройствах с Intel?
-
Pax Beach получил реакцию от Rusland в Seattle Android Ошибка exited with code 1
Создание Android приложений с NDK R13
Не мог смириться с суевериями ), и решил сам проверить. Delphi не дружит с линкером (компоновщиком) версии 4.9, а с 4.8 дружит нормально.
Все остальное на вкладке NDK использую из последнего релиза.
С сегодняшнего дня, я живу вот так:
PS: Интересно, если компоновщик брать из каталога другой архитектуры, приложения заработают корректно на устройствах с Intel?
-
Pax Beach отреагировална Rusland в Снимок экрана в полноэкранном приложении DirectX
Класс для снятия скриншотов не подойдет?
-
Pax Beach отреагировална Вячеслав в [Win] [FMX] Создать Bitmap, имея в памяти массив Byte
Все, окончательно осознал механизм работы, теперь все стало на свои места. Все дело в том, что моя камера выдает данные в формате AARRGGBB, только вот значение старших двух бит равно $00, а не $FF. Поэтому картинка и воспринимается прозрачной для TImage. В итоге пробежался в цикле по памяти, поменял нули на $FF и все заработало.
-
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
-
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
-
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;
-
Pax Beach отреагировална Равиль Зарипов (ZuBy) в [Windows] Глобальный хук на клавиши возможно ли FMX
Изменить нужно
WM_GETMINMAXINFO На
WM_HOTKEY
-
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
-
Pax Beach отреагировална Равиль Зарипов (ZuBy) в Фотография стандартной камерой смартфона
если используется SDK > 23, то приложение должно запросить права у пользователя.
Но стандартный SDK студии < 23 так что достаточно использовать старый способ (указать в настройках проекта)
-
Pax Beach отреагировална ENERGY в Фотография стандартной камерой смартфона
По поводу удаления из Gallery. Это виртуальная папка, это значит что недостаточно удалить файл из SharedCameraPath - т.к. он может быть в другом месте, т.к. MediaScanner собирает фотки со многих других папок, но обычно достаточно этого пути.
Но, даже если его удалить оттуда, он все равно останется в Gallery - его нужно удалять из SQL базы андроида.
В общем идея следующая (описана тут) - до вызова интента сначала прочитать последний Image ID (ContentResolver.Query ) который лежит там, сохранить эту цифру.
Затем после вызова интента камеры, запросить все id что больше сохраненного, как правило там должен появится один файл (одна запись с ID больше сохраненного) - и удалить его через ContentResolver.Delete. Параллельно можно сразу скопировать этот готовый jpeg файл, до удаления, чтобы не тратить время на создание своего из битмапа, т.к. можно получит и путь к нему.
-
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. -
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
-
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