Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

Восстановить пароль
Повторная активизация e-mail



Ответ
 
Опции темы
Старый 16.06.2016, 00:44   #1
mailer007
 
Регистрация: 16.06.2016
Сообщений: 7
Репутация: 20
По умолчанию Не могу добавить список в TListView

Не могу добавить список в TListView.
Пробую делать это так:
Код:

procedure TForm1.Button4Click(Sender: TObject);
var ListItem : TListItem;
begin
   with TListView(Form1.FindComponent(Activ_List)) do
      begin
        SmallImages := kartinki;
        LargeImages := kartinki;
        ListItem:= Items.Add;           //Здесь происходит ошибка
        ListItem.Caption := '1';
        ListItem.ImageIndex := 1;
      end;
end;

На тех TListView которые были сразу на форме список добавляется, а на тех, которые созданы динамически - нет, выдает ошибку.
В чем может быть проблема, если этот код
Код:

        ListItem:= Items.Add;
        ListItem.Caption := '1';
        ListItem.ImageIndex := 1;

вставляю в место, где происходит динамическое создание TListView, то там всё добавляется нормально (даже в цикле).

Везде, где смотрел был только такой код. Что тут дополнительно создать надо или ещё что сделать не представляю. Я новичок, так что заранее прошу прощения, если это совсем просто.

Последний раз редактировалось mailer007; 16.06.2016 в 01:14.
mailer007 вне форума   Ответить с цитированием
Старый 16.06.2016, 10:01   #2
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 6,680
Репутация: 1770

icq: 100500
skype: kick-ass
По умолчанию

Код:

procedure TForm1.Button4Click(Sender: TObject);
var 
  cmp: TComponent;
  lv: TListView absolute cmp;
  ListItem : TListItem;
begin
  cmp:= Form1.FindComponent(Activ_List); // на входе - имя компонента! А у тебя Activ_List - это чо такое?
  if not Assigned(lv)
    then begin
           ShowMessage('Я дурак.'#13#10'Компонент не найден.');
           Exit;
         end;  
         
   with lv do
     begin
       SmallImages := kartinki;
       LargeImages := kartinki;
       ListItem:= Items.Add;           // Здесь ошибки больше не будет
       ListItem.Caption := '1';
       ListItem.ImageIndex := 1;
     end;
end;

__________________
Чтобы правильно заниматься всякой фигнёй на работе (и дома тоже),
нужно долго и кропотливо учиться!
min@y™ вне форума   Ответить с цитированием
Старый 16.06.2016, 13:03   #3
mailer007
 
Регистрация: 16.06.2016
Сообщений: 7
Репутация: 20
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Код:

  cmp:= Form1.FindComponent(Activ_List); // на входе - имя компонента! А у тебя Activ_List - это чо такое?

Activ_List - это последний активный TListView. Вот код, которым его запоминаю:
Код:

procedure TForm1.ListView1Click(Sender: TObject);
  begin
    if (ActiveControl.ClassType = TListView) then
      Activ_List:=ActiveControl.Name;
  end;

Твой код сообщение выдает, а если убрать, то ошибку.
С теми LV, которые сразу на форме были всё ж работает, чего динамическим не хватает?


Вот ещё код создания компонент
Код:

procedure TForm1.Button3Click(Sender: TObject);
var ListView: TListView;
    ListItem : TListItem;
  begin
    if nomer=0 then
      nomer:=1;
 
    ListView:= TListView.Create(ScrollBox1);
    with ListView do
      begin
        Parent := ScrollBox1;
        Left:=80;
        Top := 70*nomer-60;
        Height:=50;
        Width:= 650;
        Visible := true;
        Name := 'ListView_put_'+inttostr(nomer);
        ViewStyle:=vsList;
        SmallImages := kartinki;
        LargeImages := kartinki;
        OnClick:=ListView1Click;
      end;
    nomer:=nomer+1;
end;


Последний раз редактировалось mailer007; 16.06.2016 в 13:12.
mailer007 вне форума   Ответить с цитированием
Старый 16.06.2016, 13:09   #4
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 6,680
Репутация: 1770

icq: 100500
skype: kick-ass
По умолчанию

Цитата:
С теми LV, которые сразу на форме были всё ж работает, чего динамическим не хватает?
C ручника сними. Я ж тебе каммент в коде написал!
Ланда, вот так сделай, мож допрёт:
Код:

  if not Assigned(lv)
    then begin
           ShowMessage(Format('Я дурак.'#13#10'Компонент "%s" не найден.', [Activ_List]));
           Exit;
         end;

Динамическим имени не хватает.
Если создаёшь компоненты динамически - FindComponent() нахрен не нужен, т.к. указатель на созданный компонент тебе становится известен при создании! Его запоминай и юзай, ёмаё.
__________________
Чтобы правильно заниматься всякой фигнёй на работе (и дома тоже),
нужно долго и кропотливо учиться!
min@y™ вне форума   Ответить с цитированием
Старый 16.06.2016, 13:22   #5
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 21,030
Репутация: 4779
По умолчанию

Цитата:
т.к. указатель на созданный компонент тебе становится известен при создании! Его запоминай и юзай, ёмаё.
категорически за!

запоминай ссылку на тот TListView, по которому кликнули:
Код:

procedure TForm1.ListView1Click(Sender: TObject);
  begin
    if (Sender is TListView) then Activ_List:=Sender;
  end;

и всё!
никаких FindComponent тебе не нужен!
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 16.06.2016, 13:22   #6
mailer007
 
Регистрация: 16.06.2016
Сообщений: 7
Репутация: 20
По умолчанию

Нашел у себя ошибку. Тему можно закрывать.
И тот, и тот код работает. Просто динамические ListView создаются на ScrollBox1, а не на Form1. Там их и надо искать.
mailer007 вне форума   Ответить с цитированием
Старый 16.06.2016, 13:29   #7
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 6,680
Репутация: 1770

icq: 100500
skype: kick-ass
По умолчанию

Цитата:
Там их и надо искать.
Да не надо их искать! Ну нафига тебе дополнительный геморрой? Проблем, штоль, не хватает? Зачем лепить костыли-то, если можно СРАЗУ сделать хорошо и правильно? FindComponent() - это самая крайняя мера, когда ничего другого не остаётся.
__________________
Чтобы правильно заниматься всякой фигнёй на работе (и дома тоже),
нужно долго и кропотливо учиться!
min@y™ вне форума   Ответить с цитированием
Старый 16.06.2016, 13:47   #8
mailer007
 
Регистрация: 16.06.2016
Сообщений: 7
Репутация: 20
По умолчанию

Насчет запоминания - по незнанию делал так, но как вижу можно и проще.
Со всем уже разобрался, всё работает. Всем спасибо.
mailer007 вне форума   Ответить с цитированием
Старый 16.06.2016, 14:40   #9
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 6,680
Репутация: 1770

icq: 100500
skype: kick-ass
По умолчанию

Цитата:
по незнанию делал так
Не надо делать по незнанию, ну пожалуйста!
Просто запомни, что все объекты - это области памяти, а переменные, имеющие тип класса (в том числе TListView) - это указатель (Pointer). Для х86-компайлера - тупо DWORD (4 байта). С помощью преобразования типов можно сильно упростить себе жизнь и сократить время отладки.

З.Ы. А где возможно, вобще юзай absolute (см. мой пример) баз всяких там as/is.
__________________
Чтобы правильно заниматься всякой фигнёй на работе (и дома тоже),
нужно долго и кропотливо учиться!
min@y™ вне форума   Ответить с цитированием
Старый 10.01.2017, 17:34   #10
mailer007
 
Регистрация: 16.06.2016
Сообщений: 7
Репутация: 20
По умолчанию

Опять взялся за старое.
Возникли проблема: когда создаю ListView (создаются на панели, а панели создаются на ScrollBox) и задаю
Код:

Anchors := [akLeft, akTop, akRight, akBottom];

правый край этого ListView уходит непонятно куда. Самый первый ListView на скрине - это кинутый на форму (для образца), а остальные добавляю динамически. Динамическим присваиваю такие же свойства, как и существующему (Height, Width, Left, Top), но всё равно что-то не так с правым краем. Хотел, чтоб при изменении размеров формы относительное положение границ осталось таким же, но вот что творится. Если
Код:

Anchors := [akLeft, akTop, akRight, akBottom];

не присваивать (по умолчанию
Код:

Anchors := [akLeft, akTop];

), то отображается нормально как и самый первый, но в этом случае не меняются размеры ListView. Хотел реализовать без использования вычислений в Resize.
Изображения
Тип файла: jpg Screenshot_181.jpg (60.9 Кб, 0 просмотров)
Тип файла: jpg Screenshot_182.jpg (70.7 Кб, 0 просмотров)
Тип файла: jpg Screenshot_183.jpg (79.0 Кб, 0 просмотров)

Последний раз редактировалось mailer007; 10.01.2017 в 22:13.
mailer007 вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавить список всех файлов и папок в TreeView PaHaNjkee Общие вопросы Delphi 1 06.12.2015 02:06
не могу добавить \ fredwriter Visual C++ 1 18.12.2011 01:38
Как добавить Метод в класс Список с++ lirikoff Помощь студентам 5 26.08.2010 20:08
Добавить пустые строки в список KNatalia Microsoft Office Excel 5 30.09.2009 08:35
Как сортировать список TListView по определённому столбцу? Никки Общие вопросы Delphi 1 18.12.2007 20:18




03:37.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
таргетированный трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru