C++Builder Drag And Drop

0

Witam.

Używam oprogramowania Embarcadero C++Builder.
Ostatnio męczę się nad jedną funkcją, mianowicie nad "Drag and Drop Files into Form".

Przeczesałem już dużo internetu i dalej nie mogę znaleźć odpowiedzi na błędy bądź brak działania:

Plik *.h:

class TForm_Main : public TForm {
__published:	// IDE-managed Components
	// ...
private:
	void virtual __fastcall WMDropFiles(TWMDropFiles &Message);

public:
	__fastcall TForm_Main(TComponent* Owner);
	BEGIN_MESSAGE_MAP
	MESSAGE_HANDLER(WM_DROPFILES,TWMDropFiles,WMDropFiles);
	END_MESSAGE_MAP (TForm);
};

Plik *.cpp:

TForm_Main *Form_Main;
//---------------------------------------------------------------------------
__fastcall TForm_Main::TForm_Main(TComponent* Owner)
	: TForm(Owner) {
    //
}
//---------------------------------------------------------------------------
void __fastcall TForm_Main::WMDropFiles(TWMDropFiles &Message) {
	UINT FileCount = DragQueryFile((HDROP) Message.Drop, 0xFFFFFFFF, NULL, 0);
	String FileName;
	String FileExtension;

	int FileLength;
	for(UINT ii=0; ii < FileCount; ii++) {
		FileName.SetLength(MAX_PATH);
		FileLength = DragQueryFile((HDROP)Message.Drop, ii,
		FileName.c_str(), FileName.Length());
		FileName.SetLength(FileLength);
		ShowMessage( "X" );
	}
	DragFinish((HDROP) Message.Drop);
}
//###########################################################################
void __fastcall TForm_Main::FormCreate(TObject *Sender) {
	DragAcceptFiles(Form_Main-> Handle, true);
}

Nie ważne jak bym zmieniał kod, dostosowując się do wszystkich znalezionych przykładów:

void __fastcall TForm_Main::WMDropFiles(TWMDropFiles &Message) {
UINT FileCount = DragQueryFile((HDROP) Msg.Drop, 0xFFFFFFFF, NULL,  0); 
 AnsiString FileName; 
 AnsiString FileExtension; 
 
 int FileLength; 
 for(UINT ii=0; ii < FileCount; ii++) 
 { 
   FileName.SetLength(MAX_PATH); 
 FileLength = DragQueryFile((HDROP)Msg.Drop, ii, 
 FileName.c_str(), FileName.Length()); 
 FileName.SetLength(FileLength); 
 ProcessFile(FileLength) // <------ Whatever you want it to be... 
 } // end for 
 DragFinish((HDROP) Msg.Drop); 
 }

lub:

void __fastcall TForm1::WmDropFiles(TWMDropFiles& Message) {
   char buff[MAX_PATH];
   HDROP hDrop = (HDROP)Message.Drop;
   int numFiles = 
      DragQueryFile(hDrop, -1, NULL, NULL);
   for (int i=0;i < numFiles;i++) {
      DragQueryFile(hDrop, i, buff, sizeof(buff));
      // process the file in 'buff'
   }
   DragFinish(hDrop);
 }

wychodzą błędy z Undefinied Symbor Message / Msg
lub Canno't convert to w_char_t*
Po naprawie tych błędów nic nie działa...

0

wychodzą błędy z Undefinied Symbor Message / Msg
lub Canno't convert to w_char_t*

Wklej treść błędu (nie przepisuj bo ci to słabo wychodzi) i powiedz gdzie dokładnie wyskakuje, przy której linii.

0

Co do błędów o których piszesz to nie ma ich w C++ Builder Berlin przynajmniej z pierwszym kodem a nie działa bo zapomniałeś o :

__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	DragAcceptFiles(Handle, 1);
}
0

Tutaj pokazuje błąd zmiennej Msg (odnośnie jednego z kodów), ale wystarczy że przerobiłem to na Message i zadziałało.
Msg.png

Tutaj jest drugi błąd odnośnie przypisania różnych typów tekstu, spróbowałem zmienić String.c_str()
String.png

Po naprawie tych wszystkich błędów, program nie wyświetla nic, nawet jeżeli wrzucę do funkcji ShowMessage("cos"); na samym początku.

0

A jak naprawiłeś błąd > Cannot convert 'char *' to 'wchar_t *' bo jego naprawa powinna polegać na zmianie:

AnsiString FileName;

na

String FileName;
0

Znalazłem rozwiązanie, uruchomienie programu przez C++Builder uniemożliwia działanie Drag and Drop...
Po uruchomieniu programu ręcznie z ikony, procedura zaczęła działać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1