Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Drag and Drop funktioniert nicht
Peter18 - Fr 13.05.11 16:49
Titel: Drag and Drop funktioniert nicht
Ein freundliches Hallo an alle,
erste Versuche mit Drag and Drop haben Probleme beschehrt. Und die Docu hilft nicht weiter.
Der Versuch per Taste ein Editfeld von "DragMode = dmManual" auf "DragMode = dmAutomatic" umzuschalten hatte nicht die erwartete Wirkung. "IsDragObject" gibt "False" zurück.
Auch
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Label1.Caption := 'X: '+IntToStr(X); Label2.Caption := 'Y: '+IntToStr(Y);
Repaint; Accept := True; end; |
brachte keine Fortschritte. Zwar wurde diese Routine aufgerufen und die Mausposition angezeigt, aber das Editfeld war wie festganagelt. In der Routine "TForm1.Edit1StartDrag" die Anweisung "DragObject.ShowDragImage;" einzutragen änderte nichts. Statt dessen sehe ich nur den "Halteverbot-Cursor".
Warscheinlich ist es eine Kleinigkeit oder ein Mistverständnis, dass nicht das erwartete Ergebnis zu sehen ist, nämlich die Änderung der Anzeige und Bewegen des Editfeldes. Ich hoffe jemand kann mir den entscheidenden Tipp geben.
Danke und viele Grüße von der sonnigen aber kühlen Nordsee
Peter
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Sa 14.05.2011 um 10:13
jaenicke - Fr 13.05.11 17:04
Peter18 hat folgendes geschrieben : |
| Warscheinlich ist es eine Kleinigkeit oder ein Mistverständnis, dass nicht das erwartete Ergebnis zu sehen ist, nämlich die Änderung der Anzeige und Bewegen des Editfeldes. |
Der Cursor sollte mit dem Code (der ja sagt, dass das Editfeld auf dem Formular abgelegt werden darf), wenn du aus dem Editfeld über das Formular ziehst, dort (
nur direkt auf dem Formular) zum Copy-Cursor werden. Nämlich mit einem kleinen Papier neben dem Cursor.
Wenn du willst, dass das Editfeld visuell bewegt wird, musst du das selbst implementieren.
Peter18 - Fr 20.05.11 18:42
Hallo an alle, hallo jaenicke,
die Routine
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Label1.Caption := 'X: '+IntToStr(X); Label2.Caption := 'Y: '+IntToStr(Y);
Repaint; Accept := True; end; |
hatte ich geschrieben, aber es fehlte noch etwas. Der Link
http://delphi.about.com/library/weekly/aa102505a.htm
hat Verständnis und eine Lösung gebracht.
Aber wozu dient "DragMode:=dmAutomatic;", wenn es doch selbst programmiert werden nuß??
Grüße von der Nordsee
Peter
jaenicke - Fr 20.05.11 19:48
Peter18 hat folgendes geschrieben : |
| Aber wozu dient "DragMode:=dmAutomatic;", wenn es doch selbst programmiert werden nuß?? |
Musst du doch nicht. :gruebel:
Du musst doch nur sagen, wo du den Vorgang annehmen willst. Das lässt sich automatisch relativ schlecht feststellen...
Aber du musst nirgends den Dragvorgang manuell starten, oder? :zwinker:
Peter18 - Di 24.05.11 11:25
hallo jaenicke,
danke für Deine Antwort, leider weiß ich nicht, was Du mir sagen willst. Beispiele wären hilfreich.
Ein "TEdit" kann ich inzwischen verschieben. Leider klappt es mit Delphi 4 nicht bei "TComboBox". Dort kann ich keine Maus-Ereignisroutinen eintragen, da sie anscheinend nicht durchgereicht werden. Auch "TControl(ComboBox).OnMouseDown" wurde mit einer Fehlermeldung quittiert.
Vielleicht gibt es ja eine weitere Möglichkeit als "Work Around"? die Drag&Drop ermöglicht.
Hier die Lösung, die ich mit Hilfe des Link:
http://delphi.about.com/library/weekly/aa102505a.htm erstellen konnte. Es wird ein "TEdit" und das dazugehörende "TLabel" bewegt. Speichern der neuen Position und Größe ist noch nicht implementiert:
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:
| procedure TForm1.ControlMouseDown( Sender: TObject; Button: TMouseButton; Shift : TShiftState; X, Y : Integer);
begin if (CB_DS_Cfg.Checked) AND (Sender is TWinControl) then begin Draging := True; SetCapture(TWinControl(Sender).Handle); GetCursorPos(oldPos); if ((Sender is TComboBox) or (Sender is TEdit)) and (TWinControl(Sender).Parent = PanelDS) then begin DragObj := TWinControl(GetControl( 'L_'+TWinControl(Sender).Name , Vertrieb.PanelDS )); end; end; end;
procedure TForm1.ControlMouseMove( Sender: TObject; Shift : TShiftState; X, Y : Integer);
const minWidth = 20; minHeight = 10; var newPos : TPoint; frmPoint : TPoint; begin if Draging then begin with TWinControl(Sender) do begin GetCursorPos(newPos);
if ssShift in Shift then begin 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 begin Screen.Cursor := crDrag; Left := Left - oldPos.X + newPos.X; Top := Top - oldPos.Y + newPos.Y; if DragObj <> Nil then begin DragObj.Left := DragObj.Left - oldPos.X + newPos.X; DragObj.Top := DragObj.Top - oldPos.Y + newPos.Y; end; oldPos := newPos; end; end; end; end;
procedure TForm1.ControlMouseUp( Sender: TObject; Button: TMouseButton; Shift : TShiftState; X, Y : Integer); begin if Draging then begin Screen.Cursor := crDefault; ReleaseCapture; Draging := False; DragObj := Nil; Screen.Cursor := crDefault; end; end; |
Für weitere Tipps und Beispiele wäre ich sehr dankbar!!
Grüße von der Nordsee
Peter
---
Moderiert von
Narses: Beiträge zusammengefasst---
Ein freundliches Hallo an alle,
:D endlich habe ich es verstanden! Die Mausereignisroutinen werden nicht bei den Anzeigeelementen z.B. "TEdit" eingetragen sondern bei dem übergeordneten Objekt also "TForm" oder "TPanel" u.s.w.. Dann kann man alle Objekte bewegen! :) :idea:
Grüße von der Nordsee
Peter
---
Moderiert von
Narses: Beiträge zusammengefasst---
Ein freundliches Hallo an alle,
da war ich wohl etwas voreilig. :(
Offenbar hat es Nebeneffekte mit anderen Ereignisroutinen und Einstellungen gegeben. Beim Einsatz an anderer Stelle: Banane. Vielleicht kann ja mal jemand die Zusammenhänge erklären!
Grüße von der Nordsee
Peter
Peter18 - Fr 03.06.11 11:04
Ein freundliches Hallo an alle,
da ich in diesem Forum bisher keine Tipps zu diesem Thema erhalten habe, tummelte ich mich in einem anderen. Zwar habe ich keine Hinweise erhalten, wie die Drag&Drop-Events zu verwenden sind, aber einen Work around. Diesen möchte ich hier zum Besten geben, falls jemand anders das gleiche Problem hat.
Die Ereignisroutinen für die Maus sind nicht verfügbar, können aber neu publiziert werden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| type TMyComboBox = class(TComboBox) published property OnMouseDown; property OnMouseMove; property OnMouseUp; end; |
Dann das Objekt deklarieren:
Delphi-Quelltext
1: 2: 3:
| implementation var MyComboBox: TMyComboBox; |
Die Ereignisroutinen können dann wie unter
http://delphi.about.com/library/weekly/aa102505a.htm beschrieben erstellt werden.
Um die Variante auch zur Entwicklungszeit verwenden zu können ist das folgende Programm nötig:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| type TMyComboBox = class(TComboBox) published property OnMouseDown; property OnMouseMove; property OnMouseUp; end; .... procedure Register;
implementation
procedure Register; begin RegisterComponents('Standard', [TMyComboBox]); end; |
Ich hoffe es ist für den Einen oder Anderen hilfreich.
Grüße von der heute sonnigen Nordsee
Peter
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!