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

Евгений Корепов

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

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

  • Посещение

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

    100

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

  1. Like
    Евгений Корепов получил реакцию от rareMax в RAD 11 на подходе?   
    Обновили продукты в онлайн магазине. http://store.embarcadero.ru/catalog/rubric/24
    Итого чтобы обновить мою Delphi XE8 до "Delphi 10.1 Berlin Professional"+"Mobile Add-On Pack к Delphi 10.1 Berlin Professional" нужно заплатить 85038,22 рублей. Кажется наем фрилансеров для реализации моих хотелок обойдется дешевле. К торрент версии душа не лежит. Буду и дальше сидеть на XE8, подожду "Delphi 10.8 Bangladesh Professional" с компилятором для Linux и Intel Atom, полноценными сервисами InAppBilling, полной реализацией работы с сенсорами и надеюсь множеством других доделок.
  2. Like
    Евгений Корепов отреагировална M1shQa в Как вытащить список из JSON со значениями   
    Огромное спасибо, Вы меня сильно выручили!
  3. Like
    Евгений Корепов получил реакцию от M1shQa в Как вытащить список из JSON со значениями   
    Вот получение данных с type=1:
    function TFormMain.ParseJSONArray(AJSONString : String) : TStringList; // для удобства функция возвращает TStringList, так будет проще закинуть результат в Memo Var AJSONArray : TJSONArray; AJSONValue : TJSONValue; I : Integer; begin Result:=TStringList.Create; // Создаем результат фозвращаемый функцией AJSONArray:=TJSONArray(TJSONObject.ParseJSONValue(AJSONString)); // Зная что на входе TJSONArray парсим его, пропуская парсинг TJSONObject if Not Assigned(AJSONArray) then // Если парсинг удался, то AJSONArray<>Nil Exit; for I := 0 to AJSONArray.Count-1 do // Работаем как с обычным массивом begin if AJSONArray.Items[I].TryGetValue('type',AJSONValue) Then // Получаем type if Not AJSONValue.Value.Equals('1') then // если type<>1 переходим на следующую итерацию (код ниже пропускается) Continue; if AJSONArray.Items[I].TryGetValue('number',AJSONValue) Then //Здесь используем полезную функцию TryGetValue, защищая себя от некорректных или отсутствующих 'number' Result.Add(AJSONValue.Value); // Если успешно, то добавляем полученную строку в результирующий StringList end; end; "адресс вайолэйшн" потому что код с  XSuperObject не безопасный, будет работать до первой ошибки в входных данных, далее крах приложения.
  4. Like
    Евгений Корепов получил реакцию от M1shQa в Как вытащить список из JSON со значениями   
    Для работы с JSON в Delphi есть все что нужно - штатная библиотека System.JSON. Быстрая и удобная, работать с ней одно удовольствие. Вот накидал проект, ваш JSON загружаю из файла.
    unit UnitFormMain; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.IOUtils, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, System.JSON; type TFormMain = class(TForm) Memo: TMemo; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } function ParseJSONArray(AJSONString : String) : TStringList; end; var FormMain: TFormMain; implementation {$R *.fmx} procedure TFormMain.FormCreate(Sender: TObject); Var AJSONString : String; begin AJSONString:=TFile.ReadAllText('D:\Embarcadero\Projects\Test\test062 JSON Array\input.json'); // Загружаем JSON в строку Memo.Lines.Assign(ParseJSONArray(AJSONString)); // Вызываем функцию парсинга, если все удачно - Memo заполнится значениями, если нет - останется пустым. end; function TFormMain.ParseJSONArray(AJSONString : String) : TStringList; // для удобства функция возвращает TStringList, так будет проще закинуть результат в Memo Var AJSONArray : TJSONArray; AJSONValue : TJSONValue; I : Integer; begin Result:=TStringList.Create; // Создаем результат фозвращаемый функцией AJSONArray:=TJSONArray(TJSONObject.ParseJSONValue(AJSONString)); // Зная что на входе TJSONArray парсим его, пропуская парсинг TJSONObject if Not Assigned(AJSONArray) then // Если парсинг удался, то AJSONArray<>Nil Exit; for I := 0 to AJSONArray.Count-1 do // Работаем как с обычным массивом if AJSONArray.Items[I].TryGetValue('number',AJSONValue) Then //Здесь используем полезную функцию TryGetValue, защищая себя от некорректных или отсутствующих 'number' Result.Add(AJSONValue.Value); // Если успешно, то добавляем полученную строку в результирующий StringList end; end. P.S. работает под всеми платформами. Скорость для такого небольшого файла JSON можно принять за мгновенную даже на стареньких телефонах. Мне вот тут один сервис отдавал JSON размером в 6 мегабайт. Онлайн парсер http://pro.jsonlint.com/ которым удобно смотреть структуру зависал наглухо. А в Delphi все отлично и быстро работало
  5. Like
    Евгений Корепов получил реакцию от Andrey Efimov в Как вытащить список из JSON со значениями   
    Для работы с JSON в Delphi есть все что нужно - штатная библиотека System.JSON. Быстрая и удобная, работать с ней одно удовольствие. Вот накидал проект, ваш JSON загружаю из файла.
    unit UnitFormMain; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.IOUtils, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, System.JSON; type TFormMain = class(TForm) Memo: TMemo; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } function ParseJSONArray(AJSONString : String) : TStringList; end; var FormMain: TFormMain; implementation {$R *.fmx} procedure TFormMain.FormCreate(Sender: TObject); Var AJSONString : String; begin AJSONString:=TFile.ReadAllText('D:\Embarcadero\Projects\Test\test062 JSON Array\input.json'); // Загружаем JSON в строку Memo.Lines.Assign(ParseJSONArray(AJSONString)); // Вызываем функцию парсинга, если все удачно - Memo заполнится значениями, если нет - останется пустым. end; function TFormMain.ParseJSONArray(AJSONString : String) : TStringList; // для удобства функция возвращает TStringList, так будет проще закинуть результат в Memo Var AJSONArray : TJSONArray; AJSONValue : TJSONValue; I : Integer; begin Result:=TStringList.Create; // Создаем результат фозвращаемый функцией AJSONArray:=TJSONArray(TJSONObject.ParseJSONValue(AJSONString)); // Зная что на входе TJSONArray парсим его, пропуская парсинг TJSONObject if Not Assigned(AJSONArray) then // Если парсинг удался, то AJSONArray<>Nil Exit; for I := 0 to AJSONArray.Count-1 do // Работаем как с обычным массивом if AJSONArray.Items[I].TryGetValue('number',AJSONValue) Then //Здесь используем полезную функцию TryGetValue, защищая себя от некорректных или отсутствующих 'number' Result.Add(AJSONValue.Value); // Если успешно, то добавляем полученную строку в результирующий StringList end; end. P.S. работает под всеми платформами. Скорость для такого небольшого файла JSON можно принять за мгновенную даже на стареньких телефонах. Мне вот тут один сервис отдавал JSON размером в 6 мегабайт. Онлайн парсер http://pro.jsonlint.com/ которым удобно смотреть структуру зависал наглухо. А в Delphi все отлично и быстро работало
  6. Like
    Евгений Корепов получил реакцию от zairkz в RAD 11 на подходе?   
    Обновили продукты в онлайн магазине. http://store.embarcadero.ru/catalog/rubric/24
    Итого чтобы обновить мою Delphi XE8 до "Delphi 10.1 Berlin Professional"+"Mobile Add-On Pack к Delphi 10.1 Berlin Professional" нужно заплатить 85038,22 рублей. Кажется наем фрилансеров для реализации моих хотелок обойдется дешевле. К торрент версии душа не лежит. Буду и дальше сидеть на XE8, подожду "Delphi 10.8 Bangladesh Professional" с компилятором для Linux и Intel Atom, полноценными сервисами InAppBilling, полной реализацией работы с сенсорами и надеюсь множеством других доделок.
  7. Like
    Евгений Корепов получил реакцию от Sergionn в RAD 11 на подходе?   
    Обновили продукты в онлайн магазине. http://store.embarcadero.ru/catalog/rubric/24
    Итого чтобы обновить мою Delphi XE8 до "Delphi 10.1 Berlin Professional"+"Mobile Add-On Pack к Delphi 10.1 Berlin Professional" нужно заплатить 85038,22 рублей. Кажется наем фрилансеров для реализации моих хотелок обойдется дешевле. К торрент версии душа не лежит. Буду и дальше сидеть на XE8, подожду "Delphi 10.8 Bangladesh Professional" с компилятором для Linux и Intel Atom, полноценными сервисами InAppBilling, полной реализацией работы с сенсорами и надеюсь множеством других доделок.
  8. Like
    Евгений Корепов отреагировална brunnengi в Как узнать какой тип у элемента JSON   
    Не знаю то или не то что ты хочешь, но вот:
    Пример:
    Строка JSON: {"type1":199, "type2":"val2","ar":["arval1","arval2"]}
    первый это число, второе строка, третье массив
     
    Код на кнопку:
    procedure TForm1.Button1Click(Sender: TObject); var s : string; js : TJSONObject; begin s := '{"type1":199, "type2":"val2","ar":["arval1","arval2"]}'; JS := TJSONObject.ParseJSONValue(s) as TJSONObject; memo1.Lines.Add(JS.Pairs[0].JsonValue.ClassName); memo1.Lines.Add(JS.Pairs[1].JsonValue.ClassName); memo1.Lines.Add(JS.Pairs[2].JsonValue.ClassName); end; Запускаем и в memo1 попадают вот такие ответы:
    TJSONNumber TJSONString TJSONArray     Думаю дальше ты знаешь что делать, если конечно я правильно тебя понял и правильно тебе насоветовал тут.
  9. Like
    Евгений Корепов отреагировална Rusland в RAD 11 на подходе?   
    Не-не-не, поддержка Linux и Intel Atom будет не раньше версии "Delphi 99.9 Uhta" 
  10. Like
    Евгений Корепов отреагировална Error в Архитектура FM   
    На Windows два вида канвы: TCanvasGdiPlus и TCustomCanvasD2D, на Mac есть нативная для макоси TCanvasQuartz, как видите не OpenGL-ем единым.
    На Windows есть как минимум один повод использовать D2D - в этой канве используется нативный для системы рендинг текста, в то время как в TGpuCanvas рендинг текста происходит через промежуточные битмапы, что сказывается на производительности.
    D2D, Quartz, GdiPlus - все эти Api созданы как-раз для использования в приложениях, в то время как OpenGL явно не предназначен для этого и не имеет элементарного рендера текста.
    Действительно у меня на 7-ке были актуальные драйвера по дефолту, за одной маленькой проблемой - с софтварным рендингом
    Тут все просто - бросьте на форму TCircle и запустите на телефоне, а потом сравните качество прорисовки круга с Windows. И из-за заточености OpenGL под 3д визуализацию намного лучше и не сделать скорее всего.
    --
    Я наоборот жду когда под мобильными платформами будет использоваться нативное API для графики
  11. Like
    Евгений Корепов отреагировална Равиль Зарипов (ZuBy) в ListBox, Edit и клавиатура   
    Пользуюсь еще вот таким модулем
     
    просто подключаем в uses и используем для Андроид
     
    vkbdhelper.zip
  12. Like
    Евгений Корепов отреагировална Rusland в Скачать курс валют через THTTPClient   
    Проблема решена.
    Оказалось что там кодировка Win1251, а я указал 
    TStringStream.Create('', TEncoding.UTF8); вместо
    TStringStream.Create(''); И парсер на всякий случай:
    uses msxml; procedure GetKursValutAndDate(XML:String; var KDollar,KEuro:Double); var XMLDoc: IXMLDOMDocument; Subnodes: IXMLDOMNodeList; AttributeNode: IXMLDOMNode; OperationNode: IXMLDOMNode; i:integer; begin KDollar:=0; KEuro:=0; try XMLDoc:=CoDOMDocument.Create; if Assigned(XMLDoc) and XMLDoc.loadXML(XML) then begin Subnodes:=XMLDoc.selectNodes('//ValCurs/node()'); if Assigned(Subnodes) then begin for I := 0 to Subnodes.length - 1 do begin AttributeNode := Subnodes[I].attributes.getNamedItem('ID'); if Assigned(AttributeNode) then if (AttributeNode.nodeValue='R01235') then begin // доллар OperationNode:=Subnodes[I].selectSingleNode('.//Value'); if Assigned(OperationNode) then KDollar:=StrToFloat(OperationNode.text); end else if (AttributeNode.nodeValue='R01239') then begin // евро OperationNode:=Subnodes[I].selectSingleNode('.//Value'); if Assigned(OperationNode) then KEuro:=StrToFloat(OperationNode.text); end end; end; end; except Raise Exception.Create('Не удалось получить курс валют'); end; end;  
  13. Like
    Евгений Корепов отреагировална AndroidHalfNoob в Добавление контакта в телефонную книгу   
    Может кому пригодится. Функцию нашел на  просторах интернета. Адаптировал по себя. На форме 5 edit-ов. Для фамилии, имени, отчества, номера телефона и электронной почты.
    Подключаем модули.
    В проекте Options--->Uses Permissions ставим true в разделе Write contacts.
    Функция добавления контакта
    На кнопку привязываем функцию
     
  14. Like
    Евгений Корепов отреагировална Равиль Зарипов (ZuBy) в RAD 11 на подходе?   
    это просто мега фейл, и как теперь их ошибки устранять... править каждый раз сорцы???
  15. Like
    Евгений Корепов отреагировална Sergionn в RAD 11 на подходе?   
    To enforce visibility semantics, class and record helpers cannot access private members of the classes or records that they extend.
    И да, я пока еще качаю, но они, что, реально убрали доступ хелперов к приватным полям? 
    У меня куча закрытых ("мудрым" архитектором) полей  таким макаром "подтянуты" до публичного доступа
  16. Like
    Евгений Корепов отреагировална krapotkin в RAD 11 на подходе?   
    вот и ответ
    "Embarcadero tools are built for elite developers who build and maintain the world’s most critical applications. "
    Элитность!
  17. Like
    Евгений Корепов отреагировална krapotkin в RAD 11 на подходе?   
    там же даже не в цене иногда вопрос, а в отношении
    очень редко где в наше время ты платишь деньги за продукт, полный багов, а фиксят их только в следующем релизе, который ты должен покупать за ту же цену
    и целых ТРИ! обращения в техподдержку у тебя есть))) в год!
     
  18. Like
    Евгений Корепов отреагировална Rusland в Алфавитный скроллинг для ListView   
    Кстати, стандартный ScrollBar можно спрятать, если скопировать в свой проект FMX.ListView.pas
    и изменить 
    const ... {$IFDEF ANDROID} DefaultScrollBarWidth = 0; // вместо 7 {$ENDIF} Осталось решить проблему "слепой зоны" ползунка при скроллировании внизу списка.
     
    PS. Ну и желательно реализовать плавность хода скроллера (
    alphLVS.zip
  19. Like
    Евгений Корепов получил реакцию от privet20044 в [Android] Как убрать "Вставить" и подчеркивание при фокусе?   
    Быть такого не может. Отладкой проверяли? Может у вас срабатывает на if Assigned(FClipboardSvc) then и ничего не выполняется. 
     
    В главной форме не забудьте    FClipboardSvc: IFMXClipboardService;
     
    и потом:
    procedure TFormMain.FormCreate(Sender: TObject); begin   if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(FClipboardSvc)) then     FClipboardSvc := nil; ...
  20. Like
    Евгений Корепов получил реакцию от privet20044 в [Android] Как убрать "Вставить" и подчеркивание при фокусе?   
    Избежать появления кнопки Вставить можно очисткой буфера обмена.
    Например так:
      procedure TFormMain.Edit1CanFocus(Sender: TObject; var ACanFocus: Boolean); begin   if Assigned(FClipboardSvc) then     FClipboardSvc.SetClipboard('');   ACanFocus:=True; end; Обратите внимание что именно пустая строка очищает буфер, попытка сделать FClipboardSvc.SetClipboard(Nil); поместит в буфер строку 'empty'.
  21. Like
    Евгений Корепов отреагировална Равиль Зарипов (ZuBy) в Вызвать настройки GPS в Android   
    интентом вызывается, вот так
    procedure TForm4.GPSSettings; {$IFDEF ANDROID} var Intent: JIntent; {$ENDIF} begin {$IFDEF ANDROID} Intent := TJIntent.Create; Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_LOCATION_SOURCE_SETTINGS); TAndroidHelper.Activity.startActivity(Intent); {$ENDIF} end;  
  22. Like
    Евгений Корепов отреагировална Brovin Yaroslav в Ошибка "Bitmap size too big"   
    Если я правильно помню, то это сторона квадрата в пикселях. Если возвращает 1000, то это значит, что допустимо хранение изображение размером до 1000 х 1000. На самом деле TBitmap в своей основе использует текстуру для хранения картинки. Поэтому этот размер и ограничение зависит от графического процессора.
  23. Like
    Евгений Корепов получил реакцию от Rusland в Ошибка "Bitmap size too big"   
    Ура! Заработало с TBitmapSurface.StretchFrom :
    ABitmapSurface:=TBitmapSurface.Create; ABitmapSurfaceResize:=TBitmapSurface.Create; TBitmapCodecManager.LoadFromFile('d:\source.png',ABitmapSurface); // png 250x250 MaxImageSize:=50; ABitmapSurfaceResize.StretchFrom(ABitmapSurface,MaxImageSize,MaxImageSize); TBitmapCodecManager.SaveToFile('d:\source_resize.png', ABitmapSurfaceResize); Все работает отменно :-)
    Итоговый код для загрузки картинки из потока и устранения ошибки "Bitmap size too big":
    Uses FMX.Graphics, FMX.Surfaces; function GetMaxImageSize : Integer; begin Result:=TCanvasManager.DefaultCanvas.GetAttribute(TCanvasAttribute.MaxBitmapSize); end; procedure CheckAndLoadFromStream(const AStream : TStream; const ABitmap : TBitmap); Var MaxImageSize : Integer; ABitmapSurface,ABitmapSurfaceResize : TBitmapSurface; begin ABitmapSurface:=TBitmapSurface.Create; AStream.Position:=0; TBitmapCodecManager.LoadFromStream(AStream,ABitmapSurface); MaxImageSize:=GetMaxImageSize; if ABitmapSurface.Height>MaxImageSize then begin ABitmapSurfaceResize:=TBitmapSurface.Create; ABitmapSurfaceResize.StretchFrom(ABitmapSurface,MaxImageSize,MaxImageSize); if Assigned(ABitmap) then ABitmap.Assign(ABitmapSurfaceResize); ABitmapSurfaceResize.Free; end Else if Assigned(ABitmap) then ABitmap.Assign(ABitmapSurface); ABitmapSurface.Free; end; Всем спасибо за помощь! Особая благодарность Ярославу! 
    P.S. Процедура для частного случая с квадратным изображением. Для меня осталось не до конца ясным значение возвращаемое TCanvasManager.DefaultCanvas.GetAttribute(TCanvasAttribute.MaxBitmapSize), исходил из догадки что это максимальный размер изображения по вертикали в пикселях. Может Ярослав поставит все точки и разъяснит этот вопрос?
  24. Like
    Евгений Корепов отреагировална Brovin Yaroslav в Ошибка "Bitmap size too big"   
    Как узнать поддерживаемый максимально допустимый размер изображения в TBitmap?
  25. Like
    Евгений Корепов отреагировална Brovin Yaroslav в Как узнать поддерживаемый максимально допустимый размер изображения в TBitmap?   
    В FireMonkey TBitmap имеет верхнее ограничение на размеры хранимого изображения, ограниченные максимально допустимым размером текстур в текущей платформе. Узнать максимальную ширину и высоту можно так:
    var MaxWidthHeight: Integer; begin MaxWidthHeight := TCanvasManager.DefaultCanvas.GetAttribute(TCanvasAttribute.MaxBitmapSize); end;
×
×
  • Создать...