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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2023, 15:21   #1
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию Listbox и стиль LBS_MULTIPLESEL

Здравствуйте! Если я создаю список со стилем LBS_MULTIPLESEL и выделяю, скажем, строки, которые не идут подряд, далее я их переношу в другой список, соответственно, из данного списка их нужно удалить..., собственно проблема, если я получаю количество выделенных строк их индексы, всё вроде бы нормально, получаю первую строку, перекидываю её в другой список, но если я удалю строку из списка источника, то дальше я буду работать уже совсем с другими строками, как сделать так чтобы всё работало так как надо, пока что делаю так:
Код:
/*Допустим я хочу из левого списка перекинуть n-е количество строк в
  правый список.(выделенные строки не идут подряд) 
  Я получаю индексы выделенных строк в массив buf, если выделенные строки есть и сообщение не завершилось с ошибкой, тогда
  беру первую строку из левого списка и отправляю её в правой список,
  далее, удаляю перемещённую строку из левого списка.*/
	WORD buf[32767];
	int iNumberOfItem = SendMessage(hListLeft, LB_GETSELITEMS, 32767, (LPARAM)buf);
	if(iNumberOfItems != 0 && LB_ERR != iNumberOfItems)
	{
		TCHAR szBuf[128];
		//Запретим перерисовку списка
		SendMessage(hListLeft, WM_REDRAW, FALSE, 0L);
		for(int i = 0; i < iNumberOfItem; ++i)
		{
			//Получаю i-ую строку
			int Len = SendMessage(hListLeft, LB_GETTEXT, buf[i], (LPARAM)szBuf);
			szBuf[Len] = '\0';
			//Отправляю её в правый список
			SendMessage(hListRight, LB_ADDSTRING, 0, (LPARAM)szBuf);
			//Удаляю отправленную строку из левого списка
			SendMessage(hListLeft, LB_DELETESTRING, buf[i], 0L);	
		}
		//Разрешаю перерисовку
		SendMessage(hListLeft, WM_REDRAW, TRUE, 0L);
	}
Странно, сообщение lm_getselitem, которое позволяет получить количество выделенных строк есть, сообщения, которое получает n-ое количество строк в массив, удаляет n-ое количество строк из списка нет.
apofioz вне форума Ответить с цитированием
Старый 07.02.2023, 23:30   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Удаляйте сначала последний элемент в списке - тогда индексы остальных не изменятся.
waleri вне форума Ответить с цитированием
Старый 08.02.2023, 00:21   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Удаляйте сначала последний элемент в списке - тогда индексы остальных не изменятся.
Может лучше удалять выделенный элемент с максимальным индексом, а не последний.

Т.е. вы получили количество выделенных строк int maxi = SendMessage(hListBox, LB_GETSELCOUNT, 0, 0);
Потом получаете массив индексов после int count = SendMessage(hListBox, LB_GETSELITEMS, maxi, (LPARAM)item);
А дальше просто перебирайте массив for (int i = count - 1; i >= 0; --i) SendMessage(hListBox, LB_DELETESTRING, item[i], 0);

Тут и цикл удаления показан

Цитата:
Код:
                        for (i = cSelItemsInBuffer - 1; i >= 0; i--) // Перебор полученного списка от последнего элемента к первому
                        { 
                            SendMessage(hListBox, LB_GETTEXT, 
                                        aSelItems[i], 
                                        (LPARAM) pszFileToDelete); 
 
                            fResult = DeleteFile(pszFileToDelete); 
                            if (!fResult) 
                            {                     
                                MessageBox(hDlg, L"Could not delete file.", 
                                    NULL, MB_OK);     
                            } 
                            else 
                            { 
                                SendMessage(hListBox, LB_DELETESTRING, 
                                        aSelItems[i], 0);  // Удаление элемента с конца списка (список уже упорядочен по возрастанию)
                            } 
                        }
macomics вне форума Ответить с цитированием
Старый 08.02.2023, 07:17   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Может лучше удалять выделенный элемент с максимальным индексом, а не последний.
Так он и есть последний. Я про массив с индексами.
waleri вне форума Ответить с цитированием
Старый 08.02.2023, 10:41   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Так он и есть последний. Я про массив с индексами.
Это был сарказм.
macomics вне форума Ответить с цитированием
Старый 10.02.2023, 13:15   #6
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Да, я так и сделал, удалял начиная с последнего элемента массива.

А структура DLGTEMPLATEEX, это, как я понял, структура которую нужно определять самому т.е. она не определена ни в одном из библиотесных файлов и её нужно объявить в своём файле для того что бы с ней работать?
Например, так:
Код:
typedef struct {
  WORD      dlgVer;
  WORD      signature;
  DWORD     helpID;
  DWORD     exStyle;
  DWORD     style;
  WORD      cDlgItems;
  short     x;
  short     y;
  short     cx;
  short     cy;
  sz_Or_Ord menu;
  sz_Or_Ord windowClass;
  WCHAR     title[titleLen];
  WORD      pointsize;
  WORD      weight;
  BYTE      italic;
  BYTE      charset;
  WCHAR     typeface[stringLen];
} DLGTEMPLATEEX;
Как это сделано в msdn или как-нибудь так:
Код:
struct DLGTEMPLATEEX
{
	DLGTEMPLATE dt;
	TCHAR* menu;
	TCHAR* windowClass;
	WCHAR* title;
	
};
Или всё же я не прав?
apofioz вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Филтр в Listbox, удаление выбранной строки в Listbox в таблице Pavel1155 Microsoft Office Excel 1 12.02.2019 13:19
[РЕШЕНО]: ListBox: как добавить из TStringList текст через 1 строку, чтобы в listBox данные располагались на чётных/нечётных позициях? pas2 Помощь студентам 2 21.03.2017 20:54
Как изменить стиль стандартного FileListBox на AlphaControl ListBox Skidxs Помощь студентам 2 14.06.2013 15:23
используя процедуру keypress и фунцию listbox.при нажатии на listbox менялась ее высота Алекс38 Общие вопросы Delphi 1 19.09.2012 19:36
как добавить в listbox файлы(пишу с помощью bassplayer)(Listbox+opendialog=play) blackstersl Общие вопросы Delphi 11 09.06.2010 13:23