Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > показ и скрытие диалоговой формы


Автор: Severyanin 6.12.2008, 08:50
мне нужно организовать простейший итератор. Есть форма и функция-член класса другой формы. мне необходимо, чтобы они крутились в цикле, вызывая друг друна по-очереди. На форме есть поля ввода, лэйблы и кнопка. Когда я все это делаю с помощью методов Show-Hide, то нормально не отображаются кнопка и эдиты, а если использую ShowModal, то на второй итерации прога валится с ошибкой "cannot show then wisible form modal", хотя предварительно эта форма скрывается.  Подскажите, пожалуйста. как мне реализовать этот фокус 

Автор: Dmi3ev 6.12.2008, 20:03
кусок кода посмотреть дайте.

Автор: 586 6.12.2008, 20:39
Цитата(Severyanin @  6.12.2008,  08:50 Найти цитируемый пост)
а если использую ShowModal, то на второй итерации прога валится с ошибкой "cannot show then wisible form modal", хотя предварительно эта форма скрывается. 

При использовании ShowModal закрывайте диалог указанием свойства ModalResult (программным путём). При указании этого свойства диалоговое окно будет закрыто и метод ShowModal вернёт код, который находится в свойстве ModalResult.

Добавлено через 10 минут и 31 секунду
Код
void __fastcall TForm2::CloseButtonClick(TObject *Sender)
{
    ModalResult = mrOk;
    // ModalResult = 1;  // любое значение, отличимое от нуля
}

Автор: Severyanin 8.12.2008, 07:04
586, я так и делаю. только я присваивал этой переменной значение 2. 
Вот код функции-итератора:
Код

void Iteration(void){
    AnsiString name_buf,type_buf,num_buf;
   
    name_buf = convert_char_to_str(measures[iterator_count]->UserName,24);
    type_buf = convert_char_to_str(measures[iterator_count]->OporaType,24);
    num_buf  = convert_char_to_str(measures[iterator_count]->OporaNumber,24);
    
    Form3->Edit1->Text = name_buf;
    Form3->Edit2->Text = IntToStr((unsigned short)measures[iterator_count]->cur_day)+"."+IntToStr((unsigned short)measures[iterator_count]->cur_month)+"."+IntToStr(measures[iterator_count]->cur_year);
    Form3->Edit3->Text = FloatToStr(measures[iterator_count]->R_Zemli);
    Form3->Edit4->Text = IntToStr(measures[iterator_count]->UstanovkaYear);
    Form3->Edit5->Text = type_buf;
    Form3->Edit6->Text = "";
    Form3->Edit7->Text = "";
    Form3->Edit8->Text = "";
    //Form3->ModalResult = mrOk;
    Form3->ShowModal();
   
                //iterator_count++;
        /*} else{
                iterator_count = 0;
                return;
        }  */
}

А вот код всех обработчиков вызываемой формы
Код

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

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
extern HANDLE DbMutex;
extern DWORD Result;
extern TOporaMeasures *measures;
extern unsigned int iterator_count;
extern unsigned short num_blocks;
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
/*__fastcall TForm3::~TForm3(TComponent* Owner)
        : TForm(Owner)
{
        
} */
//---------------------------------------------------------------------------


