Перейти к содержимому

Как закрыть форму c builder

  • автор:

Как закрыть форму c builder

Borland C++ Builder. (Embarcadero RAD Studio) Если да то читай ниже:

Как закрыть их обе?

Закрыть приложение?
Application->Terminate();

form2 вызываю так:
this->Visible = false;
Form2^ f2 = gcnew Form2();
f2->ShowDialog();

Вау. Ты динамически создал вторую форму f2 по готовой форме Form2 .

В билдере делаешь активной первую форму:
File->Use Unit.
выбираешь вторую форму.
Делаешь активной вторую форму и добавляешь первую.
Потом на кнопке в первой форме:
Form1->Visible=false;
Form2->Visible=true;
Во второй форме наоборот:
Form2->Visible=false;
Form1->Visible=true;

P.S. Есть форум для соотв. компиляторов. Для WinAPI есть тоже свой раздел.

Пишу на чистом С, плюсы спилил.

Как закрыть форму c builder

Группа: Участник
Сообщений: 22

Здравствуйте! На сей раз, я столкнулся с такой проблемой: приложение состоит из двух форм — Form1 и Form2. Форма Form2 перенесена в список доступных форм и вызывается из Form1 так:

f2=new TForm2(Application);
if (!f2) return;
f2->Show();

На форме Form2 имеется кнопка, которая должна закрывать данную форму (не крестик в правом верхнем углу). Если закрывать форму Form2, нажимая на крестик, то все нормально, а при нажатии на кнопку я получаю исключение:

Access violation at address 401146B3 in module vcl60.bpl. Read of address 00C9CDD8. Кто знает, как «заставить» форму Form2 открываться нормально при нажатии кнопки. подскажите. Заранее благодарен

Отправлено: 05.02.2007, 13:37

Группа: Участник
Сообщений: 575

Отправлено: 05.02.2007, 13:52

Группа: Модератор
Сообщений: 1583

Отправлено: 05.02.2007, 13:57

Группа: Участник
Сообщений: 22

Переменная f2 объявлена в разделе public класса TForm1. Закрывавает форму Form2 функция, которая есть в cpp-файле формы Form1. Вот ее код:

Отправлено: 05.02.2007, 14:41

Группа: Участник
Сообщений: 575

Отправлено: 05.02.2007, 14:53

Группа: Участник
Сообщений: 22

Отправлено: 05.02.2007, 15:07

Группа: Модератор
Сообщений: 1583

Отправлено: 05.02.2007, 15:13

Группа: Участник
Сообщений: 22

Отправлено: 05.02.2007, 15:22

Группа: Модератор
Сообщений: 1583

Возможно это тот случай когда «сразу delete» делать нельзя. Но учтите, что при закрытии крестиком ( ) вы не освобождаете память если у вас не стоит caFree и, возможно, не очищаете указатель f2.

Отправлено: 05.02.2007, 15:59

Группа: Участник
Сообщений: 115

все просто.
в начале ты проверяешь не создана ли форма, создаешь если нет и показываешь ее

CODE
if (Form2)
Form2=new TForm2(Form1);
>
Form2.Show;

вызывая delete Form2; ты освобождаешь память, НО
delete НЕ присваивает NULL переменной

а при закрытии формы не забудь!:

CODE
void __fastcall TForm2::OnDestroy(TObject *Sender)
Form2=NULL;
// а попробуй еще вот так :
// this=NULL;
// помоему это более правильно. или нет?
>
CODE
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
Action=caFree;
>
Отправлено: 05.02.2007, 16:10

Группа: Участник
Сообщений: 115

QUOTE
Переменная f2 объявлена в разделе public класса TForm1. Закрывавает форму Form2 функция, которая есть в cpp-файле формы Form1. Вот ее код:

определись ск-ко экземпляров TForm2 у тебя будет.
если 1 — — НЕ СОРИ!
ПЕРЕМЕННАЯ f2 — ЛИШНЯЯ.
в модуле Unit2.h (там где класс TForm2 объявлен) объявлена переменная Form2 — используй ее. а в Unit1.cpp вставь

#include «Unit2.h»
а призакрытии Form1 все прочие формы приложения (если не ошибаюсь) закрываются сами.
все прочее я написал выше.

