Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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

Зачем так?
Видимо что-то уделяешь… Вот может там и грабли?


Наверх

Титульная страница Поиск, карта сайта Написать письмо