Form erkennen



  • kann ich den Formular Namen eines Forumlar ermitteln?

    Also ich habe eine Header Datei in der ist zum beispiel folgender COde:

    void Image1_MouseDown(TObject *Sender, TMouseButton Button)
    {
            if(Button==mbLeft)
            {
                    ReleaseCapture(); //stellt gewohnte Bearbeitung der Mausnachrichten wieder her
                    SendMessage (Form1->Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0L); //simuliert klicken auf Titelleiste
            }
    }
    

    da ist ja eine genaue Formular bezeichnung
    Form1->Handle
    da die Header Datei auf mehreren Formularen sein soll macht sich das schlecht, kann man irgendwie ermitteln welches Forumlar gerade genutzt wird?
    Hoffe ihr versteht mein Problem.



  • Über den Parent des Sender sollte sich das wohl machen lassen.

    SendMessage (dynamic_cast<TImage*>(Sender)->Parent->Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0L);
    

    Das ist jetzt quick'n dirty, du müsstest naürlich noch sicherstellen, dass das Casten erfolgreich war, wirklich eine TForm als Parent ermittelt wurde usw.



  • was, wenn das Ding auf Panels sitzt, dieses Panel wiederum auf ein anderes Panel ?

    ich ziehe sowas vor:

    if(dynamic_cast<TImage*>(Sender) && GetParentForm(dynamic_cast<TImage*>(Sender))) // das Image muss nicht unbeding ein Elternfenster haben
     {
      GetParentForm(dynamic_cast<TImage*>(Sender))->Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0L);
    
     }
    

    [ Dieser Beitrag wurde am 02.02.2003 um 11:59 Uhr von AndreasW editiert. ]



  • Nagut, aber ich hoffe, dir ist zumindest das redundante Casten ein bischen peinlich. 😉



  • 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