Frage

Ich habe vor kurzem eine Funktion zu einer großen Anwendung geschrieben in Delphi (Version 2009), die der Benutzer Dateien aus dem Windows Explorer per Drag & Drop können sie auf einer TcxGrid Kontrolle. Ich erreichte dies über die gemeinsame Methode meiner eigenen Fenster proc an das Netz angebracht und die WM_DROPFILES Nachricht abfängt:

 originalGridWindowProc := cxGrid.WindowProc; // remember the old one
 cxGrid.WindowProc := GridWindowProc;  // assign the new one
 DragAcceptFiles(cxGrid.Handle, LongBool(True)); // setup to accept dropped files

Ich bin jetzt versuchen, diese Funktion zu verbessern, um festzustellen, wenn der Benutzer eine Datei auf eine bestehende Zeile im Raster fällt, die den Prozess der Überschreiben eine bestehende Datei mit einer neuen Version beginnen.

Mein erster Gedanke war, um zu sehen, ob der Mouseover-Ereignis des Grid-Control funktionieren würde. Er tut, aber nicht während des Ziehvorgangs ein.

Ich habe dann verwendet ein Programm namens Winspector, um zu sehen, welche Nachrichten an das Netz Steuerung gesendet wurden, wie die Maus über das Gitter bewegt wird, und ich kann nun erkennen, was die Maus Zeile ist vorbei, und markieren Sie es. Ich bin mit der gleichen Technik wie oben, aber in diesem Fall ist mir das Überschreiben der Fenster proc für das GridSite und nicht das Netz selbst, denn das ist, wo die Nachrichten nach Winspector zu gehen scheinen:

  originalGridSiteWindowProc := cxGrid.ActiveView.Site.WindowProc;
  cxGrid.ActiveView.Site.WindowProc := GridSiteWindowProc;

Hier ist der Körper von GridSiteWindowProc:

procedure Tfrm.GridSiteWindowProc(var message: TMessage);
var
  hitTest: TcxCustomGridHitTest;
  gridRecord: TcxCustomGridRecord;
begin
  //Log(IntToStr(message.Msg));
  case message.Msg of
    WM_NCHITTEST: begin
      hitTest := cxGrid.ActiveView.GetHitTest(cxGrid.ScreenToClient(Mouse.CursorPos));
      if hitTest is TcxGridRecordCellHitTest then begin
        gridRecord := TcxGridRecordCellHitTest(HitTest).GridRecord;
        if Not gridRecord.Focused then
          gridRecord.Focused := True;
      end;
      originalGridSiteWindowProc(message);
    end
    else
      originalGridSiteWindowProc(message);
  end;
end;

Wie Sie sehen, ich bin Einfangen der WM_NCHITTEST Nachricht dies zu erreichen. Nach Winspector, diese Nachricht wird an das Netz Website-Fenster während der Drag-Operation, aber wenn ich Kommentar-, dass Log () Anweisung, die folgende Ausgabe des Nachrichtenwert auf einen String-Liste (die ich manuell Dump auf ein Memo-Feld danach) auch gesendet, ich habe aus irgendeinem Grund festgestellt, dass ich nur ein oder zwei dieser Meldungen erhalten, wenn eine Datei über das Netz ziehen.

Nun - hier ist der interessante Teil: Wenn ich Winspector läuft und die Überwachung von Meldungen gehen in diesem Fenster haben, beginne ich plötzlich alle WM_NCHITTEST Nachrichten während der Datei Drag-Operation zu bekommen. Dies ist auch der Fall, wenn ich Ausgabe der Integer-Wert aller Nachrichten an das proc-Fenster direkt in ein separates Log-Fenster statt in einen Puffer String-Liste kommt zuerst. Ich hoffe, dass jemand in der Lage sein wird, einen Hinweis zu bieten, warum dies geschieht und wie dies zur Arbeit zu kommen.

War es hilfreich?

Lösung

Anstatt die WM_DROPFILES Nachricht verwenden, sollten Sie OLE Drag'n'Drop verwenden. Schauen Sie sich die RegisterDropTarget API. Sie können detaillierte Informationen über , wo ein Hemmschuh oder Tropfen stattfindet. Sie können auch mehrere Arten von Drag-Objekte übernehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top