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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2012, 17:49   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Список указателей(TList). Как 100%-о вернуть не nil, указатель.

Доброго времени суток!

Практикую написание классов на основе TList.
Как правильно вернуть ссылку на объект по его номеру?

Код:
type
  TSmth=class(Tlist)
  private
  function GetSomeItem(aIndx:Integer):TSmthItem;
  ....

function TSmth.GetSomeItem(aIndx:Integer):TSmthItem;
begin
Result:=TSmthItem(Items[aIndex]); //Иногда я тут натыкаюсь на nil. 
end;
Человек_Борща вне форума Ответить с цитированием
Старый 11.01.2012, 18:03   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, имхо, если передать aIndex больше (или равный), чем TSmth.Count - то и получите nil (это при условии, что вы в TList nil не добавляете )

p.s. а можно небольшой тестовый примерчик (исходники в архиве, разумеется), демонстриструющий проблему?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.01.2012, 18:14   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Я сам пытаюсь выловить. Но юзеры то в целевой программе ловят баг.
Пока спасся вызовом в try except, но проблемы это не решает.

А вообще к TList привязан список элементов TListView и обращение к эл-у списка идёт через текущий индекс эл-а в ListView, я думаю в этом и проблема. Вопрос: Как синхронизировать список и TListView?
Человек_Борща вне форума Ответить с цитированием
Старый 11.01.2012, 18:18   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Использовать ListItem.Data для хранения индекса в TList
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.01.2012, 18:49   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Аватар, вариант, однако Data уже занято. Альтернативы?

Последний раз редактировалось Человек_Борща; 11.01.2012 в 19:15.
Человек_Борща вне форума Ответить с цитированием
Старый 11.01.2012, 19:22   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Добавить неотображаемую колонку для того же

ADD

Только сейчас заметил, что не то написал. Естественно субитем, а не колонку
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 11.01.2012 в 21:46.
Аватар вне форума Ответить с цитированием
Старый 11.01.2012, 22:33   #7
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Еще такой вариант, может устроит, мне лично это помогает инфу нужную искать по метке допустим в массиве который сохраняется в TList и выводить ее в тот же ListView

Примерно так:
Код:

type
   TSmthItem = packed record
   ID      : DWORD; //Идентификатор либо метка номера строки
   Pole1  : string; //Нужные поля
   Pole2  : string;
end;

function TSmth.GetSomeItem(ID:Integer):TSmthItem;
var
i: integer;
begin
//Ищем метку в своем поле
for i:= 0 to FList.Count - 1 do
 if ID = TSmthItem(FList[i]).ID then
begin
 Result := TSmthItem(FList[i]);
exit;
end;
 Result := nil;
end;

// а дальше примерно так вывести результат без ошибки делаем проверку что нужная метка найдена
If Smth.GetSomeItem(10)<> nil then
//Выводим куда нужно
Можно конечно и по индексу как у вас, но все равно нужно делать проверку на nil.
Если не nil то выводим результат.

Последний раз редактировалось Aliens_wolfs; 11.01.2012 в 23:27.
Aliens_wolfs вне форума Ответить с цитированием
Старый 11.01.2012, 22:53   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Что-то я вопроса не понял.

Если у тебя Items некого X-а возвращает nil, то это значит, что кто-то в список добавил nil. Или не добавил, но изменил существующий элемент присвоением nil. Ну или рандомная порча памяти - это, конечно, всего вариант

Не понятны разговоры про индекс. Вхождение индекс в диапазон проверяет сам Items. Если подсунуть ему индекс несуществующего элемента - он возбудит ERangeError.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.01.2012, 22:54   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
ну, имхо, если передать aIndex больше (или равный), чем TSmth.Count - то и получите nil
Неверно:

Код:
function TList.Get(Index: Integer): Pointer;
begin
  if Cardinal(Index) >= Cardinal(FCount) then // <- явная проверка
    Error(@SListIndexError, Index);
  Result := FList[Index];
end;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.01.2012, 22:56   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
однако Data уже занято
Кем занято? Тобой или сторонним кодом?

Код:
Альтернативы?
Две.

Первое - введение своих полей методом Geo.
Второе - хранение в поле Data указателя на запись из произвольных нужных тебе данных.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатель на массив указателей на массив char'ов... SrgGld Общие вопросы C/C++ 0 19.11.2010 23:35
Передача списка указателей (TList) как параметр в dll sneksnek2006 Общие вопросы C/C++ 1 28.10.2010 11:33
Указатель на массив указателей, и т.д. Bernarditto Общие вопросы C/C++ 1 09.07.2010 12:26
Как вернуть избранное Умелец Свободное общение 1 29.05.2007 13:03