Autor Beitrag
covel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: Mi 12.07.06 11:11 
Moin, komme mal wieder nicht weiter!!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
btn_close:= TButton.Create(form1);
with btn_close do
  begin
    parent:=test;
    width:=10;
    height:=10;
    top:=0;
    left:=90;
    OnClick:=Close;    <- Hier möchte ich dem btn_close eine procedure zuweisen!! Wird auch gemacht nur es wird kein Parameter übergeben! 
  end;


Hoffe es kann mir jemand helfen!


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:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
unit objekte;

interface

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

type
  //TOnClickEvent = procedure (Sender:TObject) of object;

  TAuto= class(TObject)
    //FOnClick: TOnClickEvent;
    fx:Integer;
    fy:Integer;
    test:TPanel;
    btn_close:TButton;
    constructor Create;
    destructor  destroy;


    procedure ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;X, Y: Integer);
    procedure ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure close(Sender:TObject);
    //procedure anzeigen(xpos,ypos:Integer);
end;

implementation
var

  inReposition : boolean;
  oldPos : TPoint;
  Sender:TPanel;

constructor TAuto.Create;
begin
inherited;
test := TPanel.Create(form1);
with test do
  begin
    Visible :=true;
    Parent:=form1;
    Width :=100;
    Height :=100;
    onMouseDown:=ControlMouseDown;
    OnMouseUp:=ControlMouseUp;
    OnMouseMove:=ControlMouseMove;
  end;
inherited;
btn_close:= TButton.Create(form1);
with btn_close do
  begin
    parent:=test;
    width:=10;
    height:=10;
    top:=0;
    left:=90;
    OnClick:=Close;
  end;

end;

destructor TAuto.Destroy;
begin
btn_close.Free;
test.free;
inherited;
end;

procedure TAuto.close(Sender:TObject);
begin
TPanel(sender).Caption :='test';
//inherited;
end;

