![]() |
Delphi-Version: 6
Objekte "schnell" bewegen
Hallo,
ich bin dabei mir ein Programm mit mehreren, den Bildschirm füllenden Komponenten zu schreiben. Um zwischen diesen Komponenten umzuschalten, möchte ich keine verschiedenen Formulare benutzen, sondern eine Art "Slice-Effekt" verwenden. Dafür verwende ich im Moment einfach eine Schleife (Zum Testen eine For-Schleife, später wirds wohl eine while-Schleife).
Delphi-Quellcode:
Ich habe es auch mal mit Application.processmessages versucht, doch leider auch ohne Besserung, denn die Bewegung soll relativ schnell sein (knapp 1 Sekunde), ist aber seeeehr langsam.
for i:=0 to Screen.width do
begin Objekt1.left:=Objekt1.left-1 Objekt2.left:=Objekt2.left-1; Objekt1.refresh; Objekt2.refresh; end; Ich habe auch mal 5 pixel Schritte probiert, es geht zwar schneller, ruckelt aber... Wie kann ich das ändern? Viele Grüße! |
AW: Objekte "schnell" bewegen
Zitat:
nun von 0 to 1024 ein Objekt bewegen und neuzeichen, bleibt nun mal 1024durchläufe plus die Zeit des neuzeichnen. Wie schnell muss da ein Prozessor sein der das in < 1 sek macht :gruebel: Ohne auf Direktx oder ander GEngine zu zugreifen dürfte dies wohl nicht gehen. alfold |
AW: Objekte "schnell" bewegen
Vielleicht, wenn man nicht die Objekte selbst, sondern nur ein Abbild deren bewegt
|
AW: Objekte "schnell" bewegen
Hallo,
danke für die schnelle Antwort. Natürlich ist das ziemlich viel für eine Sekunde. Aber 20 Sekunden find ich ist auch etwas viel... Außerdem liegt die Prozessorauslastung nicht bei 100%, sondern zwischen 50 und 70%. Ich habe mir mal vor einiger Zeit zum Testen hier einen Code runtergeladen, wo mehrere Kugeln kollidieren und abprallen (Masse und Winkel berücksichtigt). Das läuft mit bis zu 100 Kugeln auch sehr flüssig... Ich guck mal, wie das mit DirectX funktionieren könnte. Viele Grüße! @mkinzler: Könntest du das etwas näher beschreiben, bitte? |
AW: Objekte "schnell" bewegen
Was sind das für Objekte?
Wenn es nur darum geht Beispielsweise mehrere PNG's zu animieren: ![]() |
AW: Objekte "schnell" bewegen
Bisher ist es ein TImage (wird später ersetzt durch eine eigene Komponente, Tochterkomponente von TImage) und eine TLMDListBox.
Viele Grüße! Edit: Ich habe mal ein bisschen rumprobiert: Wenn ich das Image mit gedrückter Maustaste verschieben lasse, geht das schnell und relativ flüssig... Vielleicht noch zum allgemeinen Verständnis: Das soll sowas wie horizontales Scrollen sein... |
AW: Objekte "schnell" bewegen
wenn Du eh eine eigene Komponente erstellen willst, findest Du in o.G. Link vielleicht die eine oder andere Anregung (ich würde von TGraphicControl ableiten).
|
AW: Objekte "schnell" bewegen
Ich möchte ja nur eine von mehreren erstellen...
|
AW: Objekte "schnell" bewegen
Hallo,
schau dir doch mal AnimateWindow an. Habs mit einem Memo getestet - geht wunderbar.
Delphi-Quellcode:
[Edit]
procedure TForm1.Button1Click(Sender: TObject);
begin AnimateWindow(Memo1.Handle, 200, AW_BLEND or AW_HIDE); end; Mist - geht doch nicht! Wirkt wie ein Memo1.Hide - egal welche Zeit angegeben wird. |
AW: Objekte "schnell" bewegen
Hallo,
ja ich habs auch ausprobiert. Ich möchte es aber auch nicht ausblenden, sondern verschieben... Also eher AW_SLIDE?! Problem 2: TImage hat kein Handle... Viele Grüße |
AW: Objekte "schnell" bewegen
Zwei Ideen:
- Ist es möglich, die zu verschiebenden Controls auf ein Panel zu setzen und das zu verschieben? - Es kann interessant sein, mit größeren Steps zu beginnen und diese stückweise zu reduzieren (erst schnell scrollen und zum Schluss dann langsam) |
AW: Objekte "schnell" bewegen
Hallo,
vom Prinzip ist es schon möglich... Frage ist nur, was das bringen sollte? Ich habe auch mal versucht, nur das Image zu verschieben: auch nicht besser... Viele Grüße! |
AW: Objekte "schnell" bewegen
Selbst malen in Form, Paintbox oder eigener Komponente kommt für Dich nicht in Frage??
|
AW: Objekte "schnell" bewegen
Zitat:
|
AW: Objekte "schnell" bewegen
Zitat:
|
AW: Objekte "schnell" bewegen
Sorry Bummi natürlich :oops:
|
AW: Objekte "schnell" bewegen
Zitat:
Wie meinst du denn das "Im Canvas verschieben"? Manuell zeichnen? Viele Grüße! |
AW: Objekte "schnell" bewegen
Ja, sollte um einiges sxhneller sein, als Objekte zu verschieben
|
AW: Objekte "schnell" bewegen
Das stimmt schon, doch wie krieg ich Objekte, die bei jedem Durchlauf anders aussehen, auf das Canvas?
Viele Grüße! |
AW: Objekte "schnell" bewegen
Screenshot des entsprechenden Bereich
|
AW: Objekte "schnell" bewegen
Wenn aber während des Scrollens z.B. eine Zeile in der ListBox dazu kommt, muss ich wieder einen neuen Screenshot machen. Also vorher wieder einblenden, Screenshot, ausblenden, verschieben und zeichnen...
Macht das dann noch Sinn? Dann würde ja eigentlich ein Flackern entstehen (Durch das ständige ein- und ausblenden) und so ein Screenshot ist ja eigentlich auch nichts anderes. Naja, die 1 Sekunde Verzögerung werd ich wohl überleben ;) Ich werd' das mal versuchen. Viele Grüße und Danke für die vielen Antworten! |
AW: Objekte "schnell" bewegen
Eine weitere Option wäre es Komponenten, wie VGScene oder DXScene zu verwenden, die lassen sich leicht Verschieben/Skalieren usw. KSDev wurde aber von Embarcadero aufgekauft und die Komponenten erstmal vom Markt genommen
![]() |
AW: Objekte "schnell" bewegen
Ich würde das Canvas der Form in ein Bitmap Objekt speichern.
Alle Objekte auf der Form unsichtbar machen und dann das ganze Bildraus rollen lassen. Bleibt noch die frage ob du von den anderen Komponenten (also die die reinrollen ) vor ab einen Screen bekommst.... :( Für kleine Animationen reicht BitBlt oder die selbe Funktion aus der GDI+ für mehr Leistung müsste man dann wohl auf etwas "Richtiges" setzen. |
AW: Objekte "schnell" bewegen
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bin nicht sicher ob ich verstanden habe was Du genau suchst, etwas in der Art?
Ganz schnell und billig, besser geht in jedem Fall ... |
AW: Objekte "schnell" bewegen
Zitat:
vom Pronzip her genau, was ich brauche - danke für das Beispiel!! Frage ist nur, ob das auch ohne zweite Form geht? Wenn ich das Formular wie es ist auf ein unsichtbares Canvas sicher, dann alles ausblende und zeichne und später wieder einblende, dann müsste das doch klappen... Dann könnte ich mit CopyRect das Ganze aufs Form malen und verschieben. Ist denn dann auch das im unsichtbaren Canvas, was außerhalb des Bildschirms ist? Viele Grüße! |
AW: Objekte "schnell" bewegen
Versuch macht kluch ...
Es sind diverse Varianten, eine denkbare wäre auch nach der Animation auf einem leeren Mainform das 2. Form zu docken, also
Delphi-Quellcode:
verwende ich aus anderen Gründen in ähnlicher Form ständig, o.g. Aktionen sind allerdings in der Form2 Basisiklasse schon parametrisierbar implementiert.
Form2.BorderStyle := bsNone;
Form2.Align := alClient; Form2.Parent := Mainform; Form2.Show; |
AW: Objekte "schnell" bewegen
Ich finde es gut das der TE sich überhaupt Gedanken um Animation macht. Animationen richtig eingesetzt erhöhen die Benutzerfreundlichkeit eines Programms ungemein. Finde Idee mit dem ausfliegen und einfliegen der Komponenten ziemlich gut. Denn für das Menschliche Gehirn ist es anstrengend mit dingen klar zukommen die auf einmal übergangslos erscheinen oder verschwinden...sowas passiert in der Natur einfach kaum...am Monitor aber die ganze Zeit. Es trägt auch deutlich zur Ermüdung des Users bei.
So let the Pixels Fly ![]() |
AW: Objekte "schnell" bewegen
Hallo,
ich sehe schon, dass das nicht so einfach ist, wie ich es mir erhofft habe. Die Lösung von Bummi wäre zwar vom Prinzip her das richtige, Doch es sollen ja nur die Hauptkontrollen verschoben werden, nicht die Buttons oben und unten. Außerdem gibt es ein Hintergrundbild, welches auch einige Schwierigkeiten macht... Ich bin dabei, die Komponenten direkt über PaintTo anzusprechen, anstatt die Form. Nur als Alternative: Gibt es eine Möglichkeit, die Komponenten einfach sanft auszublenden und dann die andere einzublenden? Viele Grüße! |
AW: Objekte "schnell" bewegen
manche controls haben die eigenschaft
Delphi-Quellcode:
. Andere WinControls könnte man per API zum selben bewegen. Beim Formular klappt das ganz gut.
Alphablend
|
AW: Objekte "schnell" bewegen
Schon, aber irgendwie klappt das bei mir nicht.
Ich habe mir die LMD-Freewarekomponenten runtergeladen. Die sollten ja zumindest Transparenz können - klappt bei mir nicht :( Bei Delphi 5 gabs das noch nicht mit AlphaBlend - Delphi 6 hat das, doch bei Delphi 5 hab ich das auch mit dem Formular hingekriegt. Doch die Prozedur klappt leider nicht mit einem anderen Handle ... Viele Grüße |
AW: Objekte "schnell" bewegen
Kannst Du mal eine kleine Herausfliegen-Demo hochladen (oder ein Video), auch wenn es derzeit holpert oder so.
So kann man es vielleicht besser nachvollziehen... |
AW: Objekte "schnell" bewegen
du könntest auch mal versuchen über ein manifest die common-controls zu verwenden, dann sollte es selbst mit AnimateWinow klappen.
|
AW: Objekte "schnell" bewegen
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal das Video hochgeladen.
Sorry wegen der schlechten Qualität... Die Kontrollen usw. hab ich nicht mit aufgenommen, nur den Slice-Effekt. Der Code:
Delphi-Quellcode:
Viele Grüße!
for i:=0 to Screen.width div 5 do
begin Image1.Left:=Image1.Left-5; List.Left:=List.Left-5; List.Refresh; Image1.Refresh; Application.ProcessMessages; end; Edit: Eine manifest habe ich schon eingebunden (style.res), doch leider keine Besserung. Das Alphablend der Form klappt, das der Komponenten nicht (LMD)... |
AW: Objekte "schnell" bewegen
Alphablends für Wincontrols mit Parent funktionieren nicht, allenfalls kannst Du ein frei schwebendes Form mit den enthaltenen Komponenten, z.b. mit einer Transparenzfarbe per Alphabelnding einblenden und am Schluss docken.
Du kannst mit eigenen GraphicControls oder auch mit der Paintbox oder im OnPaint Alphablending mit eigenen Bitmaps(PNG etc.) machen, am einfachsten mit GDI+. Wenn Du nur einen Teil animieren willst könntest Du wie bereits erwähnt die zu animierenden Controls auf dem 2. Form lassen, dieses auf einem Panel "painten" lassen wie gezeigt und am Schluss das Form auf dem Panel docken wie beschrieben. Das 2. Form muss Dich nicht abschrecken, betrachte es wie ein verbessertes Frame. |
AW: Objekte "schnell" bewegen
Hallo,
wenn ich die einzelnen Komponenten auf ein eigenes Formular packe, kann ich das über die Schleife normal scrollen (ohne ruckeln). Nur ein kleines Problem habe ich noch: Wenn ich z.B. ein Diagramm als Startseite habe und diese dann wegscrolle, ist das Diagramm zu sehen und scrollt mit. Doch wenn ich dann wieder zurückscrolle, wird das Diagramm erst wieder angezeigt, wenn das Scrollen beendet ist (vorher nur grau). Ich habe mal versucht, ein Graph.refresh vor die SChleife zu setzen, jedoch ohne Erfolg... Viele Grüße! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz