| Autor |
Beitrag |
Stread
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: Di 27.04.10 22:26
Hi,
ich möchte die Mausbewegungen, die über den ganzen Bildschirm gehen, wiedergeben. Nach dem drücken des Start Knopfes bewegt man die Maus wie man will und das Programm wiederholt dann diese Bewegungen.
Die Koordinaten der Maus bekomme ich mit GetCursorPos(MousePosition) Dann muss ich das X und Y in ein dynamisches Array speichern? Wie speichere ich es so dass X und Y zwei unterschiedliche Daten sind aber trotzdem nur gemeinsam ausgelesen und verarbeitet werden können?
Die Koordinaten sollen durch einen Timer gesteuert alle 0,5 sek gespeichert werden.
Wie kann ich das Array dann auslesen dass ich immer die richtigen Werte zusammen habe?
Die Mausposition setzte ich ja mit SetCursorPos(X,Y); Wie kann ich dann das X und Y mit dem Array Wert ersetzen? Ich weiß ja nicht wieviele und welches Array gerade dran ist.
Ist die Umsetzung so überhaupt möglich?
Danke
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 27.04.10 22:28
nimm doch ein Array vom Typ TPoint. Damit hast du X und Y in einem datentyp gemeinsam und heißen sogar "TPoint.X" und "TPoint.Y".
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Namenlosnameless
      
Beiträge: 259
Erhaltene Danke: 6
Windows XP Home Edition, Windos Vista
C#
|
Verfasst: Di 27.04.10 22:29
warum 2 array's??? du kannst ja eines machen und in einem die Position mit Point(X,Y) speichern, dann umgehst du dieses Problem
Edit: waren wir wohl gleichzeitig!
_________________ 1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Di 27.04.10 22:43
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Di 27.04.10 22:51
Hey,
ich würd da ne Liste nehmen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure AddPointToList(X, Y: Integer); type PPoint = ^TPoint; var p: PPoint; begin new(p); p^.X := X; P^.Y := Y; PointList.Add(p); end;
function GetPointFromList(index: Integer): TPoint; type PPoint = ^TPoint; begin result := PPoint(PointList[index])^; end;
procedure ClearPointList; type PPoint = ^TPoint; var i: Integer; begin for i := PointList.Count-1 downto 0 do begin dispose(PPoint(PointList[i])); PointList.delete(i); end; end; | --> UNGETESTET!!!
Das Ganze könnte man auch schön in eine extra Klasse packen un sich ne komplette TPointListe schreiben...
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
StrikeLucky
      
