N
Hallo nochmal im alten Jahr,
mein Drag&Drop Problem habe ich nun selbst lösen können. Ich stelle meine Lösung jetzt einfach mal hier rein, vielleicht hilft sie ja dann noch dem einen oder anderen.
Im Grunde ist es ja recht Einfach. Dank der Borland-Hilfe und auch einigen Suchens und lesens diverser PDFs aus den I-Net. Es lässt sich mit einer von
TDragControlObjectEx abgeleiteten Klasse prima lösen. Die Sache ist mit Sicherheit auch noch beliebig ausbaubar.
Ich habe keine wirklich eigene Klasse geschrieben, sondern meine sowieso vorhandenen Dateien entsprechend ergänzt.
Header-Datei meines Formulars:
//---------------------------------------------------------------------------
class TCustomDragObject : public TDragControlObjectEx {
private:
TDragImageList *cDragImages;
AnsiString cDragItem;
protected:
TDragImageList *__fastcall GetDragImages();
public:
__fastcall TCustomDragObject(TControl *cControl);
__fastcall ~TCustomDragObject();
void SetDragItem(AnsiString DragItm);
AnsiString GetDragItem(void);
};
//---------------------------------------------------------------------------
Source-Datei meines Formulars:
....
TCustomDragObject *cDragObject;
....
//---------------------------------------------------------------------------
__fastcall TCustomDragObject::TCustomDragObject(TControl *cControl) : TDragControlObjectEx(cControl) {
}
//---------------------------------------------------------------------------
__fastcall TCustomDragObject::~TCustomDragObject() {
if (cDragImages) cDragImages->Free();
}
//---------------------------------------------------------------------------
TDragImageList *__fastcall TCustomDragObject::GetDragImages() {
Graphics::TBitmap *DragBmp;
if (!cDragImages) cDragImages = new TDragImageList(NULL);
DragBmp = new Graphics::TBitmap();
try {
DragBmp->Canvas->Font->Style = DragBmp->Canvas->Font->Style << fsItalic;
DragBmp->Height = DragBmp->Canvas->TextHeight(cDragItem);
DragBmp->Width = DragBmp->Canvas->TextWidth(cDragItem);
DragBmp->Canvas->TextOutA(0, 0, cDragItem);
cDragImages->Width = DragBmp->Width;
cDragImages->Height = DragBmp->Height;
cDragImages->SetDragImage(cDragImages->AddMasked(DragBmp, clWhite), -16, 0);
} __finally {
DragBmp->Free();
}
return cDragImages;
}
//---------------------------------------------------------------------------
void TCustomDragObject::SetDragItem(AnsiString DragItm) {
cDragItem = DragItm;
}
//---------------------------------------------------------------------------
AnsiString TCustomDragObject::GetDragItem(void) {
return cDragItem;
}
//---------------------------------------------------------------------------
Dann kann mann in den jeweiligen Drag&Drop-Events der entsprechenden Komponenten mit dem CustomDragObject arbeiten.
//---------------------------------------------------------------------------
void __fastcall TfrmTPOemployeedeploy::lstOperationsDragOver(TObject *Sender, TObject *Source,
int X, int Y, TDragState State, bool &Accept) {
Accept = IsDragObject(Source);
}
//---------------------------------------------------------------------------
void __fastcall TfrmTPOemployeedeploy::lstOperationsMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y) {
if (Button == mbLeft) {
TJvListBox *LstBox = dynamic_cast<TJvListBox*>(Sender);
LstBox->BeginDrag(false, 5);
}
}
//---------------------------------------------------------------------------
....
//---------------------------------------------------------------------------
void __fastcall TfrmTPOemployeedeploy::lstOperationsStartDrag(TObject *Sender,
TDragObject *&DragObject) {
TJvListBox *cListBox;
cListBox = dynamic_cast<TJvListBox*>(Sender);
cDragObject = new TCustomDragObject(cListBox);
if ((cListBox->Items->Count <= 0) || (cListBox->ItemIndex < 0)) {
delete cDragObject;
return;
}
cDragObject->SetDragItem(cListBox->Items->Strings[cListBox->ItemIndex]);
DragObject = cDragObject;
}
//---------------------------------------------------------------------------
In den DragDrop-Events kann dann entsprechend mit
cDragObject->GetDragItem();
das Objekt abgerufen und verarbeitet werden. Wie aus meiner Klasse ersichtlich, habe ich diese nur für das Handeln von String-Objekten geschrieben. Aber auch das ist mir Sicherheit jedezeit erweiterbar.
Auf jeden Fall funktioniert es damit jetzt so wie ich das mir vorgestellt habe.
Wünsche euch allen einen Guten Rutsch ins neue Jahr.
Grüße Netzschleicher.