Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое удаление компонентов 
:(
    Опции темы
vmf18
Дата 4.12.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Даны 2 формы: Form1, Form2. На Form1 есть кнопка Button1 ведущая в Form2 . В Form2 динамически, при нажатии на Enter, создается новый компонент LabeledEdit. В Form2 имеется кнопка Button2 которая закрывает эту Form2. А теперь вопрос smile  Я пытаюсь при нажатие на Button2 удалить все ранее созданные компоненты LabeledEdit(что я и сделал), но почемуто снова при нажатии на Button1 компоненты не создаются... Т.е. повторна программа не работает.
Код

void __fastcall TForm2::EnterDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
    int n,i;
    n=StrToInt(Edit2->Text);
    i=StrToInt(Edit1->Text);
    if(i>n)
      {
        MessageDlg("Значение i не может превышать значение n",
        mtInformation,TMsgDlgButtons()<<mbOK,0);
      }
    if( Key == 13 )   {

        TLabeledEdit * Pressed = ( (TLabeledEdit *) Sender );
         if(Pressed->Text!=""){
         if(Pressed->Tag < (n-1) ){
        AnsiString name="Введите а["+FloatToStrF(as,ffGeneral,1,1)+"]:";
        if( Pressed->Tag == EditsCount - 1 ) {
            TLabeledEdit * NewLabeledEdit = new TLabeledEdit( Handle );
            NewLabeledEdit->Name = "LabeledEdit" + AnsiString( EditsCount );
            NewLabeledEdit->EditLabel->Caption=name;
            NewLabeledEdit->Text="";
            NewLabeledEdit->Parent = this;
            NewLabeledEdit->Tag = EditsCount;
            NewLabeledEdit->OnKeyDown = EnterDown;
            NewLabeledEdit->Left = Pressed->Left;
            NewLabeledEdit->Top = Pressed->Top + 40;
            NewLabeledEdit->Visible = true;
            NewLabeledEdit->SetFocus();
            EditsCount++;
            Form1->Height=Height+40;
            as++;
        }

        } }
    }
}

Попытался сделать вот так вот, но ничего не получилось... Т.е. компоненты удалятся удаляются, но при повторном использовании Form2, компоненты не создаются...
Код

void __fastcall TForm2::Button2Click(TObject *Sender)
{
if(Edit1->Text!="" || Edit2->Text!=""){
int n=StrToInt(Edit2->Text);
int aw=1;
for(int j=0;j<n;j++){
TObject *FindLabeledEdit;
AnsiString Name1="LabeledEdit";
Name1=Name1+aw;
FindLabeledEdit = FindChildControl(Name1);
//FindLabeledEdit->~TObject();
delete FindLabeledEdit;
aw++;
}
Form1->Height=151;
LabeledEdit0->Text ="";
Edit1->Text ="";
Edit2->Text ="";
}
Form2->Close();
}

Как исправить эту ошибку?

Это сообщение отредактировал(а) vmf18 - 4.12.2007, 13:15
PM MAIL   Вверх
Lazin
Дата 4.12.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



А что за Handle ты передаешь в конструктор? Туда нужно передавать указатель на родительский компонент. Удалять не надо, вместо этого удаляй Form2, NewLabeledEdit будет удален автоматически.
Еще можно использовать cв-во Visible компонента.
PM MAIL Skype GTalk   Вверх
vmf18
Дата 4.12.2007, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Lazin @ 4.12.2007,  16:03)
вместо этого удаляй Form2, NewLabeledEdit будет удален автоматически.

А как удалять Form2? Я не знаю... Научите... smile
PM MAIL   Вверх
mrbrooks
Дата 4.12.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



В данном случае методом  Close()  smile . Почитай повнимательней в этой ветке форума - здесь много постов по динамическому созданию компонентов. Заодно почитай Архангельского. 
PM MAIL   Вверх
Lazin
Дата 5.12.2007, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(mrbrooks @  4.12.2007,  22:42 Найти цитируемый пост)
В данном случае методом  Close()

а чем delete не устраивает?
PM MAIL Skype GTalk   Вверх
mrbrooks
Дата 5.12.2007, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата

а чем delete не устраивает? 


Так он же Form2 создает в проекте а не как 

Код

TForm *frm = new TForm(NULL);


Поэтому не delete ни Free() в принципе и не нужно. Вот если бы он создавал не атоматически форму - то бишь в available forms тогда да.

PM MAIL   Вверх
vmf18
Дата 5.12.2007, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mrbrooks @ 4.12.2007,  22:42)
Заодно почитай Архангельского.

Спасибо за совет! Ток где найти мне этого Архангельского? Не подскажешь?
PM MAIL   Вверх
vmf18
Дата 5.12.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mrbrooks @ 4.12.2007,  22:42)
В данном случае методом  Close()  smile . Почитай повнимательней в этой ветке форума - здесь много постов по динамическому созданию компонентов. Заодно почитай Архангельского.

А куда этот Close вставлять? Разве не сюда: 
void __fastcall TForm2::Button2Click(TObject *Sender)
{
Form1->Close();
}
Но так просто закрывается Form2...
Почитал посты, да действительно, много постов по динамическому созданию компонентов, но, нужного мне нет...
PM MAIL   Вверх
orthrus
Дата 6.12.2007, 03:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

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



Цитата(vmf18 @  4.12.2007,  13:07 Найти цитируемый пост)
почемуто снова при нажатии на Button1 компоненты не создаются


При нажатии на тот Button1 который на Form1 и который просто показывает Form2? Если да то как компоненты создадутся если ты их уже удалил, снова нажимай на Enter чтобы все создать заново.


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
vmf18
Дата 6.12.2007, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(orthrus @ 6.12.2007,  03:57)
снова нажимай на Enter чтобы все создать заново.

:( Я так и делаю, но не выходит...
PM MAIL   Вверх
mrbrooks
Дата 6.12.2007, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Ссылки на книги Архангельского есть в разделе "Книги" данного форума.

А что касается остального - так создание своей метки опиши в кнопке Button1 где вызываешь форму 2. По кнопке2 закрывай форму2. Она у тебя будет снова создоваться. А потомь навесь обработчик нажатой клавиши.
PM MAIL   Вверх
vmf18
Дата 6.12.2007, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mrbrooks @ 6.12.2007,  09:17)
А что касается остального - так создание своей метки опиши в кнопке Button1 где вызываешь форму 2. По кнопке2 закрывай форму2. Она у тебя будет снова создоваться. А потомь навесь обработчик нажатой клавиши.

Можете посмотреть мой проектик? Пжлста... smile

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  _____.rar 5,20 Kb
PM MAIL   Вверх
Lazin
Дата 6.12.2007, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Проблема в том, что ты пытаешься удалить элемент управления по имени, этого делать не стоит. Лучше заведи в классе формы указатель на него(или массив указателей) и удаляй его. Когда ты вызываешь деструктор FindLabeledEdit->~TObject(); то реально ничего не удаляется, просто выполняется код деструктора. Что-бы удалить компонент нужно сделать delete FindLabeledEdit .
Может тебе нужно не просто закрывать Form1 а удалять, и создавать динамически?
Я не понял что ты вообще хотел этим кодом сделать, напиши понятно, что в каком порядке должно на форме появляться, и при каких условиях удаляться.
Можно создать статически нужное количество компонентов, установить свойство Visible = false а потом показывать только нужные, 
keep it simple
PM MAIL Skype GTalk   Вверх
vmf18
Дата 6.12.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Lazin @ 6.12.2007,  13:38)
Я не понял что ты вообще хотел этим кодом сделать, напиши понятно, что в каком порядке должно на форме появляться, и при каких условиях удаляться.

А Ты пробовал мой код компилировать?
Порядок работы:
1) на форме0 пользователь выбирает какойто пункт, нажимает на кнопку1 появляется форма1
2) в форме1 пользователь вписывает в едит1 , едит2 и лайбледит0 свои числа, после нажатия на энтер, появляется новый лайбледедит1, потом еще один и еще, так они и будут появяться пока количество лайбеледитов не станет равным числу из едита1
3) пользователь нажимаеть на кнопке вычислить, и программа срабатывает так как мне нужно(в данном случае она находит число из лайбеледита i-го, а i-ое число, это число введенное в едит2)
4)пользователь нажимает на кнопку2 и эта форма закрывается, но если с формы0 опять зайти в форму1 то все созданные ранее лайбеледиты остаются не удаленными(в этом то вся и проблема)

