Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Отображение данных из файла в виде таблицы

1.8K
09 апреля 2006 года
Death Knight
139 / / 19.02.2006
Как данные из фАЙла отобразить на каком-нить элементе, например Edit, в виде таблицы с названиями колонок, и вообще какой элемент для этого лучше подходит. С испольхованием WinApi a HE MFC, вот пример файла.
406
09 апреля 2006 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Death Knight
Как данные из фАЙла отобразить на каком-нить элементе, например Edit, в виде таблицы с названиями колонок, и вообще какой элемент для этого лучше подходит. С испольхованием WinApi a HE MFC, вот пример файла.


Зачем же эдит,лучше тогда засунь все в ListView Control

1.8K
09 апреля 2006 года
Death Knight
139 / / 19.02.2006
так а как в него занести данные когда я его ставлю на окно,тогда оно совсем не хочет отображаться, я не понимаю, что за глюк, если можно поподробнее как его использовать и т. д. ??
406
09 апреля 2006 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Death Knight
так а как в него занести данные когда я его ставлю на окно,тогда оно совсем не хочет отображаться, я не понимаю, что за глюк, если можно поподробнее как его использовать и т. д. ??



Вот посмотри мой примерчик,скачай прикрепленный архив(среда MSVS C++ 7.0)

1.8K
09 апреля 2006 года
Death Knight
139 / / 19.02.2006
Спасибо сейчас заценю.
284
11 апреля 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by Death Knight
Как данные из фАЙла отобразить на каком-нить элементе, например Edit, в виде таблицы с названиями колонок, и вообще какой элемент для этого лучше подходит. С испольхованием WinApi a HE MFC, вот пример файла.


Это непростая задача. Лучше воспользоваться готовыми решениями. При этом MFC проще пользоваться, т.к. это оболочка над WinAPI. Смотри тему
http://forum.codenet.ru/showthread.php?s=&threadid=28160&highlight=FlexGrid

406
11 апреля 2006 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by michael_is_98
Это непростая задача. Лучше воспользоваться готовыми решениями. При этом MFC проще пользоваться, т.к. это оболочка над WinAPI. Смотри тему
http://forum.codenet.ru/showthread.php?s=&threadid=28160&highlight=FlexGrid


Ну почему же не простая,очень даже простая задача. И если не чистый WinApi то тогда уж лучше WTL.

284
12 апреля 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by vitaly2003s
Ну почему же не простая,очень даже простая задача. И если не чистый WinApi то тогда уж лучше WTL.


Простая если нужно отобразить две строки. Попробуйте отобразить в гриде 1 000 000 вещ. чисел. Или более того. Нужно, чтобы грид мог отлавливать события вроде "отобразить 30 строк данных, начиная с такой-то строки", а не все читал все сразу.
Кстати, по ссылке выше компонент это умеет.

1.8K
12 апреля 2006 года
Death Knight
139 / / 19.02.2006
мне тут один человек посоветовал сделать это с помощью ListView, и предложил тестовую прогу(см. прикр. файл), я ее сделал под свою прогу т. е. вставил пять колонок, помещаю туда записи из файла(около 2500), все вполне нормально работает, только вот не могу понять как сделать например фиоттрация, сортировку, и поиск элемента найболее встречающегося в таблице,
вот та прога которую мне дали, там же найдете *ехе моей, просто запостите ее и ничего не вводя нажмите Scan(убедитесь, что файл, stat.log присутствует).
406
13 апреля 2006 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Death Knight
мне тут один человек посоветовал сделать это с помощью ListView, и предложил тестовую прогу(см. прикр. файл), я ее сделал под свою прогу т. е. вставил пять колонок, помещаю туда записи из файла(около 2500), все вполне нормально работает, только вот не могу понять как сделать например фиоттрация, сортировку, и поиск элемента найболее встречающегося в таблице,
вот та прога которую мне дали, там же найдете *ехе моей, просто запостите ее и ничего не вводя нажмите Scan(убедитесь, что файл, stat.log присутствует).


Тебе что конкретно надо? Алгоритм фильтрации,поиска элемента,сортировки? Или по какому событию это сделать?

1.8K
14 апреля 2006 года
Death Knight
139 / / 19.02.2006
Цитата:
Originally posted by vitaly2003s
Тебе что конкретно надо? Алгоритм фильтрации,поиска элемента,сортировки? Или по какому событию это сделать?


Ну мне надо например при нажатии на кнопку или при выборе пункта меню, чтобы осуществлялась, например сортировка (фильтрацию я уже сделал приложу программу посмотришь, просто она как-то медленно работает, может предложишь вариант с более эффективным быстродействием), кокого-либо столбца, а еще лучше будкт если осуществить сортировку при нажатии на элемент с именем столбца, т. е. в моем случае это - 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.

406
14 апреля 2006 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Death Knight
Ну мне надо например при нажатии на кнопку или при выборе пункта меню, чтобы осуществлялась, например сортировка (фильтрацию я уже сделал приложу программу посмотришь, просто она как-то медленно работает, может предложишь вариант с более эффективным быстродействием), кокого-либо столбца, а еще лучше будкт если осуществить сортировку при нажатии на элемент с именем столбца, т. е. в моем случае это - 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;
}

1.8K
15 апреля 2006 года
Death Knight
139 / / 19.02.2006
спасибо попробую переделать, надеюсь получиться, просто с векторами никогда не работал...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог