ScrollBox automatisch scrollen
-
Ohne Timer glatte Scrollbewegung, Geschwindigheit steuerbar.
Nachteil: Invalidate() ist unwirksam. Kleine Kostprobe - muß noch den Rest fertig machen:
void __fastcall TPixi::ScrollBoxMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { POINT pt; GetCursorPos(&pt); //falls Maus am rechten Rand if (pt.x > ScrollBox1->Left+ScrollBox1->Width) { ScrollBox->HorzScrollBar->Position+=1; // Invalidate() nicht wirksam Invalidate(); Sleep(1); } // im gleichen Stil noch die übrigen 3 Seiten ... }
@DerAltenburger, Mit dem Timer konnte ich nix gutes hinbekommen. Zwar war die Bewegung auch glatt, aber noch zu schnell. Hab alle Varianten mit Enabled durchprobiert, immer das gleiche. Die einmal angeregte Bewegung wird vom OnMouseMove immer wieder ausgelöst. Auch Stillstand ist MouseMove.
Ob sich irgendwie doch ein Invalidate(), Refresh()... erreichen läßT? Die Idee wär mir noch mal 30 Kamele wert, doch ich hab ja keine mehr. :p
-
Hi
Wenn Du das mit dem Timer probierst, DARF DAS SCROLLEN NICHT PARALLEL IN MouseMove AUSGELOEST WERDEN!
Timer ODER OnMouseMove! (Kannst das ja zum Test mal auskommentieren)
Das Tempo wird vom Timer und Deiner Berechnung gesteuert.
Der Timer loest alle INTERVALL msec ein Scrollen aus, Deine Berechnung sagt, wieviel Pixel jedesmal.
Pixel/sec = (1000 / Timer->Inervall) * Scrittweite !
Wenn OnMouseMove ebenfalls Scrollen ausfuehrt, rekursiert der wieder!
PS: Neh'm auch 8 Dromedare und 3 Haremsdamen :p
-
Und das war's dann erst mal. math.h ist mein Zeuge, daß ich von Mathe keine Ahnung hab. :p Das meint, eine steilere Kurve wär für höhere Zomfaktoren sicher noch besser. Immerhin kann das Refresh()-Geruckel in (vertretbaren) Grenzen gehalten werden. Feinheiten kann man aber jederzeit noch rausarbeiten. Wer eine Idee hat...
Hier mal die Fuction (ich hoff ja, dem Fragesteller wird halbwegs verziehen, wenn er Komplettlösungen postet?
):
void __fastcall TPixi::ScrollBoxMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { // float ZFac; // ZoomFaktor, im Header privat declariert POINT pt; GetCursorPos(&pt); // Mit Screenkoordinaten arbeiten if (pt.x > ScrollBox1->Left+ScrollBox1->Width && Tag == 0) { // rechter Rand // Scrollweg festlegen, Zoomfaktor mit einbeziehen ScrollBox->HorzScrollBar->Position+=cosh(2+ZFac/2); Tag = 1; // Scrollen und Refresh() im Wechsel } if (pt.x < ScrollBox1->Left && Tag == 0) { // linker Rand ScrollBox->HorzScrollBar->Position-=cosh(2+ZFac/2); Tag = 1; } if (pt.y > ScrollBox1->Top+ScrollBox1->Height && Tag == 0) { // unterer Rand ScrollBox->VertScrollBar->Position+=cosh(2+ZFac/2); Tag = 1; } if (pt.y < ScrollBox1->Top+ToolBar->Height && Tag == 0) { // oberer Rand ScrollBox->VertScrollBar->Position-=cosh(2+ZFac/2); Tag = 1; } if (Tag == 1) { Image->Refresh(); // Spuren der Arbeit beseitigen Tag = 0; // Auf Scrollen zurückschalten } }
-
Wie kann ich den Timer dann auslösen, wenn er gebraucht wird, sonst nicht? Zumindest muß ich ihn an der richtigen Codestelle enablen. Aber der Part ist überholt, es geht ja ohne.
- War eigentlich vorab schon klar, ich brauchte nur die Screenkoordinaten. Hoffentlich hat @webFritzi viel Freude an der Antiken Ölquelle - wenngleich sie natürlich schon lang nicht mehr fördert.
Dein PS ist viel wichtiger. Sei's um die Dromedare, sie sind dir gegönnt. Aber unter 5 Haremsdamen, das kann ich nicht entstehen lassen... bevor ich deutlich über 90 bin. Du siehst, ich bin bescheiden und... arm.
-
Den Timer lass ich dauernd laufen! Der steuert bei mir mehrere Komponenten. Jede Komponente, die ich takten will, hat ja 'ne eigene Funktion abbekommen, die das ausfuehrt. Die Ausfuehrung kann abhaenig von 'ner private "Status"- Variablen in jeder Kompo freigegeben / blockiert werden. Oder je nach Zustand (Anzeigen, Malen, ...) verschiedene Funktionen ausfuehren. :p
VORTEIL mit Timer: das laeuft auf jedem Rechner gleich schnell!!! (ausser der PC ist zu lahm, damm humpelts halt
PS: Grosser Dank fuer die Dromrdare. Hoffe, die kommen unbeschadet an.
Und Du hast wirklich nicht mal 37 Haremsdamen? Du bist arm dran - aber besser als Arm ab!
Dir sei verziehen!
-
Also ich bekomm ja ein richtig schlechtes Gewissen. Baust du Spiele? Da braucht man Systemunabhängige Abläufe. Man arbeitet zB. mit Ticks = 1/16 sec. Aber bei einer Anwendung wolte ich die Abläufe so schnell wie möglich haben. Bei kleineren Bildern läuft es glat, bei größeren ist (leider) die Refreshrate der Begrenzungsfaktor.
Als Nachteil bei dem Timer find ich vor allem, daß er bei jeder Zoomstufe gleich schnell arbeitet. Bei 100% wird das dann einfach zu schnell, wenn man es für höhere Vergrößerungen auslegt. Mit der Mathematik kann man da besser ausgleichen. Vielleicht findet jemand einen noch eleganteren Rechenalgor?
Kannst die Funktion ja mal probelaufen lassen. Ich hab die OnMouseMove-Routinen für die ScrollBox und das TImage zusammengelegt. Aber du hast ja ohnehin eine gemeinsame Klasse, da sollte es auf jeden Fal klappen.
37 Haremsdamen... Träum... das haben ja hier nicht mal die Stadträte. Kommst du aus 'ner Wohlstandsgegend? :p
-
Hi
Mit Spielen hat das nichts zu tun! Da kann man kaum direkt TImage nehmen - Du hast ja auch schon Flackereffekte u.ä.
Ich bastel nur 'n bissl mit Graphik, Sound und Video- Anzeigen 'rum.
Batel 'ne Suchmaschine, die Laufwerke und Netzwerkordner nach MultiMedia- Dateien durchforstet (Grafikfiles, Audio, Video und HTM(L)- Dateien), die Daten geeignet anzeigt (in 'ner Zoom- Scroll- Box / im WinMediaplayer / im MS- IE) - im Fenster oder Vollbild. Hintergrundmusik spielen braucht's auch. Grafiken (Thumbnails davon) als Uebersicht darstellen - in 'ner MultiImageScrollBox.
Beim 'AutoScroll' stoert mich, wenn das von Mausbewegung abhaengt und das Tempo vom System. Ist alles Ansichtssache!!!
Hab auch eine Thumbnail- Uebersicht am Bildschirmrand (wie IView) und dazu Autoscroll. Das fetzt durch wie Speedy Gonzales - dafuer nehm' ich den Timer - 3 - 5 Thumbnail / sec.
Was Du als Nachteil siehst bei Timer - "bei jeder Zoomstufe gleich schnell " - kann doch die Timer- Funktion mit 'einrechnen'???
!!! Deshalb sag ich: Spezielle Funktion in der Klasse (hat Zugriff auf alle
!!! Variablen) und Aufruf durch Timer von aussen.Meine Thumbnailliste roolt pro sec festgelegte Anzahl Bilder, EGAL wie gross die sind. Wenn die Maus zu weit weg ist tut sich nichts.(siehe letzter Tip mit der Farbe)
PS: Wozu habt Ihr Stadtraete, die kosten doch nur sinnlos TEUROS!
D#rum habt Ihr kein Geld fuern ordentlichen Harem :p
-
Na, für Spiele könnte man TImage gar nicht brauchen. Gerenderte Level und Models. Da würde das arne Teilchen schon vor dem Start durchglühen und schmelzen.
Aber ich seh schon wieder Unterschiede. Zum Bilder betrachten brauch ich keine Maus. Die Leertaste find ich da viel praktischer. Dann bestimm ich das Tempo. Ggf. die Pfeiltasten, um die Ztumbnails (seitenweise) zu schalten. Da will ich keine Maus im Bildschirm sehen. Ich mach das hier nur für's Malprogramm. Da isses OK, wie es jetzt ist.
Aber ich kapier nicht, wie du den Timer langsamer arbeiten läßt. Sonst geht es immer. Hier hatte ich das Interval bis 80000 hochgestellt. Es war, als hätte ich nichts geschrieben.
Netzwerk muß 'n interessanter Bereich sein. Aber mit dem BCB3 müßte man sich erst mal ein Gerüst aufbauen. Der unterstützt ja noch nichts. Macht auch nix, ich hab sowieso keine Ressourcen im Netz. Video und Medien brauch ich nicht. Den Minibedarf kann KaZaa mühelos decken. :p Ansonsten halt NetAnts. Was will ich mir da vergleichbares bauen? Um die oft miesen Verbindungen zu verbessern, gibt's sowieso keinen Code.
Aber deine Bemerxung zu den Stadträten find ich fies. Hier gibt's nun mal keine Schrotflinten, also haben wir Stadträte. Hide(); genügt nicht, um die wegzubringen. 37? ... ich glaub, ich zieh in 'ne bessere Gegend.
-
Original erstellt von DerAltenburger:
D#rumWie schaffst du das?
-
@Omega-X
Das mit der Maus in Graphik- Anzeigen ist von CAD- Programmen 'abgeguckt'.
Zoomen / Schieben / Markieren / Originalgroesse / Einpassen ... von Zeichnungsteilen. Bei mir sind alle 3 Tasten plus <Shift> und <Ctrl> mitbelegt. Die Maus haste sowieso in der Hand. Das Scrollrad ist ja nicht an allen PC da (Laptop ohne Maus?), das ist nur ne extra Funktion - Zoom / Schieben hoch / quer mit Sondertasten. Ist auch 'n bissl Spielerei.Das mit dem Timer:
-- in Timer- Routine der Kompo hab ich 'ne static Variable, die am Anfang
-- auf 0 gesetzt wird. Koennte auch private Var in Kompo sein.-- static int Teiler=0
-- In der Routine erfolgt Test if ((Teiler % 10)==0)
-- Nur wenn true wird Code abgearbeitet (nur jedes 10te mal)
-- Die Scrittweite zum Scrollen hab ich doch abhaengig vom Randabstand berechnet
-- Siehe Beispiel mit der Farbe.
!! Wenn das bei Dir nicht langsamer wird, liegts daran, dass Du in Deinem
!! OnMouseMove auch reagierst! Das darf nichtsein. Timer ODER MouseMOVE!! Timer verursacht Scroll-> bewegt Bild-> verursacht OnMouseMove-> Scroll-> ..
Wenn ich Timer aktiviere, blockiere ich OnMouseMove!
Was meinst Du?
Das D#rum oder das mit dem Harem
[ Dieser Beitrag wurde am 16.03.2003 um 21:14 Uhr von DerAltenburger editiert. ]
-
'ne andere Möglichkeit, mit dem Timer zu arbeiten ist, ein int TimeOver zu setzen und je Interval runterzählen lassen. Letztendlich dürfte der Weg keine Rolle spielen, da die Refreshrate die Unruhe reinbringt.
Zum "Gasgeben", je weiter man vom Rand weg ist, kann man auch mit der Differenz aus ScrenPos.x oder ScrenPos.y zum Rand rechnen. Entweder TimeOver verringern oder im OnMouseMove größere Schritte machen. Erste Versuche fielen noch etwas grob aus. Damit will ich mich mal in Ruhe auseinandersetzen. Der Codeaufwand ist gering. Ich setz ja kein TRect sondern frag nur die Seiten ab.
@WebFritzi will dich nicht aufklären? Ich versuch mal die QSPaula: D#rum statt Darum, also nicht etwa Dsrum, Dyrum, Dqrum oder... Alles klar? :p Dr. Mabuse war so "genial", der hat Spiegelschrift geschrieben.
- Genauer kann ich es nicht sagen, sonst wird totales OT draus.