Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с ListBox 
:(
    Опции темы
tvstar
Дата 9.1.2010, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.1.2010

Репутация: нет
Всего: нет



подскажите пожалуйста по следующей проблеме.

имеется ListBox2  который предварительно "заполняется" потоками процесса.
мне необходимо что бы по клику по каждому из потоков выводилась информация о нем в поля Edit6,7...
проблема в том что, эта информация выводится в эти поля только по первому клику ListBox'a, а при последующих кликах по другим потокам она не "обновляется".

как сделать так, чтобы эти поля обновлялись при каждом новом выборе потока в ListBox'e?
Код

void __fastcall TForm1::ListBox2Click(TObject *Sender)
{
int pid = *((int*)(idl->Items[ListBox1->ItemIndex]));
thSnap= CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,pid);
if (Thread32First(thSnap, &the32))
      do
      {
      if ( pid == the32.th32OwnerProcessID)

          {
          Edit6->Text = the32.tpBasePri;
          Edit7->Text = the32.th32OwnerProcessID;
          Edit8->Text = the32.th32ThreadID;
          }
      }
      while(Thread32Next(thSnap, &the32));
      CloseHandle(thSnap);
}


PM MAIL   Вверх
artsb
Дата 9.1.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(tvstar @  9.1.2010,  10:28 Найти цитируемый пост)
int pid = *((int*)(idl->Items[ListBox1->ItemIndex]));

Может вы хотели написать:
Код

int pid = *((int*)(idl->Items[ListBox2->ItemIndex]));

?

Добавлено через 56 секунд
Я про 2-ку smile

Это сообщение отредактировал(а) artsb - 9.1.2010, 11:34


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
tvstar
Дата 9.1.2010, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.1.2010

Репутация: нет
Всего: нет



Нет, там все верно, idl это указатель на список класса TList в котором хранится ID процессов, сам список процессов это и есть ListBox1. ID из этого списка через приведение типа присваивается pid, который используется для определения принадлежности потока к родительскому поцессу.
(у меня два списка выводится список процессов[ListBox1] и список потоков[ListBox2] )

Это сообщение отредактировал(а) tvstar - 9.1.2010, 11:49
PM MAIL   Вверх
artsb
Дата 9.1.2010, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



А вообще, у вас тут:
Код

int pid = *((int*)(idl->Items[ListBox1->ItemIndex]));

какая-то ерунда написана.

Может так:
Код

int pid = idl->Items[ListBox1->ItemIndex].ToInt();



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
tvstar
Дата 9.1.2010, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.1.2010

Репутация: нет
Всего: нет



Может быть и так только какую библиотеку нужно подключить, чтобы компилятор знал что такое ToInt()???

В любом случае мой вариант работает, и отношения (явного) к проблеме не имеет.
PM MAIL   Вверх
artsb
Дата 9.1.2010, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(tvstar @  9.1.2010,  12:20 Найти цитируемый пост)
Может быть и так только какую библиотеку нужно подключить, чтобы компилятор знал что такое ToInt()???

В любом случае мой вариант работает, и отношения (явного) к проблеме не имеет. 

Ох, сори. Я почему-то подумал про StringList.

По делу:
ИМХО у вас условие неправильное. Что-то типа:
Код

void __fastcall TForm1::ListBox2Click(TObject *Sender)
{
int tid = *((int*)(ThreadIds->Items[ListBox2->ItemIndex]));
int pid = *((int*)(idl->Items[ListBox1->ItemIndex]));
thSnap= CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,pid);
if (Thread32First(thSnap, &the32))
      do
      {
      if (pid == the32.th32OwnerProcessID && tid == the32.th32ThreadID)
          {
          Edit6->Text = the32.tpBasePri;
          Edit7->Text = the32.th32OwnerProcessID;
          Edit8->Text = the32.th32ThreadID;
          break; // нашли что искали и выходим из цикла
          }
      }
      while(Thread32Next(thSnap, &the32));
      CloseHandle(thSnap);
}


Это сообщение отредактировал(а) artsb - 9.1.2010, 12:36


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
tvstar
Дата 9.1.2010, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.1.2010

Репутация: нет
Всего: нет



Знаете, что-то он вообще ничего теперь не выводит...

Посмотрите, пожалуйста еще вот это.
Это обработчик кнопки, которая выводит в ListBox2 потоки выбранного процесса, тут же формируется TList для ThreadIds.
Может наметанным глазом что нибудь заметите
Код