void __fastcall TForm3::Button1Click(TObject *Sender)
{
    AnsiString name_buf,type_buf,num_buf;
    //name_buf = convert_char_to_str(measures[iterator_count].UserName,24);
    //type_buf = convert_char_to_str(measures[iterator_count].OporaType,24);
    //num_buf  = convert_char_to_str(measures[iterator_count].OporaNumber,24);
    //ShowMessage(name_buf);
    //ShowMessage(StrToInt(name_buf.Length()));
    //ShowMessage(type_buf);
    //ShowMessage(StrToInt(type_buf.Length()));
    //ShowMessage(num_buf);
    //ShowMessage(StrToInt(num_buf.Length()));
    if((Edit1->Text == "")||(Edit2->Text == "")||(Edit3->Text == "")||(Edit4->Text == "")||(Edit5->Text == "")){
        ShowMessage("Заполните, пожалуйста, все обязательные поля формы");
        return;
    } else{
        //Form3->Visible = false;
        Form3->Close();
        Form3->ModalResult = mrOk;
        Form1->Visible = true;
        do
                Result = WaitForSingleObject(DbMutex,10);
        while(Result == WAIT_TIMEOUT);
        DbMutex = OpenMutex(SYNCHRONIZE,false,"DbMutex");

        AnsiString query_buf;
        /*query_buf = "INSERT INTO params(U0,I1,U1,I2,U2,Uc,I1o,U1o,I2o,U2o,Uco,Ute,Ite,U0op,Uop,Roz,Ust_year,Num_op,Type,Meas_date,FIO_OPER,Rb,Rgr,C1,C2,Tau1,Tau2,DeltaU,Rbo,Rgro,C1o,C2o,Tau1o,Tau2o,DeltaUo,Rrast,Rte,Istek,Risk_group,Peregon,ECHK,Dist,Device_id,Uote,R_Zemli,skoU0,Tau1u,C1u0,K3,UC5,Next_date) VALUES("\
        +FloatToStr(measures[iterator_count].U0)+","+FloatToStr(measures[iterator_count].I1)+","+FloatToStr(measures[iterator_count].I2)+","+FloatToStr(measures[iterator_count].U2)+","+FloatToStr(measures[iterator_count].Uc)\
        +","+FloatToStr(measures[iterator_count].I10)+","+FloatToStr(measures[iterator_count].U10)+","+FloatToStr(measures[iterator_count].Uc5)+","+FloatToStr(measures[iterator_count].U0te)+","+FloatToStr(measures[iterator_count].U0op)+","+FloatToStr(measures[iterator_count].Uop)+","+FloatToStr(measures[iterator_count].R_Zemli)\
        +","+Form3->Edit6->Text+","+num_buf+","+Form3->Edit3->Text+","+Form3->Edit5->Text+","+Form3->Edit1->Text+","+FloatToStr(measures[iterator_count].R_beton)+","+FloatToStr(measures[iterator_count].R_gran)+","+FloatToStr(measures[iterator_count].C1i)\
        +","+FloatToStr(measures[iterator_count].C2)+","+FloatToStr(measures[iterator_count].Tau1i)+","+FloatToStr(measures[iterator_count].Tau2)+","+FloatToStr(measures[iterator_count].DeltaU)+","+FloatToStr(measures[iterator_count].R_beton0)+","+FloatToStr(measures[iterator_count].Tau1u0)+","+FloatToStr(measures[iterator_count].Tau2)+","+FloatToStr(measures[iterator_count].DeltaU0)\
        +","+FloatToStr(measures[iterator_count].Rrast)+","+FloatToStr(measures[iterator_count].Rte)+","+FloatToStr(measures[iterator_count].Istek)+","+IntToStr((short)measures[iterator_count].K)+","+Form3->Edit4->Text+","+Form3->Edit7->Text+","+Form3->Edit8->Text+",1,"+FloatToStr(measures[iterator_count].U0te)+","+FloatToStr(measures[iterator_count].R_Zemli)\
        +","+FloatToStr(measures[iterator_count].skoU0)+","+FloatToStr(measures[iterator_count].Tau1u)+","+FloatToStr(measures[iterator_count].C1u0)+","+FloatToStr(measures[iterator_count].K3)+","+FloatToStr(measures[iterator_count].Uc5)+","+IntToStr((short)measures[iterator_count].next_day)+"."+IntToStr((short)measures[iterator_count].next_month)+"."+IntToStr(measures[iterator_count].next_year)+")";
        */
        if(((Form3->Edit1->Text).Pos("@")!=0)||((Form3->Edit1->Text).Pos("|")!=0)){
            if(iterator_count+1 < num_blocks*64){
                                iterator_count++;
                                Form3->Close();
                                Form3->ModalResult = mrOk;
                                //Form3->Visible = false;
                                Iteration();
                        } else{
                                iterator_count = 0;
                                //Form3->Hide();
                                Form3->ModalResult = mrOk;
                                Form3->Close();
                                Iteration();
                                //Form3->Visible = false
            }
            //Form3->Hide();

            //Form3->Visible = false;
            return;
        }
        if(((Form3->Edit5->Text).Pos("@")!=0)||((Form3->Edit5->Text).Pos("|")!=0)){
            if(iterator_count+1 < num_blocks*64){
                                iterator_count++;
                                //Form3->Hide();
                                Form3->Close();
                                Form3->ModalResult = mrOk;
                                //Form3->Visible = false;
                Iteration();
            }           else{
                                iterator_count = 0;
            }
            //Form3->Hide();
                        Form3->Close();
            //Form3->Visible = false;
                        Form3->ModalResult = mrOk;
                        //Form3->Visible = false;
            return;
        }
        Form1->ADOQuery1->Close();
        Form1->ADOQuery1->SQL->Clear();
        Form1->ADOQuery1->SQL->Add("INSERT INTO params(U0,I1,U1,I2,U2,Uc,I1o,U1o,I2o,U2o,Uco,Ute,Ite,U0op,Uop,Roz,Ust_year,Num_op,Type,Meas_date,FIO_OPER,Rb,Rgr,C1,C2,Tau1,Tau2,DeltaU,Rbo,Rgro,C1o,C2o,Tau1o,Tau2o,DeltaUo,Rrast,Rte,Istek,Risk_group,Peregon,ECHK,Dist,Device_id,Uote,R_Zemli,skoU0,Tau1u,C1u0,K3,UC5,Next_date) VALUES("\
        +FloatToStr(measures[iterator_count].U0)+","+FloatToStr(measures[iterator_count].I1)+","+FloatToStr(measures[iterator_count].I2)+","+FloatToStr(measures[iterator_count].U2)+","+FloatToStr(measures[iterator_count].Uc)\
        +","+FloatToStr(measures[iterator_count].I10)+","+FloatToStr(measures[iterator_count].U10)+","+FloatToStr(measures[iterator_count].Uc5)+","+FloatToStr(measures[iterator_count].U0te)+","+FloatToStr(measures[iterator_count].U0op)+","+FloatToStr(measures[iterator_count].Uop)+","+FloatToStr(measures[iterator_count].R_Zemli)\
        +","+Form3->Edit6->Text+","+Form3->Edit1->Text+","+Form3->Edit3->Text+","+Form3->Edit5->Text+","+Form3->Edit1->Text+","+FloatToStr(measures[iterator_count].R_beton)+","+FloatToStr(measures[iterator_count].R_gran)+","+FloatToStr(measures[iterator_count].C1i)\
        +","+FloatToStr(measures[iterator_count].C2)+","+FloatToStr(measures[iterator_count].Tau1i)+","+FloatToStr(measures[iterator_count].Tau2)+","+FloatToStr(measures[iterator_count].DeltaU)+","+FloatToStr(measures[iterator_count].R_beton0)+","+FloatToStr(measures[iterator_count].Tau1u0)+","+FloatToStr(measures[iterator_count].Tau2)+","+FloatToStr(measures[iterator_count].DeltaU0)\
        +","+FloatToStr(measures[iterator_count].Rrast)+","+FloatToStr(measures[iterator_count].Rte)+","+FloatToStr(measures[iterator_count].Istek)+","+IntToStr((short)measures[iterator_count].K)+","+Form3->Edit4->Text+","+Form3->Edit7->Text+","+Form3->Edit8->Text+",1,"+FloatToStr(measures[iterator_count].U0te)+","+FloatToStr(measures[iterator_count].R_Zemli)\
        +","+FloatToStr(measures[iterator_count].skoU0)+","+FloatToStr(measures[iterator_count].Tau1u)+","+FloatToStr(measures[iterator_count].C1u0)+","+FloatToStr(measures[iterator_count].K3)+","+FloatToStr(measures[iterator_count].Uc5)+","+IntToStr((short)measures[iterator_count].next_day)+"."+IntToStr((short)measures[iterator_count].next_month)+"."+IntToStr(measures[iterator_count].next_year)+")");
        Application->MessageBox("query begin","Системное сообщение",MB_OK);
        Form1->ADOQuery1->Open();
        ReleaseMutex(DbMutex);
        if(iterator_count+1 < num_blocks*64){
                iterator_count++;
                //Form3->Hide();
                Form3->Close();
                Form3->ModalResult = mrOk;
                //Form3->Visible = false;
                Iteration();
        } else{
                iterator_count = 0;
        }
    }
        //this->Hide();
    Form3->Close();
    Form3->ModalResult = mrOk;
    //Form3->Visible = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormCreate(TObject *Sender)
{
        //Edit1->Text = Form1->ComboBox1->->Caption;        
}
//---------------------------------------------------------------------------

void __fastcall TForm3::FormClose(TObject *Sender, TCloseAction &Action)
{
    if((Edit1->Text == "")||(Edit2->Text == "")||(Edit3->Text == "")||(Edit4->Text == "")||(Edit5->Text == "")){
        ShowMessage("Заполните, пожалуйста, все обязательные поля формы");
        return;
    } else{
        //Form3->Visible = false;
        Form3->ModalResult = mrOk;
        Form1->Visible = true;
    }
   // inf_flag = true;
    //if(FormMutex != 0)
        //ReleaseMutex(FormMutex);
}
//---------------------------------------------------------------------------

void __fastcall TForm3::FormShow(TObject *Sender)
{
        ///inf_flag = false;
       //FormMutex = OpenMutex(SYNCHRONIZE,false,"FormMutex");
       //Edit1->Show();
       //Edit2->Show();
       //Edit3->Show();
       //Edit4->Show();
       //Edit5->Show();
       //Edit6->Show();
       //Edit7->Show();
       //Edit8->Show();
}
//---------------------------------------------------------------------------

И еще, у меня просьба будет. Скиньте, пожалуйста, исходники какого-нибудь работающего проекта на Билдере, где бы использовалось управление видимостью форм

Автор: Severyanin 9.12.2008, 13:32
Всем спасибо за участие, просто я заглючил хорошо так. проблема решена

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)