Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2013, 17:42   #1
Решетова Алена
Форумчанин
 
Регистрация: 13.12.2012
Сообщений: 116
По умолчанию ListView

Здравствуйте) Делаю чарт у медиаплеера. Сначала начала делать с ListBox, потом подумала, что лучше с ListView (чтобы сделать столбцы). С ListBox все работало. А с ListView не могу разобраться в одном моменте.
Код написан в Form1, по нажатию кнопки. А сам ListView на Form3. А список песен на Form2 в ListBox. На Form3 есть label, в который идет вывод индекса строки, в качестве проверки. Если -1, то в списке песни ещё не было, если песня уже была, выводится её индекс. Ну и соответственно, если песни не было, она добавляется, если была, заменяется сама на себя в той же строке (обновляется).
Столбцы такие:
название, средняя оценка, всего оценок
МОМЕНТ: В ListBox (рабочий код приведен) даже если список был пуст, песни добавлялись, за счет V:=-1; в начале кода. А в ListView выскакивает ошибка List index out of bounds (0) и выводит V = -1. Я знаю, что она означает, но понять не могу почему. Ведь смысл то такой же как и в ListBox, если даже в цикл не заходит, то в начале присвоено V = -1 и по сути если V = -1, то добавляем строку... Может я не понимаю принцип работы ListView.. Но я уже прошарила несколько сайтов.. И ничего дельного не нашла. Я даже писала условие, если k=0, то добавляем элемент. Ноль реакции. Помогите пожалуйста...

Представляю код LisBox для примера:

Код:
procedure TForm1.Button3Click(Sender: TObject);  // кнопка добавления песни с оценкой в чарт
var i,k,V: integer;
begin
k:=Form3.ListBox1.Items.Count;
V:=-1;
for i:=0 to k-1 do begin
 if (Form3.ListBox1.Items[i] <> Form2.ListBox1.Items[Form2.ListBox1.ItemIndex]) then V:=-1
 else begin V:=i; break; end;
end;
Form3.Label1.Caption:=IntToStr(V);
if V = -1 then Form3.ListBox1.Items[k]:=Form2.ListBox1.Items[Form2.ListBox1.ItemIndex]
else Form3.ListBox1.Items[V]:=Form2.ListBox1.Items[Form2.ListBox1.ItemIndex];
end;
А теперь ListView

Код:
procedure TForm1.Button3Click(Sender: TObject);  // кнопка добавления песни с оценкой в чарт
var i,k,V: integer;
begin
k:=Form3.ListView1.Items.Count;
V:=-1;
for i:=0 to k-1 do begin
 with Form3.ListView1.Items[i] do begin
  if Caption <> Form2.ListBox1.Items[Form2.ListBox1.ItemIndex] then V:=-1
  else begin V:=i; break; end;
 end;
end;
Form3.Label1.Caption:=IntToStr(V);
if V = -1 then begin
  with Form3.ListView1.Items.Add do begin
  Caption := Form2.ListBox1.Items[Form2.ListBox1.ItemIndex];
  SubItems[0] := '0';
  SubItems[1] := '0';
  end;
end 
else
begin
  with Form3.ListView1.Items[V] do begin
  Caption := Form2.ListBox1.Items[Form2.ListBox1.ItemIndex];
  SubItems[0] := '0';
  SubItems[1] := '0';
  end;
end;
end;

Последний раз редактировалось Решетова Алена; 30.05.2013 в 17:47.
Решетова Алена вне форума Ответить с цитированием
Старый 30.05.2013, 19:00   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Добавлять субитемы нужно методами из SubItems, а не просто сразу присваивать строки по несуществующим индексам. Например SubItems.Add. И у SubItems есть св-во Count
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.05.2013, 19:07   #3
Решетова Алена
Форумчанин
 
Регистрация: 13.12.2012
Сообщений: 116
По умолчанию

я вот только что сделала так:

