wxTextCtrl (drag&drop) Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

wxTextCtrl (drag&drop)

Post by Ranger »

есть ли у кого нибудь простой пример реализации перетаскивания файлов(из проводника) в wxTextCtrl?
Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post by Ranger »

ну что, никто не может помочь?
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex »

Так а в samples/dnd пример есть и в документации вроде было
Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post by Ranger »

сделал так:

Code: Select all

#include <wx/app.h>
#include <wx/frame.h>
#include <wx/textctrl.h>
#include <wx/dnd.h>
#include <wx/filename.h>

#define	MAIN_WINDOW_ID 1000

class DnDFile : public wxFileDropTarget{
	private:
		wxTextCtrl *TargetTextCtrl;
	public:
		DnDFile(wxTextCtrl *target) {TargetTextCtrl = target; }
		virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString &filenames);
};
bool DnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString &filenames)
{
	wxFileName file(filenames[0]);
	if(file.GetExt() == "txt") TargetTextCtrl->LoadFile(filenames[0]);
	return true;
}
//---------------------------------------


class MainWindow : public wxFrame{
	private:
		wxTextCtrl *text_ctrl; 
	public:
		MainWindow(wxWindow *parent, wxWindowID id, const wxString &title, 
                           const wxPoint &pos, const wxSize &size, long style, const wxString &name);
		virtual ~MainWindow();
};

MainWindow::MainWindow(wxWindow *parent, wxWindowID id, const wxString &title, 
                       const wxPoint &pos, const wxSize &size, long style, const wxString &name) 
	  : wxFrame(parent,id, title, pos, size, style, name)
{
	text_ctrl  = new wxTextCtrl(this, wxID_ANY,wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
	text_ctrl->SetDropTarget(new DnDFile(text_ctrl));
}

//---------------------------------------
MainWindow::~MainWindow()
{
}

//---------------------------------------

class Application : public wxApp{
	public:
		bool OnInit();
};
IMPLEMENT_APP(Application)

bool Application::OnInit()
{
    MainWindow *main_window = new MainWindow(NULL,MAIN_WINDOW_ID, wxT("test"),
                                             wxPoint(100,100), wxSize(640,480), 
                                             wxDEFAULT_FRAME_STYLE, "test");	
    main_window->Show();
    return true;
}
но в Linux это отказывается компилироваться... ругается на 9 строку: 'expected class-name before ‘{’ token', и ещё метод SetDropTarget тоже 'не видит', пишет, что такого нет у wxTextCtrl. В чём может быть проблема?
Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post by Ranger »

с ошибками разобрался, но вот такой вопрос возник, как проверить формат файла, который я перетаскиваю?
radcapricorn
Experienced Solver
Experienced Solver
Posts: 70
Joined: Fri Nov 07, 2008 4:25 pm
Location: Saint-Petersburg, Russia

Post by radcapricorn »

Можно этим, но вообще все зависит от того, что нужно. :-)
win xp pro sp3/VS Express 2008/MinGW;
win Vista Ultimate/VS 2005;
Debian Lenny/gcc/cegcc-mingw32ce;
wxWidgets-2.8.9 w/wxWinCE;
Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post by Ranger »

Мне нужно при перетаскивании проверить имеет ли файл текстовый формат, т.е, если он не текстовый, то загрузка файла не должна состояться. Как собственно это можно проверить? wxMimeTypesManager думаю не совсем то, мне кажется, что мне нужно наследоваться от wxDataObject и переопределить его виртуальные методы, но что, и как конкретно, не могу разобраться...
Nikolay
Experienced Solver
Experienced Solver
Posts: 72
Joined: Wed Oct 10, 2007 4:27 am

Post by Nikolay »

А какой критерий текстовости файл?:)
Помоему вашего if(file.GetExt() == "txt") должно вполне хватать.
думаю что wxDataObject тут вообще не причем...
Best regards, Nikolay
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets
Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post by Ranger »

если wxDataObject непричём, то зачем в нём определен такой метод, как например

Code: Select all

virtual void GetAllFormats( wxDataFormat *formats, Direction dir = Get) const
и зачем нужен класс wxDataFormat? И метод void SetDataObject(wxDataObject* data) у класса wxFileDropTarget?
А насчёт проверки по расширению, то может под Windows это и будет работать, но не факт, что это будет работать под Linux. Да и под Windows... кто сказал, что file.txt это не переименованный file.bmp?
radcapricorn
Experienced Solver
Experienced Solver
Posts: 70
Joined: Fri Nov 07, 2008 4:25 pm
Location: Saint-Petersburg, Russia

Post by radcapricorn »

Гы. Ну так вообще-то любой файл - бинарный. Это для нас есть разница текст - не текст, а не для машины.
По-моему не в том месте копаете. Единственный способ достоверно проверить файл на "текстовость" - это просмотреть его целиком на предмет наличия "нечитаемых" символов. Но и то не всегда поможет - взять любой файл, закодированный в base64 - все "читаемые" символы, только вот "текстовостью" и не пахнет :-)
win xp pro sp3/VS Express 2008/MinGW;
win Vista Ultimate/VS 2005;
Debian Lenny/gcc/cegcc-mingw32ce;
wxWidgets-2.8.9 w/wxWinCE;
Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post by Ranger »

Ну так вообще-то любой файл - бинарный.
Это понятно, но есть ещё такая вещь как сигнатура... Но к текстовым файлам это конечно не относится)
Вобщем на "текстовость", насколько я понял, файл проверить не получиться? А для чего же тогда всётаки нужен класс wxDataFormat?
Nikolay
Experienced Solver
Experienced Solver
Posts: 72
Joined: Wed Oct 10, 2007 4:27 am

Post by Nikolay »

Best regards, Nikolay
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex »

wxMimeTypesManager

GetFileTypeFromMimeType
GetFileTypeFromExtension

wxFileType
A MIME type may have one or more associated extensions: "text/plain" will typically correspond to the extension ".txt", but may as well be associated with ".ini" or ".conf".
Post Reply