![]() |
Drag'n'Drop
Hallöle,
Ich bin ganz neu in die Delphi- Programmierung eingestiegen, und habe da so einige Probleme. Ich muß für meine Technikerschule ein kleine Programm entwerfen und brauche dazu das "Drag and Drop" verfahren. Ich habe es schon geschafft einen TButton zu verschieben :-D aber sobald ich es mit einem zweite versuche, springt immer derjenige, der an seinem Ort sitzen bleiben soll, zu dem Anderen :wall: . Kann mir da vieleicht jemand helfen? Ich wäre Euch sehr Dankbar!! |
Re: Drag'n'Drop
du musst schon genau sagen wann was wohin per drag&drop verschoben oder kopiert werden soll.....
und ein bissl quellcode wäre auch nicht schlecht |
Re: Drag'n'Drop
Meine Panels Sollen auf meinem Formular an eine X-Beliebige Stelle Verschoben werden
Delphi-Quellcode:
Hier ist jetzt nur einer drinnen. Aber sobald ein zweiter kommt, Setzt er sich auf den gleichen wie der erste
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin If Button=mbleft Then Panel1.BeginDrag(false) ; end; procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin accept := (Source is TPanel); end; procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer); begin Panel1.Left := x; Panel1.Top := y; Panel1.Parent := TWinControl(Sender); end; procedure TForm1.Panel2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin If Button=mbleft then Panel2.BeginDrag(false); end; procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin If button=mbleft then Label1.BeginDrag(True) end; [edit=Phoenix]Nal die Code-Tags eingefügt. Mfg, Phoenix[/edit] |
Re: Drag'n'Drop
Falls du die Jedis hast, kannst du TJvDesignSurface und TJvDesignPanel/Scollbox benutzen, die findest du unter RuntimeDesign ;)
|
Re: Drag'n'Drop
@jfheins: warum immer gleich Fremdkomponenten verwenden?
@mikegu: als erstes kann man den Quellcode, den man hier postet per "Delphi-Code"-Button formatieren, so das dieser dann für die Leser schön lesbar ist.
Delphi-Quellcode:
So sollte das ganze funktionieren,
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin If Button=mbleft Then Panel1.BeginDrag(false) ; end; procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin If Button=mbleft Then Button1.BeginDrag(false) ; end; procedure TForm1.Panel2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin If Button=mbleft then Panel2.BeginDrag(false); end; procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin If button=mbleft then Label1.BeginDrag(True) end; procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer); begin // beim Droppen müssen wir wie beim Ziehen der Komponenten // den Typ der Komponente beachten // (Typ TPanel, TButton und TLabel) if Source is TPanel then begin TPanel(Source).Left := x; TPanel(Source).Top := y; TPanel(Source).Parent := TWinControl(Sender); end else if Source is TButton then begin TButton(Source).Left := x; TButton(Source).Top := y; TButton(Source).Parent := TWinControl(Sender); end else if Source is TLabel then begin TLabel(Source).Left := x; TLabel(Source).Top := y; TLabel(Source).Parent := TWinControl(Sender); end; end; procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin // wir erlauben das Ziehen von Komponenten // vom Typ TPanel, TButton und TLabel accept := (Source is TPanel) or (Source is TLabel) or (Source is TButton); end; die wesentlichen Änderungen kannst du den Kommentaren im Quellcode entnehmen |
Re: Drag'n'Drop
@ computer-glssar.de
Vielen herzlichen Dank :-D Ich hoffe, ich komme jetzt weiter. Das mit dem "Delphi-Code"-Button habe ich nicht gewusst, aber ich werde es mir merken. @jfheins Auch bei dir vielen Dank. Auch wenn ich nicht weis was "TJvDesignSurface" ist. Aber es hört sich so an, als ob ich mich mal damit befassen sollte. Wie gesagt, ich habe erst mit der Delphi- Programmierung angefangen und bin für jede Hilfe froh die ich bekomme! Danke!! :lol: |
Re: Drag'n'Drop
das isn Units/Komponenten die dir Hilfe abnehmen sollen.
Es ist aber besser dies mal alles zu Fuß zu erledigen, denn du willst ja lernen. |
Re: Drag'n'Drop
Danke für diesen Tipp!!!
das Drag`n`Drop funktioniert sogar. Jetzt muß ich erst einmel gucken was ich da für einen Mist gebaut habe :zwinker: |
Re: Drag'n'Drop
@ computer-glossar.de
Kannst du mir vieleicht noch erklären warum mein Drag'n'Drop mit diesem Quellcode funktioniert,
Delphi-Quellcode:
aber nicht mit dem aus meinen Büchern?
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin TPanel(Source).left := x; TPanel(Source).top := y; TPanel(source).parent := TWinControl(Sender); end; Bsp.:
Delphi-Quellcode:
Würde mich echt mal interessieren was das "source" hier zu bedeuten hat.
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin Panel1.left := x; Panel1.top := y; Panel1.parent := TWinControl(Sender); end; Im übrigen, danke nochmal für die Hilfe. Ich bin echt begeistert :-D |
Re: Drag'n'Drop
erst einmal: schön dass du das nun auch mit dem quellcode formatieren hier im forum gefunden hast :-)
Delphi-Quellcode:
bedeutet dass alle Nachfahren von TPanel auf deinem Formular gedroppt werden dürfen.
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin TPanel(Source).left := x; TPanel(Source).top := y; TPanel(source).parent := TWinControl(Sender); end; Wenn du jedoch
Delphi-Quellcode:
verwendest, erlaubst du nur dem Panel1 auf dem Form gedroppt zu werden.
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin Panel1.left := x; Panel1.top := y; Panel1.parent := TWinControl(Sender); end; |
Re: Drag'n'Drop
mal noch eine Ergänzung...
Delphi-Quellcode:
- wenn sender=source kommt zugriffsverletzung (control kann nicht sein parent sein ;) )
function isChild(parent:TControl;child:TControl):boolean;
var c:TControl; begin c:=Child.Parent; result:=False; while assigned(c) and not result do begin if c=parent then result:=true; c:=c.Parent; end; end; procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin accept := (sender<>source) and (not isChild(source as TControl,(sender as TControl))) and (sender is TWinControl); end; - man darf das Parent nicht in sein client droppen (isChild-Funktion), sonst AV - der sender (= TargetControl) muss ein TWinControl sein, sonst gibt es auch Fehler (z.B. wenn man auf ein TLabel zieht) (vermutl. invalidCast to TWinControl) Gruß Frank |
Re: Drag'n'Drop
Danke Frank. Auch das wird mir helfen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz