![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос о временный таблицах [D5, D6, Win2k, WinXP]
Officeman © (2006-05-16 00:52:00)Уважаемые господа!
Нужно быстро создавать (временную) табличку на 10'000 столбцов.
В начале проекта использовал TListView и генерировал таблички от 100 до 1000 столбцов этого вполне хватало. но с увеличением числа столбцов до 10'000. Обработка добавления столбцов сильно тормозила, время на обработку до 10 часов. ))))).
Конечно это не выход! ) Что можете посоветовать?
Требования:
1) Хранение всей таблицы в памяти(получение значения из любой ячейки, по аналогии использования TListView)
2) Возможность организации цикла по табличке.
Интересуют все возможные(известные) методы в ДЕлфи
с Уважением, Officeman
Сергей М. (2006-05-19 09:24:00) [1]Инициализация происходит строчкой выше:
InitTable(Info);
Officeman (2006-05-19 09:18:00) [2]
Result := TableList.Add(Info);
как правильно инициализировать TableList , в этом случае
Officeman (2006-05-18 14:08:00) [3]Спасибо за краткий экскурс. если приду в очередной тупик подниму здесь вопросик. спасибо.
Сергей М. (2006-05-18 13:32:00) [4]Наврал.
Вот так будет правильней :
procedure InitTable(const Table: PTempTableInfo);
var Row, Col: Integer;
begin
with Info^ do
for Row := 0 to Rows - 1 do
for Col := 0 to Cols - 1 do
TableData[Row, Col] := ...;
end;
function CreateTable(const Rows, Cols: Integer): Integer;
var
Info: PTempTableInfo;
begin
New(Info);
try
Info.Rows := Rows;
Info.Cols := Cols;
GetMem(Info.TableData, Rows * Cols * SizeOf(Integer));
try
InitTable( Info);
Result := TableList.Add(Info);
except
FreeMem(Info.TableData);
raise;
end;
except
Dispose(Info);
raise;
end;
end;
Сергей М. (2006-05-18 13:23:00) [5]
> TempTable: PTempTable; // "TempTable" это и есть имя
> таблички ?
Это не "имя таблички", это символьный идентификаторпеременной, предназначенной для хранения указателя на данные типа TTempTable
Сергей М. (2006-05-18 13:21:00) [6]
> Officeman (18.05.06 13:09) [47]
Я их не создаю.
Я лишь привел пример процедур/ф-ций, манипулирующих созданием/уничтожением таблицы с занесением ее в список и удаления из списка.
Сколько раз ты вызовешь ф-цию Createtable, столько таблиц и будет создано.
В строчке
PTempTable(TabeleList[2])[5, 6] := ...
подразумевается, что Createtable() была вызвана тобой не менее 3-х раз
Officeman (2006-05-18 13:09:00) [7]>//пример обращения к элементу 3-й таблицы
>PTempTable(TabeleList[2])[5, 6] := ...
т.е. ты создаёшь список из нескольких(трёх) таблиц? [0,1,2] так ?
Officeman (2006-05-18 13:02:00) [8]to ЮЮ, погодите плиз. ещё раз. я тех кто в танке. )
Помогите разобратся! Вы потрясающие учителя.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask, ToolEdit, CurrEdit;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
name34: TButton;
Num: TRxCalcEdit;
Memo2: TMemo;
Memo3: TMemo;
Button2: TButton;
Num2: TRxCalcEdit;
procedure Button1Click(Sender: TObject);
procedure name34Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
MaxRows = 5000; //колонок
MaxCols = 100; //строк
type
PTempTable = ^TTempTable; // ??? такого в F1 вапще нет
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
Form1: TForm1;
TempTable: PTempTable; // "TempTable" это и есть имя таблички ?
TempRow: PTempRow;
TempCol: PTempCol;
Rows: Integer = MaxRows;
Cols: Integer = MaxCols;
Row, Col: Integer;
i: Integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Visible:=false;
memo1.Clear;
memo2.Clear;
Rows:= 100;
Cols:= 20;
// создаём табличку под инедификатором "TempTable" ???????????
GetMem(TempTable, Rows * Cols * SizeOf(Integer));
//заполняем значениями
for Row := 0 to Rows-1 do //столбец
for Col := 0 to Cols - 1 do begin //строка
i := random(3);
TempTable[Row, Col] := i;
Inc(i);
memo1.Lines.Add(inttostr(Row)+'. '+inttostr(i));
end;
FreeMem(TempCol);
memo1.Visible:=true;
end;
procedure TForm1.name34Click(Sender: TObject);
begin
Col := 3
//штудируем все колонки, начиная с нулевой, получаем значения СТРОКИ 3
for Row := 0 to Rows-2 do begin
memo2.Lines.Add(inttostr(Col+1)+'. '+inttostr(TempTable[row, col]+1));
//вот тут вапще косяк. в табличке записано 2,1,3. когда вытаскиваю.
//то получаю 1,0,2. ровно на единицу меньше. пришлось приписать +1
//голову сломал, ответа не нашёл.
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Row := 3 // значения текущей колонки !!!!!!!!!!!
//штудируем все Строчки, начиная с нулевой.
for Col := 0 to Cols-1 do begin
// тоже самое +1 пришлось делать. чтобы правильные значения взять.
//я чёто неправильно сделал! непонимаю в чём гвоздь
memo3.Lines.Add(inttostr(Row)+'. '+inttostr(TempTable[row, col]+1));
end;
end;
end.
Сергей М. (2006-05-18 13:02:00) [9]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;
PTempTableInfo = ^TTempTableInfo;
TTempTableInfo = packed record
Rows, Cols: Integer;
TableData: PTempTable;
end;
var
TableList: TList;
...
TableList := TList.Create;
...
function CreateTable(const Rows, Cols: Integer): Integer;
var
Info: PTempTableInfo;
begin
New(Info);
try
Info.Rows := Rows;
Info.Cols := Cols;
GetMem(Info.TableData, Rows * Cols * SizeOf(Integer));
try
InitTable(Info.TableData);
Result := TableList.Add(Info);
except
FreeMem(Info.TableData);
raise;
end;
except
Dispose(Info);
raise;
end;
end;
procedure DestroyTable(const Index: Integer);
var
Info: PTempTableInfo;
begin
Info := TableList[i];
FreeMem(Info.TableData);
Dispose(Info);
TableList.Delete(i);
end;
procedure DestroyTableList;
var
i: Integer;
begin
for i := 0 to TableList.Count - 1 do DestroyTable(TableList[i]);
TableList.Free;
end;
...
//пример обращения к элементу 3-й таблицы
PTempTable(TabeleList[2])[5, 6] := ...
Jeer (2006-05-18 12:26:00) [10]Officeman (18.05.06 12:05) [41]
В общем, начни с чтения умных книжек.
ЮЮ (2006-05-18 12:15:00) [11]>не знаю как задать другое имя
var
first, second, current: <когда с типом например определишься>;
first и second создаешь и инициализируешь. Отрисовываешь и просчитываешь current, при переключении установив current := first (second)
второй вариант:
var
tab: array of <когда с типом например определишься>;
Idx: integer;
Отрисовываешь и просчитываешь tab[Idx]. Переключаешься изменением Idx
Сергей М. (2006-05-18 12:14:00) [12]А что ты под "именем таблички" подразумеваешь ?
В моем примере у таблиц нет имен ..
Officeman (2006-05-18 12:05:00) [13]>В чем же проблема ?
не знаю как задать другое имя для временной таблички. (.
если не трудно (я всех достал, я знаю), приведи пример который ты уже приводил. но на 2 temp табличке.
Сергей М. (2006-05-18 12:04:00) [14]
> всё это происходит во время работы обработки
Что подразумевается под "обработкой" ?
Иллюстрируй в коде ..
Сергей М. (2006-05-18 12:00:00) [15]
> Officeman (18.05.06 11:47) [38]
Почему же константами ?
Переменными !
Rows: Integer = MaxRows; //по умолчанию - максимально возможное число строк
Cols: Integer = MaxCols; //по умолчанию - максимально возможное число столбцов
Перед тем как создавать таблицу ты волен изменить значения переменных Rows и Cols, взяв их из тех самых Edit'ов
> нужно создать более одной таблицы. и держать их в памяти
В чем же проблема ?
Officeman (2006-05-18 11:47:00) [16]Спасибо за подробные ответы. Очень признателен.
>to Jeer
>const
>ColMax = 200;
>RowMax = 200;
да. опыта мне нехватает. (
НУжно сделать так чтобы пользователь сам выбирал
размеры таблицы используя Edit1, Edit2
перед её созданием., а тут жёстко задаётсяконстантами.
подскажите как правильно это сделать. спасибо.
>А в примере разве не правильно ?
>Какие сомнения у тебя возникли по этому поводу ?
нужно создать более одной таблицы. и держать их в памяти.
с возможностью работы с ними(получение данных).
во время работы программы.
Одна табличка на 10'000 стоблцов x 200 строк
Вторая и Третья таблички, по 10'000 столбцов на 4 строки.
>Что есть "система "вешается" ? Форма не реагирует на клаву/мышь что ли ?
не только форма. но и ОС тоже. сильно тормозит на секунд 10. потом отвисает и через некоторые время снова повторяется завис. - всё это происходит во время работы обработки. ОЗУ 512. да вобщем это неглавное.
Сергей М. (2006-05-18 11:10:00) [17]
> Officeman (18.05.06 08:03) [34]
> каким образом правильно выделить память.
А в примере разве не правильно ?
Какие сомнения у тебя возникли по этому поводу ?
> попробовал текущий
> код. до удачного завершения обработки - система "вешается",
> w2000 например. после завершения операции - ос отпадает
> и нормально пашет.
Что есть "система "вешается" ? Форма не реагирует на клаву/мышь что ли ?
Jeer (2006-05-18 11:04:00) [18]
> Officeman (18.05.06 08:03) [34]
Совершенно непонятно почему Вас не устраивает просто:
const
ColMax = 200;
RowMax = 200;
var
arTable: array of array of integer;
// Выделение памяти
SetLength(arTable, RowMax, ColMax);
// Обращение к элементу
arTable[i,j];
Окно просмотра задаете нужного (разумного) размера и выводите в любой визуальный Grid.
Сергей М. (2006-05-18 08:11:00) [19]
> Officeman (18.05.06 07:41) [33]
см. стандартную справку и демо-проект
(%Delphi7%)\Demos\Virtual Listview
> включаю режим OwnerData=true, процесс создания таблы,
> заметно увеличивается
Создание таблицы в массиве не имеет отношения к ListView - последний лишь отображает содержимое заранее подготовленной таблицы.
> каким макаром потом устроить цикл по табличке?
Ты в [26] пример разобрал ? Там как раз и фигурирует "цикл по табличке" (см. комментарий //создаем таблицу)
Officeman (2006-05-18 08:03:00) [20]а если использовать всё таки массив данных. на примере описанном в посте [26]
каким образом правильно выделить память. попробовал текущий код. до удачного завершения обработки - система "вешается", w2000 например. после завершения операции - ос отпадает и нормально пашет.