Entwickler-Ecke

Sonstiges (Delphi) - Objekte Verschieben


hui1991 - Sa 07.04.07 20:32
Titel: Objekte Verschieben
Hallo,

ich habe hier einen Code für das Verschieben von Objekten:

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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Spin;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Copy: TButton;
    Timer1: TTimer;
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Button1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }

    x,y: Integer;
  end;

var
  Form1: TForm1;
  xx,yy: Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Form1.x:=x;
  Form1.y:=y;
  Copy.Top:=((Button(Sender).Top+Form1.y-(Button(Sender).Height div 2)) div SpinEdit1.Value) * SpinEdit1.Value;   //SpinEdit1.Value := 8
  Copy.Left:=((Button(Sender).Left+Form1.x-(Button(Sender).Width div 2)) div SpinEdit1.Value) * SpinEdit1.Value;  //SpinEdit1.Value := 8
end;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Copy.Width:=TButton(Sender).Width;
  Copy.Height:=TButton(Sender).Height;
  Copy.Caption:=TButton(Sender).Caption;
  Copy.Top:=TButton(Sender).Top;
  Copy.Left:=TButton(Sender).Left;
  Copy.Visible:=True;
  xx:=Copy.Top+Form1.x;
  yy:=Copy.Left+Form1.y;
  Timer1.Enabled:=True;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Timer1.Enabled:=False;
  Copy.Visible:=False;
  TButton(Sender).Left:=Copy.Left;
  TButton(Sender).Top:=Copy.Top;
end;

end.


So es funktioniert ja auch. Ich habe hier so Fragen dafür.
Wie macht man es besser lösen?
Es sollen alle Objekte verschiebbar sein.
Kann man die Prozedur für jedes Objekt verwenden oder muss man für Button eins machen, für Edit eins machen, für ListBox eins machen?
Das ziel ist ja das man sich das Programmieren erleichtert.
Die Geschwindigkeit spielt hier ja keine Rolle.

Hoffe ihr versteht was mein Ziel ist und hoffe das es bessere Möglichkeiten gibt ^^

Sollte man ein Image nehmen und ein Screen rein laden?

MfG
hui1991


hui1991 - Do 19.04.07 19:54

Hat niemand eine Idee wie man das verbessern kann?
Ich habe es selber gemacht, aber naja das gefällt mir nicht.
Finde aber keine andere Möglichkeit es anders zu machen.
Hoffe jemand kann mir helfen.

MfG
hui1991


Magic J - Do 19.04.07 20:18

Hi

also ich versteh zwar net, wofür du hier nen Timer brauchst...
(muss man sehen, wo der alte Button war ?)

...aber ich hätte da ne Lösung, die nicht ganz so aufwengig ist(aussieht)!

Funktioniert sogut wie mit allen Objekten (alle die vom typ "TControl" abgeleitet werden)
also Button, Edit, Label usw..


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:
Var MausStartX,MausStartY,Cx,Cy:Integer;
    Gedrueckt:Boolean;

procedure TForm1.ObjektMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Gedrueckt:=true;
  Cx:=TControl(Sender).Left;
  Cy:=TControl(Sender).Top;
  MausStartx:=Mouse.CursorPos.X;
  MausStarty:=Mouse.CursorPos.Y;
end;

procedure TForm1.ObjektMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if not Gedrueckt Then exit;
  TControl(Sender).Left:=Cx+Mouse.CursorPos.X-MausStartX;
  TControl(Sender).Top:=Cy+Mouse.CursorPos.Y-MausStartY;
end;

procedure TForm1.ObjektMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Gedrueckt:=false;
end;


Diese 3 Proceduren dann halt jedem Teil zuweisen, dass du nachher bewegen willst!
(Geht übrigens auch mit TForm´s)

Gruß Jonas


hui1991 - Mo 14.05.07 09:57

Danke,

das ist genau das was ich wollte.
Weis aber net ob es noch besser geht, aber denke das geht.
Ich wollte ein Editor machen wie der von Delphi.
Nur sowas ähnliches.
Damit könntem an dann Puzzelspiele machen.

MfG
hui1991


_frank_ - Di 15.05.07 00:21

ich empfehl dir das TSizeCtrl von Angus Johnson (http://www.angusj.com/delphi/).
Damit hab ich den Form-Designer in meinem DFM-Editor gemacht.

Gruß Frank