Announcement

Collapse
No announcement yet.

Problem nach Create Params

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem nach Create Params

    Hallo, ich habe folgendes Problem.
    <br><br>
    Aus meiner Mainform heraus kann der Benutzer eine ganze Reihe an Forms aufrufen, die einen eigenen Tasklisteneintrag haben. Dies erreichte ich mit dem Überschreiben der Funktion CreateParams.<br>
    Dies funktioniert auch einwandfrei.
    <br><br>
    Wenn ich jedoch aus einer dieser Vollbild-Unterforms(U1) eine nicht-Vollbild-Unterform(U2) aufrufe, dann gibt es einen unschönen Effekt.<br>
    Denn obwohl U1 Parent von U2 ist, wird die Mainform auf den Bildschirm geholt, wenn ich U2 ShowModal aufrufe. (Der Aufruf muss Modal sein!)
    <br>
    Sobald ich die Form U2 schließe, verschwindet
    die Mainform jedoch wieder und nur die Form U1 ist zu sehen.
    <br><br>
    Das sieht natürlich nicht so toll aus.
    Was kann ich dagegen tun?

  • #2
    Hallo Tobi,

    ich kann dieses Problem (mit BCB6) nicht nachvollziehen. Wenn ich ein nicht-modales Form (Vollbild) aus der MainForm öffne, und aus diesem Form ein modales Form öffne, bleibt das MainForm hinter dem nicht-modalen Form. Den von Dir beschriebenen Effekt habe ich nicht mal, wenn ich das modale Form aus dem nicht-modalen Form über eine Funktion in der MainForm aufrufe.

    Bringst Du an irgendeiner Stelle das MainForm zwangsweise in den Vordergrund? Kannst Du mal ein bißchen Code posten?

    Grüße Joche

    Comment


    • #3
      Hallo Jochen,
      <br>
      ich benutze auch BCB6.<br>
      Hier der entsprechende Code:<br>
      <PRE>
      Mainform:

      void __fastcall TfrmMenu::btnAISClick(TObject *Sender)
      {
      frmAIS->Show();
      }

      Unterform (frmAIS):

      void __fastcall TfrmAIS::btnKalenderClick(TObject *Sender)
      {
      frmPickDate = new TfrmPickDate(this);
      try {
      frmPickDate->Date = StrToDateTime(edDatum->Text);
      }
      catch (...)
      {
      frmPickDate->Date = TDateTime::CurrentDate();
      }
      if (frmPickDate->ShowModal()==mrOk) {
      edDatum->Text = frmPickDate->Date.FormatString(asFormatString);
      }
      }
      delete frmPickDate;
      }

      </PRE>
      Es handelt sich hier um eine Kalenderform, die aufgerufen wird.
      Der Effekt tritt jedoch vollkommen unabhängig von der Art der Form auf

      Comment


      • #4
        Hallo Tobi,

        an dem Teil des Codes liegt es nicht... Funktioniert bei mir wie Du es wünschst.<BR>
        Hm, mit was überschreibst Du CreateParams()?

        Ich hab's damit überschrieben (außer beim MainForm):
        <PRE>
        TForm::CreateParams(Params);
        Params.ExStyle |= WS_EX_APPWINDOW;
        Params.WndParent = GetDesktopWindow();
        </PRE>

        Notfalls könntest Du vor dem Anzeigen des modalen Forms das MainForm unsichtbar machen... (aber vorsicht, wenn Du OnHide() oder OnShow() im MainForm verwendest)

        Grüße Joche

        Comment


        • #5
          Hallo Jürgen,

          <PRE>
          void __fastcall TfrmAIS::CreateParams(TCreateParams &Params)
          {
          TForm::CreateParams(Params);
          Params.ExStyle |= WS_EX_APPWINDOW;
          Params.WndParent = GetDesktopWindow();
          }
          </PRE>

          genauso sieht es auch bei mir aus.<BR>
          Jedoch habe ich das in der Kalenderform nicht gemacht, ich benutze ja die CCalendar(?)-Form des Builders.<br><br>
          Gibt es sonst noch einen möglichen Grund?
          <br><br>
          Grüße Tob

          Comment


          • #6
            Ich kann die Mainform nicht unsichtbar machen, da diese ja auch wieder aktiviert werden können soll, um eine andere Form daraus aufzurufen

            Comment


            • #7
              Hallo Tobi,

              ohne das komplette Projekt, ist das für mich nur Raterei...

              <I>Ich kann die Mainform nicht unsichtbar machen, da diese ja auch wieder aktiviert werden können soll, um eine andere Form daraus aufzurufen.</I> <BR>
              Natürlich mußt Du es auch wieder sichtbar machen. ;-)<BR>
              z.B.:
              <PRE>
              MainForm->Visible = false; // oder MainForm->Hide();
              if (frmPickDate->ShowModal()==mrOk)
              {
              edDatum->Text = frmPickDate->Date.FormatString(asFormatString);
              }
              MainForm->Visible = true; // oder MainForm->Show();

              </PRE>
              Hast Du DSL? Dann könntest Du mir das Projekt mal mailen: [email protected]. <BR>
              Ich brauch die Datein mit folgender Endung <B>nicht</B>: .exe; .obj; .tds und natürlich auch nicht die Dateien mit Tilde ('~') als erstes Zeichen in der Endung.

              Grüße Joche

              Comment


              • #8
                Das ist leider nicht so einfach, das ganze ist ein Riesen-Projekt mit insgesamt > 50 Forms, das auf einer Oracle-Datenbank basiert

                Comment


                • #9
                  So, habe das ganze jetzt mal als Mini-Projekt rekonstruiert und maile dir das jetzt mal rüber

                  Comment


                  • #10
                    Hallo Tobi,

                    ist angekommen. Ohne jetzt großartig geprüft zu haben, was da im Detail passiert, hat es auf jeden Fall, damit zu tun, das das nicht-modale Form mit geänderter CreateParams aufrufst und das modale Form mit normalen Attributen aufrufst.

                    Wenn Du in dem modalen Form ebenfalls CreateParams überschreibst, funktioniert es wie gewünscht. Es funktioniert auch, wenn Du in dem nicht-modalen Form die CreateParams rausnimmst.

                    Unterm Strich kann mal also sagen, daß es korrekt funktioniert, wenn in der Aufrufkette der Forms alle CreateParams überschrieben sind, oder alle Forms mit Standard-CreateForms aufgerufen werden.

                    Grüße Joche

                    Comment


                    • #11
                      Das dachte ich mir schon. Jedoch handelt es sich in dem Projekt um eine standardisierte Kalender-Form, bei der das so wohl nicht möglich ist

                      Comment


                      • #12
                        Ich habe etwas neues herausgefunden: <br>

                        Bei einem Show ist immer die Mainform Parent der Unterform.
                        <br><br>
                        Weiß vielleicht jemand, ob und wie man das ändern kann

                        Comment


                        • #13
                          Hallo Tobi,

                          ich hätte nicht gedacht, daß das so schwierig ist...

                          Das setzen von Parent auf Form2 ist nicht möglich, auch nicht Parent = NULL. Das Fenster wird dann zwar korrekt angezeigt, läßt sich aber nicht mehr bedienen (friert ein).

                          Mir fällt im Moment auch nichts mehr ein.

                          Sorry,

                          Joche

                          Comment


                          • #14
                            Trotzdem danke Jochen

                            Comment


                            • #15
                              Hallo nochmal Tobi,

                              also vorweg: Eine elegante Lösung habe ich nicht gefunden, obwohl es da in der WinAPI bestimmt was gibt...

                              Aber Du kannst vor dem Öffnen des modalen Forms, das MainForm außerhalb des sichtbaren Bereiches schieben. z.B.
                              <PRE>
                              TForm3* ModalForm = new TForm3(NULL);
                              int Form1Top = Form1->Top;
                              Form1->Top = ScreenWidth + 10; // außerhalb des sichtbaren Bereiches verschieben
                              if (ModalForm->ShowModal() == mrOk)
                              {
                              // Aktion duchführen
                              }
                              Form1->Top = Form1Top; // MainFormposition wieder herstellen
                              delete Form3;
                              </PRE>
                              ModalForm ist das Kalenderform, Form1 ist das MainForm. Es wird nichts anderes gemacht, als das MainForm 10 Pixel unter den sichtbaren Bereich des Monitors zu schieben.

                              Dies funtkioniert, solange kein zweiter Monitor angeschlossen, dessen logische Position unter dem primären Monitor angeordnet ist. Da aber die meisten sekundären Monitore rechts oder links angeordnet sind... Ich habe nicht geprüft, was mit passiert, wenn virtuelle Desktops eingerichtet sind.

                              Grüße Joche

                              Comment

                              Working...
                              X