-
Постов
65 -
Зарегистрирован
-
Посещение
Активность репутации
-
-
Просто Проги отреагировална kami в argument out of range Listview(Баг ?)
точно не правильно.
1. Создавать TNetHTTPClient нужно в execute потока, а не использовать лежащий на форме.
2. Работать с визуальными объектами нельзя из execute, об этом 100500 раз предупреждали.
Посему, правильно с технической точки зрения (упустим пока архитектуру) будет:
1. в execute создать сетевой компонент и выполнить запрос.
2. Распарсить запрос
3. Передать результаты в основной поток и уже в нем работать с ListView.
Полезно для правильного написания вынести код потока в отдельный модуль. Который НИЧЕГО не должен знать о модуле формы. Поток должен иметь событие, через которое он передает результаты своей работы куда надо. Само собой - вызывать это событие нужно в основном потоке, используя средства синхронизации. Форма при создании потока назначает ему обработчик события и выполняет в нем необходимые действия.
-
Просто Проги отреагировална Andrey Efimov в argument out of range Listview(Баг ?)
Плюсанул kami. От себя добавлю (чтоб был ) пример с анонимным потоком
procedure TFormMain.LoadList; begin try // Что-то делаем... TThread.Synchronize(nil, procedure begin // Снихронизируемся с основным потоком, меняем состояние компонентов на форме и т.д. end); // Опять что-то делаем... finally // Выполняем обязательные операции end; end; procedure TFormMain.ButtonClick(Sender: TObject); begin // ListView1.Items.Clear; // Cоздаём анонимный поток TThread.CreateAnonymousThread(LoadList).Start; end;
Ещё в студии есть семплы по работе с потоками.
C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\RTL\HttpAsyncDownload C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\RTL\HttpDownload и ещё где-то там лежат... -
Просто Проги отреагировална Равиль Зарипов (ZuBy) в argument out of range Listview(Баг ?)
procedure ClearLV(const aLV: TListView); begin while aLV.Items.Count > 0 do aLV.Items.Delete(0); end; вызывать так
ClearLV(ListView1);
-
Просто Проги получил реакцию от Равиль Зарипов (ZuBy) в Как обратиться к Item в ListView
тебе нужно знать какой сейчас элемент выбран в listview тогда так можно попробовать.
label.Text:=ListView1.Selected.Index.ToString(); покажет какой элемент сейчас выбран в listView
-
Просто Проги получил реакцию от Alex7wrt в Как обратиться к Item в ListView
тебе нужно знать какой сейчас элемент выбран в listview тогда так можно попробовать.
label.Text:=ListView1.Selected.Index.ToString(); покажет какой элемент сейчас выбран в listView
-
Просто Проги отреагировална Brovin Yaroslav в [Windows] Глобальный хук на клавиши возможно ли FMX
Так, то что в VCL вы привыкли писать так:
procedure OnHotKey(var Msg: TWMHotKey); message WM_HOTKEY; Это заслуга Delphi TObject.Dispatch. Суть простая, вызвав Dispatch и передав внутрь сообщение TMessage с ID, TObject автоматически найдет среди ваших методов метод, у которого WM_HOTKEY будет равен ID сообщения. Таким образом можно передавать любые варианты сообщений. Главное, чтобы первые 4 байта - это были ID сообщения.
В VCL оконная процедура просто вызывает у формы Form.Dispatch и передает туда виндовое сообщение. Так все и работает.
В FMX другая идеология, она не редиректит сообщения из оконной процедуры в форму. Поэтому вам предложили сделать следующее:
Или повесить хук на оконную процедуру и обрабатывать свои сообщения там. Либо сделать редирект сообщения, как я указал на уровне платформы.
-
Просто Проги отреагировална dnekrasov в [Windows] Глобальный хук на клавиши возможно ли FMX
Легче всего, по моему мнению, сделать так:
... FWnd := AllocateHWnd(WindowProc); ... procedure WindowProc(var AMsg: TMessage); begin case AMsg.Msg of WM_HOTKEY: case TWMHotKey(AMsg).hotkey of 1: ...; 2: ...; ... end; end; end; ... RegisterHotkey(FWnd, ...); // как обычно в VCL ... UnregisterHotkey(...); // как обычно в VCL ...
-
Просто Проги отреагировална Равиль Зарипов (ZuBy) в [Windows] Глобальный хук на клавиши возможно ли FMX
Изменить нужно
WM_GETMINMAXINFO На
WM_HOTKEY
-
Просто Проги отреагировална Brovin Yaroslav в [Windows] Глобальный хук на клавиши возможно ли FMX
Вот, посмотрите мой ответ в другой теме: Обработка WM_GETMINMAXINFO
Там же есть вариант с хуком и подменой оконной процедуры.
-
Просто Проги получил реакцию от Pax Beach в Как listbox можно добавить стиль для items которые не выделены
Суть такова копаюсь в стилях, но не могу понять откуда идет наследования есть контейнер content в нем есть selection т,е выделенный элемент лист бокса , возможно ли создать стиль просто для итемов в листбоксе или это не делается через стиль?
-
Просто Проги отреагировална Pax Beach в Как правильно загружать аватары пользователей по типу как это делают мобильные приложения.
Да, нужно докачать Berlin, или отпилить DynamicAppearance.
-
Просто Проги отреагировална Равиль Зарипов (ZuBy) в Динамическая подгрузка картинок в ListView
Привет Всем!
Как принято в современных приложениях, догружать контент(обычно это картинки) при скролинге.
я взял картинки пользователей этого форума
Seattle LVdynamicLoadBitmap.zip
Berlin LVdynamicLoadBitmap(Berlin).zip
-
-
Просто Проги отреагировална Равиль Зарипов (ZuBy) в HTML парсер
парсер делаю сам через функцию, отлично работает во всех проектах.
всегда код страницы можно разделить на блоки, если этим не позаботились разработчики и блоки информации не инкременируются
также можно предложить использовать регулярки
-
Просто Проги получил реакцию от Rusland в Неполучается получить элемент из JSON
фигасе XSuperObject, это классно и кода меньше только не совсем понятно что в этой строке происходит
xItems := xResp.O['Response'].A['Items']; xItems это типа объект весь json xResp.о это респонсе потом идет сразу a итемс а как до count достучаться ? так что ли xItems := xResp.O['Response'].A['count']; и почему o и a вообще просто первый раз с такой штуко работаю) "response": { "count": 104, "items": [ -
Просто Проги отреагировална Равиль Зарипов (ZuBy) в Неполучается получить элемент из JSON
ай-яй-яй
var JS : TJSONObject; JSAr : TJSONArray; s : string; i:integer; begin s := Memo2.Text; JS := TJSONObject.ParseJSONValue(s) as TJSONObject; if Assigned(JS) then begin JS := TJSONObject.ParseJSONValue(JS.GetValue('response').ToString) as TJSONObject; JSAr := TJSONObject.ParseJSONValue(JS.GetValue('items').ToString) as TJSONArray; Form2.Memo1.Lines.Clear; for i := 0 to JSAr.Count - 1 do begin JS := TJSONObject.ParseJSONValue(JSAr.Items[i].ToString) as TJSONObject; // внутри цикла нужно Memo2.Lines.Add('id: ' + JS.GetValue('id').Value); Memo2.Lines.Add('first_name: ' + JS.GetValue('first_name').Value); Memo2.Lines.Add('last_name: ' + JS.GetValue('last_name').Value); Memo2.Lines.Add('photo_100: ' + JS.GetValue('photo_100').Value); end; JS.Free; end;
-
Просто Проги отреагировална Равиль Зарипов (ZuBy) в Неполучается получить элемент из JSON
используйте XSuperObject, код будет такой
procedure TForm4.Button1Click(Sender: TObject); // uses XSuperObject; var xResp, xObj: ISuperObject; xItems: ISuperArray; j: Integer; begin xResp := so(Memo1.Text); xItems := xResp.O['Response'].A['Items']; for j := 0 to xItems.Length - 1 do begin xObj := xItems.O[j]; with ListView1.Items.Add do begin Text := xObj.S['first_name'] + ' ' + xObj.S['last_name']; end; end; end;
-
Просто Проги получил реакцию от krapotkin в Неполучается получить элемент из JSON
фигасе XSuperObject, это классно и кода меньше только не совсем понятно что в этой строке происходит
xItems := xResp.O['Response'].A['Items']; xItems это типа объект весь json xResp.о это респонсе потом идет сразу a итемс а как до count достучаться ? так что ли xItems := xResp.O['Response'].A['count']; и почему o и a вообще просто первый раз с такой штуко работаю) "response": { "count": 104, "items": [ -
Просто Проги получил реакцию от Равиль Зарипов (ZuBy) в Неполучается получить элемент из JSON
всё понял)спасибо за помощь)