Announcement

Collapse
No announcement yet.

Drag and Drop ungewollt aktiv...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Drag and Drop ungewollt aktiv...

    Hallo Leute...

    Ich hab eine neue (hat ich bisher nicht gesehen) ungewoehnliche Reaktion eines TListviews... Beim verlassen einer TEdit box (OnExitEvent) wird eine Meldung ausgegben (MessageDlg) ob die Aenderungen uebernommen werden sollen... klcicke ich auf dem Listview (vorher war ich in der Editbox) erscheint die Meldung, wenn ich dann auf ja klicke geht der Drag Drop Mode des Listviews ungewollt an... verschiebe ich den Mauszeiger ... zieht er immer das selektierte ListItem mit (obwohl die linke Maustaste nicht gedrueckt ist)... Ich wollte schon das Drag Drop im ListView funktioniert... aber nur bei gedrueckter Maustaste und durch ziehen des Objectes...
    Kennt vielleicht jemand dieses Phaenomen und vielleicht auch die Loesung dazu.. hab schon mirt saemtlichen Drag einstellungen (inc. DragMode) rumgespielt... leider bis jetzt ohne Erfolg...

    mfg und Danke im vorraus

    Najib Amaioua

  • #2
    Hi,

    Ähnliches musste ich auch schon beobachten. Es scheint an einem eigenwilligen Verständis des Kilickevents seitens MS zu liegen, da es dort jederzeit reproduzierbar auftritt, während es linuxseitig nicht vorhanden ist.

    Gruss Gesin

    Comment


    • #3
      Hi Gesine,

      Hast du den schon mal ueber eine Loesung nachgedacht.... Unser Kunde findet das naemlich nicht so toll... Weisst du ob das vom Betriebssystem abhaengig... zur Zeit hat ich es nur unter Win2000 getestet... Naja im Notfall muss ich die Meldung aus dem OnExit rausnehmen... ist leider etwas gefaehrlich fuer den User... Sozusagen wie ein Delete ohne abfrage...

      Gruss

      Najib Amaioua

      P.S.: Vielleicht eiss ja Herr Andreas Kosch eine Loesung... Hab mir auch vor kurzem seine Buch ueber Delphi unter WIN32 gekauft... muss
      sagen sehr verstaendlich..

      Comment


      • #4
        Diese Verhalten kann man nicht unbedingt MS unterschieben, auch Borland hat daran schuld. Wird im OnExit() eine MessageBox() erzeugt dann wird der empfindliche Fokusierungsprozess zwichen den Fenstern gestört. Die ListBox glaubt sie sei fokusiert was sie aber nicht mehr ist. Abhilfe schaft es mit LastFocusWnd := Windows.GetFocus das aktuelle Fenster zu ermitteln und zwischenzu speichern. Danach wird mit Windows.SetFocus(Edit1.Handle) der Fokus wieder zurückgesetzt. Dann noch sicherheisthalber mit SendMessage(LastFocusWnd, wm_CancelMode, 0, 0); ein eventuelles Mouse-Capture freigegeben. Erst dann wird der Message Dialog aufgerufen. Nach Schließen des Dialogs kann mit Windows.SetFocus(LastFocusWnd) die ursprüngliche Fokusreihenfolge wiederhergestellt werden.<br>

        Das eigentliche Problem entsteht dadurch das ALLE Borlandscontrols kein OnBeforeExit() Event kennen. Dieses wäre die idealle Schnittstelle für deinen Dialog.<br> Das OnExit() wird durch eine gepostete cm_Exit Message nach dem Empfang der wm_SetFocus!! Message ausgelösst. Da cm_Exit mit PostMessage() versendet wurde wird das OnExit() Event erst zu einem Zeitpunkt aufgerufen wenn der Windows-Fokusierungsprozess zum neuen Fenster abgeschlossen wurde.<br> D.h. wird Edit1.OnExit() aufgerufen ist die ListBox schon vollständig fokusiert, aber die ListBox VCL der Maussteuerung noch nicht fertig. Diese hängt nämlich auch von der cm_Enter Message ab die selber wierderum durch die Borland VCL gepostet wird !!<br>
        Bei einer Unterbrechung dieser Logik durch einen Dialog, fangen die Messages wm_SetFocus, wm_KillFocus und deren geposteter Borland-Pendants cm_Enter und cm_Exit an, sich selber in den Schwanz zu beisen.<br>
        Grundsätzlich entsteht also ein Synchronisationsfehler zwischen dem was Windows glaubt welches Fenster den Fokus hat und das was die Borland VCL meint welches das ActiveControl sei. Da Borlands ListBox Mouseevents ActiveControl als Maß aller Dinge nimmt denkt die ListBox VLC sie sei fokusiert.<br>

        Unter Linux kann dies nicht auftreten da dort meineserachtens sowas wie SendMessages(), PostMessage() ganz anders implementiert wurde. D.h. dort gibts sowas nicht.

        Gruß Hage

        Comment


        • #5
          Hi Hagen,

          danke fuer die ausfuehrliche Erklaerung... Hat sich auch ganz logisch angehoert... Ich hab den Code ins OnExit Evenet eingefuegt... Trotzdem hat sich am verhalten des Listviews nicht geaendert... Drag und Drop geht nach wie vor unerwuenscht an... Nach dem Debug hab ich den Activecontrol kontrolliert... Alles laeuft so wie du beschrieben hast... der fokus wird wiedre zurueckgesetzt und dann nach der Message wierde neu gesetzt... trotzdem es bleibt beim alten...

          Gibt es viielleicht etwas was wir beide vergessen haben?

          Gruss Naji

          Comment


          • #6
            Hi Najib,

            Mit ähnlichen Tricks, wie von Hagen bereits geschildert, habe ich auch versucht dem Problem zu Leibe zu rücken. Leider ist der Erfolg damit eher mässig ( Irgendwie ist der GetFocus/SetFocus Mechanismus ja auch massgeblich an der 'Tüddelei' beteiligt ).

            Schuld an dem ganzen Rumgezicke ist offensichtlich die modale Natur des angezeigten Fensters bzw. Dialogs. Eine recht schmutzige aber zuverlässige Methode ist ein erzwungener Focuswechsel in der Show-Routine des anzuzeigenden modalen Dialogs. Wichtig dabei ist, dass FormMain nicht das Fenster ist, welches durch ModalDlgWnd kurz vorher den Fokus verloren hat. Schade ist, dass mit dieser Methode ein 'Zucken' durch die beteiligten Fenster geht.

            <pre>
            procedure ModalDlgWnd.FormShow(Sender: TObject);
            begin
            FormMain.SetFocus;
            SetFocus;
            end;
            </pre>

            Gruss
            Gesin

            Comment


            • #7
              Oder mal SendMessage(ListBox.Handle, wm_KillFocus, Handle, Handle) probieren, natürlich VOR dem Anzeigen des Dialoges. Das Problem ist wie gesagt das nach der Rückkehr des Dialoges die ListBox meint sie sei schon Fokusiert (VCL) und somit im ersten, nachfolgenden Mouseclick/move meint einen Schritt weiter zu sein.

              Gruß Hage

              Comment

              Working...
              X