void __fastcall TForm1::Button2Click(TObject *Sender
{
ThreadIds= new TList;
int pid = *((int*)(idl->Items[ListBox1->ItemIndex]));
the32.dwSize = sizeof(THREADENTRY32);
thSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,pid);
ListBox2->Items->Clear();
if (Thread32First(thSnap, &the32))
      do
      {
           if ( pid == the32.th32OwnerProcessID)
             {
             ListBox2->Items->Add("Theards");
             ThreadIds->Add(new int(the32.th32ThreadID));
              }
      }
      while(Thread32Next(thSnap, &the32));

      CloseHandle(thSnap);
}


Это сообщение отредактировал(а) tvstar - 9.1.2010, 13:30
PM MAIL   Вверх
artsb
Дата 9.1.2010, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(tvstar @  9.1.2010,  13:03 Найти цитируемый пост)
еще вот это.

тут вроде всё норм.
единственное, 
Код

ListBox2->Items->Add("Theard " + IntToStr(the32.th32ThreadID));

А вот тут:
Код

void __fastcall TForm1::ListBox2Click(TObject *Sender)
{
int tid = *((int*)(ThreadIds->Items[ListBox2->ItemIndex]));
int pid = *((int*)(idl->Items[ListBox1->ItemIndex]));
the32.dwSize = sizeof(THREADENTRY32); // не хватает
thSnap= CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,pid);
if (Thread32First(thSnap, &the32))
      do
      {
      if (pid == the32.th32OwnerProcessID && tid == the32.th32ThreadID)
          {
          Edit6->Text = the32.tpBasePri;
          Edit7->Text = the32.th32OwnerProcessID;
          Edit8->Text = the32.th32ThreadID;
          break; // нашли что искали и выходим из цикла
          }
      }
      while(Thread32Next(thSnap, &the32));
      CloseHandle(thSnap);
}


Добавлено через 5 минут и 2 секунды
tvstar, вы можете проект выложить?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
tvstar
Дата 9.1.2010, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.1.2010

Репутация: нет
Всего: нет



Вот проект



Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  InspTheards.7z 3,76 Kb
PM MAIL   Вверх
artsb
Дата 9.1.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



tvstar, я уже свой накатал smile конечно, там беспорядок.
Вы посмотрите. Если не поможет, буду смотреть ваш проект.


Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  process.rar 14,38 Kb


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
tvstar
Дата 9.1.2010, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.1.2010

Репутация: нет
Всего: нет



artsb,  спасибо!
Теперь мне нужно посидеть по разбираться в Вашей программе (: потому, что реализация немного отличается (не то что моя - тяпляп)))
PM MAIL   Вверх
artsb
Дата 9.1.2010, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(tvstar @  9.1.2010,  15:06 Найти цитируемый пост)
(не то что моя - тяпляп))) 

как-будто у меня лучше smile кусками из MSDN  smile 
там такой бардак...


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
tvstar
Дата 9.1.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.1.2010

Репутация: нет
Всего: нет



artsb, принципиальной разницы нет, конечно (: у Вас нет заморочек с TList, как у меня
зато есть:
Код

unsigned long pid = *(unsigned long*)(ListBox1->Items->Objects[ListBox1->ItemIndex]);
 unsigned long tid = *(unsigned long*)(ListBox2->Items->Objects[ListBox2->ItemIndex]);


Что такое "Objects" я немного не пойму (:

А еще не подскажите, как прикрутить таймер, чтоб список обновлялся?
PM MAIL   Вверх
artsb
Дата 9.1.2010, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(tvstar @  9.1.2010,  16:04 Найти цитируемый пост)
Что такое "Objects" я немного не пойму (:

Items имеет тип TStringList. У этого класса, с каждой строкой можно ассоциировать некий объект. Массив Objects хранит указатели на эти объекты.

Цитата(tvstar @  9.1.2010,  16:04 Найти цитируемый пост)
А еще не подскажите, как прикрутить таймер, чтоб список обновлялся? 

В моём случае, это будет:
Код

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
for(int i=0; i<ListBox1->Items->Count; i++)
 delete ((unsigned long*)ListBox1->Items->Objects[i]);
ListBox1->Clear();

if(!GetProcessList())
 Caption = "ERROR";
else if(ListBox1->Items->Count > 0){
 ListBox1->ItemIndex = 0;
 ListBox1Click(ListBox1);
}
}

Интервал у таймера я задал 5 сек.
Но тут не учитывается то, какая строка сейчас выбрана и получается так, что каждые 5 сек. выделение устанавливается на 1-ю строку.
По хорошему, нужно запоминать индексы выделенных строк и потом их "восстанавливать".

Это сообщение отредактировал(а) artsb - 9.1.2010, 19:06


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
tvstar
Дата 9.1.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.1.2010

Репутация: нет
Всего: нет



artsb,  спасибо Вам огромное! Выручили!
Буду дальше разбираться.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.