Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос о временный таблицах [D5, D6, Win2k, WinXP]


Страницы:   1 2 3

Officeman ©   (2006-05-16 00:52:00) 

Уважаемые господа!
Нужно быстро создавать (временную) табличку на 10'000 столбцов.

В начале проекта использовал TListView и генерировал таблички от 100 до 1000 столбцов этого вполне хватало. но с увеличением числа столбцов до 10'000. Обработка добавления столбцов сильно тормозила, время на обработку до 10 часов. ))))).
Конечно это не выход! )  Что можете посоветовать?

Требования:
1) Хранение всей таблицы в памяти(получение значения из любой ячейки, по аналогии использования TListView)
2) Возможность организации цикла по табличке.

Интересуют все возможные(известные) методы в ДЕлфи

с Уважением, Officeman


Officeman   (2006-05-18 07:41:00) [21]

2Сергей М.  посоветуй источник информации по этому вопросу [30]
p.s.
) когда включаю режим  OwnerData=true,  процесс создания таблы, заметно увеличивается. каким макаром потом устроить цикл по табличке?

спасибо.


Джо   (2006-05-17 19:23:00) [22]

> А чем плохо хранить данные в динамическом массиве

Да ничем не плохо. Вроде, тут каждый второй пост именно об этом.


TStas   (2006-05-17 19:18:00) [23]

А чем плохо хранить данные в динамическом массиве, а показывать можно и в TStringGrid. Рядом положить на форму TScrollBar по его прокрутке показывать очередную порцию данных. При этом память почем зря не расходуется, т. к. нет лишних объектов с кучей свойств. Ну как бы рамка перемещается по массиву.


Сергей М.   (2006-05-17 16:02:00) [24]


> код добавления столбцов и строк, надо менять?


Его, этого кода, вообщене будет в вирт.режиме.


Officeman   (2006-05-17 15:58:00) [25]

т.е. ты хочешь сказать что можно также использовать TListView но переключив его в виртуальный режим? тогда вопрос: код добавления столбцов и строк, надо менять? щас буду мучать OwnerData )


Сергей М.   (2006-05-17 14:04:00) [26]


> На первых стадиях проекта, нужно было видеть все данные.


Их и сейчас, при использовании массива, можно "увидеть", причем без особых потуг.

см. TListView.OwnerData = True - включение вирт.режима работы TListView, при котором собственно данные могут храниться где угодно (в т.ч. в массиве), а TListView лишь визуализирует эти данные.


Officeman   (2006-05-17 13:52:00) [27]

На первых стадиях проекта, нужно было видеть все данные.
для анализа и совершенствования алгоритма. математич.модель.
табличка предполагалась 100 столбцов на 100 позиций.
Прошло 4 месяца) запросы возросли и появилась необходимость изменить программу)

p.s.
я больше математик, нежели программист.
спасибо за инстуктаж. примеры ооочень пригодятся


Сергей М.   (2006-05-17 12:14:00) [28]

const

 MaxRows = 200;
 MaxCols = 10000;

type

 PTempTable = ^TTempTable
 TTempTable = array[0..MaxRows-1, 0..MaxCols-1] of Integer;
 PTempRow = ^TTempRow;
 TTempRow = array[0..MaxCols-1] of Integer;
 PTempCol = ^TTempCol;
 TTempCol = array[0..MaxRows-1] of Integer;

var
 TempTable: PTempTable;
 TempRow: PTempRow;
 TempCol: PTempCol;
 Rows: Integer = MaxRows;
 lCols: Integer = MaxCols;
 Row, Col: Integer;
 i: Integer;
..
 
 i := 0;
//создаем таблицу
 GetMem(TempTable, Rows * Cols * SizeOf(Integer));
 try
//инициализируем таблицу
    for Row := 0 to Rows - 1 do
      for Col := 0 to Cols - 1 do begin
        TempTable[Row, Col] := i;
        Inc(i);
      end;

//получаем содержимое 3-го столбца
 GetMem(TempCol, Rows * SizeOf(Integer));
 try
   Col := 3;
   for Row := 0 to Rows - 1 do
     TempCol[Row] := TempTable[Row, Col];
   ....
 finally
   FreeMem(TempCol);
 end;

