Form schliessen



  • @dreaddy
    Sollte so auch funktionieren, ist vielleicht sogar "schöner" ;). Allerdings braucht man dann das Close() in der if Abfrage nicht, da ja keine Form geshowed wurde.

    @others
    Man kann natürlich auch bei Torry nach ner entsprechenden Kompo suchen :D:D:D



  • dreaddy schrieb:

    gehts nicht mit einer übergeordneten Funktion? Im Sinne von

    void TForm2::show_or_die(void)
    {
     
      bool bedingung = finde_raus_obs_geht();
    
      if(!bedingung)
      Show();
      else
      Close();
    }
    

    ?

    Statt Form2 -> Show(); müsstest du dann halt nur Form2 -> show_or_die(); aufrufen

    hm, weiss nicht obs so wirklich geht, kann ja auch mal ein bisschen code zeigen...
    also, meine OnShow-Funktion:

    void __fastcall TParameterliste_Frm::FormShow(TObject *Sender)
    {
    Wait_Frm->Show();                                     // Warte Formular anzeigen, damit was passiert auf dem Screen während der Benutzer warten muss.
    Wait_Frm->Top = Screen->Height/2 - Wait_Frm->Height/2;// Form in der Mitte des Bildschirms platzieren
    Wait_Frm->Left = Screen->Width/2 - Wait_Frm->Width/2; // Form in der Mitte des Bildschirms platzieren
    Send_Btn->Enabled=false;                              // Send-Button disablen weil es noch nicht funktioniert...!
    Profi_p = new TProfibus(); //Instanz von TProfibus erstellen
    Main_Frm->StatusBar1->SimpleText="Parameterliste wird gestartet...";
    
      try{
      Tools::GetFormPos(this);
      }
      catch(...)
      {
      }
    if (Main_Frm->lan)
    {
    Grid->Cells[0][0]= "Nummer";
    Grid->Cells[1][0]= "Name";
    Grid->Cells[2][0]= "Wert (Hex)";
    
    }
    else
    {
    Grid->Cells[0][0]= "Number";
    Grid->Cells[1][0]= "Name";
    Grid->Cells[2][0]= "Value (Hex)";
    }
    Main_Frm->StatusBar1->SimpleText="Parameter aus INI-File einlesen...";
    
    ParamFile = new TIniFile(ExtractFileDir(ParamStr(0)) + "\\param.ini"); // Instanz auf IniFile
    Grid->ColWidths[0]=50;             // Breite der Spalten festlegen
    Grid->ColWidths[1]=250;            // Breite der Spalten festlegen
    Grid->ColWidths[2]=70;             // Breite der Spalten festlegen
    AnsiString AlreadyUsed_AS="";      // Variable deklariert in der der bereits gebrdauchte IND-String gespeichert wird
    for (int i=1; i<=1000; i++)
      {
      Grid->RowCount=Grid->RowCount+1; // ...eine Zeile hinzufügen
      Grid->FixedRows=1;               // fixed rows für die beschriftung festlegen
      Grid->Cells[1][Grid->RowCount]=ParamFile->ReadString("Parameters",i,"100000");// ^Parameter aus INI-File lesen und in Tabelle einfügen
      if (Grid->Cells[1][Grid->RowCount]=="100000")// Wenn beim auslesen aus Ini-File als Defaultwert 1000 eingefüllt wurde...
        Grid->RowCount=Grid->RowCount-1;// Eine Zeile löschen
      else
        Grid->Cells[0][Grid->RowCount]=i;// Parameternummer einfügen
      if (Grid->Cells[1][Grid->RowCount].Pos("(IND)")&&Grid->Cells[1][Grid->RowCount]!=AlreadyUsed_AS)// Wenn (IND) irgendwo im Parameter steht
        {
        AlreadyUsed_AS=Grid->Cells[1][Grid->RowCount];
        for (int IND_int=1; IND_int<=256; IND_int++)
          {
          Grid->RowCount=Grid->RowCount+1;// eine Zeile hinzufügen
          Grid->Cells[1][Grid->RowCount]=ParamFile->ReadString("Parameters",AnsiString(i)+"."+AnsiString(IND_int),"100000");// ^Parameter aus INI-File lesen und in Tabelle einfügen
          if (Grid->Cells[1][Grid->RowCount]=="100000")// Wenn beim auslesen aus Ini-File als Defaultwert 1000 eingefüllt wurde...
            {
            Grid->RowCount=Grid->RowCount-1;// Eine Zeile löschen
            break;
            }
          else
            Grid->Cells[0][Grid->RowCount]=AnsiString(i)+"."+AnsiString(IND_int);// Parameternummer einfügen à la system, das der IND-Wert hinter dem Punkt steht, z.B. 17.1
          }
        }
      }
    Main_Frm->StatusBar1->SimpleText="Parameterwerte aus Motor lesen...";
    PPO2 recStruct;
    for (int i=3; i<=Grid->RowCount;i++)
      {
      recStruct=ReceiveValues(i);
      Grid->Cells[2][i]=Tools::HexStringToShort(AnsiString(IntToHex(recStruct.PWE2,2)+IntToHex(recStruct.PWE1,0)));
      }
      Main_Frm->StatusBar1->SimpleText="fertig";
      Wait_Frm->Close(); // WarteFormular schliessen.
      }
    

    und die funktion, in der ich bestimmen will ob das formular geöffnet werden soll oder nicht:

    PPO2 __fastcall TParameterliste_Frm::ReceiveValues(int ActualRow)
    {
    PPO2 receivedStruct;
    int paramnum;
    AnsiString paramnumber_AS=Grid->Cells[0][ActualRow];
    if (paramnumber_AS.Pos("."))
      {
      AnsiString fullstring_AS=Grid->Cells[0][ActualRow];
      paramnum=paramnumber_AS.Delete(3,2).ToInt();
      receivedStruct.PKE=0x6000;
      receivedStruct.IND=(fullstring_AS.Delete(1,3).ToInt())<<8;       // vordere 2 zahlen und punkt löschen und dann in int wandeln
      }
    else
      {
      receivedStruct.IND=0;
      paramnum=paramnumber_AS.ToInt();
      receivedStruct.PKE=0x1000;
      }
    
    Profi_p->RecParam(&receivedStruct,paramnum);
    /****/
      int i;
      for (i=0; i<=20 && (Main_Frm->result.PKE &0x0fff) != paramnum; i++)
         {
         Profi_p->ReadSlave(Main_Frm->SlaveID_ED->Text.ToInt(),&Main_Frm->result);
         int result_int=Tools::HexStringToShort(AnsiString(IntToHex(Main_Frm->result.PWE2,2)+IntToHex(Main_Frm->result.PWE1,0)));
         Profi_p->RecParam(&receivedStruct,paramnum);
         Sleep(100);
         }
      if (i>20)
        {
        if (Main_Frm->lan)
          {// MSGBox zeigen und wert der Buttons in eine ver. schreiben.
          int ergebniss=Application->MessageBox(AnsiString("Abrufen des Parameters misslungen!\nNummer:"+AnsiString(paramnum)).c_str(),AnsiString(paramnum).c_str(),21);
          StatusBar1->SimpleText = "abrufen min. eines Parameters misslungen!";
          if (ergebniss==4)
          {
          // wiederholen
          i--;  // i um eins dekrementieren damit der selbe parametre nochmals abgefragt wird.
          }
          else if (ergebniss==2)
          {
          // abbrechen, hier sollte das Formular geschlossen werden....
          Parameterliste_Frm->Close();  // Form schliessen
          }
          }
        else
          {
          Application->MessageBox(AnsiString("Faild, getting the Parameter!\nNummer:"+AnsiString(paramnum)).c_str(),AnsiString(paramnum).c_str(),21);
          StatusBar1->SimpleText = "getting Parameters failed!";
          }
        }
    
    return  Main_Frm->result;
    }
    


  • Beeindruckend 🙄
    Meinst Du es hat jemand Bock sich durch den Quellcode zu ackern und das für Dich zu probieren ?



  • Peter schrieb:

    Beeindruckend 🙄
    Meinst Du es hat jemand Bock sich durch den Quellcode zu ackern und das für Dich zu probieren ?

    Nein, das sicher nicht, hab' nur gedacht so kann sich vielleicht jmd in etwa vorstelllen um was es etwa geht... :p



  • Fremden Code auf Anhieb zu verstehen ist wohl sicherlich nicht ganz so einfach. Wenn ich ne Menge Code sehe der mich eigentlich nicht ganz so brennend interessiert, wende ich mich meist ganz schnell wieder ab. Warum probierst Du nicht selber etwas rum ? Du kennst Deinen Code und die Logik die sich dahinter verbirgt am Besten 😉



  • *.h

    #define MSG_IMPPROGRESS   (WM_USER + 2314)
    ...
    
    private:
      void OnProgress(TMessage Msg);
    
    public:		// Anwender-Deklarationen
      __fastcall TForm1(TComponent* Owner);
    
    BEGIN_MESSAGE_MAP
      VCL_MESSAGE_HANDLER(MSG_IMPPROGRESS, TMessage, OnProgress);
    END_MESSAGE_MAP(TForm);
    

    in *.cpp

    void __fastcall TForm1::FormActivate(TObject *Sender)
    {
      PostMessage(Handle, MSG_IMPPROGRESS, 0, 0);
    }
    //---------------------------------------------------------------------------
    void TForm1::OnProgress(TMessage Msg)
    {
      if (iregendwas_nicht_stimmt)
        Close();
    }
    


  • Peter schrieb:

    Fremden Code auf Anhieb zu verstehen ist wohl sicherlich nicht ganz so einfach. Wenn ich ne Menge Code sehe der mich eigentlich nicht ganz so brennend interessiert, wende ich mich meist ganz schnell wieder ab. Warum probierst Du nicht selber etwas rum ? Du kennst Deinen Code und die Logik die sich dahinter verbirgt am Besten 😉

    also, hab's jetzt so probiert:
    (code des TParameterliste_Frm-Forms, das ich evt. nicht öffnen will)

    if (ergebniss==4)
          {
          // wiederholen
          i--;  // i um eins dekrementieren damit der selbe parametre nochmals abgefragt wird.
          }
          else if (ergebniss==2)
          {
          // abbrechen
          PostMessage(Main_Frm->Handle, 333, 0, 0);
    //      Parameterliste_Frm->Hide();  // Form schliessen
          }
    

    und in meinem Main_Frm steht das:

    void __fastcall TMain_Frm::AppOnMessage(MSG& msg, bool&)
    {
       [noch mehr *messageabarbeitcode*]
       if (msg.message == 333)
         {
         ShowMessage("Got Message!");// Message anzeigen wenn msg der paramliste angekommen ist.
         }
    
    }
    

    die message kommt aber nicht an... 😞



  • Ähhh, hast Du überhaupt gelesen (und probiert) was ich weiter vorne geschrieben habe (das mit WM_CLOSE) 🙄
    Nur zur Info, das habe ich nämlich zur Sicherheit bei mir an einem Popelprojekt ausprobiert und es hat funktioniert !



  • oder auch das, was ich geschrieben habe??



  • Oder vielleicht auch das was dreaddy geschrieben hat 🙄

    Ich gebs auf.
    Schönes Wochenende
    und Tschüss 🕶



  • Wieso nimmst du nicht einfach das "OnActivate"-Ereignis? Dann wird das Fenster bereits angezeigt, und du kannst es ganz in Ruhe schließen, allerdings nicht mit Close() glaub ich, da m,üsstest du dann halt Application->Terminate() benutzen.



  • [quote="Windoof"]Wieso nimmst du nicht einfach das "OnActivate"-Ereignis? Dann wird das Fenster bereits angezeigt, und du kannst es ganz in Ruhe schließen, allerdings nicht mit Close() glaub ich, da m,üsstest du dann halt Application->Terminate() benutzen.[/quote]

    oh man, achtet ihr auch darauf, welche antworten es schon gab? auf seite 1 kam schon der tolle Trick mit Application->Terminate(), und dort erfährt man (falls man es bis jetzt noch nicht gemerkt hat) auch, das sich damit nur die ganze Anwendung schließen lässt. Ist wohl nicht im Sinne des Erfinders.

    da er daten holen will, und auf ein profibus protokoll zugreift, sieht es nach einen automatisierten prozess aus, ich glaube nicht, das man sich dann da hin stellt, und andauernd da programm startet, damit er jetzt seine daten bekommen könnte. ok, schafft vielleicht arbeitsplätze! 🕶

    ZUM PROBLEM:

    also ich kann peters tipp da nur unterstützen, PostMessage(Handle,WM_CLOSE,0,0); funkt eigentlich immer wunderbar. allerdings könnte es auch sein, das bei dir klassen mit in spiel funken oder threads?

    aber kleine rüge @peter:
    wenn er hier schon fragt, finde ich ne antwort wie:"warum probierst du nicht selber mal...." echt doof, dann erfüllt so ein forum seinen zweck nicht.

    ich finde es ist schwachsinnig in einem forum nachzufragen, und dann so ne tollen antworten zu bekommen.

    es zwinkt hier niemand irgendjemanden dazu sich diesen thread anzusehen. 🙂

    gruß gerd



  • Wieso nicht einfach "Show" überschreiben und Show von TForm nur bei bestimmten Bedigungen dann aufrufen?
    Ihr geht alle völlig falsch an das Problem. Statt die Ursache der Schmerzen des Patienten zu finden, knappt Ihr ihm Ponstan (schmerzmittel) auf den Tisch...

    -junix



  • Wenn er die Schmerzmittel wenigstens mal nehmen würde 😃 Der Vorschlag von dreaddy geht ja so ungefähr in die von Dir vorgeschlagene Richtung. Ausserdem spricht nix dagegen aus vielen Vorschlägen auch mal eigene Ideen zu entwickeln. Aber der Trend in diesem Forum geht ganz deutlich in die Richtung Suche nach "pfannenfertigen Gerichten" oder klickfertigen Kompos. Diejenigen die sich noch intensiv mit der Programmierung beschäftigen und bereit sind eigene Energien zu entwickeln tauchen entweder selten oder garnicht hier auf oder sind Moderatoren.
    Sorry, aber ich hab "so'n Hals" 😞



  • Lieber Peter, meiner Meinung nach regst du dich hier nahezu umsonst auf. Deinen Vorschlag hatte roN bereits probiert, wie er es bereits gesagt hat. Und dass du dich so über das Posten des Codes aufregst, finde ich auch nicht gut. Auch wenn es ein wenig viel Code war. Natürlich hat roN recht, wenn er sagt, dass es manchmal sehr hilfreich ist, den anderen Code zu präsentieren, damit sie besser helfen können. Ich finde das besser als das Verhalten dieser ganzen Idioten, die denken, dass andere stets ihre Kristallkugel dabei haben. Ich denke, roN hat sich hier schon ganz gut verhalten. Der zeigt jedenfalls, dass ihm daran gelegen ist, dass ihm die anderen helfen. Andere scheinen das als selbstverständlich zu sehen (oder sind einfach dumm) und bemühen sich einen Dreck um Verständlichkeit.

    @roN: Versuch doch mal, die "Architektur" deines Projektes darzulegen. Keiner weiß, was bei dir die MainForm ist, und was die anderen Formen so machen.

    P.S.: Bei mir funzt es mit

    void __fastcall TForm2::FormShow(TObject *Sender)
    {
       PostMessage(Handle, WM_CLOSE, 0, 0);
    }
    

Anmelden zum Antworten