Добро пожаловать, 
                        
                             
                
                       
                   
          
         
       
  
										  
     
      
  
      
 
    
     
    
     
    
      
    
     
    
      
 
  
 
  
  Поиск
	
			
			
				 
				
					
					
					
					Вот несколько функций для операций с двухмерными массивами. Самый простой путь для создания собственной библиотеки. Процедуры SetV и GetV позволяют читать и сохранять элементы массива VArray (его Вы можете объявить как угодно).
 
Например:
Код type 
 
VArray : Array[1..1] of double; 
var 
 
X : ^VArray; 
NR, NC : Longint; 
 
begin 
 
NR := 10000; 
NC := 100; 
if AllocArray(pointer(X), N*Sizeof(VArray)) then exit; 
SetV(X^, NC, 2000, 5, 3.27);    { X[2000,5] := 3.27 } 
end; 
 
function AllocArray(var V : pointer; const N : longint) : Boolean; 
begin        {распределяем память для массива V размера N} 
 
try 
GetMem(V, N); 
except 
ShowMessage('ОШИБКА выделения памяти. Размер:' + IntToStr(N)); 
Result := True; 
exit; 
end; 
FillChar(V^, N, 0);  {в случае включения длинных строк заполняем их нулями} 
Result := False; 
end; 
 
procedure SetV(var X : Varray;const N,ir,ic : LongInt;const value : 
double); 
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;
 
Самый простой путь - создать массив динамически
Код 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)
 
Вот способ создания одно- и двухмерных динамических массивов:
Код (* 
 
 
 модуль для создания двух очень простых классов обработки динамических массивов 
     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.
 
					 
					
				 
			 
			
	 
 
	
			
			
				 
				
					
					
					
					Очень простой пример...
 
Код Const 
 
MaxBooleans = (High(Cardinal) - $F) div sizeof(boolean); 
 
Type 
 
TBoolArray = array[1..MaxBooleans] of boolean; 
PBoolArray = ^TBoolArray; 
 
Var 
 
B : PBoolArray; 
N : integer; 
 
BEGIN 
 
N := 63579; 
{= получение памяти под динамический массив.. =} 
 
GetMem(B, N*sizeof(boolean)); 
{= работа с массивом... =} 
 
B^[3477] := FALSE; 
{= возвращение памяти в кучу =} 
{$IFDEF VER80} 
 
FreeMem(B, N*sizeof(boolean)); 
{$ELSE} 
 
FreeMem(B); 
{$ENDIF} 
END. 
 
					 
					
				 
			 
			
	 
 
	
			
			
				 
				
					
					
					
					Я провел небольшое исследование, и вот что я выяснил: При закрытии приложения (используя системное меню или вызывая метод закрытия формы), возникают следующие события:
FormCloseQuery  - действие по умолчанию, устанавливает переменную 
CanClose  в значание 
TRUE  и продолжает закрытие формы.
   1. FormClose 
   2. FormDestroy  
Если приложение активно и вы пытаетесь завершить работу Windows (Shut Down), происходят следующие события (с соблюдением последовательности):
   1. FormCloseQuery 
   2. FormDestroy  
Мы видим, что метод FormClose в этом случае не вызывается.
Теперь воспроизведем всю последовательность событий, происходящую при попытке завершить работу Windows:
   1. Windows посылает сообщение 
WM_QUERYENDSESSION  всем приложениям и ожидает ответ.
   2. Каждое приложение получает сообщение и возвращает одну из величин: не равную нулю - приложение готово завершить свою работу, 0 - приложение не может завершить свою работу.
   3. Если одно из приложений возвращает 0, Windows не завершает свою работу, а снова рассылает всем окнам сообщение, на этот раз 
WM_ENDSESSION .
   4. Каждое приложение должно снова подтвердить свою готовность завершить работу, поэтому операционная система ожидает ответа TRUE, резонно предполагая, что оставшиеся приложения с момента предыдущего сообщения закрыли свои сессии и готовы завершить работу. Теперь посмотрим, как на это реагирует Delphi-приложение: приложение возвращает значение 
TRUE  и немедленно вызывает метод 
FormDestroy , игнорируя при этом метод FormClose. Налицо проблема.
   5. Завершение работы Windows. 
Первое решение проблемы: приложение Delphi на сообщение WM_QUERYENDSESSION должно возвратить 0, не дав при этом Windows завершить свою работу. При этом бессмысленно пытаться воспользоваться методом FormCloseQuery, поскольку нет возможности определить виновника завершения работы приложения (это может являться как результатом сообщения WM_QUERYENDSESSION, так и просто действием пользователя при попытке закрыть приложение).
Другое решение состоит в том, чтобы при получении сообщения 
WM_QUERYENDSESSION  самим выполнить необходимые действия, вызвав метод 
FormClose .
Код  
unit Unit1; 
interface 
uses 
 
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, 
Dialogs; 
type 
 
TForm1 = class(TForm) 
procedure FormClose(Sender: TObject; var Action: TCloseAction); 
private 
{} 
{ Объявляем свой обработчик сообщения WM_QUERYENDSESSION } 
{} 
procedure WMQueryEndSession( 
var Message: TWMQueryEndSession); message WM_QUERYENDSESSION; 
public 
{ Public declarations } 
end; 
var 
 
Form1    : TForm1; 
 
implementation 
{$R *.DFM} 
 
{} 
{ Создаем процедуру обработки сообщения WM_QUERYENDSESSION.    } 
{ Приложение получит только это сообщение при попытке Windows  } 
{ завершить работу                                             } 
{} 
procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession); 
begin 
 
inherited;   { сначала сообщание должен обработать наследуемый метод } 
{} 
{ в этой точке вы также можете сообщить Windows о неготовности       } 
{ приложения завершить работу...                                     } 
{ Message.Result:=0;                                                 } 
{-или} 
{ вызов процедуры освобождения ресурсов, предусмотренной в FormClose } 
{ MyCleanUpProcedure;                                                } 
{} 
end; 
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
 
MyCleanUpProcedure; 
end; 
 
end.
 
					 
					
				 
			 
			
	 
 
	
			
			
				 
				
					
					
					
					У меня есть неотложная задача: в настоящее время я разрабатываю проект, где я должен проверять достоверность введенных дат с применением маски __/__/____, например 12/12/2007.
Некоторое время назад я делал простой шифратор/дешифратор дат, проверяющий достоверность даты.
 
Код приведен ниже. 
Код function CheckDateFormat(SDate:string):string;
var
IDateChar:string;
x,y:integer;
begin
IDateChar:='.,/';
for y:=1 to length(IDateChar) do
begin
x:=pos(IDateChar[y],SDate);
while x>0 do
begin
Delete(SDate,x,1);
('-',SDate,x);
x:=pos(IDateChar[y],SDate);
end;
end;
CheckDateFormat:=SDate;
end;
function DateEncode(SDate:string):longint;
var
year,month,day:longint;
wy,wm,wd:longint;
Dummy:TDateTime;
Check:integer;
begin
DateEncode:=-1;
SDate:=CheckDateFormat(SDate);
Val(Copy(SDate,1,pos('-',SDate)-1),day,check);
Delete(Sdate,1,pos('-',SDate));
Val(Copy(SDate,1,pos('-',SDate)-1),month,check);
Delete(SDate,1,pos('-',SDate));
Val(SDate,year,check);
wy:=year;
wm:=month;
wd:=day;
try
Dummy:=EncodeDate(wy,wm,wd);
except
year:=0;
month:=0;
day:=0;
end;
DateEncode:=(year
000)+(month
0)+day;
end;
 
Примечание:  смайлик - знак умножения
 
					 
					
				 
			 
			
	 
 
	
			
			
				 
				
					
					
					
					Рассмотрим два способа преобразования HEX в Integer. Один - простой, второй - альтернативный.
Решение 1 
Код var 
i : integer 
s : string; 
begin 
s := '$' + ThatHexString; 
i := StrToInt(a); 
end;  
 
Решение 2 
Код CONST HEX : ARRAY['A'..'F'] OF INTEGER = (10,11,12,13,14,15); 
VAR str : String; 
Int, 
i : integer; 
BEGIN 
READLN(str); 
Int := 0; 
FOR i := 1 TO Length(str) DO 
IF str[i] < 'A' THEN Int := Int * 16 + ORD(str[i]) - 48 
ELSE Int := Int * 16 + HEX[str[i]]; 
WRITELN(Int); 
READLN; 
END.  
 
					 
					
				 
			 
			
	 
 
Внимание! Если у вас не получилось найти нужную информацию, используйте 
рубрикатор  или воспользуйтесь 
поиском  .      
   
книги  по  программированию  исходники  компоненты  шаблоны  сайтов  C++  PHP  Delphi  скачать