Form erkennen



  • ja schon, war aber weniger Schreibarbeit 😉



  • Hmm, eigentlich ist doch genau das Gegenteil der Fall!?

    TImage *img = dynamic_cast<TImage*>(Sender);
    if(img && GetParentForm(img))
      GetParentForm(img)->Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0L);
    


  • Nicht zu vergessen:

    img = NULL;
    

    😉

    @Jansen: Schonmal was von Copy & Paste gehört? 😉



  • Wenn img = NULL dann ist es automatisch false.

    Edit:
    Achso, jetzt sehe ich erst was du meinst. Der obige Text kann also vergessen werden. 🙂

    [ Dieser Beitrag wurde am 02.02.2003 um 14:20 Uhr von Jansen editiert. ]



  • Original erstellt von Jansen:
    Hmm, eigentlich ist doch genau das Gegenteil der Fall!?[code]

    nicht wenn du:

    dynamic_cast<TImage*>(Sender);

    in der Zwischenablage hast *G*



  • Warum ist bei solchen Funktionen wie

    void Image1_MouseDown(TObject *Sender, TMouseButton Button)

    immer ein TObject der Sender? Warum haben die das nicht so gemacht das das ein TForm ist?



  • Ich mein, weil das ewige casten nervt. vorallendingen weils auch noch ein schlimmer cast ist, finde ich



  • Hab jetzt folgendes gemacht, mit eurer Methode wollte es irgendwie nicht so hinhauen.

    for(int i=0; i <Screen->FormCount; i++)
            {
                    jpg->LoadFromFile(ExtractFilePath(Application->ExeName)+"close.jpg");
                    close=new TImage(Screen->Forms[i]);
                    close->Picture->Bitmap->Assign(jpg);
                    close->AutoSize=true;
                    close->OnMouseDown=Form1->MenueButtonMouseDown;
                    close->OnMouseMove=Form1->MenueButtonMouseMove;
                    close->ShowHint=true;
                    close->Parent=Screen->Forms[i];
                    close->Hint="Schließen";
    }
    

    funktioniert soweit auch ganz gut nur bei der Zeile
    close->OnMouseDown=Form1->MenueButtonMouseDown;
    close->OnMouseMove=Form1->MenueButtonMouseMove;

    meckert er. Wie kann ich da auf die funktion in dem Formular zugreifen ohne das halt vorher das Formular bekannt ist.



  • sorry

    close->OnMouseDown=Form1->MenueButtonMouseDown;
    close->OnMouseMove=Form1->MenueButtonMouseMove;

    sollte natürlich heißen

    close->OnMouseDown=Screen->Forms[i]->MenueButtonMouseDown;
    close->OnMouseMove=Screen->Forms[i]->MenueButtonMouseMove;



  • Du solltest dir darüber im Klaren sein, dass Screen->Forms[i] wirklich ALLE Formulare durchgeht. Ist da auch nur eines dabei, welches keine solche Memberfunktion besitzt, hast du verloren. Ich würde vorschlagen, du benutzt doch die von Jansen gepostete Methode. Und mach erstmal nen normalen Cast. Wenn das klappt, dann ändere ihn in einen C++-Cast. Also erstmal so:

    void __fastcall TForm1::Images_MouseDown(TObject* Sender, ...)
    {
       TImage* img = (TImage*)Sender;
       if(img)
       {
          if(Button == mbLeft)
          {
             ReleaseCapture();
             img->Parent->Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0L);
          }
       }
    }
    

    Beim Erstellen der Images schreibst du dann nur (sofern das Erstellen in der Klasse TForm1 vor sich geht)

    TImage* close = new TImage(this);  // Der Owner ist ziemlich egal
    ...
    close->OnMouseDown = Images_MouseDown;
    

Anmelden zum Antworten