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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2015, 18:42   #1
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию TListView, AddObject и GetObject

Всем привет!

Есть список в ListView, к каждой строке нужно прицепить массив байт\чаров и соответственно при клике пользовать массив))

Добавляю так:
Код:
var
  ListItem: TListItem;
  d: PChar;
begin
  ListItem := ListView1.Items.Add;
    with ListItem do
      begin
        Caption := 'чототам';
        // тут ещё сабы
        SubItems.AddObject('чототут', d);
      end;
end;
Пытаюсь получить так:
Код:
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
var
  p: TObject;
begin
  p := Item.SubItems.Objects[Item.Index];
В итоге, получаю nil. Подскажите как правильно такое провернуть
ДралсяСошибками вне форума Ответить с цитированием
Старый 07.09.2015, 19:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
SubItems.AddObject('чототут', d);
А где d эта получает свои значения?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.09.2015, 20:18   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ну так можно
Код:
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
  for i:=1 to 10 do ListView1.AddItem('Строка '+IntToStr(i),TObject(StrNew(PChar('Уря-уря '+IntToStr(i)))));
end;

procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
begin
  if Assigned(Item) and Assigned(Item.Data) then Label1.Caption:=String(Item.Data);
end;

procedure TForm1.FormDestroy(Sender: TObject);
var i: Integer;
begin
  for i:=0 to ListView1.Items.Count-1 do StrDispose(ListView1.Items.Item[i].Data);
end;
Можно и свой класс со строкой и его туда пихать как в этом посте
http://www.programmersforum.ru/showthread.php?t=47112
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.09.2015, 19:18   #4
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Вопчем, пишу(тырю код) компонент сниффер. Данные от него приходят в событии(ип, порт, размер, данные и прочее), что-то типо такого:
Код:
procedure TForm1.sniff1exec(ip, proto:string d:pchar dsize:integer.......);
Полученное впихиваю в listview, а данные с тем что снифф поймал, хочу прицепить к строкам списка, чтобы потом при клике отобразить в мемо и подобных.

Набросал тестовый пример в отдельном проекте, так как в основном не желает робить:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  ListItem: TListItem;
  i: Integer;
  p: PChar;
begin
 { p := #7'12345'#8;
    for i := 0 to 9 do
      begin
        ListItem := ListView1.Items.Add;
          with ListItem do
            begin
              Caption := '1';
              SubItems.Add('2');
              SubItems.AddObject('3', Pointer(p));
            end;
      end;    }
  p := #7'12345'#8;
  ListItem := ListView1.Items.Add;
    with ListItem do
      begin
        Caption := '1';
        SubItems.Add('1');
        SubItems.AddObject('1', Pointer(p));
      end;
  p := #7'654321'#8;
  ListItem := ListView1.Items.Add;
    with ListItem do
      begin
        Caption := '2';
        SubItems.Add('2');
        SubItems.AddObject('2', Pointer(p));
      end;
  p := #7'888888'#8;
  ListItem := ListView1.Items.Add;
    with ListItem do
      begin
        Caption := '3';
        SubItems.Add('3');
        SubItems.AddObject('3', Pointer(p));
      end;
end;

procedure TForm1.ListView1Click(Sender: TObject);
var
  p: PChar;
begin
  if Assigned(TListView(Sender).Selected) then
    begin
      p := Pointer(TListView(Sender).Selected.SubItems.Objects[1]); // тут у меня был косяк, я индекс объекта ставил Item.Index
      ShowMessage(p);
    end;
end;
Пример работает, но в основном, почему-то такая фигня не прокатила(((
В итоге пришлось передавать через массив, примерно так;
Код:
c: Array of Byte;
...
SetLength(c, dsize);
CopyMemory(c, d, dsize);
SubItems.AddObject(IntToStr(dsize), Pointer(c));
SetLength(c, 0);
получать так:
Код:
p: Array of Byte;
...
p := Pointer(TListView(Sender).Selected.SubItems.Objects[4]);
от события ListView1SelectItem отказался, он почему-то срабатывает больше одного раза, пользую ListView1Click

Аватар
Когда лазил в юните listitem, видел поле data, только не совсем понял для чего оно, попробую Ваш вариант)))
класс создавать не хочу, хотя это был вариант на крайняк)))
ДралсяСошибками вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с GetObject Janger Общие вопросы Delphi 1 28.01.2015 11:59
Listbox.ittems.addobject как проиндексировать обьекты? N0foR Помощь студентам 0 22.04.2010 00:50
Не могу прописать путь GetObject Ант@н Microsoft Office Excel 10 18.11.2009 16:56
AddObject VladimirVB Общие вопросы Delphi 3 29.04.2009 17:38
Как прочитать данные, добавленные в Combobox методом AddObject SNUPY Общие вопросы Delphi 2 19.03.2009 20:58