Einzelnen Beitrag anzeigen

Aike

Registriert seit: 2. Okt 2004
319 Beiträge
 
#1

Drag&Drop wird nicht vor erstem Klick ausgeführt

  Alt 19. Sep 2005, 13:10
Hallöchen,

es ist mir schon fast peinlich, wieder eine D&D-Frage zu stellen, da das Forum voll davon ist, abed ich probiere schon seit einer Stunde daran herum und komme nicht weiter.

Leider kann ich mein Problem schlecht in Code ausdrücken, aber ich versuche es mal so zu schildern ...

Mein Programm besteht aus einem Listbox (lstbxStart) und einer Editbox. Wenn man einen Ordner oder eine Datei auf die Listbox zieht, soll die Datei der Liste hinzugefügt werden. Das funktioniert soweit auch, aber leider erst, nachdem ich ein mal in die Listbox geklickt habe. Es ist mir völlig schleierhaft, warum da etwal passieren soll, da kein OnClick-Ereignis definiert ist. Ich habe eigentlich auch alle Eigenschaftswerte wie in einer anderen Listbox verwendet, die ich mal programmiert habe.

Hier etwas Code:

Delphi-Quellcode:
procedure TfrmFastCast.lstbxStartMouseDown(Sender: TObject;
begin
//Gekürzt

if ssLeft in Shift then
  begin
    DragAcceptFiles(self.Handle, true);
    ReleaseCapture;
    Self.Perform(WM_NCLBUTTONDOWN, HTCAPTION, varEmpty);
  end;
end;

procedure TfrmFastCast.lstbxStartDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  if Sender = lstbxStart then
    Accept:=False
  else
    Accept:=True;
end;

procedure TfrmFastCast.FormCreate(Sender: TObject);
begin
//Gekürzt

  lstbxStart.DragMode:=dmAutomatic;
  DragAcceptFiles(self.Handle, True);
end;

procedure TfrmFastCast.WMDropFiles(var Msg: TMessage);
var i, anzahl, size: integer;
    Dateiname: PChar;
    mousepos: TPoint;
    ndx: integer;
begin
  GlobParameter:='';
  inherited;
  Dateiname := '';
  anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255);
  if (GetCursorPos(mousepos)) then // Position des Cursors
  begin
    mousepos := lstbxStart.ScreenToClient(mousepos);
    ndx := lstbxStart.ItemAtPos(mousepos, True);
    if ndx <> -1 then
    begin
      FileName:=lstbxStart.Items[ndx];
    end;
  end;
  // Dieser Code ist dann für die Pfade die gedroppt werden
  for i := 0 to (anzahl - 1) do
  begin
    size := DragQueryFile(Msg.WParam, i, nil, 0) + 1;
    Dateiname := StrAlloc(size);
    DragQueryFile(Msg.WParam, i, Dateiname, size);

    GlobParameter:=Dateiname;
    StrDispose(Dateiname);
  end;

  if GlobParameter<>'then
    lstbxStart.OnDblClick(self);
  else
    FileName:='';
    
  DragFinish(Msg.WParam);
  Drop(FileName); //Drop ist eine weitere Prozedur.
end;
Die Eigenschaften der Listbox aus dem Builder:
Delphi-Quellcode:
DragKind:=dkDrag;
DragMode:=dmAutomatic;
Was mir noch aufgefallen ist, ist, dass es mit dem D&D nicht funtioniert, wenn ich bei DragAcceptFiles anstatt "self.handle" den Namen der Listbox angebe. Zwar kann ich dann nicht mehr auf das ganze Formular droppen, aber es passiert auch nichts mehr :-/

Ich hoffe, ihr könnt mir helfen, auch wenn der Code ein Schuss ins Blaue ist :-/


Liebe Grüße
Aike
Achim
  Mit Zitat antworten Zitat