Как отключить кнопку закрытия [X] формы?

Запись была обновлена

Чтобы сделать кнопку закрыть форму/программу достаточно прописать небольшой код. Так в FormCreate пропишите представленный ниже код:

HMENU MenuHandle = GetSystemMenu(Handle, false); if(MenuHandle) DeleteMenu(MenuHandle, SC_CLOSE, MF_BYCOMMAND);

Поделиться

Подготовил материал

Табаков Юрий

Программист

Автор и редактор проекта CuBook.PRO. Главная задача, которую я ставлю перед собой – донести до начинающих программистов удобочитаемый материал. Буду рад выслушать замечания и предложения. Не забываем ставить оценки и делать репосты =)

Минутка юмора

Компьютерные вирусы — это такие маленькие программульки, которые пишут большие говнюки.

Предложить статью

Самое интересное

  • Log – натуральный логарифм
  • ShellExecute – открыть папку или приложение
  • Pow – возведение числа в степени
  • Chart – графики и диаграммы
  • StringGrid – таблица строк и столбцов

Как закрыть форму c builder

Здравствуйте Господин Самвел! Прошу Вас поместите еще один необходимый шаг в раздел C++ Builder. Даже в форуме на Sources.ru мне отвечают не то что надо или меня понять не могут или . В общем меня интересует такая вещь как управление окнами в рамках одного приложения. Т.е. у меня есть MDI main form и две MDI child. Так вот, первая child при своем открытии создает вторую child. Вторая child не может существовать без первой и при закрытии первой нужно из первой, например, закрыть эту вторую форму. На форуме мне советовали и Release и т.п. но все выходит в ошибку. Итак вопрос как управлять из какой-то формы, в рамках одного приложения, свойствами другой формы. Т.е. двигать форму, закрывать, сворачивать и т.д. У меня получилось только создать.

С уважением Дмитрий.

В принципе, по логике VCL формы (диалоговые окна) делятся на три типа: обычные, MDI формы, MDI субформы. Или дочерние окна. Если интересно, могу сказать, что с точки зрения Windows особой разницы между ними нет — разница только в родителе формы. Собственно форма (окно) является базовым элментом управления Windows, по сути пустым, то есть не несущим на себе никакой другой роли, кроме роли контейнера. Ну, на самом деле мы можем взять тот же ComboBox, добавить к его стилю при создании (как это сделать — в следующм шаге) стили WS_OVERLAPPED|WS_BORDER|WS_MINIMIZE и получим диалоговое окно с единственным элементом — этим COMBOBOX.

Стиль формы определяется свойством FormStyle, может быть fsNormal, fsMDIChild, fsMDIForm, fsStayOnTop. Первые три прямо о себе говорят, ну а последнее — что оно постоянно на виду. Вообще-то странно, почему это не отдельное свойство, поскольку на уровне API можно любое окно сделать StayOnTop. Ну у ребят из Borland какие-то там свои задумки, это они наверное специально сделали, чтобы сбить с толку конкурентов.

Поясняю на примере. Допустим. у нас есть основное окно, у которого свойство FormStyle установлено в fsMDIForm. Нужно, чтобы по нажатию File->New создавалось дочернее окно. Самый простой, отчасти кликовый вариант этого — делаем основную форму TMainForm, устанавливаем свойство FormStyle куда надо, делаем дочернюю TChildForm, также устанавливаем ее свойство (а как же иначе), и. Теперь, как это ни странно, нужно немного поработать клавиатурой.

#include "childform.hpp" void __fastcall TMainForm::New1Click(TObject* Sender) < TChildForm* newform = new TChildForm(this); newform->Show(); >

Уничтожаем форму извне простым delete, чтобы освободить ресурсы занимаемые формой изнутри, то есть из обработчика события, используем Release.

Меняем позицию формы на экране абсолютно по-детски — изменяя свойства Left, Top, Width и т.д. и т.п.

Что же еще сказать-то можно. В общем интересное наблюдение — при создании формы необходимо указывать Owner‘а, потому что для освобождения памяти под форму используется именно он. То есть, допустим, вы закрываете форму Release‘ом, если Owner не указан, освобождения области памяти не происходит. Поправьте меня, если я не прав.

В следующем шаге рассмотрим возможность изменения Window Style и Class Style.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *