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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2016, 23:44   #1
mailer007
 
Регистрация: 15.06.2016
Сообщений: 7
По умолчанию Не могу добавить список в 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 в 00:14.
mailer007 вне форума Ответить с цитированием
Старый 16.06.2016, 09:01   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Код:
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, 12:03   #3
mailer007
 
Регистрация: 15.06.2016
Сообщений: 7
По умолчанию

Цитата:
Сообщение от 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 в 12:12.
mailer007 вне форума Ответить с цитированием
Старый 16.06.2016, 12:09   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
С теми LV, которые сразу на форме были всё ж работает, чего динамическим не хватает?
C ручника сними. Я ж тебе каммент в коде написал!
Ланда, вот так сделай, мож допрёт:
Код:
  if not Assigned(lv)
    then begin
           ShowMessage(Format('Я дурак.'#13#10'Компонент "%s" не найден.', [Activ_List]));
           Exit;
         end;
Динамическим имени не хватает.
Если создаёшь компоненты динамически - FindComponent() нахрен не нужен, т.к. указатель на созданный компонент тебе становится известен при создании! Его запоминай и юзай, ёмаё.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 16.06.2016, 12:22   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

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

запоминай ссылку на тот TListView, по которому кликнули:
Код:
procedure TForm1.ListView1Click(Sender: TObject);
  begin
    if (Sender is TListView) then Activ_List:=Sender;
  end;
и всё!
никаких FindComponent тебе не нужен!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.06.2016, 12:22   #6
mailer007
 
Регистрация: 15.06.2016
Сообщений: 7
По умолчанию

Нашел у себя ошибку. Тему можно закрывать.
И тот, и тот код работает. Просто динамические ListView создаются на ScrollBox1, а не на Form1. Там их и надо искать.
mailer007 вне форума Ответить с цитированием
Старый 16.06.2016, 12:29   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

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

Насчет запоминания - по незнанию делал так, но как вижу можно и проще.
Со всем уже разобрался, всё работает. Всем спасибо.
mailer007 вне форума Ответить с цитированием
Старый 16.06.2016, 13:40   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

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

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

Опять взялся за старое.
Возникли проблема: когда создаю 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 Кб, 114 просмотров)
Тип файла: jpg Screenshot_182.jpg (70.7 Кб, 117 просмотров)
Тип файла: jpg Screenshot_183.jpg (79.0 Кб, 114 просмотров)

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавить список всех файлов и папок в TreeView PaHaNjkee Общие вопросы Delphi 1 06.12.2015 01: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 19:18