Код:
procedure TForm1.Button3Click(Sender: TObject);  // кнопка добавления песни с оценкой в чарт
var i,k,V: integer;
begin
k:=Form3.ListView1.Items.Count;
V:=-1;
for i:=0 to k-1 do begin
 with Form3.ListView1.Items[i] do begin
  if Caption <> Form2.ListBox1.Items[Form2.ListBox1.ItemIndex] then V:=-1
  else begin V:=i; break; end;
 end;
end;
Form3.Label1.Caption:=IntToStr(V);
if V = -1 then begin
  with Form3.ListView1.Items.Add do begin
  Caption := Form2.ListBox1.Items[Form2.ListBox1.ItemIndex];
    while SubItems.Count<2 do
    SubItems.Add('');
  SubItems[0] := '0';
  SubItems[1] := '0';
  end;
end 
else
begin
  with Form3.ListView1.Items[V] do begin
  Caption := Form2.ListBox1.Items[Form2.ListBox1.ItemIndex];
    while SubItems.Count<2 do
    SubItems.Add('');
  SubItems[0] := '0';
  SubItems[1] := '0';
  end;
end;
end;
Ошибки теперь нет, но и не добавляет. Прост опишет в label -1
Что ещё нужно дописать?
Решетова Алена вне форума Ответить с цитированием
Старый 30.05.2013, 22:13   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не понял... А чего это листбокс и листвью должны совпадать?
Я бы делал так:
Код:

procedure TForm1.Button3Click(Sender: TObject);  // кнопка добавления песни с оценкой в чарт
var i,k,V: integer; lvi:TListItem;s:string;
begin
k:=Form3.ListView1.Items.Count;
lvi:=nil;
s:=Form2.ListBox1.Items[Form2.ListBox1.ItemIndex];
for i:=0 to k-1 do begin
  if Form3.ListView1.Items[i].Caption = s
   then begin lvi:=Form3.ListView1.Items[i];break;end;
end;

if lvi=nil then lvi:=Form3.ListView1.Items.Add;

 with lvi do begin
   Caption := s;
    while SubItems.Count<2 do    SubItems.Add('0');
  end;
end ;

end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.05.2013, 16:23   #5
Решетова Алена
Форумчанин
 
Регистрация: 13.12.2012
Сообщений: 116
По умолчанию

Ребята.. текста в ListView не видно.. А скролл появляется, будто они есть. Может я в свойствах чего не указала?
Решетова Алена вне форума Ответить с цитированием
Старый 31.05.2013, 16:28   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Свойство Columns, создать в нем колонки и заголовки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.05.2013, 16:34   #7
Решетова Алена
Форумчанин
 
Регистрация: 13.12.2012
Сообщений: 116
По умолчанию

Созданы.
Цитата:
Столбцы такие:
название, средняя оценка, всего оценок
............

Count растет. А строк не видно.

Последний раз редактировалось Stilet; 31.05.2013 в 18:27.
Решетова Алена вне форума Ответить с цитированием
Старый 31.05.2013, 17:15   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

ViewStyle сделан vsReport?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.05.2013, 18:26   #9
Решетова Алена
Форумчанин
 
Регистрация: 13.12.2012
Сообщений: 116
По умолчанию

Да
............................
Решетова Алена вне форума Ответить с цитированием
Старый 31.05.2013, 18:29   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ану прикрепи сюда свой проект в архиве.
Може так будет понятно что у тебя случилось.

P.S. нигде для ListView не прописан случайно BeginUpdate?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перетащить элемент ListView в другой ListView? Paul Hindenburg Компоненты Delphi 5 26.01.2013 11:35
MS VC++ listView Darth_Vader Visual C++ 1 12.04.2011 06:40
ListView &&blad&& Общие вопросы Delphi 7 26.03.2011 18:47
[C# + WPF] ListView. Узнать выделена ли строка в нём. ListView.View == GridView. Casper-SC WPF, UWP, WinRT, XAML 2 12.08.2010 19:04
ListView Witaliy Общие вопросы Delphi 1 01.05.2008 20:46