HELP Помогите чайнику вызвать дочернюю форму !!!!!!!!!!!!!!!!!!!!
Помогите кто шарит открыть форму дочернюю. плс
У тебя что, не работает Form1->ShowModal(); или Form1->Show();?
Если это не то что тебе нужно , то задай вопрос поконкретнее.
У тебя что, не работает Form1->ShowModal(); или Form1->Show();?
Если это не то что тебе нужно , то задай вопрос поконкретнее.
Вот именно это и не работает
Вот именно это и не работает
Так что у тебя происходит? Ошибка компиляции или просто после вызова дной из этих функций просто не открывается форма?
В дюбом случае поставть точку останова на функцию вызова команды открытия формы и дальше выполняй в пошаговом режиме. Думаю что тогда увидишь проблему. И кстати, посмотри внимательно свойства формы которая не открывается.
#include "Unit1.h"
#include "Unit2.h"
//----------------------
void __fastcall TForm1::BtnBtn1Click(TObject *Sender){
TForm2 *Form2 = new TForm2(Application);
Form2->Visible = true;
}
Откроет форму при клике на кнопку.
#include "Unit1.h"
#include "Unit2.h"
//----------------------
void __fastcall TForm1::BtnBtn1Click(TObject *Sender){
TForm2 *Form2 = new TForm2(Application);
Form2->Visible = true;
}
Откроет форму при клике на кнопку.
Very Very Big SENKS !!!:P
Application->CreateForm(__classid(Tl_form), &l_form);
только надо еще
include "l_form.h"
подключить
а что такой код никого не устраивает
Application->CreateForm(__classid(Tl_form), &l_form);
только надо еще
include "l_form.h"
подключить
Про сути - практически никакой разницы. В одном случае вызывается свойство объекта Application, в другом случае - конструктор формы.
Про сути - практически никакой разницы. В одном случае вызывается свойство объекта Application, в другом случае - конструктор формы.
Сорри, а могно еще узнать как ее закрыть. Мне нужно тест сделать.
Сорри, а могно еще узнать как ее закрыть. Мне нужно тест сделать.
На форме кнопку сделай и в клике на ней напиши:
Close();
}
Если в первую форму должны быть возвернуты какие либо данные, то необходимо, во первых, включить заголовочный файл, во вторых, во второй форме необходимо в заголовочный файл в качестве открытого члена класса объявить указательна объект типа TForm *Form.
Так будет выглядеть код открытия :
#include "Unit1.h"
#include "Unit2.h"
//----------------------
void __fastcall TForm1::BtnBtn1Click(TObject *Sender){
TForm2 *Form2 = new TForm2(Application);
Form2->Form = this;
Form2->Visible = true;
}
}
А так код закрытия на второй форме:
#include "Unit2.h"
#include "Unit1.h"
//----------------------
void __fastcall TForm2::BtnBtn1Click(TObject *Sender){
(TForm *)Form1 = Form;
Form1->Edit1->Text = Edit1->Text;
Visible = false;
}
}
#include "Unit2.h"
#include "Unit1.h"
//----------------------
void __fastcall TForm2::BtnBtn1Click(TObject *Sender){
:???: (TForm *)Form1 = Form;:???:
1)Form1->Edit1->Text = Edit1->Text;
Visible = false;
}
}
Объясни плс, что это означает. И еще в 1* выдало ошибку. Строку я закомментировал и все пошло
Объясни плс, что это означает. И еще в 1* выдало ошибку. Строку я закомментировал и все пошло
Если ты создаешь форму из "кучи" - то есть выделяешь пямять динамически, то при попытке получения адреса любого компонента формы ты рискуешь получить доступ к неопределенной области памяти - что бы этого избежать необходимо получить указатель на объект к которому ты собираешься вернуться. Для этого в открытой части класса второй формы я объявляю указатель на объект TForm *Form а при открытии формы инициализирую его указателем на текущую форму.
Это делается здесь:
А эта строка необходима для того что бы таы мог из новой формы обратится к компоненту предыдущей
Что такое приведение типов я надеюсь рассказывать не надо?
И еще в 1* выдало ошибку. Строку я закомментировал и все пошло
Потому ошибку и выдало.
После закрытия формы:
delete Form2;
Так вот вопрос . Точно не знаю, но помойму связан с указателями. Как передавать данные из формы в форму я понял, а вот как значение переменной увеличивать, в зависимости от ответа в предыдущей форме???
И еще вопрос:angel: . Просто я учусь еще на 1 курсе на программера. В нас вдалбливают ПАСКАЛЬ _ ПАСКАЛЬ !!! 1 год его учил - понял че к чему, и давай дальше топать и тут же столкнулся с проблемами. Спасибо , что разжевываешь . Сам бы не допер. :))
Так вот вопрос . Точно не знаю, но помойму связан с указателями. Как передавать данные из формы в форму я понял, а вот как значение переменной увеличивать, в зависимости от ответа в предыдущей форме???
Все зависит от того, что именно тебе нужно получить. На пример задача модет быть решена следующим образом.
Первая форма содержит переменную которая должна увеличится на 1 если на второй форме нажата кнопка "Да" и остаться прежней если нет.
Это заголовочный файл первой формы:
#define Unit1H
...//Здесь идет включение необходимых файлов
//объявдение класса формы и т.п.
...
protected:
int iCount;
pablic:
...
int __fastcall SetCount(const AnsiString&);
...
Реализация класса формы:
#include "Unit2.h"
#include "Unit1.h"
//----------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
iCount = 0;//Устанавливаем начальное значение
}
//-----------------------------------------
void __fastcall TForm2::BtnBtn1Click(TObject *Sender){
(TForm *)Form1 = Form;
Form1->Edit1->Text = Edit1->Text;
Visible = false;
}
}
//-------------------------------------------
int __fastcall SetCount(const AnsiString& String){
if(String=="Да")iCount++;
return iCount;
}
На второй форме две кнопки с надписями да или нет..:)
Реализация второй формы:
#include "Unit2.h"
#include "Unit1.h"
//----------------------
void __fastcall TForm2::BtnBtn1Click(TObject *Sender){
(TForm *)Form1 = Form;
Form1->SetCount(BtnBtn1->Caption);
Visible = false;
}
}
void __fastcall TForm2::BtnBtn2Click(TObject *Sender){
(TForm *)Form1 = Form;
Form1->SetCount(BtnBtn2->Caption);
Visible = false;
}
}
Это самый примитивный способ - в рабочей программе лучше его не использовать. Для подобных целей существуют модальные диалоги, кнопки, статические переменные и соответственно более элегантные решения. Но как иллюстрация передачи данных вполне годится. Можно iCount объявить как public - тогда можно обойтись без вызова функции и передавать значение напрямую:
#include "Unit2.h"
#include "Unit1.h"
//----------------------
void __fastcall TForm2::BtnBtn1Click(TObject *Sender){
(TForm *)Form1 = Form;
Form1->iCount++;
Visible = false;
}
}
void __fastcall TForm2::BtnBtn2Click(TObject *Sender){
(TForm *)Form1 = Form;
Form1->iCount--;
Visible = false;
}
}
Но этого тоже надо избегать - если без передачи данных напрямую обойтись нельзя, то данные стоит скрывать в защищенной области а для передачи использовать функции.
Ну память выделил, а освободить. Потом из-за таких мелочей могут выходить большие глюки.
После закрытия формы:
delete Form2;
Ну попробуй...
Большие глюки могут выходить в тех случаях когда человек не понимает что делает - например про delete где-то слышал, а области видимости мимо пролетели.
:)
Ну попробуй...
Большие глюки могут выходить в тех случаях когда человек не понимает что делает - например про delete где-то слышал, а области видимости мимо пролетели.
:)
Ну вот твой код:
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//----------------------
void __fastcall TForm1::BtnBtn1Click(TObject *Sender){
TForm2 *Form2 = new TForm2(Application);
Form2->Visible = true;
}
Память оператором new ты выделяешь, а где эта память освобождаться будет? А область видимости - ты что, хочешь сказать память сама освободится? Не путай статическое выделение памяти с динамическим. Если разницы не усваиваешь, прочитай "Для чайникoff".
Последнюю неделю только и делаю, что ошибки таких умников отлавливаю. Память выделяют и забывают, а потом - почему через час работы программа виснит? А искать их ой как нелегко, в чужой то проге. Вот и рекомендую для сохранения нервов себе и другим учитесь подчищать за собой.
Ну вот твой код:
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//----------------------
void __fastcall TForm1::BtnBtn1Click(TObject *Sender){
TForm2 *Form2 = new TForm2(Application);
Form2->Visible = true;
}
Память оператором new ты выделяешь, а где эта память освобождаться будет? А область видимости - ты что, хочешь сказать память сама освободится? Не путай статическое выделение памяти с динамическим. Если разницы не усваиваешь, прочитай "Для чайникoff".
Последнюю неделю только и делаю, что ошибки таких умников отлавливаю. Память выделяют и забывают, а потом - почему через час работы программа виснит? А искать их ой как нелегко, в чужой то проге. Вот и рекомендую для сохранения нервов себе и другим учитесь подчищать за собой.
Тебе пальцами в растопырке по клаве стучать удобно? Тон сбавь - если ты считаешь что в коде не хватает оператора освобождения памяти - то плз, код в студию.
Kot_, а какую книжку посоветуешь прочесть и где ее можно заказать???
Если совсем в начале - начни с Архангельского и попробуй поработать на разных компиляторах, не зацикливайся только на Борланде. Рекомендую так же "Стандартная библиотека С++ на примерах", ну а дальше смотря что тебе надо.
Еще слышал, что 8 buider есть. Стоит переходить или пока 6 хватит?
:???: Я так понял что ты вроде как только начал - с чего же ты переходить собрался?:D
И для чего хватит?:D
:???: Я так понял что ты вроде как только начал - с чего же ты переходить собрался?:D
И для чего хватит?:D
Все понял.:P
Я уже говорил, что пока тест хочу сделать. Так если 20 ? , то надо 20 форм сделать или ето можно сделать другим путем?
Все понял.:P
Я уже говорил, что пока тест хочу сделать. Так если 20 ? , то надо 20 форм сделать или ето можно сделать другим путем?
Что 20? 20 форм или 20 - как введенное число? Или 20 раз вызвать одну и ту же форму? Или ту же форму но с разными вариациями?
Есть разные формы - соответственно разные методы работы с ними. Кроме того - можно рисовать окно средствами ОС, можно разработать свой класс, вариантов куча.
Что 20? 20 форм или 20 - как введенное число? Или 20 раз вызвать одну и ту же форму? Или ту же форму но с разными вариациями?
Вот помоему последнее мне и нужно. Как это можно сделать
:???:
Вот помоему последнее мне и нужно. Как это можно сделать
:???:
Легко.
В открытой области класса второй формы объявляешь функцию такого вида
void __fastcall SetupView(const AnsiString& Label, const int& What=0);
к примеру. И соответственно меняешь код вызова формы:
Form2->Form = this;
Form2->SetupView(Stroka,Identificator)
Form2->Visible = true;
Функция может быть определена примерно вот так:
Label1->Caption = Label;
switch(What){
case 1:{
TEdit *Edit1 = new TEdit(Form2);
Edit1->Left = 100;
Edit1->Top = 100;
Edit1->Text = "Вот оно - программно созданный компонент";
break;
}
...
...
default:{
...
}
}
}
Ну и так далее. Все зависит от задачи и твоей фантазии.
Но мне правда очень интересно.
Я вот тут записную книжку делал. Последннее , что осталось организовать поиск. И тут компилятор выдал ошибку, мол НЕОПОЗНАННЫЙ СИМВОЛ Form1
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit4.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm4 *Form4;
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm4::Button1Click(TObject *Sender)
{
for(int i=1;i<10;i++)
{
!!! if(Form1->ListBox1->Items ==Edit1->Text) !!!(в этой строке)
{
ShowMessage("sdf");
}
}
}
//---------------------------------------------------------------------------
Тебе пальцами в растопырке по клаве стучать удобно? Тон сбавь - если ты считаешь что в коде не хватает оператора освобождения памяти - то плз, код в студию.
Ты зря то тут понты не кидай если хочешь кого-нибудь чему-нибудь научить то имей совесть делай это хотя бы грамотно. А вообще все что я тут прочитал хорошим тоном программирования не назовешь. И иногда это немного бесит когда вот такие ... учат новичков...
Я тебя еще не достал тупыми вопросами??? :))
Но мне правда очень интересно.
Я вот тут записную книжку делал. Последннее , что осталось организовать поиск. И тут компилятор выдал ошибку, мол НЕОПОЗНАННЫЙ СИМВОЛ Form1
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit4.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm4 *Form4;
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm4::Button1Click(TObject *Sender)
{
for(int i=1;i<10;i++)
{
!!! if(Form1->ListBox1->Items ==Edit1->Text) !!!(в этой строке)
{
ShowMessage("sdf");
}
}
}
//---------------------------------------------------------------------------
Один клик по форме, и в инспекторе объектов ищешь Name как твоя форма называется. Возможно ты просто ее переименовал.
Один клик по форме, и в инспекторе объектов ищешь Name как твоя форма называется. Возможно ты просто ее переименовал.
Я тоже вначале так подумал, посмотрел нейм. Но там все ОК.
{
(TForm *)Form1 = Form;
for(int i=1;i<10;i++)
{
!!! if(Form1->ListBox1->Items ==Edit1->Text) !!!(в этой строке)
{
ShowMessage("sdf");
}
}
}
{
(TForm *)Form1 = Form;
for(int i=1;i<10;i++)
{
!!! if(Form1->ListBox1->Items ==Edit1->Text) !!!(в этой строке)
{
ShowMessage("sdf");
}
}
}
Если форма Form1 уже закрыта - то тогда необходимо создать ее заново.
Ты зря то тут понты не кидай если хочешь кого-нибудь чему-нибудь научить то имей совесть делай это хотя бы грамотно. А вообще все что я тут прочитал хорошим тоном программирования не назовешь. И иногда это немного бесит когда вот такие ... учат новичков...
А когда вот такие грамотеи налево и направо советы раздают то повидимому все ОК? Я кстати, так и не услышал - или не увидел - где должен находится в представленом мной коде оператор delete?
Могу повторить фрагмент для тех кто в бронепоезде:
TForm2 *Form2 = new TForm2(Application);
Form2->Visible = true;
}
8)
А когда вот такие грамотеи налево и направо советы раздают то повидимому все ОК? Я кстати, так и не услышал - или не увидел - где должен находится в представленом мной коде оператор delete?
Могу повторить фрагмент для тех кто в бронепоезде:
TForm2 *Form2 = new TForm2(Application);
Form2->Visible = true;
}
Ошибки:
1. Во первых нет смысла выделять память, если эта форма в Project->Options->Forms находится в списке Auto-CreateForm. Тогда просто:
Form2->Show();
или
Form2->ShowModal();
//смотря какая нужна
Отсюда мораль - в любом случае надо было посоветовать перенести в Auto-CreateForm. Если она уже там, в чем я проктически уверен, то не заниматься глупостями.
2. Незачем было в ограниченной области инициализировать указатель на форму (ведь в Form1.cpp есть #include"Form2.h", где последней строчкой: extern PACKAGE TForm2 *Form2), тоесть он уже есть глобальный.
3. При выходе из области действия указателя он теряется, тоесть вне функции в твоём случае с ним уже ничего не сделаешь. А если на форме TImage, или другие висомые компоненты. Память просто пропадает на глазах, с каждым открытием формы.
Ну и если нужна действительно денамически выделяемая форма , то
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2 = new TForm2(Application);
Form2->Visible = true;
}
на форме 2:
//---------------------------------------------------------------------------
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
delete Form2;
}
//---------------------------------------------------------------------------
Ито память небудет теряться если больше 1 формы по кнопке не открывать, иначе либо немного усложнить, либо см п.1.
Ну и архив, если у УЧИТЕЛЯ КРИВЫЕ РУКИ.
поступило в первом ответе на это сообщение. Так к слову.
По поводу delete при вызове Close() - если тебе спокойней используй - только какую память ты при этом освобождаешь? Если память освобождается - то почему не больше 1 формы? Или как? И почему не показан в таком случае код закрытия первой формы? Или может в ней память освобождать не нужно? Тогда почему? Она ведь тоже создается динамически?
Чго тогда так слабо? Надо было уже мне в ошибку поставить что при создании формы я оператор new не перегрузил...чего блин мелочиться. Память не выделил правильно. На билдер понадеялся. Куда нам темным. Слава богу есть еще люди способные на наши ошибки ткнуть.
Рад за твои прямые руки, но к смею обратить внимание - предложение использовать Form2->Show()
поступило в первом ответе на это сообщение. Так к слову.
По поводу delete при вызове Close() - если тебе спокойней используй - только какую память ты при этом освобождаешь? Если память освобождается - то почему не больше 1 формы? Или как? И почему не показан в таком случае код закрытия первой формы? Или может в ней память освобождать не нужно? Тогда почему? Она ведь тоже создается динамически?
Чго тогда так слабо? Надо было уже мне в ошибку поставить что при создании формы я оператор new не перегрузил...чего блин мелочиться. Память не выделил правильно. На билдер понадеялся. Куда нам темным. Слава богу есть еще люди способные на наши ошибки ткнуть.
Да ты пойми что все это не просто какие - то наезды... дело в том что ты объясняешь простые вещи для человека, который я так понимаю только только начал учиться программить, очень замудреным языком. Если есть желание поумничать то наверное ты просто не туда попал, если же дело в том что ты сам так все понимаешь то наверное стоит задуматься над самообразованием а так в принципе все нормально и никто не хотел тебе ничего плохого сказать, а конструктивную критику нужно иногда понимать и принимать...
Да ты пойми что все это не просто какие - то наезды... дело в том что ты объясняешь простые вещи для человека, который я так понимаю только только начал учиться программить, очень замудреным языком. Если есть желание поумничать то наверное ты просто не туда попал, если же дело в том что ты сам так все понимаешь то наверное стоит задуматься над самообразованием а так в принципе все нормально и никто не хотел тебе ничего плохого сказать, а конструктивную критику нужно иногда понимать и принимать...
:angel: Хм...ничего не скажешь критика весьма конструктивна. :???: :???: :???:
И послений вопрос :) Как я уже говорил- я делал телефонную книжку. Там я сделал 2 Листбокса В первом ИМЯ , а во 2-м ТЕЛЕФОН. Как мне сделать так, чтобы можно было сохранить в текстовый файл Имя - телефон, а потом загрузить это дело в книжку? Спасибо, заранее.
Так нужно ли освобождать память после того, как дочерняя форма закрыта?
Память освобождать нужно - но ИМХО если уже предлагать чистить ее в самом классе формы, то почему тогда не борландовское
Action = caFree;
}
Работает кстати корректней.
А как можно скрыть форму, но чтобы программа работала? И как , чтобы при свертываниии появился значек в трее( и чтобы меню там организовано было). Все ли программы , которые в трее резидентны? Можно ли мне при моих небольших знаниях, сделать такую программу, например прогу для отрытия сидюка при нажатии определенной комбинации клавишь?
Объяните пожалуйста в 2-х словах на маленьком примере назначение указателей.(мне кажется без них можно всегда обойтись или я ошибаюсь?) Как отсортировать listbox?
И послений вопрос :) Как я уже говорил- я делал телефонную книжку. Там я сделал 2 Листбокса В первом ИМЯ , а во 2-м ТЕЛЕФОН. Как мне сделать так, чтобы можно было сохранить в текстовый файл Имя - телефон, а потом загрузить это дело в книжку? Спасибо, заранее.
Может тебе проще найти книгу Архангельского?:) Ответы на эти вопросы там есть. Она есть в электронном виде - на форуме кто-то давал ссылки.
Кстати, по моему listbox не очень удобен для телефонной книжки, сортировка его делается просто - ListBox1->Sorted = true;
Рад за твои прямые руки, но к смею обратить внимание - предложение использовать Form2->Show()
поступило в первом ответе на это сообщение. Так к слову.
По поводу delete при вызове Close() - если тебе спокойней используй - только какую память ты при этом освобождаешь? Если память освобождается - то почему не больше 1 формы? Или как? И почему
не показан в таком случае код закрытия первой формы? Или может в ней память освобождать не нужно? Тогда почему? Она ведь тоже создается динамически?
Чго тогда так слабо? Надо было уже мне в ошибку поставить что при создании формы я оператор new не перегрузил...чего блин мелочиться. Память не выделил правильно. На билдер понадеялся. Куда нам темным. Слава богу есть еще люди способные на наши ошибки ткнуть.
1.По поводу Form2->Show(), ты просто не смог обьяснить почему она у него не работает, и начал загонятся.
2.Указатель Form2 один (в моём примере), глобальный в 2-х модулях. Память освобождается нужная. Почему при выделении памяти в моём примере одновременно открывать не более 1 формы, я думал и чайнику ясно (при открытии одновременно 2-х форм указатель на первую Form2 затрётся указателем на вторую Form2). А память чем выделяю, тем и удаляю ( new - delete ) и помоему это правильно.
3. ПРИМЕР ВЫСЛАЛ ЗАЧЕМ? Всётки неполенился бы и скачал бы. Первая форма Auto-CreateForm, вторая нет. Вот и выводы делай.
Надоело обьяснять правила хорошего тона в программировании. Я не кричу что я ас, но и учить новичков тому, чего сам незнаю не лезу. Ты либо правда нини, либо издеваешся. В любом случае надоело.
Bye.