![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FindComponent [D6]
timekiller © (2008-01-16 11:50:00)Попытка найти ширину у вложенного ва фрейм компонента
Компилируется, а прога постоянно впаривает ошибку доступа к памяти .. че это? нахрена вот? зачем не работает?
for cmpn:=ComponentCount-1 downto 0 do
if (Components[cmpn].Tag=22222222) and
(Components[cmpn] is TFrame) then
currPos:=TControl(Components[cmpn].FindComponent('PA_'+TComboBox(Sender).Name)).Height;
timekiller (2008-01-16 15:02:00) [1]ну уговорил, объясни на своем языке
Kolan (2008-01-16 14:07:00) [2]> За синтакс спасибо для меня пока всё в этом мире сложно
Заметно, даже код с синтаксисом путаешь
timekiller (2008-01-16 12:29:00) [3]Все, вроде догоняю
FindComponent бежит, а параметр не тот прибегает вощм = )))))) надо еще и по контролам FindComponent'ить
терь я понял?
За синтакс спасибо, для меня пока всё в этом мире сложно :) а что делать
Palladin (2008-01-16 12:26:00) [4]ты просто реально не понимаешь что происходит...
при работе со строкой функция сама бежит по строке и если найдет - заменяет и абсолютно монопенисуально есть там необходимая подстрока или нет, при работе с объектом класса ты обращаешься к свойству, происходит обращение к какой-то, предполагаемо выделенной заранее, области памяти под объект, следовательно обращаясь к свойству ты должен быть уверен, что объект существует и подкрепляешь свою уверенность проверкой на nil
Сергей М. (2008-01-16 12:25:00) [5]
> timekiller © (16.01.08 12:20) [13]
А как можно умудриться передать параметром несуществующую строку ?
Palladin (2008-01-16 12:22:00) [6]это у тебя в голове не предусмотрена разница между работой со строками и обращением к свойству которого нет... надо эту разницу предусмотреть прочитав соответствующую литературу
Kolan (2008-01-16 12:20:00) [7]> прекрасно работает, слова nil там нету
Ну дык Free проверяет на нил
> наверное так?
Что непонятно?
FindComponent возвращает объект если найден или nil.
Ты же предполагаешь, что FindComponent всегда вернет объект тут твоя ошибка.
Результат работы FindComponent надо проверить.
то есть:
MyComponent := Components[cmpn].FindComponent('PA_'+TComboBox(Sender).Name);
if Assigned(MyComponent) then
currPos:= TControl(MyComponent).Height
Кроме того надо проверять что найденый объект действительноTControl, испльзуйis
timekiller (2008-01-16 12:20:00) [8]ОФТОП
Просто мне странно .. почему тогда например в StringReplace не проверяем на отсутствие строки и подстроки чтобы не было критического случая, (гы) а сразу ищем ее и заменяем? или В функции FindComponent чтото не предусмотрели товарищи создатели?
Palladin (2008-01-16 12:19:00) [9]ну песец синтаксис сложнейший
var
c:TControl;
if (Components[cmpn].Tag=22222222) and
(Components[cmpn] is TFrame) then
Begin
c:=Components[cmpn].FindComponent('PA_'+TComboBox(Sender).Name) as TControl;
If c=Nil then raise exception.create('а нету');
currPos:=c.Height;
end;
timekiller (2008-01-16 12:17:00) [10]Тогда подскажите синтаксис ..
Palladin (2008-01-16 12:16:00) [11]голова дум дум, метод Free проверяет перед вызовом деструктора self на nil
в отличии от тебя
timekiller (2008-01-16 12:15:00) [12]ну допустим
TControl(FindComponent('PA_'+TComboBox(Sender).Name)).Freeпрекрасно работает, слова nil там нету - видимо функция изобретена изначально правильно и создана для проверок на наличие компонента, а не чтобы проверяли чтото на nill вместо функции которая сама проверяет? наверное так?
Плохиш (2008-01-16 12:11:00) [13]
> найден он или нет - смотрит и решает возвращать имя/не возвращать
> FindComponent? и насчет найден не беспокоимся по закону
> borland'a прально ? :)
А теперь по-медленней и по-русски, что там у вас ещё за законы...
Palladin (2008-01-16 12:11:00) [14]
> смотрит и решает возвращать имя/не возвращать FindComponent?
> и насчет найден не беспокоимся по закону borland'a прально
> ? :)
при чем тут Borland? он за тебя результат на nil проверять будет чтоли?
Плохиш (2008-01-16 12:10:00) [15]
> currPos:=TControl(Components[cmpn]. FindComponent('PA_'+TComboBox(Sender).
> Name)).Height;
Ну нет искомого компонента, следующий вопрос...
timekiller (2008-01-16 12:09:00) [16]на этой
currPos:=TControl(Components[cmpn].FindComponent('PA_'+TComboBox(Sender).Name)).Height;
курент позишн равна ширине контрола по имени 'PA_'+TComboBox(работаем с ним).Name) который находится во пространстве Components[cmpn]
найден он или нет - смотрит и решает возвращать имя/не возвращать FindComponent? и насчет найден не беспокоимся по закону borland'a прально ? :)
Palladin (2008-01-16 12:05:00) [17]
> Components[cmpn].FindComponent('PA_'+TComboBox(Sender).Name)).
а ты уверен что он найден?
Kolan (2008-01-16 11:59:00) [18]Ну и на какой строке ошибка, ты отладчиком прошел?
timekiller (2008-01-16 11:55:00) [19]не не удаляю, вот привычка после удаления кшно осталась с этим downto )) копирую незамечая уже
Kolan (2008-01-16 11:54:00) [20]> for cmpn:=ComponentCount-1 downto 0 do
Зачем так?
Видимо что-то уделяешь Вот может там и грабли?