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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2016, 17:55   #1
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию Работа с ListView

Доброго дня!

Имеется код, и по нему 2 вопроса:

Код:
procedure TForm.ListView1DblClick(Sender: TObject);
begin
  EX.Clear;
  Item := ListView1.Selected;
  ExtractStrings(['|'], [], PChar(StringList[Item.Index]), EX);
  if not (EX[4] = 'No') then
    if Pos('http://', EX[4]) or Pos('https://', EX[4]) <> 0 then
      ShellExecute(Handle, 'open', '"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"', PWideChar('--user-data-dir="Z:\Soft\Google\Chrome\User Data" -incognito -url "' + EX[4] + '"'), nil, SW_SHOWNORMAL)
    else
      ShellExecute(Handle, 'open', PWideChar('' + EX[4] + ''), nil, nil, SW_SHOWNORMAL)
  else
    ShowMessage('Ссылка / Путь не задан.');
end;
1) Если кликнуть по пустому месту в списке, то выскачит ошибка, как сделать проверку ,чтобы если не по ячейке кликаешь, то нечего не происходило. И еще если выделить 2 и более ячейки и кликнуть по одной из них то тоже выдаст ошибку, как можно сделать проверку на то чтобы кликать можно было только по 1 ячейке иначе тоже чтобы нечего не происходило.

2) Таких ListView у меня много, можно чтобы не писать один и тот же код во всех, написать как-то функцию в которую можно было-бы просто передать по какому ListView кликают и на какую ячейку и все остальное сделать уже в функции?
nibufep вне форума Ответить с цитированием
Старый 20.02.2016, 18:29   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Относительно второго вопроса.
1. На форме выделяете все ListView, для которых вы пишете обработчик.
2. В инспекторе объектов в разделе EVENTSвыбираете ваше событие (onDblClick)
3. Для него пишете обработчик (обработчик будет один, но он будет работать на все выбранные компоненты)
4. в начале обработчика пишете:
Код:
var currentListView: TListView;
Сразу после begin пишете так
Код:
currentListView:=TListView(sender);
5. Далее к ListView обращаетесь через переменную currentListView

______

Теперь. не совсем по вашему вопросу, но по вашему коду
Код:
if not (EX[4] = 'No') then
Неграмотная запись. Так записывать будет грамотнее:
Код:
if EX[4] <> 'No' then
__________

Код:
if Pos('http://', EX[4]) or Pos('https://', EX[4]) <> 0 then
Этот код у вас компилируется? Просто, насколько я знаю, функция Pos возвращает целочисленное значение и оно не может быть операндом логического выражения.

Последний раз редактировалось Вадим Мошев; 20.02.2016 в 18:57.
Вадим Мошев вне форума Ответить с цитированием
Старый 20.02.2016, 20:17   #3
vlad1389
Форумчанин
 
Регистрация: 02.02.2016
Сообщений: 290
По умолчанию

Цитата:
Если кликнуть по пустому месту в списке, то выскачит ошибка
Код:
if ListView1.ItemIndex = -1 then Exit;
или
Код:
if ListView1.Selected = nil then Exit;
В начале кода должно помочь
Цитата:
Таких ListView у меня много
Используйте Sender
Код:
if TListView(Sender).ItemIndex = -1 then Exit;
и т.д. по аналогии. В обьект-инспекторе назначьте обработчик для всех ListView эту процедуру.

Последний раз редактировалось vlad1389; 20.02.2016 в 20:22.
vlad1389 вне форума Ответить с цитированием
Старый 20.02.2016, 20:21   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Не забыть ListView1 поменять на currentListView

Последний раз редактировалось Вадим Мошев; 20.02.2016 в 20:30.
Вадим Мошев вне форума Ответить с цитированием
Старый 20.02.2016, 20:34   #5
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
Относительно второго вопроса.
1. На форме выделяете все ListView, для которых вы пишете обработчик.
А как это сделать? В Object inspector пытаюсь выделить зажимая Alt нечего не выходит...
nibufep вне форума Ответить с цитированием
Старый 20.02.2016, 20:42   #6
vlad1389
Форумчанин
 
Регистрация: 02.02.2016
Сообщений: 290
По умолчанию

Там это делается просто мышкой без комбинаций клавиш. Справа от обработчика в выпадающем списке выбираете нужную процедуру. И так для каждого ListView.
vlad1389 вне форума Ответить с цитированием
Старый 20.02.2016, 20:43   #7
cotseec
Пользователь
 
Регистрация: 02.05.2012
Сообщений: 45
По умолчанию

Цитата:
...
4. в начале обработчика пишете:
Код:
var currentListView: TListView;
Сразу после begin пишете так
Код:
currentListView:=TListView(sender);
5. Далее к ListView обращаетесь через переменную currentListView
...
имхо, гораздо проще написать сразу
Код:
var currentListView: TListView absolute Sender;
и пункт 4 не нужен - можно сразу пользоваться currentListView без приведения, на свой страх и риск (м.б. этот обработчик подключен не только для TListView)
Skype: cotseec
ICQ: 330-171-495
cotseec вне форума Ответить с цитированием
Старый 20.02.2016, 20:47   #8
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

Спасибо за замечание. Не знал о такой конструкции. Смысл ясен.

всем большое спасибо за помощь!

Последний раз редактировалось Вадим Мошев; 20.02.2016 в 21:58.
nibufep вне форума Ответить с цитированием
Старый 21.02.2016, 00:15   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от nibufep Посмотреть сообщение
А как это сделать? В Object inspector пытаюсь выделить зажимая Alt нечего не выходит...
Как обычно в винде выделять несколько элементов знаешь? В проводнике например. Щелчком выделяешь один, затем зажимаешь Shift и щелкаешь по всем остальным. (При выделении более чем одного компонента на форме соответствующие квадратики выделения меняют свой цвет на темно-серый).
Теперь в Инспекторе объектов можешь всем выделенным назначить одно и то же значение.
northener вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с ListView Maxibaxi Компоненты Delphi 4 29.11.2015 17:23
работа с listview lexon17 Компоненты Delphi 0 21.04.2015 12:52
Работа с ListView kholoshchak Общие вопросы Delphi 1 20.12.2013 17:08
Работа с ListView мимо Общие вопросы Delphi 7 12.02.2011 17:05
работа с listview D_E_N Общие вопросы Delphi 16 06.01.2010 12:38