C++Builder Drag And Drop

C++Builder Drag And Drop
chkam
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 4 lata
  • Postów:59
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:

Kopiuj
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:

Kopiuj
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:

Kopiuj
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:

Kopiuj
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...

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 2 godziny
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.

KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
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 :

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

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
chkam
Mam to użyte w TForm_Main::FormCreate(TObject *Sender)
KA
No to powinno działać a jaką wersję masz C++ Builder?
chkam
Delphi 10.1 Berlin and C++ Builder 10.1 Builder Update 1 Starter
chkam
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 4 lata
  • Postów:59
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.

KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
0

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

Kopiuj
AnsiString FileName;

na

Kopiuj
String FileName;

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
chkam
Tak dokładnie to
KA
No to musi działać. Zrób testowy projekt (pusta forma + ten kod), wyślij spakowany na jakiś darmo hosting i daj link, bo albo robisz dziwny błąd który nie wynika z info które tu podałeś albo już nie wiem o co chodzi.
chkam
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 4 lata
  • Postów:59
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ć.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.