Wheel Problem mit Frames
-
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