Autor Beitrag
KnuffelTom
Hält's aus hier
Beiträge: 5

Win XP SP2
Delphi 7 Enterprise
BeitragVerfasst: Do 17.05.07 12:03 
Hallo Ihr absolut geniale Truppe!

Schreite heute zum ersten Mal aus dem Schatten - habe sonst meine Probleme immer anhand anderer Postings gelöst bekommen - und muss schon sagen:

Trotzdem ich Null Background in Sachen Programmierung habe, kann ich mittlerweile schon ganz passabel programmieren (zumindest passiert immer das, was ich will) und das dank dieser großartige Site!!! Weiter so! :flehan:


Nun zu meinem Problem:

Ich habe mir eine Komponente von einer TPaintbox abgeleitet und möchte nun ein Drag & Drop INNERHALB dieser Komponente umsetzen. Zur optischen Verschönerung möchte ich, dass der Cursor sich je nach state des linken Mousebuttons verändert - und das ist das Problem.

Sobald Mousedown ist, wird die Codezeile "Cursor := crDrag" zwar angesprunge, aber die sichtbare Umsetzung erfolgt erst, sobald die Mouse released wird.

Das Problem besteht übrigens auch auf einer nackten Form. Frage daher:

Gibt es sowas wie Cursor.invalidate? :?!?:

Herzlichen Dank im Voraus,

der Knufflige!

_________________
Wenn es einen Weg gibt, etwas besser zu machen...
Finde ihn! (Thomas Alva Edison)
webbi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 142

Win XP Pro SP2, Debian GNU/Linux 2.6
D5 Pro, D7 Pro, BDS2006, Kylix3, MS-VS 2005
BeitragVerfasst: Sa 19.05.07 18:38 
Spiel mal damit:

OnMouseMove, OnMouseEnter, OnMouseLeave, OnMouseActivate

_________________
Programmieren ist der Wettkampf zwischen Programmierer
die immer noch einfachere Programme schreiben und Anwender die immer noch dümmer werden...
_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: Sa 19.05.07 18:47 
warum nutzt du nicht die vorhandene Drag&Drop-Implementation?
dragMode=dmAutomatic
oder bei manuell:
BeginDrag/EndDrag
den rest kannst du über die DragOver/DragDrop-Events steuern...

HTH Frank
KnuffelTom Threadstarter
Hält's aus hier
Beiträge: 5

Win XP SP2
Delphi 7 Enterprise
BeitragVerfasst: So 20.05.07 18:13 
Titel: Das war's leider noch nich' :o(
Hallo und danke für die Beiträge,

leider geht das alles nicht ganz so einfach, aber ich glaube, ich schreibe mal ein wenig mehr zur eigentlichen Funktion:

Ich habe ein Planelement, das in 24 rechteckige Segmente eingeteilt ist. Diese symbolisieren die 24 Stunden des Tages. Jedes Stunden- Objekt besitzt verschiednee Eigenschaften, die auf wiederum verschiedene Weisen modifiziert werden können:
1) Per Kontextmenü über rechte Maustaste
2) Per Doppelklick
3) Per linke Maustaste festhalten und hoch oder runter ziehen (LMM).

Ich möchte nun aber eine Stunde auf eine andere kopieren und das möglichst per Drag & Drop.
Durch das LMM ist dmAutomatic ausgeschlossen. Daher versuchte ich es mit dmManual und einem Threshold, aber das funzte nicht ganz so gut (erstens Probleme mit dem Threshold und dann mit einem anpassen des Cursors im MouseMove, denn ich kann die Stunde nur auf zukünftige Stunden fallen lassen, daher muss im MouseMove abgefragt werden, ob das Droppen auch zulässig ist.)

Und genau diese Problem mit dem nicht aktualisierten Cursor ist mit einem einfachen Projekt nachzustellen:

Einfach eine Form nehmen und ein Edit- Feld einfügen. Dann im MouseMove das hier schreiben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if (ssright in Shift) or (ssleft in Shift)  or (ssmiddle in Shift) then
  begin
    cursor := crDrag;
  end
  else
  begin
    if (cursor = crDrag) then
      cursor := crArrow;
  end;

  edit1.Text := cursortostring(cursor);
end;


bei rechter und mittleren Maustaste funktioniert alles, bei der linken steht zwar der richtige Wert in Cursor, aber der Cursor wird nicht aktualisiert. Mit anderen Worten:

Ich kann zwar mein Drag & Drop bauen, aber man sieht's nicht, buhuuu! :autsch:

Also wenn Ihr noch weitere Tricks im Ärmel habt, dann bitte her damit. Bin für alles offen.

Herzlichen Dank,

der Knufflige.

_________________
Wenn es einen Weg gibt, etwas besser zu machen...
Finde ihn! (Thomas Alva Edison)
_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: Mo 21.05.07 02:39 
Titel: Re: Das war's leider noch nich' :o(
user profile iconKnuffelTom hat folgendes geschrieben:

3) Per linke Maustaste festhalten und hoch oder runter ziehen (LMM).

Durch das LMM ist dmAutomatic ausgeschlossen.

was heist nun LMM?? ist doch normales Drag&Drop, oder?
user profile iconKnuffelTom hat folgendes geschrieben:
Daher versuchte ich es mit dmManual und einem Threshold, aber das funzte nicht ganz so gut (erstens Probleme mit dem Threshold und dann mit einem anpassen des Cursors im MouseMove, denn ich kann die Stunde nur auf zukünftige Stunden fallen lassen, daher muss im MouseMove abgefragt werden, ob das Droppen auch zulässig ist.)

was verstehst du unter threshold? die Zeitdifferenz, ab wann das Drop erlaubt sein soll?
für letzteres gibt es DragOver, wo man accept setzen kann ;)

Gruß Frank
KnuffelTom Threadstarter
Hält's aus hier
Beiträge: 5

Win XP SP2
Delphi 7 Enterprise
BeitragVerfasst: Do 24.05.07 09:15 
Hallo Frank,

habe mir auf Deine Anregung hin gerade nochmal die Hilfe einer anderen Delphi- Version durchgelesen und mache das nun mit dmManual. Mit dmAutomatic geht's nicht, da meine anderen Funktionen (z.B. Doppelklick) dann nicht mehr funktionieren. Mache das dann mit:

BeginnDrag(False, -1);


Aber ich verstehe trotzdem noch nicht, warum bei dem Umsetzen der eigenen Drag & Drop- Routine das nicht mit der linken Maustaste funktioniert!?

Wenn noch einer was dazu weiss, dann bitte mal posten, ansonsten herzlichen Dank für den Denkanstoss,

der Knufflige.