НАДЕЮСЬ ПОНЯТНО ИЗЛОЖИЛ... smile

Это сообщение отредактировал(а) vmf18 - 6.12.2007, 14:05
PM MAIL   Вверх
Lazin
Дата 6.12.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(vmf18 @  6.12.2007,  14:02 Найти цитируемый пост)
А Ты пробовал мой код компилировать?

Цитата(Project.cpp)

Код

                 Application->Initialize();
                 Application->CreateForm(__classid(TForm0), &Form0);
                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->CreateForm(__classid(TForm2), &Form2);
                 Application->CreateForm(__classid(TForm3), &Form3);
                 Application->CreateForm(__classid(TForm4), &Form4);
                 Application->CreateForm(__classid(TForm5), &Form5);
                 Application->CreateForm(__classid(TForm6), &Form6);
                 Application->CreateForm(__classid(TForm7), &Form7);
                 Application->CreateForm(__classid(TForm8), &Form8);
                 Application->CreateForm(__classid(TForm9), &Form9);
                 Application->CreateForm(__classid(TForm10), &Form10);
                 Application->CreateForm(__classid(TForm11), &Form11);
                 Application->CreateForm(__classid(TForm12), &Form12);
                 Application->CreateForm(__classid(TForm13), &Form13);
                 Application->CreateForm(__classid(TForm14), &Form14);
                 Application->CreateForm(__classid(TForm15), &Form15);
                 Application->CreateForm(__classid(TForm16), &Form16);
                 Application->CreateForm(__classid(TForm17), &Form17);
                 Application->CreateForm(__classid(TForm18), &Form18);
                 Application->CreateForm(__classid(TForm19), &Form19);
                 Application->CreateForm(__classid(TForm20), &Form20);
                 Application->CreateForm(__classid(TForm21), &Form21);
                 Application->Run();


Файлы в архиве:
02.12.2007  23:00             6я409 func.h
06.12.2007  01:03             3я183 Project.cpp
03.12.2007  00:18             8я420 _00_.cpp
02.12.2007  23:38             3я720 _00_.h
06.12.2007  00:58             4я231 _01_.cpp
06.12.2007  00:58             1я346 _01_.h
05.12.2007  22:00               107 Инструкция.txt

Как я это понял: ты хочешь что-бы, на форме 1 создавались динамически едиты, пользователь их заполнял-бы, происходи-ли-бы какие-то вычисления и форма вместе с едитами пропадала. При повторном открытии, что-бы там ничего не-было.
Вообще для этого придумали стринг грид))


Цитата(vmf18 @  6.12.2007,  14:02 Найти цитируемый пост)
НАДЕЮСЬ ПОНЯТНО ИЗЛОЖИЛ... smile

Цитата

xxx: че использовать для вывода чтоб предыдущее значение сохранялось в поле и на следующей строке появлялось следующее
yyy: Что использовать чтобы огурцы ложкой банка майонеза.


Добавлено через 3 минуты и 33 секунды
пример того что я говорил про список компонентов:
на форме 3 компонента: 1 TEdit - содержит число едитов которые нужно создать
2 кнопки btnClose - удаляет все динамически созданные компоненты
btnAdd - создает компоненты динамически
заголовочный файл:
Код

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <list>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TEdit *edNum;
    TButton *btnClose;
    TButton *btnAdd;
    void __fastcall btnAddClick(TObject *Sender);
    void __fastcall btnCloseClick(TObject *Sender);
private:    // User declarations
    std::list<TControl*> controls;
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


код

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnAddClick(TObject *Sender)
{
    int num = StrToInt(edNum->Text);
    for (int i = 0; i < num; i++)
    {
        TEdit* newEdit = new TEdit(this);
        newEdit->Parent = this;
        newEdit->Left = edNum->Left + 2*i;
        newEdit->Top = edNum->Top + edNum->Height*i;
        controls.push_back(newEdit);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnCloseClick(TObject *Sender)
{
    for (std::list<TControl*>::iterator i = controls.begin(); i != controls.end(); ++i)
    {
        delete *i;
    }
    controls.clear();
}
//---------------------------------------------------------------------------



PM MAIL Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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