Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: Поиск текста в файлах
Показать сообщение отдельно

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Доброго времени суток student_po, не совсем понятно, какого масштаба задание: практика, лаба, расчётно-графическая, другое?
Меня смущает в перечисленных форматах наличие doc и rtf, так как для последних встроенных возможностей языка будет не достаточно. Придётся писать довольно массивный код, дабы получить возможность без проблемного чтения данных файлов (по сути свой Word/WordPad), чего не скажешь про txt.
В технологии поиска можно предусмотреть использование ключевых слов "и" "или" и т.д. или без таких, опираясь на спец символы, вводящие в окно поиска, дабы искать по несколько строк сразу.

Для построения GUI в предполагаемых средствах программирования Visual C++ 6 и выше до 9 во всех этих версия можно построить, используя или чистый Win32 Api, или библиотеку классов MFC.
В версиях 7.Х и выше возможно так же использовать и WinForms (который использует .Net Framework), а начиная с 8й версии и выше можно и Windows Presentation Foundation (тоже использует .Net Framework).
Если окно нужно строить используя WIN32 API, то вот
прототип окна поиска
Код: Выделить весь код
#include <windows.h>
#include <commctrl.h>

#pragma comment(lib, "comctl32.lib")

enum {ID_BUTTON};

HWND hWndListView;

LRESULT CALLBACK WindowFunc(HWND hWnd,UINT message,
			WPARAM wParam,LPARAM lParam)
{
	switch (message)
	{	
		case WM_CREATE:
			CreateWindow(
				TEXT("STATIC"),
				TEXT("Search by any or all of the criterial below."),
				WS_CHILD | WS_VISIBLE,
				10,
				10,
				270,
				20,
				hWnd,
				NULL,
				NULL,
				NULL);
			CreateWindow(
				TEXT("STATIC"),
				TEXT("All or part of the file name:"),
				WS_CHILD | WS_VISIBLE,
				10,
				45,
				250,
				20,
				hWnd,
				NULL,
				NULL,
				NULL);
			CreateWindow(
				TEXT("EDIT"),
				NULL,
				WS_CHILD | WS_VISIBLE | ES_LEFT | ES_MULTILINE ,
				10,
				65,
				270,
				20,
				hWnd,
				NULL,
				NULL,
				NULL);
			CreateWindow(
				TEXT("STATIC"),
				TEXT("A word or phase in the file:"),
				WS_CHILD | WS_VISIBLE,
				10,
				85,
				250,
				20,
				hWnd,
				NULL,
				NULL,
				NULL);
			CreateWindow(
				TEXT("EDIT"),
				NULL,
				WS_CHILD | WS_VISIBLE | ES_LEFT | ES_MULTILINE ,
				10,
				105,
				270,
				20,
				hWnd,
				NULL,
				NULL,
				NULL);
			CreateWindow(
				TEXT("STATIC"),
				TEXT("Look in:"),
				WS_CHILD | WS_VISIBLE,
				10,
				125,
				100,
				20,
				hWnd,
				NULL,
				NULL,
				NULL);
			CreateWindow(
				TEXT("EDIT"),
				NULL,
				WS_CHILD | WS_VISIBLE | ES_LEFT | ES_MULTILINE ,
				10,
				145,
				270,
				20,
				hWnd,
				NULL,
				NULL,
				NULL);
			CreateWindow(
				TEXT("BUTTON"),
				TEXT("Search"),
				BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_TABSTOP,
				200,
				200,
				80,
				30,
				hWnd,
				NULL,	
				NULL,
				NULL);
		break;

		case WM_COMMAND:
			switch(wParam)
			{
				case ID_BUTTON:
					//MessageBox(NULL, TEXT("Search Results"), TEXT("About"), MB_ICONASTERISK | MB_OK);
				ShowWindow(hWndListView,SW_SHOW);
				break;
			}
			break;

	case WM_DESTROY:
			PostQuitMessage (0);
		break;

	default:
			return DefWindowProc (hWnd,message,wParam,lParam);
	}
		return 0;
}

int WINAPI WinMain (HINSTANCE hThisInst,HINSTANCE hPrevInst,
				LPSTR lpszArgs,int nWinMode)
{	
	WNDCLASS wcl;
	wcl.style = 0;
	wcl.lpfnWndProc = WindowFunc;
	wcl.cbClsExtra = 0;
	wcl.cbWndExtra = 0;
	wcl.hInstance = hThisInst;
	wcl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
	wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
	wcl.hbrBackground = (HBRUSH)COLOR_WINDOW;
	wcl.lpszMenuName = NULL;
	wcl.lpszClassName = TEXT("Search");

	if (!RegisterClass (&wcl))
		return -1;
	HWND hWnd = CreateWindowEx (WS_EX_TOPMOST,
		wcl.lpszClassName,
		TEXT("Search Results"),
		WS_TILEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		HWND_DESKTOP,
		NULL,
		hThisInst,
		NULL);
	if (!hWnd)
		return -1;

	ShowWindow (hWnd,nWinMode);
	UpdateWindow (hWnd);
	MSG msg;

hWndListView = CreateWindow(
				WC_LISTVIEW,
 NULL,
				WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
	300,
	10,
	250,
	220,
	hWnd,
	NULL,
	NULL,
	NULL);
#ifdef UNICODE
	TCHAR szColumnHeader[3][12] = {TEXT("Name"), TEXT("In Folder"), TEXT("Size")};
#else
	char szColumnHeader[3][12] = {TEXT("Name"), TEXT("In Folder"), TEXT("Size")};
#endif
	int index;
	int iiWidth[3];
	LV_COLUMN lvC;

	ListView_SetExtendedListViewStyle(hWndListView, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

	iiWidth[0] = 60;
	iiWidth[1] = 100;
	iiWidth[2] = 400;

	lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
	lvC.fmt = LVCFMT_LEFT;

	for(index = 0; index < 3; index++)
{
		lvC.iSubItem = index;
		lvC.cx = iiWidth[index];
		lvC.pszText = szColumnHeader[index];
		ListView_InsertColumn(hWndListView,index,&lvC);
	}

	while(GetMessage(&msg, NULL, 0, 0) > 0)
	{
		TranslateMessage (&msg);
		DispatchMessage (&msg);
	}
	return msg.wParam;
}
По нажатию на кнопку Поиск ("Search") появляется окно с предполагаемым результатом. Кроме того в коде не совсем корректно создаётся собственно это окно (в примере моветон), так как по хорошему его создание и определение ListView_SetExtendedListViewStyle нужно было размещать в case WM_CREATE: а не так как здесь после MSG msg; перед while(GetMessage(&msg, NULL, 0, 0) > 0). На практике между этими двумя строками ничего не должно быть.
Я размесил эго создание между этим двумя строчками, так как хотел продемонстрировать его включение по кнопке. А как включать это окно, если оно расположено на своём месте в case WM_CREATE: я показать не готов (кнопка в case WM_COMMAND: получает не инициализированный hWndListView), возможно другие участники смогу подсказать как это сделать корректно.

Если же окно нужно строить не на Win32 API, тогда, учитывая что версия MSVC от 6 до 9, его нужно строить с использованием библиотек MFC. Это ещё проще, так как это можно сделать визуально, перетягивая соответственные элементы управления.

Последний раз редактировалось Admiral, 13-08-2009 в 00:44.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:42, 12-08-2009 | #2

Название темы: Поиск текста в файлах