Отображение данных из файла в виде таблицы
Как данные из фАЙла отобразить на каком-нить элементе, например Edit, в виде таблицы с названиями колонок, и вообще какой элемент для этого лучше подходит. С испольхованием WinApi a HE MFC, вот пример файла.
Зачем же эдит,лучше тогда засунь все в ListView Control
так а как в него занести данные когда я его ставлю на окно,тогда оно совсем не хочет отображаться, я не понимаю, что за глюк, если можно поподробнее как его использовать и т. д. ??
Вот посмотри мой примерчик,скачай прикрепленный архив(среда MSVS C++ 7.0)
Как данные из фАЙла отобразить на каком-нить элементе, например Edit, в виде таблицы с названиями колонок, и вообще какой элемент для этого лучше подходит. С испольхованием WinApi a HE MFC, вот пример файла.
Это непростая задача. Лучше воспользоваться готовыми решениями. При этом MFC проще пользоваться, т.к. это оболочка над WinAPI. Смотри тему
http://forum.codenet.ru/showthread.php?s=&threadid=28160&highlight=FlexGrid
Это непростая задача. Лучше воспользоваться готовыми решениями. При этом MFC проще пользоваться, т.к. это оболочка над WinAPI. Смотри тему
http://forum.codenet.ru/showthread.php?s=&threadid=28160&highlight=FlexGrid
Ну почему же не простая,очень даже простая задача. И если не чистый WinApi то тогда уж лучше WTL.
Ну почему же не простая,очень даже простая задача. И если не чистый WinApi то тогда уж лучше WTL.
Простая если нужно отобразить две строки. Попробуйте отобразить в гриде 1 000 000 вещ. чисел. Или более того. Нужно, чтобы грид мог отлавливать события вроде "отобразить 30 строк данных, начиная с такой-то строки", а не все читал все сразу.
Кстати, по ссылке выше компонент это умеет.
вот та прога которую мне дали, там же найдете *ехе моей, просто запостите ее и ничего не вводя нажмите Scan(убедитесь, что файл, stat.log присутствует).
мне тут один человек посоветовал сделать это с помощью ListView, и предложил тестовую прогу(см. прикр. файл), я ее сделал под свою прогу т. е. вставил пять колонок, помещаю туда записи из файла(около 2500), все вполне нормально работает, только вот не могу понять как сделать например фиоттрация, сортировку, и поиск элемента найболее встречающегося в таблице,
вот та прога которую мне дали, там же найдете *ехе моей, просто запостите ее и ничего не вводя нажмите Scan(убедитесь, что файл, stat.log присутствует).
Тебе что конкретно надо? Алгоритм фильтрации,поиска элемента,сортировки? Или по какому событию это сделать?
Тебе что конкретно надо? Алгоритм фильтрации,поиска элемента,сортировки? Или по какому событию это сделать?
Ну мне надо например при нажатии на кнопку или при выборе пункта меню, чтобы осуществлялась, например сортировка (фильтрацию я уже сделал приложу программу посмотришь, просто она как-то медленно работает, может предложишь вариант с более эффективным быстродействием), кокого-либо столбца, а еще лучше будкт если осуществить сортировку при нажатии на элемент с именем столбца, т. е. в моем случае это - Date, Time, Page, Browser, clientIP.
Фильтрацию я делал следующим методом:
//функцыя фильтрации
int Filter(HWND hwnd_list, HWND mainWnd, int number)
{
int p=num; //переменная указывающая на кол-во элементов в //таблице
char qwert[100], nCel[100];
GetDlgItemText(mainWnd, 99999, nCel, 100);
for(int k=0;k<p;k++)
{
ListView_GetItemText(hwnd_list, k, number, qwert, 100);
if (strcmp(nCel, qwert))
{
ListView_DeleteItem(hwnd_list, k);
k--;
p--;
}
}
return 0;
}
Передаваемые параметры HWND hwnd_list - LIstView в который я вывожу данные, его индефикатор 99999.
HWND mainWnd - главное окно
int number - номер колонки в которой выполнять фильтрацию, т. е. в Data, Time, Page и т. д.
char qwert[100] переменная в которую считывается значение опр. элемента, столбца переданного в int number
nCel[100] переменная в которую вводиться текст по которуму нужно отсортировать
Ну а далее идет цикл от 0 до количество элементов, в нем сравниваются значение поля(пер. qwert) и значение введенное в поле Edit(пер. nCel) и если они равны, строка остается если нет, то удаляется, при удалении все элементы смещаются на один пунк назад, поэтому надо уменшить значение к и количество элементов становиться меньше, значит стоит уменшить p;
И последняя вещь которая мне наюо это определение значение наиболее часто встречающегося в опр. столбце, т. е. например на какую страницу было больше всего посещений.
Вот это же прога с фильтрацией...
В поле возле кнопки Filter введите имя столбца учитывая регистр букв например Date, Time, Page, Browser, clientIP. В нижнем поле, которое побольше введите значение по которому нужно отфильтровать(учитывая рнгистр букв).
Возможно потом придется подождать до 15 сек, зависит от конф. компьютера.
Чтобы потом отобразить все данные таблицы занова, поле для ввода имене столбца оставьте пустым а поледля ввода значения введите .back и нажмите filter.
Ну мне надо например при нажатии на кнопку или при выборе пункта меню, чтобы осуществлялась, например сортировка (фильтрацию я уже сделал приложу программу посмотришь, просто она как-то медленно работает, может предложишь вариант с более эффективным быстродействием), кокого-либо столбца, а еще лучше будкт если осуществить сортировку при нажатии на элемент с именем столбца, т. е. в моем случае это - Date, Time, Page, Browser, clientIP.
Фильтрацию я делал следующим методом:
//функцыя фильтрации
int Filter(HWND hwnd_list, HWND mainWnd, int number)
{
int p=num; //переменная указывающая на кол-во элементов в //таблице
char qwert[100], nCel[100];
GetDlgItemText(mainWnd, 99999, nCel, 100);
for(int k=0;k<p;k++)
{
ListView_GetItemText(hwnd_list, k, number, qwert, 100);
if (strcmp(nCel, qwert))
{
ListView_DeleteItem(hwnd_list, k);
k--;
p--;
}
}
return 0;
}
Передаваемые параметры HWND hwnd_list - LIstView в который я вывожу данные, его индефикатор 99999.
HWND mainWnd - главное окно
int number - номер колонки в которой выполнять фильтрацию, т. е. в Data, Time, Page и т. д.
char qwert[100] переменная в которую считывается значение опр. элемента, столбца переданного в int number
nCel[100] переменная в которую вводиться текст по которуму нужно отсортировать
Ну а далее идет цикл от 0 до количество элементов, в нем сравниваются значение поля(пер. qwert) и значение введенное в поле Edit(пер. nCel) и если они равны, строка остается если нет, то удаляется, при удалении все элементы смещаются на один пунк назад, поэтому надо уменшить значение к и количество элементов становиться меньше, значит стоит уменшить p;
По данному пункту предлагаю завести массивы по каждому столбцу в виде stl контейнеров векторов:
#include <vector>
#include <string>
using namespace std;
....
vector<string> vDate;
vector<string> vTime;
vector<string> vPage;
vector<string> vBrowser;
vector<string> vclientIP;
...добавляем данные сюда каждый раз как добавляем элементы в ListView примерно так:
for(int i=0;i<kolvo_elementov;i++)
{
vDate.push_back("01.08.99");
vTime.push_back("13.25.23");
vPage.push_back("1");;
vBrowser.push_back("111");
vclientIP.push_back("192.168.12.0");
.... добавляем в ListView те же данные,т.е здесь создаем новую строку и так для каждого элемента
}
далее фильтруем так:
int Filter(HWND hwnd_list, HWND hwnd_edit_forfilter, int number)
{
int count=ListView_GetItemCount(hwnd_list);
//переменная указывающая на кол-во элементов в таблице
char tmp[100];
GetWindowText(hwnd_edit_forfilter,tmp,100);
vector<string>* pcolumn;
switch(number)
{
case 1:
pcolumn=&vDate;
break;
case 2:
pcolumn=&vTime;
break;
case 3:
pcolumn=&vPage;
break;
case 4:
pcolumn=&vBrowser;
break;
case 5:
pcolumn=&vclientIP;
break;
default: return 0;
}
for(int i=0;i<count;i++)
{
if ((*pcolumn)!=temp))
{
vDate.erase(vDate.begin()+i);
vTime.erase(vTime.begin()+i);
vPage.erase(vPage.begin()+i);
vBrowser.erase(vBrowser.begin()+i);
vclientIP.erase(vclientIP.begin()+i);
ListView_DeleteItem(hwnd_list, i);
count--;
i--;
}
}
return 1;
}
Попробуй такой вариант,хоть и выглядит он больше но скорость должна увеличится,хотя конечно если много элементов за раз фильтруется и соответственно много раз происходит удаление лишних строк,то я бы лучше сделал так: Добавил бы в начале функции очистку от элементов всего ListView, затем произвел сортировку по выше предложенному алгоритму без использования ListView_DeleteItem. И после сортировки вывел в ListView отфильтрованые значения из наших векторных массивов,так как они станут содержать нужные данные.
И последняя вещь которая мне наюо это определение значение наиболее часто встречающегося в опр. столбце, т. е. например на какую страницу было больше всего посещений.
Ну примерно так с учетом введеных массивов из предыдущего примера.
int Filter(int NUMBER_COLUMN,string& str_result,int& Count)
{
vector<string>* pcolumn;
switch(NUMBER_COLUMN)
{
case 1:
pcolumn=&vDate;
break;
case 2:
pcolumn=&vTime;
break;
case 3:
pcolumn=&vPage;
break;
case 4:
pcolumn=&vBrowser;
break;
case 5:
pcolumn=&vclientIP;
break;
default: return 0;
}
vector<string> tmp;
tmp=*pcolumn;
sort<tmp.begin(),tmp.end());
string str;
int cnt=1,max_cnt=0;
for(int i=0;i<tmp.size()-1;i++)
{
if(tmp==tmp[i+1]) cnt++;
else
{
if(max_cnt<cnt)
{
str=tmp;
max_cnt=cnt;
}
cnt=1;
}
}
str_result=str;
Count=max_cnt;
return 1;
}