Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: почему-то OpenDialog1 не открывается  (Прочитано 7301 раз)
0 Пользователей и 1 Гость смотрят эту тему.
locator
Постоялец

ru
Offline Offline

« : 16-06-2007 18:16 » 

Колбасит TOpenDialog:
Код:
if(OpenDialog1->Execute())
{
  fname = OpenDialog1->FileName;
}
При попытке нарисовать окно появляется ошибка ETapiNoMem, не хватает памяти!
И вся программа вылетает сразу. Это что за ошибка такая?
Спасибо за ответ!

Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 16-06-2007 22:17 » 

Думаю, что ты где-то с параметрами намудрил - читай внимательно доку и проверяй свои действия. Я лишь однажды этим пользовался и проблем не было - заработало сразу.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
locator
Постоялец

ru
Offline Offline

« Ответ #2 : 17-06-2007 16:04 » 

Нашел косяк... К вызову OpenDialog не имеющий отношения. В потоковой функции был объявлен локальный указатель (вроде как безобидная штука) Улыбаюсь
Код:
void __fastcall func()
{
long* x = new long[10];
...
delete x;
}
Убрал указатель:
Код:
void __fastcall func()
{
long x[10];
...

}
И все отлично заработало. Осталось загадкой, почему окно с диалогом не хотело запускаться.
Поток - штука тонкая Здесь была моя ладья...
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 17-06-2007 16:35 » 

locator,

потому что надо
Цитата
long* x = new long[10];
...
delete [] x;
, ибо массив Улыбаюсь Дело вовсе не в потоке.

Записан

locator
Постоялец

ru
Offline Offline

« Ответ #4 : 17-06-2007 19:10 » 

так это же один указатель, а не массив указателей
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 17-06-2007 19:42 » 

locator, если создаешь один элемент (class * var = new class;), то в освобождаешь через delete var;, а если создаешь массив (class * var = new class[size];), то освобождаешь через delete[] var;. Это стандарт языка.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
locator
Постоялец

ru
Offline Offline

« Ответ #6 : 18-06-2007 19:38 » 

Сделал, как стандарт языка предписывает: delete []x. Все работает, полет нормальный Улыбаюсь Запускаю OpenDialog и ... любюсь сообщением: "Error in BORLNDMM.DLL" и вылетаю в систему Я зол! Нет, видимо в потоке нельзя так лихо объявлять указатели.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 18-06-2007 19:43 » 

locator, в потоке можно все, если только данные не используются одновременно более чем одним потоком. В этом случае следует использовать механизмы синхронизации для исключения несинхронного изменения.

У меня подозрение, что сбой у тебя в runtime библиотеке - возможно как-то следует сказать при компиляции, что приложение многопоточное. Странно все это...
« Последнее редактирование: 18-06-2007 19:46 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 18-06-2007 19:44 » 

locator, да можно всё, скорее всего дело в каком нибудь буфере, размер которого ты не правильно задаёшь

код приведи, всю работу с диалогом
Записан

locator
Постоялец

ru
Offline Offline

« Ответ #9 : 18-06-2007 20:44 » 

для поиска косяка применял метод комментирования всего лишнего, так и добрался до этого указателя Улыбаюсь А для проверки запуска диалогa я специально весь код вырезал оттуда, чтоб чисто окно запустилось и все:
Код:
void __fastcall TForm::Button1Click(TObject *Sender)
{
 AnsiString fname;
 if(OpenDialog1->Execute())
 {
   fname = OpenDialog1->FileName;
 }
}
Кстати, с SaveDialog тот же косяк происходит, при работающем потоке (когда там указатель) окно нельзя открыть - программа падает. Где-то поток не поделил память с этим окном Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 18-06-2007 20:50 » 

locator, стоит начать с документации - я так думаю.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
kroum
Интересующийся

ua
Offline Offline

« Ответ #11 : 21-06-2007 09:51 » 

Сдается мне, в классе потока нужно объявить переменную типа TOpenDialog, перед вызовом создать экземпляр его через new, а после окончания работы с ним - очистить память посредством delete.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines