Евгений Корепов
-
Постов
738 -
Зарегистрирован
-
Посещение
-
Победитель дней
100
Активность репутации
-
Евгений Корепов получил реакцию от 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, полной реализацией работы с сенсорами и надеюсь множеством других доделок.
-
Евгений Корепов отреагировална M1shQa в Как вытащить список из JSON со значениями
Огромное спасибо, Вы меня сильно выручили!
-
Евгений Корепов получил реакцию от 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 не безопасный, будет работать до первой ошибки в входных данных, далее крах приложения.
-
Евгений Корепов получил реакцию от 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 все отлично и быстро работало
-
Евгений Корепов получил реакцию от 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 все отлично и быстро работало
-
Евгений Корепов получил реакцию от 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, полной реализацией работы с сенсорами и надеюсь множеством других доделок.
-
Евгений Корепов получил реакцию от 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, полной реализацией работы с сенсорами и надеюсь множеством других доделок.
-
Евгений Корепов отреагировална 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 Думаю дальше ты знаешь что делать, если конечно я правильно тебя понял и правильно тебе насоветовал тут. -
Евгений Корепов отреагировална Rusland в RAD 11 на подходе?
Не-не-не, поддержка Linux и Intel Atom будет не раньше версии "Delphi 99.9 Uhta"
-
Евгений Корепов отреагировална Error в Архитектура FM
На Windows два вида канвы: TCanvasGdiPlus и TCustomCanvasD2D, на Mac есть нативная для макоси TCanvasQuartz, как видите не OpenGL-ем единым.
На Windows есть как минимум один повод использовать D2D - в этой канве используется нативный для системы рендинг текста, в то время как в TGpuCanvas рендинг текста происходит через промежуточные битмапы, что сказывается на производительности.
D2D, Quartz, GdiPlus - все эти Api созданы как-раз для использования в приложениях, в то время как OpenGL явно не предназначен для этого и не имеет элементарного рендера текста.
Действительно у меня на 7-ке были актуальные драйвера по дефолту, за одной маленькой проблемой - с софтварным рендингом
Тут все просто - бросьте на форму TCircle и запустите на телефоне, а потом сравните качество прорисовки круга с Windows. И из-за заточености OpenGL под 3д визуализацию намного лучше и не сделать скорее всего.
--
Я наоборот жду когда под мобильными платформами будет использоваться нативное API для графики
-
Евгений Корепов отреагировална Равиль Зарипов (ZuBy) в ListBox, Edit и клавиатура
Пользуюсь еще вот таким модулем
просто подключаем в uses и используем для Андроид
vkbdhelper.zip
-
Евгений Корепов отреагировална 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;
-
Евгений Корепов отреагировална AndroidHalfNoob в Добавление контакта в телефонную книгу
Может кому пригодится. Функцию нашел на просторах интернета. Адаптировал по себя. На форме 5 edit-ов. Для фамилии, имени, отчества, номера телефона и электронной почты.
Подключаем модули.
В проекте Options--->Uses Permissions ставим true в разделе Write contacts.
Функция добавления контакта
На кнопку привязываем функцию
-
Евгений Корепов отреагировална Равиль Зарипов (ZuBy) в RAD 11 на подходе?
это просто мега фейл, и как теперь их ошибки устранять... править каждый раз сорцы???
-
Евгений Корепов отреагировална Sergionn в RAD 11 на подходе?
To enforce visibility semantics, class and record helpers cannot access private members of the classes or records that they extend.
И да, я пока еще качаю, но они, что, реально убрали доступ хелперов к приватным полям?
У меня куча закрытых ("мудрым" архитектором) полей таким макаром "подтянуты" до публичного доступа
-
Евгений Корепов отреагировална krapotkin в RAD 11 на подходе?
вот и ответ
"Embarcadero tools are built for elite developers who build and maintain the world’s most critical applications. "
Элитность!
-
Евгений Корепов отреагировална krapotkin в RAD 11 на подходе?
там же даже не в цене иногда вопрос, а в отношении
очень редко где в наше время ты платишь деньги за продукт, полный багов, а фиксят их только в следующем релизе, который ты должен покупать за ту же цену
и целых ТРИ! обращения в техподдержку у тебя есть))) в год!
-
Евгений Корепов отреагировална Rusland в Алфавитный скроллинг для ListView
Кстати, стандартный ScrollBar можно спрятать, если скопировать в свой проект FMX.ListView.pas
и изменить
const ... {$IFDEF ANDROID} DefaultScrollBarWidth = 0; // вместо 7 {$ENDIF} Осталось решить проблему "слепой зоны" ползунка при скроллировании внизу списка.
PS. Ну и желательно реализовать плавность хода скроллера (
alphLVS.zip
-
Евгений Корепов получил реакцию от 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; ... -
Евгений Корепов получил реакцию от privet20044 в [Android] Как убрать "Вставить" и подчеркивание при фокусе?
Избежать появления кнопки Вставить можно очисткой буфера обмена.
Например так:
procedure TFormMain.Edit1CanFocus(Sender: TObject; var ACanFocus: Boolean); begin if Assigned(FClipboardSvc) then FClipboardSvc.SetClipboard(''); ACanFocus:=True; end; Обратите внимание что именно пустая строка очищает буфер, попытка сделать FClipboardSvc.SetClipboard(Nil); поместит в буфер строку 'empty'.
-
Евгений Корепов отреагировална Равиль Зарипов (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;
-
Евгений Корепов отреагировална Brovin Yaroslav в Ошибка "Bitmap size too big"
Если я правильно помню, то это сторона квадрата в пикселях. Если возвращает 1000, то это значит, что допустимо хранение изображение размером до 1000 х 1000. На самом деле TBitmap в своей основе использует текстуру для хранения картинки. Поэтому этот размер и ограничение зависит от графического процессора.
-
Евгений Корепов получил реакцию от 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), исходил из догадки что это максимальный размер изображения по вертикали в пикселях. Может Ярослав поставит все точки и разъяснит этот вопрос?
-
Евгений Корепов отреагировална Brovin Yaroslav в Ошибка "Bitmap size too big"
Как узнать поддерживаемый максимально допустимый размер изображения в TBitmap?
-
Евгений Корепов отреагировална Brovin Yaroslav в Как узнать поддерживаемый максимально допустимый размер изображения в TBitmap?
В FireMonkey TBitmap имеет верхнее ограничение на размеры хранимого изображения, ограниченные максимально допустимым размером текстур в текущей платформе. Узнать максимальную ширину и высоту можно так:
var MaxWidthHeight: Integer; begin MaxWidthHeight := TCanvasManager.DefaultCanvas.GetAttribute(TCanvasAttribute.MaxBitmapSize); end;