![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работы с большими таблицами данных.
Фродо ) © (2006-01-09 00:59:00)Проблема такова - мне необходимо сделать так, чтобы программа записывала и отображала в списке очень большую таблицу (порядка 500.000 и более строк и около 4- 5 колонок).
Впросы такие :
1) Каким компонентом воспользоваться для реализации моей идеи? (пробовал юзать СтрингГрид, но ничего не вышло - слииииишком долго он загружает таблицу)
2) Как можно БЫСТРО загрузить такую таблицу, или как с ней лучше всего работать (чтобы был быстрый доступ к любой троке таблицы) ?
Спасибо.
palva (2006-01-09 23:26:00) [1]Сейчас поигрался немного. Работают клавиши Ctrl-B, Ctrl-I, Ctrl-U. Наверняка есть документация, где все это описано.
palva (2006-01-09 23:17:00) [2]Фродо ) (09.01.06 15:13) [17]
> Надо чтобы можно было изменить данные в любой из строк - ткнув на ней мышкой и введя новые данные. А при использовании браузера, грузя ХТМЛ таблицу - это проблематично
Ну как раз здесь проблем нет. У вас проблема другая - очень много строк. Так что нижеследующий код вам вряд ли пригодится. Я уж сейчас не буду заботиться о скорости и напишу с динамическим заполнением таблицы всего на сто строк.
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
d, t, r, c: OLEVariant;
begin
WebBrowser1.Navigate
('about:<div contenteditable><table border=1 id=tbl>'+
'<tr><td width=100>col1</td><td width=100>col2</td></tr>'+
'</table></div>');
repeat
Application.ProcessMessages;
until WebBrowser1.readyState = 4;
d := WebBrowser1.Document;
t := d.all.tbl;
for i:=1 to 100 do begin
r := t.insertRow;
c := r.insertCell;
c.innerHTML:= IntToStr(i);
c := r.insertCell;
c.innerText:=IntToStr(i div 2);
end;
end;
Несложно сгенерировать, чтобы можно было редактировать определенные столбцы. Ну еще потребуется кнопка сохранить. Это, конечно, не фотошоп, но зато работает.
аматор (2006-01-09 21:51:00) [3]Привет...
Фродо - может я туп (если Вы работаете с "дельфином"), но зачем для отображения (просто отображения) базы использовать стринггрид а не дбгрид, или там есть выборка с которой запросами не справиться...
Фродо ) (2006-01-09 21:03:00) [4]>Формат хранения данных менять можно?
Можно, главное чтобы грузилось нормально и можно было обработать любую из строк списка (изменить данные в ней).
Fay (2006-01-09 15:26:00) [5]Формат хранения данных менять можно?
Фродо ) (2006-01-09 15:13:00) [6]
> Отображать порядка 500.000 строк, на первый взгляд, по крайней
> мере не разумно (если вспомнить о юзере). Возможно следовало
> бы воспользоваться запросами перед отображением?
>
Поравлюсь... Мне надо сделать так чтобы пользователь МОГ просмотреть очень большую таблицу сам (поскольку когда я пользовался именно запросами на поиск определенной строки \ строк мне говорили - мол ХАЧУ ШТОБЫ ВЕСЬ СПИСОК ЗАГРУЖАЛСЯ И ЕГО МОЖНО БЫЛО ПРОЛИСТАТЬ САМАМУ), бред конечно, но хозяин как говорится - барин...
И еще видите ли в чем загвоздочка... Надо чтобы можно было изменить данные в любой из строк - ткнув на ней мышкой и введя новые данные.. А при использовании браузера, грузя ХТМЛ таблицу - это проблематично )...
Извиняюсь что не сказал это ранее, и приношу извинения за заранее не полностью обрисованую проблему.
> отрисовывает у меня браузер за 15 секунд (2.4 Ггц)
У меня СтрингГрид таблицу из 100.000 строк и 5 столбцов грузит за 6 секунд (P-IV 3.2)
примерно так..
procedure LoadCollection(SG:TStringGrid; FileName:pchar);
var
f:textfile;
temp,x,y,r:integer;
sapppath,tempstr:string;
begin
sapppath := ExtractFilePath(Application.ExeName);
tempstr := '';
sg.Cols[0].BeginUpdate;
sg.Cols[1].BeginUpdate;
sg.Cols[2].BeginUpdate;
sg.Cols[3].BeginUpdate;
sg.Cols[4].BeginUpdate;
if FileExists(FileName) then
begin
assignfile(f,FileName);
reset(f);
readln(f,temp);
SG.colcount:=temp;
readln(f,temp);
SG.rowcount:=temp;
For y:=0 to SG.colcount-1 do
For x:=0 to SG.rowcount-1 do
begin
readln (F, tempstr);
SG.cells[y,x]:=tempstr;
end;
sg.Cols[0].EndUpdate;
sg.Cols[1].EndUpdate;
sg.Cols[2].EndUpdate;
sg.Cols[3].EndUpdate;
sg.Cols[4].EndUpdate;
end;
end;
Код старый и не мой, моим методом сохранения \ загрузки таблицы стринггрида она загружается 9 секунд.
А это очень долго...
Вот тот же FileMonitor грузит свой собственный лог (более 500.000 записаей) около 2-х секунд. Вот мне и надо добиться примерно того же....
> А что из себя представляет сама таблица?
Таблица представляет из себя списки проданой продукции за месяц \ пол года \ год.
| Наименование товара | Продано | Цена |
| | | |
| | | |
Вобщем такая вот таблица... А за месяц \ год представляете себе КАКАЯ получится эта таблица!!
Вот примерно такова ситуация...
Набережных С. (2006-01-09 14:49:00) [7]Я думаю, что DrawGrid + динамическая подгрузка данных позволят отрисовать несколько быстрее 15 секунд даже на более слабой машине :)
Fay (2006-01-09 14:49:00) [8]2 palva © (09.01.06 14:42) [14]
> Ну мне дальше не интересно
При некоторй доработке и Ваш способ можно сделать ещё медленее. Не опускайте руки!
palva (2006-01-09 14:42:00) [9]> Конечно, речь идёт о TDBGrid(Eh).
Ну мне дальше не интересно, я думал будет фотошоп.
Fay (2006-01-09 14:40:00) [10]2 palva © (09.01.06 14:34) [12]
Конечно, речь идёт о TDBGrid(Eh).
palva (2006-01-09 14:34:00) [11]> писать в TdxMemData
Писать можно и в массив. Автор хочет просматривать.
Fay (2006-01-09 14:23:00) [12]1 Фродо )
А что из себя представляет сама таблица?
Fay (2006-01-09 14:10:00) [13]2 palva © (09.01.06 13:29) [9]
15 секунд - это очень долго.
Если данные брать так же (for i ...) и писать в TdxMemData (к примеру), то будет 0.4 с (Celeron 2.4).
Те же данные из MSSSQL - 0.6 сек.
Какие 15?!
palva (2006-01-09 13:29:00) [14]> Использование браузера, в данном случае, сродни забиванию гвоздей микроскопом.
Не понимаю ваш намек. Браузер как раз и предназначен для просмотра данных. У меня подозрение что на больших объемах данных браузер будет работать немного быстрее чем DataGrid. Вот такая кнопка
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
fo: TextFile;
begin
AssignFile(fo, 'c:/tbl.htm');
Rewrite(fo);
WriteLn(fo, '<table border=1>');
for i:=1 to 100000 do begin
WriteLn(fo, '<tr><td>'+IntToStr(i)+'</td><td>'+
IntToStr(i div 2)+'</td></tr>');
end;
WriteLn(fo, '</table>');
CloseFile(fo);
WebBrowser1.Navigate('file://c:/tbl.htm');
end;
отрисовывает у меня браузер за 15 секунд (2.4 Ггц)
Если вы считаете, что здесь уместнее использовать фотошоп, то - вперед, помогите автору, может он вам и денег отвалит. А я спорить не буду, я здесь не для споров и не для зарабатывания денег.
Fay (2006-01-09 12:04:00) [15]Я бы даже сказал "микроскопов гвоздём"
Fay (2006-01-09 12:02:00) [16]2 palva © (09.01.06 11:16) [5]
Опыта (боевого) нет, но я знаю, как это сделать.
Могу поспорить на некоторую сумму 8).
> То что вы пишете, очень интересно.
Использование браузера, в данном случае, сродни забиванию гвоздей микроскопом.
Согласитесь - тоже весьма занимательно.
TUser (2006-01-09 11:25:00) [17]DBGrid
palva (2006-01-09 11:16:00) [18]Fay © (09.01.06 10:45) [4]
> Ага, не хуже, чем Photoshop.
То что вы пишете, очень интересно.
Расскажите, как можно для просмотра таблиц приспособить фотошоп? Как поместить окно фотошопа на форму делфи? И что будет работать быстрее, браузер или фотошоп. Поделитесь пожалуйста опытом.
Fay (2006-01-09 10:45:00) [19]2 palva © (09.01.06 1:22) [1]
> Он должен с этим хорошо справиться
Ага, не хуже, чем Photoshop.
Alarm (2006-01-09 10:18:00) [20]Отображать порядка 500.000 строк, на первый взгляд, по крайней мере не разумно (если вспомнить о юзере). Возможно следовало бы воспользоваться запросами перед отображением?