LibKing » Книги » comp-programming » Валентин Озеров - Советы по Delphi. Версия 1.0.6

Валентин Озеров - Советы по Delphi. Версия 1.0.6

Тут можно читать онлайн Валентин Озеров - Советы по Delphi. Версия 1.0.6 - бесплатно полную версию книги (целиком). Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте LibKing.Ru (ЛибКинг) или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
libking
  • Название:
    Советы по Delphi. Версия 1.0.6
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    5/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Ваша оценка:

Валентин Озеров - Советы по Delphi. Версия 1.0.6 краткое содержание

Советы по Delphi. Версия 1.0.6 - описание и краткое содержание, автор Валентин Озеров, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Советы по Delphi. Версия 1.0.6 - читать онлайн бесплатно полную версию (весь текст целиком)

Советы по Delphi. Версия 1.0.6 - читать книгу онлайн бесплатно, автор Валентин Озеров
Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать

begin {заполняем элементами двухмерный массив x размером ? x n : x[ir,ic] := value}

X[N*(ir-1) + ic]:= value;

end;

function GetV(const X: Varray; const N, ir,ic : Longint): double;

begin {возвращаем величины x[ir,ic] для двухмерного массива шириной n столбцов}

Result:= X[N*(ir-1) + ic];

end;

Раздел 2

Самый простой путь – создать массив динамически

Myarray:= GetMem(rows * cols * sizeof(byte,word,single,double и пр.)

сделайте функцию fetch_num типа

function fetch_num(r,c:integer): single;

result:= pointer + row + col*rows

и затем вместо myarray[2,3] напишите

myarray.fetch_num(2,3)

поместите эти функции в ваш объект и работа с массивами станет пустячным делом. Я экспериментировал с многомерными (вплоть до 8) динамическими сложными массивами и эти функции показали отличный результат.

Раздел 3

Вот способ создания одно– и двухмерных динамических массивов:

(*

--

–- модуль для создания двух очень простых классов обработки динамических массивов

-- TDynaArray : одномерный массив

-- TDynaMatrix : двумерный динамический массив

--

*)

unit DynArray;

INTERFACE

uses SysUtils;

Type TDynArrayBaseType = double;

Const vMaxElements = (High(Cardinal) – $f) div sizeof(TDynArrayBaseType);

{= гарантирует максимально возможный массив =}

Type

TDynArrayNDX = 1..vMaxElements;

TArrayElements = array[TDynArrayNDX] of TDynArrayBaseType;

{= самый большой массив TDynArrayBaseType, который мы может объявить =}

PArrayElements = ^TArrayElements;

{= указатель на массив =}

EDynArrayRangeError = CLASS(ERangeError);

TDynArray = CLASS

Private

fDimension: TDynArrayNDX;

fMemAllocated: word;

Function GetElement(N: TDynArrayNDX): TDynArrayBaseType;

Procedure SetElement(N: TDynArrayNDX; const NewValue: TDynArrayBaseType);

Protected

Elements : PArrayElements;

Public

Constructor Create(NumElements : TDynArrayNDX);

Destructor Destroy; override;

Procedure Resize(NewDimension : TDynArrayNDX); virtual;

Property dimension: TDynArrayNDX read fDimension;

Property Element[N : TDynArrayNDX] : TDynArrayBaseType read GetElement write SetElement; default;

END;

Const

vMaxMatrixColumns = 65520 div sizeof(TDynArray);

{= построение матрицы класса с использованием массива объектов TDynArray =}

Type

TMatrixNDX = 1..vMaxMatrixColumns;

TMatrixElements = array[TMatrixNDX] of TDynArray;

{= каждая колонка матрицы будет динамическим массивом =}

PMatrixElements = ^TMatrixElements;

{= указатель на массив указателей… =}

TDynaMatrix = CLASS

Private

fRows : TDynArrayNDX;

fColumns : TMatrixNDX;

fMemAllocated : longint;

Function GetElement(row: TDynArrayNDX; column: TMatrixNDX): TDynArrayBaseType;

Procedure SetElement(row: TDynArrayNDX; column: TMatrixNDX; const NewValue: TDynArrayBaseType);

Protected

mtxElements: PMatrixElements;

Public

Constructor Create(NumRows : TDynArrayNDX; NumColumns : TMatrixNDX);

Destructor Destroy; override;

Property rows: TDynArrayNDX read fRows;

Property columns: TMatrixNDX read fColumns;

Property Element[row : TDynArrayNDX; column : TMatrixNDX] : TDynArrayBaseType read GetElement write SetElement; default;

END;

IMPLEMENTATION

(*

--

-- методы TDynArray

--

*)

Constructor TDynArray.Create(NumElements : TDynArrayNDX);

BEGIN {==TDynArray.Create==}

inherited Create;

fDimension:= NumElements;

GetMem(Elements, fDimension*sizeof(TDynArrayBaseType));

fMemAllocated:= fDimension*sizeof(TDynArrayBaseType);

FillChar(Elements^, fMemAllocated, 0);

END; {==TDynArray.Create==}

Destructor TDynArray.Destroy;

BEGIN {==TDynArray.Destroy==}

FreeMem(Elements, fMemAllocated);

inherited Destroy;

END; {==TDynArray.Destroy==}

Procedure TDynArray.Resize(NewDimension: TDynArrayNDX);

BEGIN {TDynArray.Resize==}

if (NewDimension < 1) then raise EDynArrayRangeError.CreateFMT('Индекс вышел за границы диапазона : %d', [NewDimension]);

Elements:= ReAllocMem(Elements, fMemAllocated, NewDimension*sizeof(TDynArrayBaseType));

fDimension:= NewDimension;

fMemAllocated:= fDimension*sizeof(TDynArrayBaseType);

END; {TDynArray.Resize==}

Function TDynArray.GetElement(N: TDynArrayNDX) : TDynArrayBaseType;

BEGIN {==TDynArray.GetElement==}

if (N < 1) OR (N > fDimension) then raise EDynArrayRangeError.CreateFMT('Индекс вышел за границы диапазона : %d', [N]);

result:= Elements^[N];

END; {==TDynArray.GetElement==}

Procedure TDynArray.SetElement(N: TDynArrayNDX; const NewValue: TDynArrayBaseType);

BEGIN {==TDynArray.SetElement==}

if (N < 1) OR (N > fDimension) then raise EDynArrayRangeError.CreateFMT('Индекс вышел за границы диапазона : %d', [N]);

Elements^[N]:= NewValue;

END; {==TDynArray.SetElement==}

(*

--

-- методы TDynaMatrix

--

*)

Constructor TDynaMatrix.Create(NumRows: TDynArrayNDX; NumColumns: TMatrixNDX);

Var col : TMatrixNDX;

BEGIN {==TDynaMatrix.Create==}

inherited Create;

fRows:= NumRows;

fColumns:= NumColumns;

{= выделение памяти для массива указателей (т.е. для массива TDynArrays) =}

GetMem(mtxElements, fColumns*sizeof(TDynArray));

fMemAllocated:= fColumns*sizeof(TDynArray);

{= теперь выделяем память для каждого столбца матрицы =}

for col := 1 to fColumns do BEGIN

mtxElements^[col]:= TDynArray.Create(fRows);

inc(fMemAllocated, mtxElements^[col].fMemAllocated);

END;

END; {==TDynaMatrix.Create==}

Destructor TDynaMatrix.Destroy;

Var col : TMatrixNDX;

BEGIN {==TDynaMatrix.Destroy;==}

for col:= fColumns downto 1 do BEGIN

dec(fMemAllocated, mtxElements^[col].fMemAllocated);

mtxElements^[col].Free;

END;

FreeMem(mtxElements, fMemAllocated);

inherited Destroy;

END; {==TDynaMatrix.Destroy;==}

Function TDynaMatrix.GetElement(row: TDynArrayNDX; column: TMatrixNDX): TDynArrayBaseType;

BEGIN {==TDynaMatrix.GetElement==}

if (row < 1) OR (row > fRows) then raise EDynArrayRangeError.CreateFMT('Индекс строки вышел за границы диапазона : %d', [row]);

if (column < 1) OR (column > fColumns) then raise EDynArrayRangeError.CreateFMT('Индекс столбца вышел за границы диапазона : %d', [column]);

result:= mtxElements^[column].Elements^[row];

END; {==TDynaMatrix.GetElement==}

Procedure TDynaMatrix.SetElement(row: TDynArrayNDX; column: TMatrixNDX; const NewValue: TDynArrayBaseType);

BEGIN {==TDynaMatrix.SetElement==}

if (row < 1) OR (row > fRows) then raise EDynArrayRangeError.CreateFMT('Индекс строки вышел за границы диапазона : %d', [row]);

if (column < 1) OR (column > fColumns) then raise EDynArrayRangeError.CreateFMT('Индекс столбца вышел за границы диапазона : %d', [column]);

mtxElements^[column].Elements^[row]:= NewValue;

END; {==TDynaMatrix.SetElement==}

END.

-Тестовая программа для модуля DynArray-

uses DynArray, WinCRT;

Const

NumRows: integer = 7;

NumCols: integer = 5;

Var

M: TDynaMatrix;

row, col: integer;

BEGIN

M:= TDynaMatrix.Create(NumRows, NumCols);

for row:= 1 to M.Rows do for col:= 1 to M.Columns do M[row, col]:= row + col/10;

writeln('Матрица');

for row:= 1 to M.Rows do BEGIN

for col:= 1 to M.Columns do write(M[row, col]:5:1);

writeln;

END;

writeln;

writeln('Перемещение');

for col:= 1 to M.Columns do BEGIN

for row:= 1 to M.Rows do write(M[row, col]:5:1);

writeln;

END;

M.Free;

END.

Базы данных

Создание

Создание db-файла во время работы приложения

uses DB, DBTables, StdCtrls;

procedure TForm1.Button1Click(Sender: TObject);

var

tSource, TDest: TTable;

begin

TSource:= TTable.create(self);

with tsTSource do begin

DatabaseName:= 'dbdemos';

Читать дальше
Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать


Валентин Озеров читать все книги автора по порядку

Валентин Озеров - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Советы по Delphi. Версия 1.0.6 отзывы


Отзывы читателей о книге Советы по Delphi. Версия 1.0.6, автор: Валентин Озеров. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
Большинство книг на сайте опубликовано легально на правах партнёрской программы ЛитРес. Если Ваша книга была опубликована с нарушениями авторских прав, пожалуйста, направьте Вашу жалобу на PGEgaHJlZj0ibWFpbHRvOmFidXNlQGxpYmtpbmcucnUiIHJlbD0ibm9mb2xsb3ciPmFidXNlQGxpYmtpbmcucnU8L2E+ или заполните форму обратной связи.
img img img img img