Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
3 / 3 / 1
Регистрация: 08.04.2016
Сообщений: 79
1

Заполнение ListView из БД

11.04.2016, 13:47. Показов 5669. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написал вот такой код, но при запуске программы ListView не заполняется а программа выдает ошибку.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
with ibQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM DOCS');
    Open;
    First;
    ListVIew1.Items.BeginUpdate;
    try
      ListView1.Clear;
      while not Eof do
      begin
       with ListView do
       begin
        ViewStyle := vsReport;
    NewColumn := Columns.Add;
    NewColumn.Caption := 'Наименование';
    NewColumn := Columns.Add;
    NewColumn.Caption := 'Тип';
    NewColumn := Columns.Add;
    NewColumn.Caption := 'Дата создания';
      end;
  Item := ListView1.Items.Add;
  Item.Caption := ibquery1.FieldByName('NAMEDOC').AsString;
  Item.SubItems.Add(ibquery1.FieldByName('TYPEDOC').AsString);
  Item.SubItems.Add(ibquery1.FieldByName('DATADOC').AsString);
end;
    finally
      ListView1.Items.EndUpdate;
    end;
  end;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2016, 13:47
Ответы с готовыми решениями:

Заполнение listview
Подскажите, как добавить столбцы и заполнить строки, при нажатии кнопки?

Заполнение ListView
Создаю в xaml-разметке чистый ListView. Мне его надо заполнить программно. Причем количество...

Заполнение ListView
Подскажите, как заполнять ListView. Я пробую заполнить так: ListView->AddItem("Текст",...

Заполнение ListView из БД
Добрый день! Прошу помощи у тех кто владеет Delfi Нужно код на дельфи переписать на c++ builder...

29
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
11.04.2016, 21:58 21
Author24 — интернет-сервис помощи студентам
поставь стринггрид, заполни его
0
3 / 3 / 1
Регистрация: 08.04.2016
Сообщений: 79
11.04.2016, 23:38  [ТС] 22
Цитата Сообщение от qwertehok Посмотреть сообщение
поставь стринггрид, заполни его
Хорошо. DBGrid кстати заполняется без проблем, но попробую со стрингом поэксперементировать.

Добавлено через 29 минут
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
begin
 with IBQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM DOCS');
    Open;
      while not IBQuery1.Eof do
    begin
StringGrid1.Cells[1,1]:=IBQuery1.FieldByName('NAMEDOC').AsString;
StringGrid1.Cells[2,1]:=IBQuery1.FieldByName('TYPEDOC').AsString;
StringGrid1.Cells[3,1]:=IBQuery1.FieldByName('DATEDOC').AsString;
     ibQuery1.Next;
    end;
  end
Простенько, но для проверки сойдет вполне. Заполняет он стринггрид растудыть его туды. А лист не хочет(((

Добавлено через 5 минут
В твоем коде даже попробовал Fields на FieldByName поменять и всё осталось на прежнем уровне(((((

Добавлено через 41 секунду
Складывается такое впечатление что истина где то рядом.....
0
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,373
12.04.2016, 00:58 23
Лучший ответ Сообщение было отмечено klausteam как решение

Решение

ListView несколько необычно заполняется:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Var i: Integer;
begin
 for i := 0 to ADOQuery1.Fields.Count - 1
 do with ListView1.Columns.Add
    do Caption := ADOQuery1.Fields[i].FieldName;
 
 while not ADOQuery1.Eof
 do begin
    with ListView1.Items.Add
    do for i := 0 to ADOQuery1.Fields.Count - 1
       do if i = 0
          then Caption := ADOQuery1.Fields[i].AsString
          else SubItems.Add(ADOQuery1.Fields[i].AsString);
    ADOQuery1.Next;
    end;
end;
1
3 / 3 / 1
Регистрация: 08.04.2016
Сообщений: 79
12.04.2016, 01:47  [ТС] 24
Цитата Сообщение от Пытливый Посмотреть сообщение
ListView несколько необычно заполняется:
Сработало. Спасибо огромное заполнилось. Интересно, а шапку этой таблицы можно переименовать с англицкого на русский, или это проще в IBExperte сделать будет?
0
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,373
12.04.2016, 19:24 25
Можно конечно, первый цикл берет названия полей в качестве заголовков, вы можете индивидуально задать каждому столбцу свое название не используя цикл.
1
3 / 3 / 1
Регистрация: 08.04.2016
Сообщений: 79
13.04.2016, 20:31  [ТС] 26
Цитата Сообщение от Пытливый Посмотреть сообщение
Можно конечно, первый цикл берет названия полей в качестве заголовков, вы можете индивидуально задать каждому столбцу свое название не используя цикл.
Спасибо я обязательно воспользуюсь этим.

Добавлено через 4 минуты
Цитата Сообщение от Пытливый Посмотреть сообщение
Можно конечно, первый цикл берет названия полей в качестве заголовков, вы можете индивидуально задать каждому столбцу свое название не используя цикл.
Кстати, ещё вопрос, а как сделать так чтобы ширина полей подгонялись под значение в них, а то раздвигать каждый раз неудобно
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
13.04.2016, 21:45 27
при чтении очередной строки брать ее размер и проверять на max, в конце расширить до max
0
3 / 3 / 1
Регистрация: 08.04.2016
Сообщений: 79
13.04.2016, 22:04  [ТС] 28
Цитата Сообщение от qwertehok Посмотреть сообщение
при чтении очередной строки брать ее размер и проверять на max, в конце расширить до max
Надо только разобраться как это работает)))))
0
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,373
14.04.2016, 19:42 29
Ну вот вам вариант с автоподбором ширины колонок:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Var i: Integer;
begin
 for i := 0 to ADOQuery1.Fields.Count - 1
 do with ListView1.Columns.Add
    do Caption := ADOQuery1.Fields[i].FieldName;
 
 while not ADOQuery1.Eof
 do begin
    with ListView1.Items.Add
    do begin
       for i := 0 to ADOQuery1.Fields.Count - 1
       do begin
          if i = 0
          then Caption := ADOQuery1.Fields[i].AsString
          else SubItems.Add(ADOQuery1.Fields[i].AsString);
          if Canvas.TextWidth('@' + ADOQuery1.Fields[i].AsString + '@') > ListView1.Columns[i].Width
          then ListView1.Columns[i].Width := Canvas.TextWidth('@' + ADOQuery1.Fields[i].AsString + '@');
          end;
       end;
    ADOQuery1.Next;
    end;
end;
1
3 / 3 / 1
Регистрация: 08.04.2016
Сообщений: 79
15.04.2016, 01:00  [ТС] 30
Цитата Сообщение от Пытливый Посмотреть сообщение
Ну вот вам вариант с автоподбором ширины колонок:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[DELPHI] with IBQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM VLADEL');
    Open;
    ListView1.Columns.Add.Caption:= 'Фамилия';
    ListView1.Columns.Add.Caption:= 'Имя';
    ListView1.Columns.Add.Caption:= 'Отчество';
    ListView1.Columns.Add.Caption:= 'Адрес';
    ListView1.Columns.Add.Caption:= 'Телефон';
 while not IBQuery1.Eof
 do begin
    with ListView1.Items.Add
    do begin
      for i := 2 to IBQuery1.Fields.Count - 1
       do begin
         if i = 2
          then Caption := IBQuery1.Fields[i].AsString
          else SubItems.Add(IBQuery1.Fields[i].AsString);
          if Canvas.TextWidth('@' + IBQuery1.Fields[i].AsString + '@') > ListView1.Columns[i].Width
         then ListView1.Columns[i].Width := Canvas.TextWidth('@' + IBQuery1.Fields[i].AsString + '@');
          end;
       end;
    IBQuery1.Next;
     end;
    end;
[/DELPHI]
В моем случае это выглядит вот так, но оно не работает пишет что List index out of bounds(5)

Добавлено через 43 минуты
Я понял, раз я рисую колонки сам,то мне надо их вывести в отдельную переменную и тогда всё получится........наверное)))))