//получаем содержимое 5-й строки
 GetMem(TempRow, Cols * SizeOf(Integer));
 try
   Row := 5;
   for Col := 0 to Cols - 1 do
     TempRow[Col] := TempTable[Row, Col];
   ....
 finally
   FreeMem(TempRow);
 end;

 finally
//уничтожаем таблицу
   FreeMem(TempTable);
 end;


Jeer   (2006-05-17 12:08:00) [29]


> В чем проблема-то ?


Вероятно, от незнания основ программирования и элементарных структур данных.


MetalFan   (2006-05-17 12:08:00) [30]

народ, мастера, вы что, прикалываетесь?!
зачем визуальные компоненты использовать в невидимом режиме для хранения данных?!
чем вам динамические массивы не подходят?
или какой-нить TMemoryTable из RX или JVCL


Сергей М.   (2006-05-17 11:55:00) [31]


> порядковый номер записанный в Caption


Зачем что-то записывать в Caption, если по условию


> 1) табличку выводить на экран не надо


?

Зачем вообще хранить целое число в строковом представлении, если для этого существует Integer-тип ?


> указав номер столбца - можно получить все его значения


Ну так в случае с массивом все это как раз замечательно решается !
В чем проблема-то ?


Officeman   (2006-05-17 11:47:00) [32]

при каждом нажатии кнопки обрабатывается следующая строка таблицы,
с циклом по всем столбикам. (с определённым условием)

Каждый столбик имеет свой порядковый номер записанный в Caption. указав номер столбца - можно получить все его значения (в столбик).

т.е. нужна возможность организованного цикла по строкам или столбцам таблички.


Сергей М.   (2006-05-17 11:23:00) [33]


> Officeman   (17.05.06 11:09) [20]


> сложность в послед.обработке данных


В чем же она состоит ?
Проиллюстрируй ..


Officeman   (2006-05-17 11:09:00) [34]

to ЮЮ,  только заполнение в процессе создания. во время последующего использования - только читать данные.

//TListView  в виртуальном режиме (OwnerData = true)
попробую. хотя никогда не использовал. будут вопросы - спрошу.

to Сергей М.
сложность в послед.обработке данных.

спасибо.


Сергей М.   (2006-05-17 10:36:00) [35]


> Officeman   (17.05.06 10:24) [17]


И чем использование обычного двумерного массива тебе не угодило ?

Куда уж проще и быстрей - объявил такой массив, создал-заполнил его и шаришься по нему как твоей душе угодно ..


ЮЮ   (2006-05-17 10:36:00) [36]

с последующей возможностью работы с ячейками этой таблицы., аналогично TListView

И какие это возможности, кроме редактироования первого столбца?

a: Array of Array of <нужный тип>
SetLength(a, <число строк>, <число столбцов>

Визуализация:
1) TListView  в виртуальном режиме (OwnerData = true)
2) TDrawGrid - получишь доступ к каждой ячейке, а не строке целиком


Officeman   (2006-05-17 10:24:00) [37]

Окей!

Задача: принажатии на кнопочку, создать табличку заданного размера
X x Y(число столбцов на число позиций), с последующей возможностью работы с ячейками этой таблицы., аналогично TListView. Пример действий: из таблицы получить данные всей строки, столбца или данные конкретной ячейки(x,y). т.е. организация цикла по табличке.

данные типа integer, заносятся в табличку в момент её создания.


evvcom   (2006-05-17 09:41:00) [38]

Может лучше задачу озвучишь, чем спрашивать о быстроте создания 10000 столбцов?


Сергей М.   (2006-05-17 09:00:00) [39]


> Officeman   (17.05.06 08:54) [14]


п.1 в сочетании с п.2 однозначно говорят об изначально неверном выборе TListView в кач-ве контрола, эффективно решающего задачу


Officeman   (2006-05-17 08:54:00) [40]

Приветствую всех вас!
Спасибо за поддержку топа!

1) табличку выводить на экран не надо.
2) данные integer.
3) развернуть табличку можно но придётся в корне менять движок, много времени займёт.

p.s. как я уже понял TListView не вариант для 10'000 столбиков ))).  
пробовал TListItem, не понял как организовать цикл добавления столбцов(


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо