Autor Beitrag
V!P3R
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: So 02.12.07 11:06 
sodass man es bearbeiten kann?

Ich habe mehrere TShapes. per klick auf das shape soll es markiert sein. und das soll der user an irgenteiner veränderung feststellen können. von diesem shape soll er die größe, farbe, position,usw verändern können.

am besten wäre das so, dass man das shape größer ZIEHEN kann, und nicht in ein EDITFELD die werte eingeben muss, geht das irgentwie?

MfG
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: So 02.12.07 11:38 
gehen tut alles :)

guck dir das mal an, da steht, wie man eine Form mit bsNone verschiebt. Ist eigentlich das selbe Problem, wie du hast.
www.delphi-forum.de/...59508&highlight=

Mit dem OnClick weißt du, welches Shape ausgewählt ist. Dann kannst du z.B. eine ColorBox verwenden, um das Shape umzufärben.

_________________
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)
V!P3R Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: So 02.12.07 12:14 
ja vielen dank

hab aber noch zwei probleme
erstens: der Name des objektes setzt sich zusammen aus 'Shape' und einem Integerwert.:

www.delphi-forum.de/...tellen_78746,20.html

zweitens: bei folgendem code springt das TShape immer ungefähr um +100 Left und +100 Top:

Shap: TShape (Beispiel Shape. Die anderen werden selbst produziert, siehe link)

ausblenden 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:
procedure TForm1.ShapMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 MousPosX:=X;
 MousPosY:=Y;
 MousePress:=true;
end;

procedure TForm1.ShapMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if MousePress=True then
  begin
   Shap.Left:=Mouse.CursorPos.X-MousPosX;
   Shap.Top:=Mouse.CursorPos.Y-MousPosY;
  end;
end;

procedure TForm1.ShapMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
MousePress:=False;
end;


MfG


PS: hab oft editiert, gab probleme mit Delphi Code


Zuletzt bearbeitet von V!P3R am So 02.12.07 12:19, insgesamt 1-mal bearbeitet
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: So 02.12.07 12:17 
ausblenden Delphi-Quelltext
1:
2:
   Shap.Left:=Mouse.CursorPos.X-MousPosX;
   Shap.Top:=Mouse.CursorPos.Y-MousPosY;


ich vermute mal:
Mouse.CursorPos.X gibt die Position der Maus auf dem Bildschirm an. Also musst Form1.ScreentoClient(Mouse.CursorPos).X benutzen

um für alle Shapes das zu machen, nimmst du bei allen Shapes das gleiche Event (OnMouseDown usw). Dann kannst du mit TShape[FindComponent('Shape'+inttostr(Shape.Tag))] arbeiten (wenns Shape.Tag nicht gibt, dann nehm den Hint dazu)

_________________
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)
V!P3R Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: So 02.12.07 12:23 
ausblenden Delphi-Quelltext
1:
2:
Shap.Left:=Form1.ScreentoClient(Mouse.CursorPos).X;
Shap.Top:=Form1.ScreentoClient(Mouse.CursorPos).Y;


so gehts. nur KLEINER fehler. maus springt in die linke ecke des objektes (indem fall also Shap)
bzw das objekt (Shap) springt so, dass die maus in der oberen linken ecke ist.

EDIT: Ja aber die Shapes werden doch erst erstellt. wie kann ich dann die OnMouseUp function bestimmen?

Hier der komplette code:

ausblenden volle Höhe 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:
var
 Form1: TForm1;
 Int: Integer = 0;
 MousePress: boolean;
 MyShape: TShape;
 MousPosX,MousPosY: integer;

implementation

{$R *.dfm}

procedure TForm1.B_AddShapeClick(Sender: TObject);
begin
  Inc(Int);

  MyShape := TShape.Create(Form1);
  try
    MyShape.Name := 'Shape' + IntToStr(Int);
    MyShape.Parent := Form1;
    MyShape.Tag := Int;
    MyShape.Left := 140;
    MyShape.Top := 56;
    MyShape.Width := 100;
    MyShape.Height := 100;
    MyShape.Brush.Color:=clRed;
    MyShape.Show;

  finally
  end;
end;
procedure TForm1.ShapeClick(Sender: TObject);
begin
ShowMessage('Es wurde Shape '+InttoStr(Int)+ ' ausgewählt.');
end;

procedure TForm1.ShapMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
MousPosX:=X;
 MousPosY:=Y;
 MousePress:=true;
end;

procedure TForm1.ShapMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if MousePress=True then
  begin
  Shap.Left:=Form1.ScreentoClient(Mouse.CursorPos).X;
  Shap.Top:=Form1.ScreentoClient(Mouse.CursorPos).Y;
  end;
end;

procedure TForm1.ShapMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
MousePress:=False;
end;
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: So 02.12.07 12:32 
so weißt du die Events zu:

ausblenden Delphi-Quelltext
1:
MyShape.OnMouseDown:=ShapMouseDown;					


das springen kommt daher:
ausblenden Delphi-Quelltext
1:
2:
 Shap.Left:=Form1.ScreentoClient(Mouse.CursorPos).X+MousePosX;
  Shap.Top:=Form1.ScreentoClient(Mouse.CursorPos).Y+MousePosY;

_________________
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)
Mr. Hunt
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: So 02.12.07 12:41 
user profile iconXion hat folgendes geschrieben:
so weißt du die Events zu:

das springen kommt daher:
ausblenden Delphi-Quelltext
1:
2:
 Shap.Left:=Form1.ScreentoClient(Mouse.CursorPos).X+MousePosX;
  Shap.Top:=Form1.ScreentoClient(Mouse.CursorPos).Y+MousePosY;


Richtig muss es heißen:
ausblenden Delphi-Quelltext
1:
2:
 Shap.Left:=Form1.ScreentoClient(Mouse.CursorPos).X-MousPosX;
  Shap.Top:=Form1.ScreentoClient(Mouse.CursorPos).Y-MousPosY;
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: So 02.12.07 14:32 
ach, logisch, sry :oops:

_________________
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)
V!P3R Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: So 02.12.07 19:25 
bei folgendem Code klapps fast, aber man kann 'MyShape' nicht bewegen, wenn man drauf geht
und wenn man auf form 1 klickt verschwindet MyShape oben links in der ecke. woran liegt das, und vorallem, wie kann ich das ändern.

ausblenden 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:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if MousePress=True then
  begin
  MyShape.Left:=Form1.ScreentoClient(Mouse.CursorPos).X-MousPosX;
  MyShape.Top:=Form1.ScreentoClient(Mouse.CursorPos).Y-MousPosY;
  end
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 MousPosX:=X;
 MousPosY:=Y;
 MousePress:=true; 
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
MousePress:=False;
end;


Das klappt schon mal nicht:

ausblenden 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:
procedure TForm1.MyShapeMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if MousePress=True then
  begin
  MyShape.Left:=Form1.ScreentoClient(Mouse.CursorPos).X-MousPosX;
  MyShape.Top:=Form1.ScreentoClient(Mouse.CursorPos).Y-MousPosY;
  end;
end;

procedure TForm1.MyShapeMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 MousPosX:=X;
 MousPosY:=Y;
 MousePress:=true;
end;

procedure TForm1.MyShapeMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
MousePress:=False;
end;


die frage ist: wie ertselle ich eine OnMouse... fucktion für MyShape???


MfG


Hier mein kompletter code:

ausblenden volle Höhe 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:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
var
 Form1: TForm1;
 Int: Integer = 0;
 MousePress: boolean;
 MyShape: TShape;
 MousPosX,MousPosY: integer;

implementation

{$R *.dfm}

procedure TForm1.B_AddShapeClick(Sender: TObject);
begin
  Inc(Int);

  MyShape := TShape.Create(Form1);
  try
    MyShape.Name := 'Shape' + IntToStr(Int);
    MyShape.Parent := Form1;
    MyShape.Tag := Int;
    MyShape.Left := 140;
    MyShape.Top := 56;
    MyShape.Width := 100;
    MyShape.Height := 100;
    MyShape.Brush.Color:=clRed;
    MyShape.Show;

  finally
  end;
end;
procedure TForm1.ShapeClick(Sender: TObject);
begin
ShowMessage('Es wurde Shape '+InttoStr(Int)+ ' ausgewählt.');
end;

procedure TForm1.ShapMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 MousPosX:=X;
 MousPosY:=Y;
 MousePress:=true;
end;

procedure TForm1.ShapMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if MousePress=True then
  begin
  Shap.Left:=Form1.ScreentoClient(Mouse.CursorPos).X-MousPosX;
  Shap.Top:=Form1.ScreentoClient(Mouse.CursorPos).Y-MousPosY;
  end;
end;

procedure TForm1.ShapMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
MousePress:=False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MyShape.Top:=12;

end;


//Das funktioniert nur mit den oben geschriebenen fehlern:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if MousePress=True then
  begin
  MyShape.Left:=Form1.ScreentoClient(Mouse.CursorPos).X-MousPosX;
  MyShape.Top:=Form1.ScreentoClient(Mouse.CursorPos).Y-MousPosY;
  end
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 MousPosX:=X;
 MousPosY:=Y;
 MousePress:=true; 
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
MousePress:=False;
end;

//Das klappt nicht:
procedure TForm1.MyShapeMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if MousePress=True then
  begin
  MyShape.Left:=Form1.ScreentoClient(Mouse.CursorPos).X-MousPosX;
  MyShape.Top:=Form1.ScreentoClient(Mouse.CursorPos).Y-MousPosY;
  end;
end;

procedure TForm1.MyShapeMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 MousPosX:=X;
 MousPosY:=Y;
 MousePress:=true;
end;

procedure TForm1.MyShapeMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
MousePress:=False;
end;

end.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: So 02.12.07 20:23 
du machst oben bei private einfach rein:

ausblenden Delphi-Quelltext
1:
2:
private
  procedure MyOnClickEvent(Sender: TObject);


und unten dann

ausblenden Delphi-Quelltext
1:
procedure TForm1.MyOnClickEvent(Sender: TObject);					

_________________
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)
V!P3R Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: So 02.12.07 20:47 
bei einem OnMouseMoveEvent ist das aber nicht so einfach.