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