Drag & Drop DragImage
-
Hallo Zusammen,
ich hab da mal wieder eine Frage.
In meinem Programm habe ich zwei TListBoxen. Zwischen diesen beiden sollen per Drag&Drop Einträge hin- und hergeschoben werden können. Das habe
ich auch per manuellem Drag&Drop prima hinbekommen. Auch das Sortieren, also das Verschieben von vorhandenen Einträgen in einer der beiden Listboxen klappt
einwandfrei. Um den zu verschiebenden Listboxeneintrag am Cursor hängend anzuzeigen hab ich dann entsprechend den ControlStyle 'csDisplayDragImage' gesetzt. Klappt auch prima.
Nun ist es aber so, das in der zweiten Listbox vor die Einträge noch eine Zahl, entsprechend der Position in der Liste gesetzt wird. Diese wird nun beim Drag aus dieser Listbox entsprechend am Cursor mit angezeigt.Meine Frage nun, kann ich auf dieses Image zugreifen und dieses auch verändern, so das ich also die Positionsnummer als String abschneiden und diesen dann praktisch wieder als DragImage an der Cursor hängen kann? Und wenn ja, wie muß ich dazu vorgehen.
Würde mich über Hilfe freuen.
Grüße Netzschleicher
P.S. Benutze RAD Studio 2007
-
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.