Maks150988
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Всем привет у меня снова вопрос про массивы. Перейду сразу к делу. Собственно есть код: Код: // Структура для хранения данных. TRouteItem = record bGateWay : Boolean; bChecked : Boolean; pszRouteName: WideString; dwNetWork : DWORD; dwNetMask : DWORD; end; // Глобальный массив этих структур. pRouteInfo: Array of TRouteItem; | Этот массив привязан к строчкам ListBox. При запуске приложения заполняю ListBox, допустим, пятью строками, в то же время заполняю таким количеством свой массив. Ну вроде самая легкая часть. Настает пора доабвления и удаления строк, а значит надо мутить и с массивом эти действия. Код удаления строки: Код: //idItem и iCount это Integer idItem := SendMessageW(GetDlgItem(hWnd, IDC_MAIN_LISTBOX), LB_GETCURSEL, 0, 0); if (idItem <> LB_ERR) then begin iCount := SendMessageW(GetDlgItem(hWnd, IDC_MAIN_LISTBOX), LB_DELETESTRING, idItem, 0); if (iCount <> LB_ERR) then begin if (idItem < iCount) then CopyMemory( @pRouteInfo[idItem], @pRouteInfo[idItem + 1], (iCount - idItem) * SizeOf(TRouteItem) ); SetLength(pRouteInfo, iCount); //Move(pRouteInfo[idItem+1],pRouteInfo[idItem],(iCount-idItem)*SizeOf(pRouteInfo[0])); end; end; | Вот вроде бы удалил строчку из контрола, удалил элемент из массива, сдвинул позиции там. Теперь редактирование элемента: Код: idItem := SendMessageW(GetDlgItem(hWnd, IDC_MAIN_LISTBOX), LB_GETCURSEL, 0, 0); if (idItem <> LB_ERR) then | Если удалять впервые после запуска программы последнюю строку и потом начать "редактирование", то все окей. Если где-то в другом месте - на последней редактируемой строке вылетает исключение. Пробовал не выводить егошний pszRouteName, вроде все путем, раз на раз не вылетает. Значит дело в освобождении строки? Как вобщем обыграть ситуацию? Ну и вобще помогите советами что где надо подправить, я чето не соображу. |