Beiträge: 35
|
Verfasst: Mi 28.04.10 20:07
Wofür steht das "^" vor dem TPoint?
Und wofür steht es nochmal hier: p^.X := X; //Daten übernehmen ?
Was bewirkt es?
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Mi 28.04.10 21:10
|
|
Stread 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: Do 29.04.10 22:20
Ein paar Fragen dazu hätte ich noch:
Die Variable L und MousePosL muss noch deklariert werden oder? Als array? Alle Variabeln in Private rein, weil man sie ja 2x braucht?
Zeile 3-6 kommt in den Timer der das ganze Aufzeichnen soll und Z. 10-14 in den der es abspielen soll?
Wo kommt das Pos im zweiten teil her?
Ich habe bis jetzt noch nicht soviel mit Arrays gearbeitet und kenne mich deshalb nicht so damit aus.
Xion hat folgendes geschrieben : |
Verstehe deßhalb das Problem nicht ganz...
|
Ich weiß zwar wie es theoretisch gehen muss aber nicht welche Befhle ich dafür benötige.
PS. dass mit der Bewegung interpolieren verstehe ich nicht aber ich bin schon froh wenn das erste klappt.
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Do 29.04.10 23:50
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Stread 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: Fr 30.04.10 20:40
Ich habe jetzt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| private L,Pos:Integer; MousePos: array of TPoint; public
end; |
und deine Routine:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm12.BtAufzeichnenClick(Sender: TObject); begin TimerAufzeichnen.Enabled:=TRUE; Pos:=0;
end; procedure TForm12.TimerAbspielenTimer(Sender: TObject); begin
if Pos<Length(MousePos) then SetCursorPos(MousePos[Pos].X,MousePos[Pos].Y) else TimerAb.Enabled:=False; Pos:=Pos+1; end;
procedure TForm12.TimerAufzeichnenTimer(Sender: TObject); begin L:=Length(MousePos); SetLength(MousePos+1); MousePos[L]:=Mouse.CursorPos; end; |
Bei Zeile 17: SetLength(MousePos+1); meldet er den Fehler: E2008 Inkompatible Typen
Ich gebe mit dem +1 die Größe des Arrays an?
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 30.04.10 21:10
Eh klar. Mit SetLength setzt du die neue Länge des Arrays. Diese Methode erwartet 2 Parameter. Einerseits das dynamische Array und andererseits die neue Länge des Arrays (welches du eh schon in L gespeichert hast eigentlich). Deswegen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm12.TimerAufzeichnenTimer(Sender: TObject); begin L:=Length(MousePos); SetLength(MousePos, L); MousePos[L]:=Mouse.CursorPos; end; |
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Fr 30.04.10 21:18
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm12.TimerAufzeichnenTimer(Sender: TObject); begin L:=Length(MousePos); SetLength(MousePos, L+1); MousePos[L]:=Mouse.CursorPos; end; |
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Stread 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: Fr 30.04.10 22:37
Danke Xion
L+1 klappt. Mit dem Button Aufzeichnen starte ich den Timer mit Stop und Abspielen beende ich den Timer und mit Abspielen starte ich den zweiten Timer. Wenn ich nun zum 2. mal den Aufzeichnen Knopf drücke werden die neuen Daten gerade hinten eingefügt. Also muss ich das Array wieder löschen.
Ich habe es mit FillChar(MousePos[0], Length(MousePos)*sizeof(MousePos[0]), 0); probiert aber dann setzt sich der Mauszeiger oben links am Bildschirm fest.
Wie kann ich das Array so hinbekommen wie es am Anfang war?
Ich habe das Intervall beider Timer auf 10 gesetzt. Nun habe ich auch meine flüssige Bewegung. Kann es mit der Methode zu Problemen kommen?
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Fr 30.04.10 22:43
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Stread 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: Fr 30.04.10 23:53
Xion hat folgendes geschrieben : |
Mir fällt da nur ein, dass irgendwann mal dein Speicher überläuft. |
Wann circa. 10 min? 1h?
Als nächstes will ich dann dass er auf Mausklick die aktuellen Koordnaten speichert und dann zur richtigen Zeit auf dem richtigen Punkt klickt. Aber dazu muss ich mir erst selbst was überlegen
Ich hab ja schon dass er alles Manuell kann. Also per Tastenkombination Koordinaten speichern, ich wähle aus ob Links/rechts/Doppelklick und er macht das dann in der Zeit wo ich es sage.
Nun muss das alles noch mit dem Array der Mausbewegung stimmen.
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Sa 01.05.10 02:53
Hey,
| Delphi Hilfe hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4:
| type TPoint = packed record X: Longint; Y: Longint; end; | Longin -2147483648..2147483647 32 Bit, mit Vorzeichen |
32Bit = 4 Byte. Da es 2 sind (X und Y) sind es 8 Byte pro 10ms das sind 800Byte pro Sekunde. Nehmen wir an du hast 1024MB (frei) zur verfügung. 1024MB = 1.073.741.824 B. 1.073.741.824 / 800 = 1.342.177,28 Sekunden. Damit kannste ca. 15,5 Tage aufnehmen^^
für die Mausklicks kannst du das änlich machen. Erstell dir n array of record, in dem du dann deine Daten speicherst:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TMouseButton = (mbLeft, mbRight, mbDouble); TMouseClickRec = packed record Time: Cardinal; Button: TMouseButton; end;
var MouseClickArr = array of TMouseClickRec; | oder so ähnlich
MfG Bergmann
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Sa 01.05.10 03:14
ich würds komplett in das array einarbeiten. Also statt array of TPoint zu nehmen und dann nochmal ein extra Array (was im übrigen mMn das zusammenfügen dann recht schwer macht) zu verwenden, einfach gleich sowas:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TMouseButton = (mbLeft, mbRight, mbDouble, mbNone); TMouseRec = packed record Pos = TPoint; Button = TMouseButton; end;
var MouseArray = array of TMouseRec; |
Das speichert dann bei jeder Koordinate ob mit der Maus geklickt wurde. Wenn ja wird gespeichert mit welcher Taste, wenn nein wird mbNone verwendet. Braucht zwar etwas mehr Speicher, aber ich finde es ist einfacher zum Aufnehmen und Wiedergeben.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Stread 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: So 02.05.10 00:32
Kann ich meine bisherigen Variablen und das Array behalten und das neue ist nur eine Erweiterung, oder muss ich was ganz neues schreiben? Welches Array frage ich dann in Abspielen ab?
Delphi sagt zu mir nach mbLeft müsste die Klammer wieder zugehen.
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 02.05.10 08:38
Mach einfach
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TMouseButton = (mbNone,mbLeft, mbRight, mbDouble);
type TMousePosData=record X,Y: integer; Button: TMouseButton; end;
MousePos: array of TMousePosData; |
Dann ändert sich an deinem bisherigen Code nix. Aber durch MouseButton[x].Button kannst du noch ne Information zusätzlich speichern
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Stread 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: Sa 08.05.10 19:04
Sorry aber ich blicks gerade nicht. Wo muss das hin? In den Timer der auch schon die Mausbewegung aufzeichnet?
Die Abfrage ob und wenn ja welche Maustaste gedrückt wurde muss ja mit der aktuellen Koordinate gespeichert werden, also muss es doch auch ins gleiche Array gespeichert werden oder?
Reicht denn die 1. Zeile um die Art des Mausklicks zu bestimmen?
Wie kann ich beim Abspielen auf diese Informationen zugreifen? Bis jetzt bewegt er ja nur den Mauszeiger.
PS. Sorry dass ich erst jetzt schreibe aber ich hatte noch zu tun.
|
|