OnClick Ereignis



  • Hallo,
    soweit alles klar. weis aber noch nicht, wie ich in der Form an das gemeinsamen OnClick-Ereignis der Frame herankomme?
    Gruß Siegfried :schland:



  • Hallo

    da du deine Frage nicht wirklich präzisierst hast, schau dir einfach nochmal beide Links an.

    bis bald
    akari



  • Hallo,
    habe folgendes gemacht.
    in der Frame.cpp

    //--->          "Frame" n Label dynamisch erstellen
    void __fastcall TFrameMenue::FrameResize(TObject *Sender)
        if (!boStart)
          {   //  !boStart
          boStart=true;
            //
            for (int i=0; i<iNewLabelMax; i++)
              {   //  i=0; i<iNewLabelMax; i++
              NewLabel.Length++;
              NewLabel[i] = new TLabel(this);
              NewLabel[i]->Font->Size = 8;
              NewLabel[i]->Font->Color = clBlack;
              NewLabel[i]->Font->Style = TFontStyles()<< fsBold;
              NewLabel[i]->Top = LabelTop;
              NewLabel[i]->Width = 43;
              NewLabel[i]->Height = 13;
              NewLabel[i]->Tag = i+1;
              NewLabel[i]->OnClick = NewLabelClick;
              NewLabel[i]->OnMouseMove = NewLabelMouseMove;
              NewLabel[i]->Transparent = true;
              NewLabel[i]->Parent = this;
              NewLabel[i]->Show();
              }   //  i=0; i<iNewLabelMax; i++
            //
          }   //  !boStart
    }
    //---------------------------------------------------------------------------
    
    //--->          "Frame" Label OnClick Ereignis
    void __fastcall TFrameMenue::NewLabelClick(TObject* Sender)
    //
    //    erstellt am: 19. Juni 2005    geändert am: 30. Juni 2005
    //
    {
    //
        iLabelTag = dynamic_cast<TLabel*>(Sender)->Tag;
    //
    //
    }
    //---------------------------------------------------------------------------
    

    in der Form.cpp

    //--->          "Form" Label OnClick Ereignis
    void __fastcall TmyFormHaupt::FrameMenueNewLabelClick(TObject *Sender)
    {
    int iLabelTagIndex;
    FrameMenue->NewLabelClick(Sender);
    iLabelTagIndex = FrameMenue->iLabelTag;
    }
    //---------------------------------------------------------------------------
    

    Das gemeinsame OnClick-Ereignis aller n Label in der Frame funktioniert einwandfrei. Nun möchte ich auch, das ich dieses OnClick Ereignis der dynamisch erstellten Label in einer einzigen Routine in der Form bekommen.
    Gruß Siegfried 😞 😞 😞



  • Hallo

    also ich versteh dich so, das die Labels nicht eine Methode von dem Frame, sondern eine Methode von dem Form aufrufen soll?
    Da fällt mir zum einen nur ein das du damit den eigentlichen Sinn eines Frames negierst, nämlich das alle Controls eines Frames zusammengehören und keine direkten externen Mittel brauchen.
    Wenn du das trotzdem machen willst, must du eben entweder aus dem Parent des Frames das Form casten (wenn dein Form-Aufbau entsprechend aussieht). Oder du gibst dem Frame andersweitig den Pointer auf das übergeordnete Form.
    Dann must du natürlich die zuzuweisende Methode aus dem Form public machen.

    bis bald
    akari



  • Hallo,
    warscheinlich heute zu heiß, verstehe zu Zeit nichtsmehr.
    wenn ich in der Frame folgendes mache, habe ich das was ich möchte.

    NewLabel[i]->OnClick = FrameMenueNewLabelClick;
    

    Die NewLabelClick Routiene in der Frame ist für dieses Beispiel dann deaktiviert.
    zusätzlich habe ich in der Frame den Form.Header eingeschlossen. Dies möchte ich unter allen Umstande nicht tun. Da die Frame auch für zukünftige Projekte gedacht ist, möchte ich keine unbekannte Verbindungen haben.
    Das Ergebnis des OnClick der Frame wird nur in der Form "weiterverarbeitet"
    Wie muß ich die Zeilen
    NewLabel[i]->OnClick = FrameMenueNewLabelClick;
    NewLabel[i]->OnClick = NewLabelClick;
    umstellen ?
    Gruß Siegfried 😞 😞 😞



  • Hallo

    zusätzlich habe ich in der Frame den Form.Header eingeschlossen. Dies möchte ich unter allen Umstande nicht tun. Da die Frame auch für zukünftige Projekte gedacht ist, möchte ich keine unbekannte Verbindungen haben.

    Das Ergebnis des OnClick der Frame wird nur in der Form "weiterverarbeitet"

    merkst du den Widerspruch?
    Wobei ich wiie gesagt die erste Aussage unterstütze.
    Wenn die Verarbeitung in der Form erfolgt hast du einen Konzept-Fehler. Verleg lieber die Verarbeitung in das Frame.

    bis bald
    akari



  • Hallo,
    geht leider nicht. muß mir einen anderen Weg suchen.
    Nur noch eine Frage. Warum geht es von der Form auf die Frame mit festem Label zuzugreifen und warum geht es nicht, wenn dieses dynamisch erstellt wurden ?
    Trozdem vielen Dank.
    Gruß Siegfried 👍 👍



  • Hallo

    was du hingegen noch machen kannst ist selber einen Event einbauen

    class TFrameMenue :
    {
    ...
      public :
    
        // Eventpointer wird als Eigenschaft definiert, sodas der auch im OI gesetzt werden kann
        __property TNotifyEvent CustomLabelClick = {read = m_customlabelclick; write = m_customlabelclick};
    
      private :
    
        TNotifyEvent m_customlabelclick; // interner Eventpointer
    };
    
    // Implementation des Konstruktors, hier wird Initialsierung hinzugefügt
    TFrameMenue::TFrameMenue : 
    TForm(...), m_customlabelclick(0)
    {
      ...
    }
    void __fastcall TFrameMenue::NewLabelClick(TObject* Sender)
    {
      // Event wird weitergeschickt, wenn vorhanden
      if (m_customlabelclick) m_customlabelclick(Sender);
    }
    

    Jetzt kannst du sowohl zur Laufzeit als zur Entwurfszeit den neuen Event des Frames zuweisen, um den um Form zu benutzen.

    bis bald
    akari



  • Hallo,
    muß das Problem noch einmal anpacken. Habe von euch gute Info's bekommen, komme aber selber nicht weiter. Wer kann mir hier helfen ?
    Gruß Siegfried 😞 😞 😞



  • Hallo

    und wo genau kommst du nicht weiter? Wie ist dein aktueller Stand? Es wurden dir ja mehrere Möglichkeiten genannt.

    bis bald
    akari



  • Hallo,
    habe dies in der *.h

    public :
    // Eventpointer wird als Eigenschaft definiert, sodas der auch im OI gesetzt werden kann
        __property TNotifyEvent CustomLabelClick = {read = m_customlabelclick; write = m_customlabelclick};
    private :
      TNotifyEvent m_customlabelclick; // interner Eventpointer
    

    und dies in der *.cpp

    void __fastcall TFrameMenue::NewLabelClick(TObject* Sender)
    {
      // Event wird weitergeschickt, wenn vorhanden
      if (m_customlabelclick) m_customlabelclick(Sender);
    }
    

    eingebunden.
    Mit diesem Code stehe ich auf dem Schlauch.

    // Implementation des Konstruktors, hier wird Initialsierung hinzugefügt
    TFrameMenue::TFrameMenue : 
    TForm(...), m_customlabelclick(0)
    {
      ...
    }
    

    Ich weis nicht, wo dieser stehen muß?
    Gruß Siegfried



  • Hallo

    das ist die Implementierung des Konstruktors von dem Form.
    Eine solche Methode muß bereits in deinem Code des Formes vorhanden sein.
    Erkennbar an

    <Formname>::<Formname>
    :TForm()
    

    Dort sollst du nur die sogenannte Initialisierungsliste um

    , m_customlabelclick(0)
    

    erweitern.

    Für solche Sachen solltest du unbedingt erstmal OOP-Grundlagen beherschen.

    bis bald
    akari



  • Du kannst genauso

    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
       m_customlabelclick = 0;
    }
    

    schreiben. Ist die gleiche Wirkung. Ach ja, versuch mal bitte, dein Deutsch zu verbessern. Es ist teilweise kaum verständlich, was du da schreibst.


Anmelden zum Antworten