//////////////////MOUSEMOVE///////////////////////
procedure TAuto.ControlMouseUp(
  Sender: TObject;
  Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if inReposition then
  begin
    Screen.Cursor := crDefault;
    ReleaseCapture;
    inReposition := False;
  end;
end;

procedure Tauto.ControlMouseMove(
  Sender: TObject;
  Shift: TShiftState;
  X, Y: Integer);
const
  minWidth = 20;
  minHeight = 20;
var
  newPos: TPoint;
  frmPoint : TPoint;
begin
  if inReposition then
  begin
    with TWinControl(Sender) do
    begin
      GetCursorPos(newPos);

      if ssShift in Shift then
      begin //resize
        Screen.Cursor := crSizeNWSE;
        frmPoint := ScreenToClient(Mouse.CursorPos);
        if frmPoint.X > minWidth then
          Width := frmPoint.X;
        if frmPoint.Y > minHeight then
          Height := frmPoint.Y;
      end
      else //move
      begin
        Screen.Cursor := crSize;
        Left := Left - oldPos.X + newPos.X;
        Top := Top - oldPos.Y + newPos.Y;
        oldPos := newPos;
      end;
    end;
  end;
end(*ControlMouseMove*)

procedure TAuto.ControlMouseDown(
  Sender: TObject;
  Button: TMouseButton;
  Shift: TShiftState;
  X, Y: Integer);
begin
  if(Sender is TWinControl) then
  begin
    inReposition:=True;
    SetCapture(TWinControl(Sender).Handle);
    GetCursorPos(oldPos);
  end;
end;
//////////////////////////////////////////////////

end.


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Mi 12.07.06 11:35 
schau dir noch mal deine Close-Procedure an:

du weist einem Button die Close-Procedure für das OnClick- Event zu... in der Procedure selber greifst du aber auf TPanel(Sender) zu, das kann nicht funktionieren, da der Sender dein Button ist. Wenn, muss es an der Stelle entweder TButton(Sender).Caption oder test.Caption heissen, je nachdem, in welches Caption du nun was schreiben willst.
covel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: Mi 12.07.06 11:48 
ohh, da habe ich was übersehen, es funkt. nun. besten dank
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Mi 12.07.06 11:59 
vielleicht täusche ich mich ja, aber hatten wir nicht in einem ähnlichen Thread von dir schon mal gesagt, dass du deine Klasse vielleicht von TPanel und nicht von TObject ableiten solltest?

desweiteren solltest du vermeiden, ggf. zentral vorbelegte Procedure- Namen zu mißbrauchen (Close ist quasi mehrfach vorbelegt... nenne es vielleicht besser: BtnClose oder noch besser BtnCloseClick).

Wird dein ButtonClick eigentlich überhaupt aufgerufen? Habe die Befürchtung, dass du mit deinem
ControlMouseDown bzw. ControlMouseUp das schon abfängst bzw. nicht entsprechend weiterleitest.

Was soll eigentlich deine globale Variable Sender? Schmeiss die mal lieber weg... kann sein, dass die die Wurzel allen Übels ist und anstatt auf den Parameter Sender im Close greift dein Close auf die nicht initialisierte Variable Sender zu.
covel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: Mi 12.07.06 14:08 
Jo, habe vor ein paar tagen etwas ähnliches gepostet!!! Habe deine Tips bis auf das Objekt als TPanel zudeklarieren befolgt!

Habe jedoch wieder ein Problem :-( Wenn ich zwei Instanzen erzeugt habe, kann ich das erste Objekt also Auto1 löschen ohne Fehlermeldung wenn ich aber Auto2 per btncloseclick löschen will kommt immer eine EAccessViolation Exeption!!!

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:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
unit objekte;

interface

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

type
  //TOnClickEvent = procedure (Sender:TObject) of object;

  TAuto= class(TObject)
    //FOnClick: TOnClickEvent;
    fx:Integer;
    fy:Integer;
    test:TPanel;
    btn_close:TButton;
    constructor Create(AOwner: TComponent);
    destructor  destroy;


    procedure ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;X, Y: Integer);
    procedure ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure BtnCloseClick(Sender:TObject);
    //procedure anzeigen(xpos,ypos:Integer);
end;

implementation
var

  inReposition : boolean;
  oldPos : TPoint;
  //Sender:TPanel;

constructor TAuto.Create;
begin
//inherited;
test := TPanel.Create(form1);
with test do
  begin
    Visible :=true;
    Parent:=form1;
    Width :=100;
    Height :=100;
    onMouseDown:=ControlMouseDown;
    OnMouseUp:=ControlMouseUp;
    OnMouseMove:=ControlMouseMove;
  end;
//inherited;
btn_close:= TButton.Create(form1);
with btn_close do
  begin
    parent:=test;
    width:=10;
    height:=10;
    caption:= 'x';
    top:=0;
    left:=90;
    OnClick:=BtnCloseClick;
  end;

end;

destructor TAuto.Destroy;
begin
btn_close.Free;
//test.free;
inherited;
end;

procedure TAuto.BtnCloseClick(Sender:TObject);
begin
TButton(sender).parent.free;
//TButton(sender).Caption :='x';
inherited;
end;

//////////////////MOUSEMOVE///////////////////////
procedure TAuto.ControlMouseUp(
  Sender: TObject;
  Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if inReposition then
  begin
    Screen.Cursor := crDefault;
    ReleaseCapture;
    inReposition := False;
  end;
end;

procedure Tauto.ControlMouseMove(
  Sender: TObject;
  Shift: TShiftState;
  X, Y: Integer);
const
  minWidth = 20;
  minHeight = 20;
var
  newPos: TPoint;
  frmPoint : TPoint;
begin
  if inReposition then
  begin
    with TWinControl(Sender) do
    begin
      GetCursorPos(newPos);

      if ssShift in Shift then
      begin //resize
        Screen.Cursor := crSizeNWSE;
        frmPoint := ScreenToClient(Mouse.CursorPos);
        if frmPoint.X > minWidth then
          Width := frmPoint.X;
        if frmPoint.Y > minHeight then
          Height := frmPoint.Y;
      end
      else //move
      begin
        Screen.Cursor := crSize;
        Left := Left - oldPos.X + newPos.X;
        Top := Top - oldPos.Y + newPos.Y;
        oldPos := newPos;
      end;
    end;
  end;
end(*ControlMouseMove*)

procedure TAuto.ControlMouseDown(
  Sender: TObject;
  Button: TMouseButton;
  Shift: TShiftState;
  X, Y: Integer);
begin
  if(Sender is TWinControl) then
  begin
    inReposition:=True;
    SetCapture(TWinControl(Sender).Handle);
    GetCursorPos(oldPos);
  end;
end;
//////////////////////////////////////////////////

end.
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Mi 12.07.06 14:11 
Kanns sein, dass du Auto2 als
ausblenden Delphi-Quelltext
1:
Auto2:=Auto1;					

initialisierst?

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
covel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: Mi 12.07.06 14:23 
nein, sodern mit

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
uses objekte;
{$R *.dfm}

var
auto1,auto2:Tauto;

procedure TForm1.Panel1Click(Sender: TObject);
begin
Auto1:=TAuto.Create(self);//(120,120);
Auto2:=TAuto.Create(self);
end;


oder ist das dass gleiche wie auto2:=auto1;?
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Mi 12.07.06 14:28 
nein... die wurzel des bösen ist, dass du nur EINEN button erzeugst...

du erzeugst ihn ja immer mit

ausblenden Delphi-Quelltext
1:
  btn_close := TButton.Create(form1);					


Dabei soll der Owner des Buttons nicht das Form sondern dein Auto sein, oder ? dadurch erzeugst du eine Instanz deines btn_close nach der anderen, aber du hast immer nur den zuletzt erzeugten... gibst du diesen frei, hast du keinen button mehr, auf den du zugreifen kannst... dafür aber noch viele im speicher!

desweiteren... kann ich anfangen zu schreien, wenn ich in einem constructor eines Objektes sowas lese
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:
24:
25:
26:
27:
constructor TAuto.Create;  
begin  
  //inherited;  
  test := TPanel.Create(form1);  { <--- DAS HIER MEINE ICH}
  with test do  
  begin  
    Visible :=true;  
    Parent:=form1;  
    Width :=100;  
    Height :=100;  
    onMouseDown:=ControlMouseDown;  
    OnMouseUp:=ControlMouseUp;  
    OnMouseMove:=ControlMouseMove;  
  end;  
//inherited;  
  btn_close:= TButton.Create(form1);  
  with btn_close do  
  begin  
    parent:=test;  
    width:=10;  
    height:=10;  
    caption:= 'x';  
    top:=0;  
    left:=90;  
    OnClick:=BtnCloseClick;  
  end;  
end;


Du setzt damit voraus, dass bei der Verwendung von der Klasse TAuto IMMER ein form1 vorhanden ist! lass das form1 da weg! entweder packst du da nil rein... oder Self... oder du solltest da definitiv ein Panel draus machen, dann brauchst du auch dein test nicht mehr! Im constructor solltest du als ERSTES immer das inherited Create; aufrufen.

Desweiteren solltest du auch im destructor auch test freigeben...
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: Mi 12.07.06 14:32 
nein, ist nicht das gleiche...hast es schon richtig gemacht.
bei Auto2:=auto1; kopierst du nur den Pointer, d.h. es zeigen beide variablen auf 1 Objekt. wenn du es freigibst, sind beide Pointer (da gleich) ungültig.
Create erstellt ein neues Objekt und gibt den Pointer zurück, welchen du deiner variablen zuweist.

Gruß Frank

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
covel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: Mo 17.07.06 09:51 
So ich erzeuge nun die Buttons als Array, kann die einzelnen Panels aber immer noch nicht über Btn_close löschen.

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:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
unit objekte;

interface

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

type

  TAuto= class(TObject)
    fx:Integer;
    fy:Integer;
    test:Array[0..10of TPanel;
    btn_close:Array [0..10of TButton;
    constructor Create(AOwner: TComponent);
    //destructor  destroy;


    procedure ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;X, Y: Integer);
    procedure ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure BtnCloseClick(Sender:TObject);
    //procedure anzeigen(xpos,ypos:Integer);
end;

implementation
var
  inReposition : boolean;
  oldPos : TPoint;
  x,y: integer;

constructor TAuto.Create;
begin
test[x] := TPanel.Create(nil);
with test[x] do
  begin
    Visible :=true;
    Parent:=form1;
    Width :=100;
    Height :=100;
    onMouseDown:=ControlMouseDown;
    OnMouseUp:=ControlMouseUp;
    OnMouseMove:=ControlMouseMove;
    caption:= inttostr(x);
  end;

btn_close[y]:= TButton.Create(nil);
with btn_close[y] do
  begin
    parent:=test[x];
    width:=10;
    height:=10;
    caption:= 'x';
    top:=0;
    left:=90;
    OnClick:=BtnCloseClick;
  end;
inc(x);
inc(y);
end;

//destructor TAuto.Destroy;
//begin
//inherited;
//end;

procedure TAuto.BtnCloseClick(Sender:TObject);
begin
//TButton(sender).Free;
//TButton(sender).parent.free;
TButton(sender).destroy;
inherited;
end;

//////////////////MOUSEMOVE///////////////////////
procedure TAuto.ControlMouseUp(
  Sender: TObject;
  Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if inReposition then
  begin
    Screen.Cursor := crDefault;
    ReleaseCapture;
    inReposition := False;
  end;
end;

procedure Tauto.ControlMouseMove(
  Sender: TObject;
  Shift: TShiftState;
  X, Y: Integer);
const
  minWidth = 20;
  minHeight = 20;
var
  newPos: TPoint;
  frmPoint : TPoint;
begin
  if inReposition then
  begin
    with TWinControl(Sender) do
    begin
      GetCursorPos(newPos);

      if ssShift in Shift then
      begin //resize
        Screen.Cursor := crSizeNWSE;
        frmPoint := ScreenToClient(Mouse.CursorPos);
        if frmPoint.X > minWidth then
          Width := frmPoint.X;
        if frmPoint.Y > minHeight then
          Height := frmPoint.Y;
      end
      else //move
      begin
        Screen.Cursor := crSize;
        Left := Left - oldPos.X + newPos.X;
        Top := Top - oldPos.Y + newPos.Y;
        oldPos := newPos;
      end;
    end;
  end;
end(*ControlMouseMove*)

procedure TAuto.ControlMouseDown(
  Sender: TObject;
  Button: TMouseButton;
  Shift: TShiftState;
  X, Y: Integer);
begin
  if(Sender is TWinControl) then
  begin
    inReposition:=True;
    SetCapture(TWinControl(Sender).Handle);
    GetCursorPos(oldPos);
  end;
end;
//////////////////////////////////////////////////

end.
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Mo 17.07.06 10:10 
Was hältst du davon ?

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:
unit objekte;

interface

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

type

  TAuto= class(TObject)
    fx:Integer;
    fy:Integer;
    test:TPanel;
    btn_close:TButton;
    constructor Create(AOwner: TComponent);
    destructor  destroy;
    procedure BtnCloseClick(Sender:TObject);
  end;

implementation
var
  inReposition : boolean;
  oldPos : TPoint;

constructor TAuto.Create(AOwner: TComponent);
begin
  inherited Create;

  test := TPanel.Create(Self); // oder TPanel.Create(nil);
  with test do
  begin
    Visible := true;
    Parent  := AOwner;   // <-- WICHTIG: Hier kein statisches Form angeben
    Width   := 100;
    Height  := 100;
    onMouseDown:=ControlMouseDown;
    OnMouseUp:=ControlMouseUp;
    OnMouseMove:=ControlMouseMove;
  end;

  btn_close := TButton.Create(test);
  with btn_close do
  begin
    parent:=test;
    width:=10;
    height:=10;
    caption:='x';
    top:=0;
    left:=90;
    OnClick:=BtnCloseClick;
  end;
end;

destructor TAuto.Destroy;
begin
  test.free;
  btn_close.free;

  inherited;
end;

procedure TAuto.BtnCloseClick(Sender:TObject);
begin
  Close;
end;

end.


Noch einmal: Leite dir TAuto von TPanel ab. Desweiteren kannst du in einer Ereignis-Routine die aufrufende Komponente nicht freigeben. Das gibt dir immer einen Zugriffsfehler, da diese Komponente ja quasi "noch in Benutzung" ist. Dein Code ist seeeehr fehleranfällig, so wie du ihn da zusammenbaust... und noch etwas: benutze den destructor, da solltest du ALLE im Panel integrierten Komponenten frei geben.
covel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: Mo 17.07.06 11:01 
wie leite ich TAuto den von TPanel genau ab?? Bei deinem Quellcode bekommen ich ne fehlermeldung

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 test := TPanel.Create(self); // <----Funkt. nur mit nil
  with test do
  begin
    Visible := true;
    Parent  := AOwner;   // <--[Fehler] objekte.pas(81): Inkompatible Typen: 'TWinControl' und 'TComponent' 
    Width   := 100;
    Height  := 100;
    onMouseDown:=ControlMouseDown;
    OnMouseUp:=ControlMouseUp;
    OnMouseMove:=ControlMouseMove;
  end;
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Mo 17.07.06 11:10 
Ist gar nicht mal so schwer ;)

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:
118:
119:
120:
121:
122:
unit objekte;  
 
interface  

uses  
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  Dialogs, ExtCtrls, StdCtrls;  
 
type  
  TAuto= class(TPanel)  
    fx:Integer;  
    fy:Integer;  
    btn_close:TButton;  
    constructor Create(AOwner: TComponent);  
    destructor destroy;  
    procedure BtnCloseClick(Sender:TObject);  
    procedure ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;X, Y: Integer);  
    procedure ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);  
    procedure ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);  
  end;  

 
implementation  
var  
  inReposition : boolean;  
  oldPos : TPoint;  
 
constructor TAuto.Create(AOwner: TComponent);  
begin  
  inherited Create(AOwner);  

  Visible := true;  
  Width   := 100;  
  Height  := 100;  
  OnMouseDown:=ControlMouseDown;  
  OnMouseUp:=ControlMouseUp;  
  OnMouseMove:=ControlMouseMove;  

 
  btn_close := TButton.Create(Self);  
  with btn_close do  
  begin  
    parent:=Self;  
    width:=10;  
    height:=10;  
    caption:='x';  
    top:=0;  
    left:=90;  
    OnClick:=BtnCloseClick;  
  end;  
end;  

 
destructor TAuto.Destroy;  
begin  
  btn_close.free;  
  inherited;  
end;  
 
procedure TAuto.BtnCloseClick(Sender:TObject);  
begin  
  Self.Free; {Befürchte aber nach wie vor, dass du das Free so nicht aufrufen kannst, da du in einer Ereignis-Routine eines Objektes dieses nicht freigeben kannst}
end;  

//////////////////MOUSEMOVE///////////////////////  
procedure TAuto.ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);  
begin  
  if inReposition then  
  begin  
    Screen.Cursor := crDefault;  
    ReleaseCapture;  
    inReposition := False;  
  end;  
end;  

procedure TAuto.ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);  
const  
  minWidth = 20;  
  minHeight = 20;  
var  
  newPos: TPoint;  
  frmPoint : TPoint;  
begin  
  if inReposition then  
  begin  
    with TWinControl(Sender) do  
    begin  
      GetCursorPos(newPos);  

 
      if ssShift in Shift then  
      begin //resize  
        Screen.Cursor := crSizeNWSE;  
        frmPoint := ScreenToClient(Mouse.CursorPos);  
        if frmPoint.X > minWidth then  
          Width := frmPoint.X;  
        if frmPoint.Y > minHeight then  
          Height := frmPoint.Y;  
      end  
      else //move  
      begin  
        Screen.Cursor := crSize;  
        Left := Left - oldPos.X + newPos.X;  
        Top := Top - oldPos.Y + newPos.Y;  
        oldPos := newPos;  
      end;  
    end;  
  end;  
end(*ControlMouseMove*)  
 
procedure TAuto.ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);  
begin  
  if(Sender is TWinControl) then  
  begin  
    inReposition:=True;  
    SetCapture(TWinControl(Sender).Handle);  
    GetCursorPos(oldPos);  
  end;  
end;  
//////////////////////////////////////////////////  
 
end.
covel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: Mo 17.07.06 11:30 
bekomme ne fehlermeldung bei

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
TAuto= class(TPanel)  
    fx:Integer;  <---[Fehler] objekte.pas(193): Das Published-Feld 'fx' ist weder vom Typ class noch interface
    fy:Integer;  <---[Fehler] objekte.pas(194): Das Published-Feld 'fy' ist weder vom Typ class noch interface
    btn_close:TButton;  
    constructor Create(AOwner: TComponent);  
    destructor destroy;


habe die zeilen gelöscht!

Jedoch wenn ich nun mit
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Panel1Click(Sender: TObject);
begin
Auto1:=TAuto.Create(self);
end;


Auto1 erzeugen will wird es mir auf der Form1 nicht angezeigt!! Muss ich nen parent setzen?ß

Grüße Michael
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Mo 17.07.06 11:40 
Mein Fehler:

du solltest in einem Objekt/Klasse/Komponente immer zwischen private/public/published- properties/procedure etc differenzieren. fx, fy hattest du ja gar nicht benutzt, warum somit sowieso überflüssig.


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:
24:
25:
26:
27:
28:
29:
{...}   
type    
  TAuto= class(TPanel)
  private
    btn_close:TButton;    
    procedure BtnCloseClick(Sender:TObject);    
    procedure ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;X, Y: Integer);    
    procedure ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);    
    procedure ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);    
  public
    constructor Create(AOwner: TComponent);    
    destructor destroy;    
  end;    

{...}
implementation    

constructor TAuto.Create(AOwner: TComponent);    
begin    
  inherited Create(AOwner);    

  Parent := AOwner;
  Visible := true;    
  Width   := 100;    
  Height  := 100;    
  OnMouseDown:=ControlMouseDown;    
  OnMouseUp:=ControlMouseUp;    
  OnMouseMove:=ControlMouseMove;    
{...}
covel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: Mo 17.07.06 11:44 
Noch nen Fehler :-(

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
constructor TAuto.Create(AOwner: TComponent);  
begin
  inherited Create(AOwner);
  Parent := AOwner;   <---[Fehler] objekte.pas(214): Inkompatible Typen: 'TWinControl' und 'TComponent'
  Visible := true;
  left:=10;
  top:=10;
  Width   := 100;
  Height  := 100;
  OnMouseDown:=ControlMouseDown;
  OnMouseUp:=ControlMouseUp;
  OnMouseMove:=ControlMouseMove;
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Mo 17.07.06 12:09 
tu mir mal einen gefallen und poste mal deine ganze unit (oder pack mir das ganze projekt mal in eine zip datei)... mit dieser flickenarbeit kommen wir ja nicht wirklich voran ;)

C.
covel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: Mo 17.07.06 12:16 
here it is!! Erstmal besten dank das du dir so viel mühe gibst!!!!
Einloggen, um Attachments anzusehen!
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Mo 17.07.06 12:35 
momentan ist unsere firmenfirewall auf "paranoid" eingestellt und ich kann die datei von hier aus nicht herunterladen. ich schau mir das heute abend mal von zuhause an.

hoffe, du kannst noch so lange warten ;)

C.
covel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

Win XP PRo
Borland D7/C#
BeitragVerfasst: Mo 17.07.06 12:38 
alles klar ich warte :-)