Перейти к содержанию
  • Регистрация

Slym

Пользователи
  • Публикаций

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

  • Посещение

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

    5

Весь контент Slym

  1. а бездумно копипастить вредно. форум режет скобки... JArray.Items [ i ]; приведенный код не соответствует тексту JSON... нету в тексте Array (обозначается [ ])
  2. Также серьезно как и TObject(nil).Free; //no problem Это работает! Поверь и проверь. В любом вызове метода объекта передается первым параметром self, и достаточно сделать в самом начале if self=nil then exit; - и проблемы нет так делает TJSONValue.FindValue, так делает TObject.Free пример из генофонда: procedure TObject.Free; begin // under ARC, this method isn't actually called since the compiler translates // the call to be a mere nil assignment to the instance variable, which then calls _InstClear {$IFNDEF AUTOREFCOUNT} if Self <> nil then Destroy; {$ENDIF} end;
  3. Slym

    TEdit искажает текст

    Данный артефакт я тоже ловил на лабелах - лечится именно восстановлением фона. (хотя эм могла гденить еще косячнуть) Во всех формах надо убрать фон (возможно ты используешь несколько форм)... В чистом проекте артефакт есть? сделай полный билд, передерни эм делфи, кофе попей...
  4. function Proc(const Answerreqest:string):boolean; var JSON,AItem: TJSONValue; JRequest, JDistance: TJSONObject; JArray: TJSONArray; I: integer; begin JSON := TJSONObject.ParseJSONValue(Answerreqest); //if not Assigned(JSON) then exit(false); //<<< прикинь даже не обязательно проверять на nil JPath работает через FindValue - а он сам проверяет на nil try if JSON.TryGetValue<TJSONObject>('request',JRequest) then TabbedForm.memo3.Lines.Add('JRequest: ' + JRequest.ToString); if JSON.TryGetValue<TJSONObject>('distance',JDistance) then begin TabbedForm.memo3.Lines.Add('JDistance: ' + JDistance.ToString); TabbedForm.memo3.Lines.Add('price_1: ' + JDistance.GetValue<string>('price_1','')); if JDistance.TryGetValue<TJSONArray>('SomeArray',JArray) then begin TabbedForm.memo3.Lines.Add('count: ' + JArray.Count.ToString); for I := 0 to JArray.Count - 1 do begin AItem := JArray.Items; TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_id','') + ',' + AItem.GetValue<string>('obj_acc_id','') + ',' + AItem.GetValue<string>('obj_cat_id','')); TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_title','')); TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_descr','')); TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_address','')); TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_url','')); end; end; end; finally JSON.Free; end; result:=true; end;
  5. Slym

    TEdit искажает текст

    УБЕРИ ФОН С ФОРМЫ: фон делай отдельным Rectanglом - там любой цвет кроме шрифтов всплывет и другое читать тут:
  6. ни одного TJSONArray в ответе нет так же нет ничего из этого: TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_id').Value + ',' + aJSObjArr.GetValue('obj_acc_id').Value + ',' + aJSObjArr.GetValue('obj_cat_id').Value); TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_title').Value); TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_descr').Value); TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_address').Value); TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_url').Value); бросай те вы уже эти as TJSONArray as TJSONObject - где проверки на существование? жесткого приведения требует только разве что TJSONArray, а остальное выше TJSONValue приводить не обязательно. используйте нотацию TJSONValue.GetValue<string>('obj_title','').- не найдено встанет значение по умолчанию... не нравится возьми TryGetValue даже jpath(указание пути названий узлов) работает JSONValue.GetValue<integer>('request.people_count,0) - даже с массивами... касаемо массивов - можно указать тип искомой ноды SONValue.GetValue<TJSONArray>('request.distance',nil)
  7. FDQuery1.Lookup? или RTTI c:=FindComponent(FDQuery1.Fields[1].AsString) if assigned(c) SetProp(c,FDQuery1.Fields[2].AsString,TValue.From(FDQuery1.Fields[3].AsString))
  8. Под андроид идет опция AUTOREFCOUNT - все объекты имеют счетчик ссылок... любое присваивание - это +/- ссылки, даже Free не честное: procedure TObject.Free; begin // under ARC, this method isn't actually called since the compiler translates // the call to be a mere nil assignment to the instance variable, which then calls _InstClear {$IFNDEF AUTOREFCOUNT} if Self <> nil then Destroy; {$ENDIF} end; т.е. Free ничего не делает!!! - экземпляр остается в зомбирежиме (ты его убил а оно ходит) пока счетчик до 0 не до тикает. TObject(TreeItem); - пытается найти методы подсчета ссылок (Это же объект!) и не находит т.к. это не объект вовсе. TTreeItem = record меняем на TTreeItem = class, честно создаем и не забываем убить, хотя под AUTOREFCOUNT - оно само должно помереть если циклической ссылочности нет.
  9. аяяй! Совсем разленились try юзать, все на RefCounting надеетесь... ну-ну... а под вендой мемлики плодятся (если файла нет - Surf куда?) не-не... переделать! а то студенты накопипастят... procedure TBitmapAsyncLoader.LoadImageAsync(const AFilePath:string; Callback: TProc); begin TTask.Run( procedure var ABitmapSurface : TBitmapSurface; begin ABitmapSurface:=TBitmapSurface.Create; try if TBitmapCodecManager.LoadFromFile(AFilePath, ABitmapSurface, CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) and assigned(Callback) then TThread.Synchronize(nil, Callback); finally ABitmapSurface.Free; end; end); end;
  10. ну в общем воркеры имеются... например TTask и запускаются в пуле... и можно запускать много тасков и они из общего пула не вылезут и делать к примеру так: данный код не бест и может ломать пикчу, и поэтому вопрошаю кто как... пользую TBitmap а не Surface что тоже не оптимально, но обратно совместимо с vcl (в дефайн обернуть?) procedure LoadImageAsync(const Name:string; Callback: TProc<TBitmap>); begin TTask.Run( procedure var Bitmap:TBitmap; begin Bitmap:=TBitmap.Create; try Bitmap.LoadFromFile(ImagePath+Name); TThread.Synchronize(nil, procedure begin Callback(Bitmap); end); finally Bitmap.Free; end; end); end; procedure TmainForm.FormShow(Sender: TObject); begin LoadImageAsync('logo1.png', procedure(Bitmap:TBitmap) begin Image1.Bitmap.Assign(Bitmap); Image1.Invalidate; end); LoadImageAsync('logo2.png', procedure(Bitmap:TBitmap) begin Image2.Bitmap.Assign(Bitmap); Image2.Invalidate; end); LoadImageAsync('logo3.png', procedure(Bitmap:TBitmap) begin Image3.Bitmap.Assign(Bitmap); Image3.Invalidate; end); end;
  11. Доп вопрос в тему: Как вы с fs загружаете картинки? по тутору андрюши любой доступ к fs желательно поточить, а тут еще и декод... а декод можно параллелить на кучи ядер смартфона но все поголовно не заморачиваются и тупо LoadFromFile в главном потоке. как правильно? на косяки TBitmap в потоке тоже нарывался прозрачность портит/чернит 1. допустим есть форма и TImage на ней, и в него надо положить logo.png 2. тоже самое но 10-20 images (параллельный декод)
  12. У меня IPhone6 вдулся от постоянного висения на шнурке... Теперь правило вечером отключить... но нет! нет отладки - нет зарядки и садится в ноль! Теперь правило в понедельник всегда на зарядку...
  13. а so бинари под правельный cpu? so - это нативная либа собранная под конкретный cpu, а не байткод докомпилируемый на месте
  14. А руками uses FireDAC.Phys.Oracle; TFDPhysOracleDriverLink.Create(form); не? все мышкой привыкли...
  15. Не делайте слепое приведение типов... var JObj:TJSONObject; begin JObj:=TJSONObject(TJSONObject.ParseJSONValue('0')); try try if assigned(JObj) then JObj.AddPair('Access','violation'); except ShowMessage('Surprise MF!: '+JObj.ClassName); end; finally JObj.Free; end; end; ParseJSONValue возвращает TJSONValue, и необходима или проверка типа или использование только в рамках TJSONValue чего в большинстве случаев вполне достаточно.
  16. procedure TForm2.Button1Click(Sender: TObject); var Iters:integer; begin Iters:=100000000; TThread.CreateAnonymousThread( procedure var i:integer; a:real; begin for i := 0 to Iters do begin a:=i/3; if i mod 1000000 = 0 then begin TThread.Queue(nil, procedure begin ProgressBar1.Value:=ProgressBar1.Value+1; end); end; end; end).Start; end; и не надо никаких доп классов... еще есть TTask... тоже полезно
  17. PerspEffect1.TopLeft := PerspEffect1.TopLeft+ TPointF.Create(5,0);
  18. Procedure TServerConnectionTH.RecieveData(); // сюда приходя данные со сканера //Data - это данные в виже TBytes //str - строка со считанным штрихкодом var Intent: JIntent; str:String; begin str:=TEncoding.UTF8.GetString(Data); Form1.DisplayR.Lines.Add(Str); Form1.DisplayR.GoToTextEnd; Intent := TJIntent.Create; Intent.setAction(StringToJString('com.google.android.c2dm.intent.RECEIVE')); Intent.putExtra(StringToJString('text'),StringToJString('1')); Intent.putExtra(StringToJString('title'),StringToJString('1C')); Intent.putExtra(StringToJString('data'),StringToJString(str)); TAndroidHelper.Context.sendBroadcast(Intent); end;
  19. основное решение: оставить основной поток для gui... все что тормозит основной поток должно из него уйти в доп потоки или таски - и там "зависайте" сколько угодно. асинхронное выполнение с калбеками...
  20. procedure TForm1.LoadImage(const AItem: TListViewItem; const AListItemImage : TListItemImage); Var AAsyncResult : IAsyncResult; begin if Not Assigned(AItem) or Not Assigned(AListItemImage) then exit; if AItem.Data['ImageState'].AsInteger <> ListViewItemImageEmpy then exit; if AItem.Data['ImageURL'].AsString.IsEmpty then exit; AItem.Data['ImageState']:=ListViewItemImageLoading; if not assigned(FHTTPClient) then exit; TMonitor.Enter(listview1); try AItem.TagObject:= FHTTPClient.BeginGet( procedure (const ASyncResult: IAsyncResult) Var AHTTPResponse : IHTTPResponse; begin if assigned(AItem.TagObject) then begin TMonitor.Enter(listview1); try AItem.TagObject:=nil; finally TMonitor.exit(listview1); end; end; if ASyncResult.IsCancelled then exit; AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult); if AHTTPResponse.StatusCode <> 200 then exit; TThread.Queue(nil, procedure begin if Not Assigned(AItem) or Not Assigned(AListItemImage) then exit; AListItemImage.BeginUpdate; AListItemImage.Bitmap:=TBitmap.Create; AListItemImage.Bitmap.LoadFromStream(AHTTPResponse.ContentStream); AListItemImage.EndUpdate; AItem.Data['ImageState']:=ListViewItemImageLoaded; end); end, AItem.Data['ImageURL'].AsString) as TBaseAsyncResult; finally TMonitor.Exit(listview1); end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var i:integer; IResult:IAsyncResult; begin TMonitor.Enter(listview1); try for i:=0 to listview1.Items.Count-1 do if assigned(listview1.Items[i].TagObject) then (listview1.Items[i].TagObject as TBaseAsyncResult).Cancel; finally TMonitor.Exit(listview1); end; TMonitor.Enter(listview1); try for i:=0 to listview1.Items.Count-1 do if assigned(listview1.Items[i].TagObject) then begin IResult:=TBaseAsyncResult(listview1.Items[i].TagObject) as IAsyncResult; TMonitor.Exit(listview1); try THTTPClient.EndAsyncHTTP(IResult); except end; TMonitor.Enter(listview1); end; finally TMonitor.Exit(listview1); end; end;
  21. Логика асинхронности принимает на вход анонимную процедуру для обработки результата, анонимная процедура захватывает переменные в зоне своего определения, а там хоть итем, хоть индекс, хоть блэкджек с простихоспаде чем попало...
  22. умрет потому что используется TThread.CreateAnonymousThread, 500 потоков это не шутка... переделать на TTask. TTask плодит ограниченное кол-во потоков. или вовсе отказаться от собственных потоков и отдать на откуп асинхронному запросу THTTPClient 1 экземпляр THTTPClient может одновременно обслуживать несколько асинхронных запросов (4-8) HTTPClient.BeginGet
×
×
  • Создать...