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

TListView при нажатии на один из его элементов происходит повторный вызов процедуры


master webs

Вопрос

Добрый день ситуация такая

при создании формы заполняю listwiev у компонента  при клике на items установлена процедура 

procedure TForm1.categoryItemClick(const Sender: TObject;
  const AItem: TListViewItem);
begin
loadcat(inttostr(AItem.tag));
end;
 
дальше происходит следующе идет парсинг json удаление  списка и заполнение по новой грубо говоря  категории подкатегории
 
при создании формы все прекрасно работает при  открытии таба  также прекрасно перезаполняет листвиев но вот при клике  по итему   перезеполнение  идет  но происходит  двойной переход  открывает подкатегорию и сразу очищает список и открывает подкатегорию 3го уровня 
происходит так не всегда   понят  причину так и не смогу  допускаю что нужно помимо очистки списка удалть и фокус так как  он остается  на мести даже еслли итема нет
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Понятие фокуса на итеме не совсем уместно, т.к. итемы в ListView не являются контролами. У листвью есть Selected. А насчет ваших подкатегорий сложно гадать, т.к. не видно что вы делаете в "loadcat".

В любом вопросе вы должны указать что вы хотите, что получается и что вы делаете. Я правильно понимаю, что изначально у вас заполнен ListView, потом по клику на итем список одолжен чищаться и заполняться новыми элементами? А на деле у вас после этого еще раз срабатывает клик ивент и список соответственно еще раз заполняется? Если это бывает не всегда, то я бы для начала порекомендовал поставить счетчик на ивенте OnMouseDown, не нажимаете ли вы иногда действительно 2 раза. Если проблема в этом, то можно, например, на время обработки клика по элементу снять обработчик событий с итемклика, а по завершении вернуть его на место.

Изменено пользователем xenon54
Ссылка на комментарий
  • 0

Понятие фокуса на итеме не совсем уместно, т.к. итемы в ListView не являются контролами. У листвью есть Selected. А насчет ваших подкатегорий сложно гадать, т.к. не видно что вы делаете в "loadcat".

В любом вопросе вы должны указать что вы хотите, что получается и что вы делаете. Я правильно понимаю, что изначально у вас заполнен ListView, потом по клику на итем список одолжен чищаться и заполняться новыми элементами? А на деле у вас после этого еще раз срабатывает клик ивент и список соответственно еще раз заполняется? Если это бывает не всегда, то я бы для начала порекомендовал поставить счетчик на ивенте OnMouseDown, не нажимаете ли вы иногда действительно 2 раза. Если проблема в этом, то можно, например, на время обработки клика по элементу снять обработчик событий с итемклика, а по завершении вернуть его на место.

да все верно список  очищаю и заполняю по новому

вот процедура

 

procedure loadtovar(cat: string);

begin

Form1.TabControl3.ActiveTab:=Form1.TabItem9;

Form1.TabControl1.ActiveTab:=Form1.TabItem1;

Form1.MultiView1.HideMaster;

IdHTTP := TIdHTTP.Create(nil);

try

JSONs:= IdHTTP.Get ('http://sayt.ru/api/category.php?paren='+ cat);

finally

IdHTTP.Free;

end;

jsonObiekt := TJSONObject.ParseJSONValue(JSONs) as TJSONObject;

If jsonObiekt.GetValue('Erorr').Value = '1' then

begin

loadtovarcategory(cat);

Form1.TabItem10.Visible:=true;

Form1.TabControl3.ActiveTab:=Form1.TabItem10;

end;

If jsonObiekt.GetValue('Erorr').Value = '0' then

begin

Form1.category.Items.Clear;

try

streams := jsonObiekt.Get('Categories').JsonValue as TJSONArray;

liczbaStrumieni := streams.Size;

for i := 0 to liczbaStrumieni - 1 do

begin

stream := streams.Get(i) as TJSONObject;

channel := stream.Get('item').JsonValue as TJSONObject;

name := channel.Get('id').JsonValue as TJSONString;

quantity:= channel.Get('name').JsonValue as TJSONString;

suma:= channel.Get('image').JsonValue as TJSONString;

nm := name.Value;

LItem := Form1.category.Items.Add;

LItem.Text :=quantity.Value;

LItem.Tag :=strtoint(name.Value);

If suma.Value = 'none' then

begin

Bitmaps := Form1.GetImage('none');

 LItem.Bitmap.Assign(Bitmaps);

end;

If suma.Value <> 'none' then

begin

ms := LoadWebImage(suma.Value);

 LItem.Bitmap.LoadFromStream(ms);

ms.Free;

end;

end;

finally

end;

end;

end;

Ссылка на комментарий
  • 0

Порекомендовал бы вам использовать событие "ItemClickEx", в обычном "ItemClick" после очистки списка вылетает AV. после завершения события и перехода к 

  if AItem <> nil then
    AItem.SyncCheckedState;

А по поводу многократного срабатывания писал выше:

 

 

Если это бывает не всегда, то я бы для начала порекомендовал поставить счетчик на ивенте OnMouseDown, не нажимаете ли вы иногда действительно 2 раза. Если проблема в этом, то можно, например, на время обработки клика по элементу снять обработчик событий с итемклика, а по завершении вернуть его на место.
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...