Wheel Problem mit Frames



  • Hi,

    In solchen Fällen rate ich erlich gesgt immer --> bei dynamischen Sachen
    Blöde Frage 🙂
    Hast du in der Frame-Klasse irgendwo unit1.h includiert. (im Zweifelsfall in der Frame.h und Frame.cpp)

    Grüsse



  • Ich muss sie includieren, ansonsten könnte ich die Frames nicht über das MainMenu erstellen 😃
    Aber wie gesagt klappt das nicht, da Zugriffsverletzung im laufenden Programm kommt.



  • Hi,

    es geht mir um die eventuell vielen Frames im Speicher.

    Wie sollen die wissen wo das '''übergeordneten Objekt des Steuerelements''' ist,
    wenn '''Handled==false''' ist.
    Ich kann ja falsch liegen das Form1 nicht das '''übergeordente Objekt'''' des Frames ist.
    Deshalb bin ich der Ansicht, dass in die Frame-Klasse das stehen muss
    #include <unit1.h> <---- in die Frame.h rein

    Grüsse



  • Ohne zum eigentlichen Thema etwas beitragen zu können:

    Bei Frames steht die Wiederverwendbarkeit im Vordergrund. Insofern wäre es tückisch, dort einen Verweis auf irgendeine Form zu verwenden. Die Forms müssen wissen, welche Frames es gibt. Nicht aber umgekehrt.

    Includes sollten vorzugsweise in der CPP-Datei durchgeführt werden. Nur wenn es absolut unumgänglich ist, sollten includes in der Header-Datei verwendet werden.



  • Jetzt entfernen wir uns aber langsam weit vom Thema.

    Nochmal Kurz zusammengefasst:
    In der TForm ist die TFrame Klasse eingebunden und in der TFrame Klasse ist die TFrom eingebunden, da beide miteinander Daten austauschen müssen.
    Würde die eine die andere nicht kennen, würde der Compiler schon meckern das ihm die Klasse unbekannt ist.



  • Hi,

    was ist in der ScrollBox1 auf dem Frame drin??
    (Das könnte dir den Fokus von der Scrollbox weg schnappen... PaintBox macht das nicht)
    Baue mir das schnell nach....... sage dann bescheid.

    Grüsse



  • In der ScrollBox liegt ein TImage welches natürlich den gesammten Platz wegnimmt. In TForm hat es auch keine Probleme mit 😉



  • Hi,

    mein Plan hat nicht funktioniert... und wäre auch nicht sehr konfortabel gewesen....

    in unit1.h

    private:	// Anwender-Deklarationen
    TScrollBox *hallo;
    //zum überschreiben deklarieren .... diese muss immer am Schluss von allen privaten Deklerationen stehen
    DYNAMIC bool __fastcall DoMouseWheel(Classes::TShiftState Shift, int WheelDelta, const Windows::TPoint &MousePos);
    

    in unit1.cpp

    //Im Konstruktor hallo auf 0 setzen!!!!
    
    //Hauptmausradfunktion überschreiben
    bool __fastcall TForm1::DoMouseWheel(Classes::TShiftState Shift, int WheelDelta, const Windows::TPoint &MousePos)
    {
     if(hallo!=0)
      {
        if (WindowFromPoint(MousePos)==hallo->Handle)
        {
            long msg = (Shift.Contains(ssShift)) ? WM_HSCROLL : WM_VSCROLL;
            long code = (WheelDelta>0) ? SB_LINEUP : SB_LINEDOWN;
            for (int i=1;i<Mouse->WheelScrollLines;i++)
            {
                hallo->Perform(WM_VSCROLL, code, 0);
                hallo->Perform(WM_VSCROLL, SB_ENDSCROLL, 0);
            }
        }
    } }//---------------------------------------------------------------------------
    
    //wenn in die ScrollBox geklickt wird .... das Scrollen starten
    void __fastcall TForm1::ScrollBox1MouseUp(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
     hallo = ScrollBox1;
    }
    //---------------------------------------------------------------------------
    

    Mein Plan war es nun... vom Frame aus Form1->hallo auf die dortige ScrollBox zu setzen.
    Dies Funktioniert nicht weil beim Compilieren oder Linken der Fehler kommt das nicht auf
    TForm1 zu geriffen werden kann.

    Sorry das es so lange gedauert hat musst mir erst noch eine ScrollMaus ausleihen.
    Vielleicht kann ja trotzdem irgend jemand daraus was lernen.

    Ich bin mir sicher das es ein Lösung gibt...... mir fällt nicht mehr ein

    Grüsse



  • Hi,

    Es geht doch!!! 🙂

    +++hallo++++ ist nicht public.

    Also die das MousWheel von den ScrollBoxen wird nicht mehr gebraucht.
    Sie werden auf die überschriebene DoMousWheel umgeleitet (wenn man das so sagen kann)

    Grüsse



  • Da hängt sich ja jemand richtig rein 😃

    Ohne das jetzt auszuprobieren, denke ich das du lediglich eine Umleitung gefahren bist. Unter TForm1 lief das scrollen ja auch bei mir. Das Problem bestand nur dann, wenn die ScrollBox in einem Frame liegt oder wenn man das Ereignis OnWheel direkt in der ScrollBox abfragen wollte.

    Dein Code fragt alles wieder auf TForm1 ab.

    Erstelle mal bitte über Menü->Datei->Neues Frame... pack dort eine ScrollBox rein mit einem grossen Image und lege jetzt über Komponentenpalette oben, bei Tab Standard das erste Icon TFrame in deine TForm1 rein.. es sollte eine Abfrage erscheinen welches Frame du einbinden willst. Da wählst dann dein Frame aus mit der ScrollBox .. so und dann probier nochmal die ScrollBox in dem Frame zu bewegen 🙄

    Ich habs mal hier ausprobiert, hatte leider nicht geklappt im Frame.



  • Hi Schnappi :-),

    Mir fällt nicht mehr dazu ein.
    Kann sein das es irgendwo eine richtig Umgangsweise beschrieben ist.

    Kannst ja versuchen, ob du es in einer Komponente besser lösen kannst.
    So wie ich das sehe, ist das Frame eine einfachere Art einer Komponente.
    Muss aber dazu sagen,
    dass ich noch nie eine ScrollBox in eine Komponente eingebaut hab.

    See you later Schnappi.

    Grüsse



  • Hi,

    So wie du es beschrieben hast hab ich das Frame eingebaut.

    Als erstes musst du in der Frame.cpp die unit.h deklarieren (auch wenn das nicht ganz richtig ist)
    Es geht nicht anderst du musst die unit.h includieren!!!!
    Includieren, deshalb damit du von jedem dynamisch angelegten Frame aus +++++hallo+++++ in der unit.h
    ändern kannst.

    Frame.cpp

    #include "unit1.h" //damit hallo in Form1 ein Wert zugewiesen
    .                       //werden kann (ist dort ein ScrollBox-Zeiger)
    .
    .
    .
    .
    .
    //wenn auf das TImage in der ScrollBox klicken
    void __fastcall TFrame2::Image1MouseUp(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
     Form1->hallo=ScrollBox1;   
    }
    //---------------------------------------------------------------------------
    

    Den Konfortvelust sehe ich darin, dass jedesmal in die ScrollBox geklickt werden muss,
    bevor man die ScrollBox ''scrolen kann''.
    Ein Weiter Nachteil ist wenn zufällig noch ein TRichEdit da ist, können diese ebenfalls nicht
    mehr ohne weiteres gescrollt werden.
    Dann muss Form1->hallo=RichEdit->.....Srcoll.... heissen.
    Ich sehe auf die Schnell keine bessere Lösung.
    Komponenten entwickeln macht am Anfang auch keinen sonderlichen Spass und ist sehr
    Zeitaufwendig.
    Ich bin aber davon überzeugt, wenn man eine Komponente von TPanel ableitet und darin
    ein ScrollBox mit Alingn->all einbaut wirst du keine Probleme mit der Mausradfunkion haben.
    Dazu muss man es allerdings erst schaffen die Mausradfunktion richtig in die Komponente zu
    vererben.

    Grüsse



  • Also jetzt muss ich dir mal fettes Dankeschön aussprechen. Wenn das mal keine freundliche Hilfe war und auch so extrem engagiert!

    Aber der wichtigste Satz und Lösungsschlüssel hast mal so nebenläufig erwähnt 😉

    Den Konfortvelust sehe ich darin, dass jedesmal in die ScrollBox geklickt werden muss, bevor man die ScrollBox "scrolen kann".

    Der Satz ist wie ein Leuchtfeuer losgegangen 😃
    Einfach Focus setzen und dann kannes losgehen mit scrollen, ja so einfach kann manchmal die Lösung sein. Folgender Code arbeitet primstens. 🤡

    //---------------------------------------------------------------------------
    void __fastcall TMyFrame::Image1MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
        ScrollBox1->SetFocus();
    }
    //---------------------------------------------------------------------------
    void __fastcall TMyFrame::ScrollBox1MouseWheel(TObject *Sender,
          TShiftState Shift, int WheelDelta, TPoint &MousePos, bool &Handled)
    {
        long msg = (Shift.Contains(ssShift)) ? WM_HSCROLL : WM_VSCROLL;
        long code = (WheelDelta>0) ? SB_LINEUP : SB_LINEDOWN;
        for (int i=1;i<Mouse->WheelScrollLines;i++)
        {
            ScrollBox1->Perform(WM_VSCROLL, code, 0);
            ScrollBox1->Perform(WM_VSCROLL, SB_ENDSCROLL, 0);
        }
    }
    //---------------------------------------------------------------------------
    


  • Hi Schnappi,

    Ich weis nicht ob du das Lied kennst '''Der um das Klo tantz'''
    Wir haben beide getantz...... ich etwas länger wie du.
    Danke
    Es ist noch einfacher als gedacht 🙂

    Grüsse


Anmelden zum Antworten