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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2009, 19:32   #1
hip3r
 
Регистрация: 12.10.2009
Сообщений: 8
По умолчанию Проблема переноса строк из одного списка (Listbox) в другой.

Всем привет. Есть задача.

Диалоговая панель содержит два списка(ID_LIST1 и ID_LIST2) и кнопку >>(ID_BUTTON).
После нажатия кнопки >> строки выбранные в списке(ID_LIST1) переслать в список(ID_LIST2).

Код:
//     код процедуры диалоговой панели
BOOL CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int i;
int nMax;       //      количество выделенных строк
int *Index;     //      массив индексов
 
char Str [20];
char Str1 [] = "String1";
char Str2 [] = "String2";
char Str3 [] = "String3";
 
switch(uMsg)
{ 
        case WM_INITDIALOG:     //      инициализация диалоговой панели
                SendDlgItemMessage(hDlg, ID_LIST1, LB_ADDSTRING, 0, (LPARAM)Str1);      // вставка строки в список(ID_LIST1)
                SendDlgItemMessage(hDlg, ID_LIST1, LB_ADDSTRING, 0, (LPARAM)Str2);
                SendDlgItemMessage(hDlg, ID_LIST1, LB_ADDSTRING, 0, (LPARAM)Str3);
                return TRUE;
        case WM_COMMAND:
                switch(LOWORD(wParam))
                { 
                case ID_BUTTON: //      обработчик кнопки ">>"
                        nMax = SendDlgItemMessage(hDlg, ID_LIST1, LB_GETSELCOUNT, 0, 0);        //      количество выделенных строк     
                        Index = new  int [nMax];    //      массив для индексов выделенных строк  
                        SendDlgItemMessage(hDlg, ID_LIST1, LB_GETSELITEMS, (WPARAM)nMax, (LPARAM)*Index);       //      заполнение массива
                        for (i = 0; i <= nMax; i++)
                        {
                                SendDlgItemMessage(hDlg, ID_LIST1, LB_GETTEXT, (WPARAM)Index[i], (LPARAM)Str);  //      копирование строки из списка(ID_LIST1) в буфер Str  
                                SendDlgItemMessage(hDlg, ID_LIST2, LB_ADDSTRING, 0, (LPARAM)Str);       //      вставка строки из буфера в список(ID_LIST2)
                        }
                        delete [] Index;
                break;
                case ID_CANSEL:
                case ID_OK:
                        EndDialog(hDlg, 0);
                return TRUE;
                }
        break;
        }
  return 0;
}
Код компилируется, но после нажатия кнопки ">>"(ID_BUTTON) выскакивает сообщение:



Подскажите в чём проблема.

Последний раз редактировалось Stilet; 13.10.2009 в 13:18.
hip3r вне форума Ответить с цитированием
Старый 12.10.2009, 19:37   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

буфера точно хватает на копирование?
ибо винда не знает длины буфера...вы должны сами её(длину) узнавать
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.10.2009, 21:25   #3
hip3r
 
Регистрация: 12.10.2009
Сообщений: 8
По умолчанию

Пепел Феникса, какой буфер char Str [20]?

Пробовал ставить Str [100]. Не помогло.
hip3r вне форума Ответить с цитированием
Старый 12.10.2009, 21:51   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

попробуйте пройтись или отладчиком.
или просто комментировать куски кода(например цикл копирование заккоментируйте)
и там уже виднее будет.

Код:
SendDlgItemMessage(hDlg, ID_LIST1, LB_GETTEXT, (WPARAM)Index[i], (LPARAM)Str)
может всетаки указатель надо?...попробуйте *Str
может тут компилятор приведение типа иначе воскпринял(хотя с чего это)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.10.2009, 11:59   #5
hip3r
 
Регистрация: 12.10.2009
Сообщений: 8
По умолчанию

Пепел Феникса, спасибо за помощь!!! Разобрался!!!

1. Цикл

Не for (i = 0; i <= nMax; i++), а for (i = 0; i < nMax; i++).

2.Но это не главное основная проблема в этой строке:

SendDlgItemMessage(hDlg, ID_LIST1, LB_GETSELITEMS, (WPARAM)nMax, (LPARAM)*Index); // заполнение массива

Нужно не *Index первое значение массива, а его адрес Index:

SendDlgItemMessage(hDlg, ID_LIST1, LB_GETSELITEMS, (WPARAM)nMax, (LPARAM)Index); // заполнение массива
hip3r вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переход из одного типа в другой Лонли-Локли Общие вопросы Delphi 8 27.08.2009 12:39
По поводу переноса БД с 1 компа на другой Droid БД в Delphi 17 19.06.2009 04:43
Перенос проги с одного ПК на другой Azef Помощь студентам 2 13.05.2008 18:07
Сортировка в StringGrid'е, копирование строк из одного SG в другой monushka Помощь студентам 3 29.10.2007 23:54
Перенос из одного Image в другой Dimitriys Компоненты Delphi 5 14.07.2007 23:32