Лидеры
Популярный контент
Показан контент с высокой репутацией 26.04.2016 во всех областях
-
Добавьте это {$ZEROBASEDSTRINGS ON} Инфа: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Zero-based_strings_(Delphi)2 балла
-
Генерация QR-кода на Android
zairkz и ещё один отреагировал Равиль Зарипов (ZuBy) за вопрос
могу подсказать в какую сторону копать. строки в ANDROID/IOS начинаются с 0, а там не заметил чтобы это учитывалось. Если сделаете, выложите. Всем будет полезно2 балла -
угу, посмотрел, раньше вроде не было этого я думаю, это просто лень ему было написать тип PtrInt и еще парочку надо написать автору на гитхабе, он быстро исправляет ошибки2 балла
-
Не согласен, тут просто нужно запомнить что: A - Array I - Integer S - String B - Boolean и т.д. Очень даже просто и логично )2 балла
-
Как вытащить список из JSON со значениями
zairkz и ещё один отреагировал Равиль Зарипов (ZuBy) за вопрос
Я отказался от родного в пользу XSO, посмотрите как компактно выглядет код который я привел выше. И стабильно и читабельно, скорость тоже на высоте2 балла -
Генерация QR-кода на Android
zairkz и ещё один отреагировал Равиль Зарипов (ZuBy) за вопрос
Я вижу решение таким, реализуйте. Каждый пиксель нужно отрисовать примерно 4 раза, тогда квадрат будет не 1х1, а 4х4. Картинка станет четкой т.к. увеличится холст2 балла -
Cancel в InputQuery
Евгений Корепов отреагировал enatechno за вопрос
и не только... What's New - Berlin: Simplified Dialog API Several procedures and functions to show dialog boxes are now deprecated, and have been replaced by the procedures and functions of the new IFMXDialogServiceAsync and IFMXDialogServiceSync platform services that provide support for synchronous and asynchronous dialog boxes, respectively. The following table summarizes the API changes: Deprecated Members New Members FMX.Dialogs.ShowMessage* FMX.Dialogs.ShowMessageFmt* FMX.Dialogs.ShowMessagePos ShowMessageAsync ShowMessageSync FMX.Dialogs.MessageDlg FMX.Dialogs.MessageDlgPos FMX.Dialogs.MessageDlgPosHelp FMX.Platform.IFMXDialogService.MessageDialog MessageDialogAsync MessageDialogSync FMX.Dialogs.InputBox FMX.Dialogs.InputQuery FMX.Platform.IFMXDialogService.InputQuery InputQueryAsync InputQuerySync * ShowMessage and ShowMessageFmt are not really deprecated, but you may want to use ShowMessageAsync or ShowMessageSync instead nonetheless. Two new helper classes have been created as well: TDialogServiceAsync and TDialogServiceSync. These helper classes provide class methods and functions that allow you to call the new procedures and functions for dialog boxes without the need of an instance of the corresponding dialog box platform service. Other FireMonkey1 балл -
Генерация QR-кода на Android
zairkz отреагировал Равиль Зарипов (ZuBy) за вопрос
похоже на правду, но сейчас нет времени проверить. думаю Pax Beach примет это к сведению1 балл -
Ну ладно... {$IFNDEF MSWINDOWS} {$ZEROBASEDSTRINGS OFF} {$ENDIF} И обращаю внимание что это только для проверки. Я код не видел - но скорее всего придется много переделывать для кроссплатформенности.1 балл
-
Генерация QR-кода на Android
zairkz отреагировал Равиль Зарипов (ZuBy) за вопрос
я про это в курсе, но тогда на Windows отвалится. я не проверял, но в коде видел циклы со строками начинающиеся с 11 балл -
я неправильно сделал, что не добавил строчку: Canvas.Stroke.Kind := TBrushKind.Solid; рисовать квадратами, тоже хорошо получилось. Модуль в моей редакции (в архиве выше) под Windows хорошо с UTF8 работает, а вод под Android разбираюсь. Спасибо за указание на ошибку.1 балл
-
Кроме того, проверьте стандартную библиотеку System.JSON на утечку памяти (ReportMemoryLeak), каждый раз TJSONvalue надо освобождать и уничтожать.1 балл
-
Еще посмотрите на компонент CalloutPanel1 балл
-
Генерация QR-кода на Android
zairkz отреагировал Равиль Зарипов (ZuBy) за вопрос
немного неправильно сделали, вот так: procedure TfmMainQRShare.ImageQRPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); var Row, Column: Integer; xPos, yPos, RectSize: Single; pixelColor: TAlphaColor; Img: TImage; begin Img := (Sender as TImage); if Assigned(QRCode) and (not QRCode.Data.IsEmpty) then begin RectSize := Min(Img.Width, Img.Height) / QRCode.Columns; if RectSize > 0 then begin try Canvas.BeginScene; for Row := 0 to QRCode.Rows - 1 do begin for Column := 0 to QRCode.Columns - 1 do begin if (QRCode.IsBlack[Row, Column]) then pixelColor := TAlphaColors.Black else pixelColor := TAlphaColors.White; xPos := Column * RectSize + 0.5 * RectSize; yPos := Row * RectSize + 0.5 * RectSize; Canvas.Fill.Color := pixelColor; Canvas.FillRect(RectF(xPos, yPos, xPos + (RectSize + 1), yPos + (RectSize + 1)), 0, 0, AllCorners, 1); end; end; finally Canvas.EndScene; end; end; Img.Bitmap.SetSize(Canvas.Width, Canvas.Height); Img.Bitmap.Assign(Canvas.Bitmap); end; end; procedure TfmMainQRShare.Update; begin QRCode.Free; QRCode := TDelphiZXingQRCode.Create; QRCode.Data := edtText.Text; QRCode.Encoding := TQRCodeEncoding(cmbEncoding.ItemIndex); QRCode.QuietZone := StrToIntDef(edtQuietZone.Text, 2); QRCodeBitmap.SetSize(QRCode.Rows, QRCode.Columns); ImageQR.Repaint; end; но проблема в другом, проблема в самом модуле, он не правильно работает со строками1 балл -
Посмотрите на реализацию JSON парсера в библиотеке https://github.com/synopse/mORMot немного о быстродействии http://blog.synopse.info/post/2015/02/16/Benchmarking-JsonDataObjects-JSON-parser пример кода { "glossary":{ "title":"example glossary", "GlossDiv":{ "title":"S", "GlossList":{ "GlossEntry":{ "ID":"SGML", "SortAs":"SGML", "GlossTerm":"Standard Generalized Markup Language", "Acronym":"SGML", "Abbrev":"ISO 8879:1986", "GlossDef":{ "para":"A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso":[ "GML", "XML" ] }, "GlossSee":"markup" } } } } } // Synopse direct record access Check(gloss.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso[0]='GML'); // Synopse TDocVariant with properties Check(DocVariantData(doc.GetValueByPath(['glossary','GlossDiv','GlossList','GlossEntry','GlossDef','GlossSeeAlso'])).Value[0]='GML'); // Synopse TDocVariant with late binding Check(doc.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso._(0)='GML'); // DBXJSON check(((((((obj.GetValue('glossary') as TJSONObject).GetValue('GlossDiv') as TJSONObject).GetValue('GlossList') as TJSONObject).GetValue('GlossEntry') as TJSONObject).GetValue('GlossDef') as TJSONObject).GetValue('GlossSeeAlso') as TJSONArray).Get(0).Value='GML');1 балл
-
Как вытащить список из JSON со значениями
zairkz отреагировал Равиль Зарипов (ZuBy) за вопрос
AV выходит только при не правильной JSON структуре. А остальные данные можно не проверять, на существование. Он сам съест ошибку и вернет пустоту. а если учесть что данные идут от сервера (в данной теме) нужно всего ишь проверить правильность начальных символов. дело в кол-ве строчек, а в количестве символов и в понимании работы с JSON1 балл -
Как вытащить список из JSON со значениями
zairkz отреагировал Равиль Зарипов (ZuBy) за вопрос
я всеже предложу вам посмотреть реализацию через XSO там реализован правильный фильтр JSONParse.zip1 балл -
Как вытащить список из JSON со значениями
Евгений Корепов отреагировал M1shQa за вопрос
Огромное спасибо, Вы меня сильно выручили!1 балл -
Как вытащить список из JSON со значениями
M1shQa отреагировал Евгений Корепов за вопрос
Вот получение данных с 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 не безопасный, будет работать до первой ошибки в входных данных, далее крах приложения.1 балл -
RAD 11 на подходе?
Равиль Зарипов (ZuBy) отреагировал Rusland за тема
Не-не-не, поддержка Linux и Intel Atom будет не раньше версии "Delphi 99.9 Uhta"1 балл -
Как вытащить список из JSON со значениями
M1shQa отреагировал Евгений Корепов за вопрос
Для работы с 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 все отлично и быстро работало1 балл -
Как вытащить список из JSON со значениями
M1shQa отреагировал Равиль Зарипов (ZuBy) за вопрос
если использовать XSuperObject var aJSON: string; xJS, xObj: ISuperObject; j: integer; begin xJS := SO(aJSON); // данные with xJS.A['data'] do // имя массива begin for j := 0 to length - 1 do begin xObj := O[j]; TStringList.Add(xObj.S['number']); // собираем в стринг лист нужное поле end; end; end;1 балл -
при Add тебе возвращается указатель(!) на новый итем. смотри TListViewItems.AddItem(Index: Integer) в FMX.ListView в TListViewItems.Delete(Index: Integer) вызывается FreeAndNil итема а вот в TListViewItems.Clear просто чистится TList<TListViewItem>. как известно TList это просто список указателей. так что сама память при ListView.Items.Clear как я понимаю не освободится. как альтернатива: while ListView.Items.Count > 0 do ListView.Items.Delete(0);1 балл
-
Почему на мобильных платформах у меня не рисуется окружность?
Oleg Erofeev отреагировал Brovin Yaroslav за вопрос
В вашем случае вы не задали тип кисти Canvas.Stroke. Более, чем уверен, что на устройстве там стоит TBrushKind.bkNone. Вашу проблему решит задание типа кисти TBrushKind.bkSolid. procedure TForm5.Image14Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); var EllipseRegion: TRectF; begin Canvas.Stroke.Kind := TBrushKind.bkSolid; Canvas.Stroke.Color := TAlphaColorRec.Red; EllipseRegion := TRectF.Create(TPointF.Create(100, 100), 20, 20); Canvas.DrawEllipse(EllipseRegion, 1); end; Хорошая практика отрисовки в FMX полагает, что вы полностью инициализируете все кисти, необходимые вам для отрисовки. Так же обратите внимание, что канва для формы и всех контролах, размещенных на ней, всегда существует в одном экземпляре. И правилом хорошего тона, является использовать канву, переданную через параметры события отрисовки.1 балл