Добавлено через 22 минуты
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  with IBQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM VLADEL');
    Open;
    ListView1.Columns.Add.Caption:= 'Фамилия';
    ListView1.Columns.Add.Caption:= 'Имя';
    ListView1.Columns.Add.Caption:= 'Отчество';
    ListView1.Columns.Add.Caption:= 'Адрес';
    ListView1.Columns.Add.Caption:= 'Телефон';
 while not IBQuery1.Eof
 do begin
    with ListView1.Items.Add
    do begin
      for i := 2 to IBQuery1.Fields.Count - 1
       do begin
         if i = 2
          then Caption := IBQuery1.Fields[i].AsString
          else SubItems.Add(IBQuery1.Fields[i].AsString);
          for j := 0 to ListView1.Columns.Count-1 do
          if Canvas.TextWidth('@' + IBQuery1.Fields[i].AsString + '@') > ListView1.Columns[j].Width
         then ListView1.Columns[j].Width := Canvas.TextWidth('@' + IBQuery1.Fields[i].AsString + '@');
          end;
       end;
         IBQuery1.Next;
 
    end;
     end;
Вот так оно работает)))) Спасибо всем огромное я начинаю понимать то что я делаю, пусть и немного)))

Добавлено через 2 минуты
тему можно закрывать
0
15.04.2016, 01:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2016, 01:00
Помогаю со студенческими работами здесь

Заполнение ListView из БД
Есть одна активити, в ней 2 текстовых поля и кнопка, отправляющая содержимое этих полей как строку...

Заполнение listview
Доброго дня! Как заполнять такой listview?

Заполнение ListView
Привет всем столкнулся с такой проблемой: есть следующий ListView <ListView Height="313"...

Заполнение ListView с XML
Здравствуйте, мне нужна помощь, не могу понять как заполнить ListView с XML файла скаченного с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru