Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Fr 13.05.11 16:49 
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
ausblenden 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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Sa 14.05.2011 um 10:13
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 13.05.11 17:04 
user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Fr 20.05.11 18:42 
Hallo an alle, hallo jaenicke,

die Routine
ausblenden 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
delphi.about.com/lib...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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 20.05.11 19:48 
user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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: delphi.about.com/lib...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:
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:
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      // Label holen u. DragObj zuweisen!
      DragObj := TWinControl(GetControl( 'L_'+TWinControl(Sender).Name , Vertrieb.PanelDS ));
    end;
  end;
end(*ControlMouseDown*)

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   // in Ctrl und Shift ändern
      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 := crDrag;        // crSize
        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(*ControlMouseMove*)

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;
    // In Grid eintragen !!!
    Screen.Cursor := crDefault;
  end;
end(*ControlMouseUp*)



Für weitere Tipps und Beispiele wäre ich sehr dankbar!!

Grüße von der Nordsee
Peter

---Moderiert von user profile iconNarses: 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 user profile iconNarses: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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:
ausblenden 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:

ausblenden Delphi-Quelltext
1:
2:
3:
implementation
var
  MyComboBox: TMyComboBox;

Die Ereignisroutinen können dann wie unter delphi.about.com/lib...weekly/aa102505a.htm beschrieben erstellt werden.

Um die Variante auch zur Entwicklungszeit verwenden zu können ist das folgende Programm nötig:

ausblenden 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