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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2016, 17:11   #1
Turbine
Пользователь
 
Регистрация: 13.08.2008
Сообщений: 76
Восклицание Invalid pointer operation при передаче компонента как параметра

Здравствуйте!

Передаю компоненту tmemo в качестве параметра
Код:


Код:
procedure tx.UseMemo(const m: tmemo);
begin
if m<>nil then mmm:=m;
end;
или в качестве указателя
Код:


Код:
procedure tx.UseMemobyPointer(mp:pointer);
begin
if mp<>nil then mpr:=mp;
end;
работа с мемо пробовалась двумя способами:

Код:


Код:
mmm.Lines.Add(s);
// или
tmemo(mpr).Lines.Add(s);
Компонент прекрасно с ним работает, строки добавляются, но...
Если вызвать деструктор компонента раньше завершения программы, то invalid pointer operation.

Если просто закрыть программу, то все гладко.
Turbine вне форума Ответить с цитированием
Старый 21.04.2016, 21:16   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Если вызвать деструктор компонента раньше завершения программы
Вызываешь деструктор компонента, созданного динамически или в дизайнере?
код покажи.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 21.04.2016, 21:51   #3
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от Turbine Посмотреть сообщение
Если вызвать деструктор компонента
А зачем его вызывать-то???
Или вы при закрытии программы вначале последовательно уничтожаете все компоненты???
kropotkina-alice вне форума Ответить с цитированием
Старый 21.04.2016, 22:04   #4
Turbine
Пользователь
 
Регистрация: 13.08.2008
Сообщений: 76
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Вызываешь деструктор компонента, созданного динамически или в дизайнере?
код покажи.
memo в дизайнере
компонент, который использует memo и создается и отпевается динамически.
Я тут немного дурака свалял в описании. Приношу извинения
Все происходит в двух вариантах:

1. Динамически создается компонент
2. Передается мемо любым из вышеописанных способов
3. Работа с компонентом
4. Вызов деструктора компонента (там кроме inherited нет ничего)
5. При закрытии программы - invalid pointer operator

При этом
Если только:
1. Динамически создается компонент
2. Передается мемо любым из вышеописанных способов
3. Работа с компонентом
4. Закрыть программу (деструктор компонента вызовется автоматически в FormDestroy)
то ошибки не возникает...

Сравнивал owner,parent, значение указателя у memo в начале и после destroy - ничего не меняется.
Пытался отбиться freenotification - не помогло
Пытался работать не с самим memo, а с lines через указатель - та же картина
Turbine вне форума Ответить с цитированием
Старый 21.04.2016, 22:05   #5
Turbine
Пользователь
 
Регистрация: 13.08.2008
Сообщений: 76
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
А зачем его вызывать-то???
Или вы при закрытии программы вначале последовательно уничтожаете все компоненты???
Компонент подразумевает динамическое создание и разрушение, соответственно тестируется всячески.
Т.е., динамичеки создается, заружается под завязку, потом уничтожается, чтобы выявить утечки и прочую пакость

Последний раз редактировалось Turbine; 21.04.2016 в 22:30.
Turbine вне форума Ответить с цитированием
Старый 21.04.2016, 23:41   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

я ж просил код показать!
неужто вызываешь destroy() напрямую?

показывай весь код, где компонент родится, живёт и помирает.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 22.04.2016, 15:01   #7
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Для затравки... Почему const?
Баламут вне форума Ответить с цитированием
Старый 23.04.2016, 00:03   #8
Turbine
Пользователь
 
Регистрация: 13.08.2008
Сообщений: 76
По умолчанию

Цитата:
Сообщение от Баламут Посмотреть сообщение
Для затравки... Почему const?
пробовал и как var
дело оказалось совсем в другом
Turbine вне форума Ответить с цитированием
Старый 23.04.2016, 00:06   #9
Turbine
Пользователь
 
Регистрация: 13.08.2008
Сообщений: 76
По умолчанию

Проблему удалось решить довольно дебильным образом.
Причем второй раз сталкиваюсь с этим.

Достаточно было просто поставить описание переменной типа tMemo в другое место секции public.
В прошлый раз пришлось "переставлять" массивы.
Чем руководствовался компилятор и в том и в другом случае неизвестно.
Turbine вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка Invalid Pointer Operation при работе switch David Villa Общие вопросы C/C++ 5 02.06.2012 16:24
Invalid Pointer operation hon Общие вопросы Delphi 6 22.11.2011 21:59
При удалении потока Invalid Pointer Operation RIO Общие вопросы C/C++ 7 20.06.2010 21:49
Invalid pointer operation. KoBRaAndrey Общие вопросы Delphi 6 02.06.2010 17:32
Invalid pointer operation Димарик Общие вопросы Delphi 2 05.11.2007 09:53