Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objekte "schnell" bewegen (https://www.delphipraxis.net/159239-objekte-schnell-bewegen.html)

Delphi-Narr 19. Mär 2011 11:39

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:
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 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.

Ich habe auch mal 5 pixel Schritte probiert, es geht zwar schneller, ruckelt aber...

Wie kann ich das ändern?

Viele Grüße!

alfold 19. Mär 2011 11:52

AW: Objekte "schnell" bewegen
 
Zitat:

Zitat von Delphi-Narr (Beitrag 1089599)
...
ich bin dabei mir ein Programm mit mehreren, den Bildschirm füllenden Komponenten zu schreiben.
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.

Ich habe auch mal 5 pixel Schritte probiert, es geht zwar schneller, ruckelt aber...

Wie kann ich das ändern?

Viele Grüße!

Hast Du mal überlegt, bei einer Auflösung von H=1024,
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

mkinzler 19. Mär 2011 11:55

AW: Objekte "schnell" bewegen
 
Vielleicht, wenn man nicht die Objekte selbst, sondern nur ein Abbild deren bewegt

Delphi-Narr 19. Mär 2011 12:02

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?

Bummi 19. Mär 2011 12:52

AW: Objekte "schnell" bewegen
 
Was sind das für Objekte?
Wenn es nur darum geht Beispielsweise mehrere PNG's zu animieren:
http://www.delphipraxis.net/156716-g...-und-zoom.html

Delphi-Narr 19. Mär 2011 12:59

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...

Bummi 19. Mär 2011 13:23

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).

Delphi-Narr 19. Mär 2011 13:38

AW: Objekte "schnell" bewegen
 
Ich möchte ja nur eine von mehreren erstellen...

Helmi 19. Mär 2011 13:46

AW: Objekte "schnell" bewegen
 
Hallo,

schau dir doch mal AnimateWindow an.
Habs mit einem Memo getestet - geht wunderbar.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  AnimateWindow(Memo1.Handle, 200, AW_BLEND or AW_HIDE);
end;
[Edit]
Mist - geht doch nicht!
Wirkt wie ein Memo1.Hide - egal welche Zeit angegeben wird.

Delphi-Narr 19. Mär 2011 15:00

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

stahli 20. Mär 2011 01:30

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)

Delphi-Narr 20. Mär 2011 10:03

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!

Bummi 20. Mär 2011 10:05

AW: Objekte "schnell" bewegen
 
Selbst malen in Form, Paintbox oder eigener Komponente kommt für Dich nicht in Frage??

mkinzler 20. Mär 2011 10:15

AW: Objekte "schnell" bewegen
 
Zitat:

Ich habe auch mal versucht, nur das Image zu verschieben: auch nicht besser...
Das habe ich nicht gemeint mit Abbild verscheiben, sondern das Verschieben im Canvas des Formulars oder besser einer TPaintBox/TScrollBox ( wie Bummi schon geschrieben hat)

Bummi 20. Mär 2011 10:32

AW: Objekte "schnell" bewegen
 
Zitat:

Brummi
so schlimmm...:oops::-D

mkinzler 20. Mär 2011 10:35

AW: Objekte "schnell" bewegen
 
Sorry Bummi natürlich :oops:

Delphi-Narr 20. Mär 2011 19:29

AW: Objekte "schnell" bewegen
 
Zitat:

Zitat von mkinzler (Beitrag 1089783)
Zitat:

Ich habe auch mal versucht, nur das Image zu verschieben: auch nicht besser...
Das habe ich nicht gemeint mit Abbild verscheiben, sondern das Verschieben im Canvas des Formulars oder besser einer TPaintBox/TScrollBox ( wie Bummi schon geschrieben hat)

Das bezog sich auch eher auf die Idee mit dem Panel...

Wie meinst du denn das "Im Canvas verschieben"? Manuell zeichnen?

Viele Grüße!

mkinzler 20. Mär 2011 19:31

AW: Objekte "schnell" bewegen
 
Ja, sollte um einiges sxhneller sein, als Objekte zu verschieben

Delphi-Narr 20. Mär 2011 19:49

AW: Objekte "schnell" bewegen
 
Das stimmt schon, doch wie krieg ich Objekte, die bei jedem Durchlauf anders aussehen, auf das Canvas?

Viele Grüße!

mkinzler 20. Mär 2011 19:57

AW: Objekte "schnell" bewegen
 
Screenshot des entsprechenden Bereich

Delphi-Narr 20. Mär 2011 20:21

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!

mkinzler 20. Mär 2011 20:28

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
http://www.ksdev.com/forums/viewtopic.php?f=4&t=986

QuickAndDirty 21. Mär 2011 10:20

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.

Bummi 21. Mär 2011 10:48

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 ...

Delphi-Narr 21. Mär 2011 14:07

AW: Objekte "schnell" bewegen
 
Zitat:

Zitat von Bummi (Beitrag 1089996)
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 ...

Hallo,

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!

Bummi 21. Mär 2011 14:57

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:
Form2.BorderStyle := bsNone;
Form2.Align := alClient;
Form2.Parent := Mainform;
Form2.Show;
verwende ich aus anderen Gründen in ähnlicher Form ständig, o.g. Aktionen sind allerdings in der Form2 Basisiklasse schon parametrisierbar implementiert.

QuickAndDirty 21. Mär 2011 16:23

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
http://www.bitsandbuzz.com/article/flying-pixels/

Delphi-Narr 21. Mär 2011 19:04

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!

WM_CLOSE 21. Mär 2011 19:10

AW: Objekte "schnell" bewegen
 
manche controls haben die eigenschaft
Delphi-Quellcode:
Alphablend
. Andere WinControls könnte man per API zum selben bewegen. Beim Formular klappt das ganz gut.

Delphi-Narr 21. Mär 2011 19:22

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

stahli 21. Mär 2011 19:25

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...

WM_CLOSE 21. Mär 2011 19:42

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.

Delphi-Narr 21. Mär 2011 19:50

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:
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;
Viele Grüße!

Edit:

Eine manifest habe ich schon eingebunden (style.res), doch leider keine Besserung. Das Alphablend der Form klappt, das der Komponenten nicht (LMD)...

Bummi 21. Mär 2011 22:30

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.

Delphi-Narr 22. Mär 2011 20:56

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 13:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz