Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое создание/удаление формы, ибо возникли проблемы 
V
    Опции темы
FactoREAL
Дата 10.1.2009, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 10.1.2009

Репутация: нет
Всего: нет



сложно будет объяснить, но постараюсь что бы вы поняли суть моей проблемы. хотя я сам если честно так и не понял в чём именно проблема =)
Необходимо на лету создавать  форму(Form 3) из другой формы (Form2) при нажатии на кнопку. На этой форме(на создаваемой) находится много компонентов ShockWaveFlash. так же в программе объявлена глобальная переменная adres:=extractFilePath(application.ExeName); она используется компонентами ShockWaveFlash для загрузки в них флеш файлов из папки. Но после убивания Form3 с помощью Free, возникает ошибка, мол неверное обращение к памяти...AcessViolationControl бла бла бла(ошибка возникает не обязательно при следующем создании формы, может возникнуть и на 3 и на 5 запуск формы3.. вообще как то хаотично) вот примерно так это всё реализованно:

Код

type
  TForm3 = class(TForm)
    ShockwaveFlash1 TShockwaveFlash;
    ...
    ShockwaveFlash191 TShockwaveFlash;
    procedure ResetComponents;
    ...  
  end;


procedure TForm3.ResetComponents;   //  сбрасывает все компоненты на умолчание
begin
adres:=extractFilePath(application.ExeName);
ShockwaveFlash1.LoadMovie(0,adres+'путь к файлу');
...
ShockwaveFlash191.LoadMovie(0,adres+'путь к файлу');
end;


procedure TForm3.FormCreate(Sender: TObject);
begin
ResetComponents;
adres:=extractFilePath(application.ExeName);
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ResetComponents;
form2.Show;
form3.free;
end;


Код

procedure TForm2.Button1Click(Sender: TObject);
begin
Form3 := TForm3.Create(Nil);
form3.show;
form2.Hide;
end;


извините, просто там очень много кода, написал коротенько и вроде что б понятно было. трабла как то связана с переменной adres. её приходится тыкать в совершенно ненужных местах, ошибки чудесным образом перестают выскакивать там, но всплывают в других местах о_О И ещё удаётся выйти из ситуации, в процессе выполнения программы в Delphi ошибок нет, но при использовании скопиленого ехе'шника ошибки почему то есть (( вообще ничего не пойму. Помогите плиз, вторые сутки мозг ломаю.




PM MAIL   Вверх
Bose
Дата 11.1.2009, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 8
Всего: 51



А зачем в TForm3.FormClose вызывается ResetComponents ?
PM MAIL WWW Skype   Вверх
FactoREAL
Дата 11.1.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 10.1.2009

Репутация: нет
Всего: нет



Цитата(Bose @ 11.1.2009,  01:06)
А зачем в TForm3.FormClose вызывается ResetComponents ?

да вот сам не понимаю.. это я уже буквально методом тыка подставлял и adres и ResetComponents. просто в некоторых случаях когда перед закрытием выполняется эта процедура ошибок меньше. та же самая басня и с adres. их там вообще во многих местах не надо писать, но если не написать, ошибка эта. например при выполнении ResetComponents в теле самой процедуры уже выполняется поиск адреса(adres), но в некоторых случаях, что бы не было ошибки приходится ещё перед выполнением процедуры узнавать этот адрес. хотя он уже программе известен, и так же перед закрытием приходилось писать этот адрес, хотя и там он не нужен по идее. он вообще должен при создании формы единожды определяться. не понимаю вообще... О_о Я почти уверен что касяк мой какой то очень банальный и глупый, но не могу я найти в чём касяк (
PM MAIL   Вверх
Frees
Дата 11.1.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



Цитата(FactoREAL @  11.1.2009,  01:23 Найти цитируемый пост)
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);beginResetComponents;form2.Show;form3.free;end;


ты в методе класса убеваеш свой же экземпляр!!
нельзя так

у тебя MDI
если да то 
Код

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;


если не MDI
то
Код

procedure TForm2.Button1Click(Sender: TObject);
begin
 if Form3 = nil then
  Form3 := TForm3.Create(Nil);
form3.show;
form2.Hide;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form3.Free;
end;





--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
FactoREAL
Дата 11.1.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 10.1.2009

Репутация: нет
Всего: нет



Frees , приложение не MDI но вот "убивать" Форму3 желательно именно при закрытии этой формы, а не при закрытии Формы2 потому что Form2 остаётся открытой постоянно, только скрывается при создании Form3. Form3 убивается с целью освобождения памяти, т.к. она жрёт её очень много, и таких форм 2 штуки. Вот и хотелось бы освобождать одну их них перед открытием второй. А Form2 служит для открытия одной из этих форм.
PM MAIL   Вверх
Frees
Дата 11.1.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  form3 := TForm3.Create(self);
  form2.Hide;  
  form3.ShowModal;
  form3.free;
end;

не подойдет?


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Frees
Дата 11.1.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



хотя 
Код

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;


так форма тоже освободится по закрытию,  вроде smile


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
NosfBlazE
Дата 11.1.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


炎丸 =Ferro ignique!=
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 16.11.2008
Где: Russia

Репутация: нет
Всего: нет



Кстати, может кто-нибудь подскажет, можно как-нибудь вернуть начальные значения/параметры формы, которые были при первом ее создании, без того, чтобы заводить переменные, которые хранят эти начальные значения/параметры?

Простой пример:
- Есть 2 формы F1 и F2. У F2 через Инспектор объектов установлен начальный ее цвет, к примеру, Синий. На F1 есть Button, при нажатии на который вызывается форма F2. На форме F2 есть ColorBox, который меняет ее цвет. 
- Итак, мы на F1 жмем Button и вызываем F2. Появляется F2 Синего цвета. Меняем цвет F2, например, на Красный. Далее закрываем форму F2. После этого снова вызываем F2 нажатием на форме F1 на Button. Появляется F2, но теперь ее цвет Красный. 

Так вот, необходимо, чтобы при повторном вызове формы F2 ее цвет был Синий, а не Красный. Я понимаю, что можно завести переменную, которая хранит начальное значение, а при закрытии F2 просто с помощью этой переменной возвращать исходное значение. Но что если таких значение очень много и иногда мне надо их сохранить, а иногда вернуть значения по умолчанию. Как быть в таком случае? Можно как-то возвращать значения по умолчанию с помощью пересоздания формы?

P.S. Написал, конечно, кое-как, но вроде суть передал.))) Это, чтобы отдельную тему не создавать, тем более тематика вроде схожая.
PM MAIL ICQ Skype Jabber   Вверх
FactoREAL
Дата 11.1.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 10.1.2009

Репутация: нет
Всего: нет



ооой. ужас. а меня ещё и настараживала хаотичность появления ошибок... не знаю возможно ли такое, но я думаю что проблема была в слабости моего компьютера   smile при "неаккуратном" обращении с программой и появлялись ошибки, программа просто не успевала походу обрабатывать такие объёмы данных. и даже при неправельном завершении формы (в Form3.OnClose вызывалось Form3.Free) ошибок не возникало когда попробовал запустить прогу на другом компе (он помощнее). а я от вас тут ума просил =)
Код

procedure TForm2.Button1Click(Sender: TObject);
begin
  form3 := TForm3.Create(self);
  form2.Hide;  
  form3.ShowModal;
  form3.free;
  form3:=nil;
end;

я написал вот так, полёт нормальный. Плохо конечно то, что программа будет работать на таких же слабых компах как и у меня. Ну теперь буду пробовать оптимизировать  smile Спасибо за советы.

ПС. Frees, извини плюс поставить не могу  smile 

Это сообщение отредактировал(а) FactoREAL - 11.1.2009, 16:44
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1108 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.