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

How to display / Select only one TListViewItem from "OnItemClick" event?


Legit Coder

Вопрос

У меня есть приложение с 2 TLabels, 1 TListView. Я хотел бы отобразить значение или (текст) содержимое TListViewItem внутри тегов TLabels образом, чтобы содержимое первой метки не могло быть одинаковым.

Мой код :

 

....
  ListView1: TListView;
  Base: TLabel;
  Hypo: TLabel;
....

procedure TMainForm.BaseClick(Sender: TObject);
begin
   ListView1.Visible := True;
end;

procedure TMainForm.HypoClick(Sender: TObject);
begin
   ListView1.Visible := True;
end;    

procedure TMainForm.ListView1ItemClick(const Sender: TObject;
   const AItem: TListViewItem);
begin
   if Assigned(ListView1.Selected) then
	begin
      Base.Text := TListViewItem(ListView1.Selected).Text;
    end else
      Hypo.Text := TListViewItem(ListView1.Selected).Text;
   
   ListView1.Visible := False;
end;

на изображении я хочу, чтобы XAG выделялся, когда я нажимаю на 1-ю TLabel, а другое значение также выбиралось как XAF, например, когда я нажимаю на 2-ю TLabel.

WfYA7.png

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

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

  • 0

а представьте, что нет никаких Label или ListView
а есть три переменных. в одной значение, в двух других - что-то там чтоб не повторялось

это можете написать?

Ссылка на комментарий
  • 0
Something like that ? что-то в этом роде?

procedure TForm3.ListView1ItemClick(const Sender: TObject;
  const AItem: TListViewItem);
var elvitem : TListViewItem;
    i,n : integer;
begin
  n:=0;
  for i:=0 to ListView1.ItemCount-1 do
  begin
     if ListView1.Items[i].Purpose=TListItemPurpose.None then // it's an item 
     begin
        if ListView1.Items[i].Checked then
        begin
          inc(n);
          case n of
            1 : base.text:=ListView1.Items[i].Text;
            2 : begin
                  hypo.text:=ListView1.Items[i].Text;
                  break; // don't search more
                end;
          end;
        end;
      end;
  end;
end;

 

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

нет.

никто понятия не имеет, что и как и правильно ли у вас отображается. может у вас ошибки в совсем других местах

"Я хотел бы отобразить значение или (текст) содержимое TListViewItem внутри тегов TLabels образом, чтобы содержимое первой метки не могло быть одинаковым." Одинаковым с чем??

перечитаем задачу. Даже если посмотреть на картинки и ваш код, ничего не понятно.

Кликнуть вы можете по одной строке ListView. Допустим, текст, который в этой строке, вы хотите разместить в Label1. А откуда берется текст в Label2 ???
Если текст1 = 'XYZ' то добавьте к нему A и в Label2 запишите 'XYZA'. Вполне совпадает с заданным вами условием.

Попробуйте еще раз, на общечеловеческом языке объяснить, чего вы хотели-то ?

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

хорошо, как я уже говорил в начале, У меня есть приложение с 2 TLabels, 1 TListView

1. Когда я нажимаю на 1-й TLabel, я выбираю text в TListView и сохраняю его во 2-м TLabel.

2. Когда я нажимаю на 2-й TLabel, я выбираю другой текст, отличный от 1-го, в же TListView, и он сохраняется во 2-м TLabel.

Sorry for my bad Russian. извините за мой плохой русский язык

Ссылка на комментарий
  • 0
В 19.07.2022 в 14:27, krapotkin сказал:

Кликнуть вы можете по одной строке ListView. Допустим, текст, который в этой строке, вы хотите разместить в Label1. А откуда берется текст в Label2 ???

в же TListView

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

я не знаю, откуда вы берете текст, который размещается в ListView но он же должен где-то храниться
вот оттуда его берём в методе UpdateLabels
 

TForm3 = class(TForm)
...
SelectedList : TList<integer>;
...
end;

........

procedure TForm3.FormCreate(Sender : TObject);
begin
  SelectedList := TList<integer>.Create;
end;

procedure TForm3.FormDestroy(Sender : TObject);
begin
  FreeAndNil(SelectedList);
end;

procedure TForm3.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem);
begin
  if SelectedList.Count = 2 then exit;
  case Selected Count of
    0 : begin
      SelectedList.Add(AItem.Index);
      UpdateLabels();
    end;
    1 : begin
      if SelectedList[0] <> AItem.Index then
        SelectedList.Add(AItem.Index);
      UpdateLabels();
    end;
  end;
end;

procedure TForm3.UpdateLabels();
begin
  if SelectedList.Count > 0 then
    label1.text := varIDontKnowWhereYourTextStored[ SelectedList[0] ]
  else 
    label1.text := '';

  if SelectedList.Count > 1 then
    label2.text := varIDontKnowWhereYourTextStored[ SelectedList[1] ]
  else 
    label2.text := ''; 
end;

 

Ссылка на комментарий
  • 0
5 часов назад, krapotkin сказал:

я не знаю, откуда вы берете текст, который размещается в ListView но он же должен где-то храниться
вот оттуда его берём в методе UpdateLabels

TListView заполняется из API, и я делаю livebindingshttps://api.apilayer.com/exchangerates_data/symbols

NB: я использую Delphi 11 и Firemonkey

 

 

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

Я не использую liveBindings в проектах, потому что не люблю, когда нет никакого контроля, только какая-то магия.

Но никто не мешает вам как и раньше брать текст из ListViewItem

Label1.text := ListView ListItems[SelectedList[1]].Text

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

После того, как выбор сделан, что мне делать, если я хочу измениться и выбрать другое значение? в пределах 2 TLabel?

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

Это называется UX - сценарий использования пользователем вашей программы.
Собственно, сначала придумывается из головы UX, а только потом пишется программа. Так что это к вам вопрос - что делать с уже введенными данными

С точки зрения программирования нужно всего лишь
 

SelectedList.Clear();
UpdateLabels();

 

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

ну так совсем другое дело )) сразу бы так

создаем поля формы FirstValue, SecondValue :  TSomeType; например запись Name:string, ID:integer;
FClickedButton : TObject; обеим кнопкам даем один и тот же обработчик

procedure TForm1.ButtonClick(Sender : TObject);
begin
  FClickedButton  := sender;
  ShowSelectionList();
end;

при клике на ListView

if FClickedButton = button1 then
begin
   FirstValue := значение из списка...
end
else
begin
   SecondValue := значение из списка...
end;
UpdateValueLabels();

 

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

я потратил некоторое время , но я думаю, что есть вещи, которые я не закодировал. я не совсем понимаю твое решение. не забывайте, что я все еще учусь. Будьте снисходительны.

В 23.08.2022 в 12:03, krapotkin сказал:
ShowSelectionList();

???

В 23.08.2022 в 12:03, krapotkin сказал:
UpdateValueLabels();

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

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

это методы, которые нужно написать

я старался, чтобы по названиям было понятно, что они должны делать

если смотреть на вашу картинку, то очевидно, что список показывается только тогда, когда мы нажали на кнопку, этим должен заняться метод ShowSelectionList()

после выбора, скорее всего, нужно будет убрать с экрана этот список, т.е. нужен еще один метод типа HideSelectionList().

если список все время на экране, то эти методы не нужны  

 

UpdateValueLabels() как следует из названия - отражает то, что у нас хранится в переменных FirstValue и SecondValue, в соответствующие места на экране, в первую и вторую метку

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

вот что я написал, это работает, но я думаю, что есть более профессиональный подход, не могли бы вы меня поправить?

procedure TForm1.ListView1ItemClick(const Sender: TObject;
  const AItem: TListViewItem);
begin

  if FClickedButton = Base then
  begin
     FirstValue := TListViewItem(ListView1.Selected).Index; // SelectedList.Add(AItem.Index);
  end
  else
  begin
    SecondValue := TListViewItem(ListView1.Selected).Index; // SelectedList.Add(AItem.Index);
  end;
  UpdateValueLabels();

end

Это UpdateValueLabels()

procedure TForm1.UpdateValueLabels();
begin
  if Assigned(ListView1.Selected) then
    Base.text := IntToStr(FirstValue)
  else
    Base.text := '';

  if Assigned(ListView1.Selected) then
    Hypo.text := IntToStr(SecondValue)
  else
    Hypo.text := '';
end;
Изменено пользователем Legit Coder
Ссылка на комментарий
  • 1

нет, неверно

в ListView1ItemClick вам передается параметр AItem - это и есть тот item по которому мы кликнули

if FClickedButton = Base then
begin
  FirstValue := AItem.Index; 
end
else
begin
 SecondValue := AItem.Index; 
end;
UpdateValueLabels();


если смотреть в UpdateValueLabels - какое отношение имеет ListView1.Selected к выводу переменных в кнопки ?

из вашего кода следует, что вы сделали FirstValue, SecondValue : integer;
логично предположить, что значение -1 будет показывать, что кнопка пуста

procedure TForm1.UpdateValueLabels();
begin
  if FirstValue = -1 then
    Base.text := ListView1.items[FirstValue].text
  else
    Base.text := '';

  if SecondtValue = -1 then
    Hypo.text := ListView1.items[SecondValue].text
  else
    Hypo.text := '';
end;
Ссылка на комментарий
  • 0

Спасибо за объяснение! Но я решил использовать ListView1.Selected, потому что мы должны указать вид выбора. Но, как вы и предположили, я заменил весь свой код, и теперь ничего не выбрано, ничего не появляется.

 🤨.это безумие, но я знаю, что если я буду упорствовать, я пойму свои недостатки и буду прогрессировать. 

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

Вид выбора вы указали в момент клика.
В момент рисования вас это не волнует абсолютно.

Чтобы получить помощь, приложите уже свой код. Пока что мы обсуждаем неизвестно что.

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

я замечаю логику во время создания "FormCreate"и создания, все происходит в голове, как ты сказал. 
Действительно, Спасибо!

Изменено пользователем Legit Coder
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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