Динамический массив в функции CreatePolygonRgn
Добавлено: 12 дек 2006, 14:38
Функция CreatePolygonRgn позволяет создавать сложную область окна из массива вершин переданных во втором параметре. Мне нужно было сделать следующее: есть строка такой структуры: [0,0][100,50][200,0]. То есть в этой строке записаны координаты точек по которым нужно строить область.
На основании этой строки я создаю массив элементов типа TPoints, который передаю в функцию CreatePolygonRgn. Количество вершин в строке не фиксированное, поэтому и массив я делаю динамическим. А когда использую его,функция возвращает значение 0, область не получается.
Код функции приведен ниже:
function CreateCompositRgn_v2(MPoints:String; ErrorCode:Integer):HRGN;
const
ENoBeginPos = 1; //скобка не открыта
ENoEndPos = 2; //скобка не закрыта
ENoSeparator = 3; //нехватает запятой
ENoLongValue = 4; //нечисловое значение
var
ind:Integer;
separatorPos,
beginPos,
endPos:Integer;
MatrixPoints: array of array of Integer; //Хранит значения вершин полученных из текстовой строки
xValue, yValue:integer;
indM:integer;
v:array of TPoint; //массив вершин передаваемый в функцию
rgn:HRGN;
begin
separatorPos :=0;
beginPos := 0;
endPos := 0;
ErrorCode := 0;
//подсчет специальных символов
for ind := 0 to Length(MPoints) do
begin
if MPoints[ind] = '[' then
inc(beginPos)
else if Mpoints[ind] = ']' then
inc(endPos)
else if MPoints[ind] =',' then
inc(separatorPos);
end;
//проверка правильности строки:
if beginPos < endPos then ErrorCode := ENoBeginPos
else if endPos < beginPos then ErrorCode := ENoEndPos
else if beginPos = endPos then
begin
if separatorPos <> beginPos then ErrorCode := ENoSeparator
else
begin
//установка размеров массивов:
SetLength(MatrixPoints,beginPos,2);
SetLength(v,beginPos);
separatorPos :=0;
beginPos := 0;
endPos := 0;
//получение данных из строки:
indM :=0;
for ind := 0 to Length(MPoints) do
begin
if MPoints[ind] = '[' then
beginPos := ind
else if MPoints[ind] = ',' then
separatorPos := ind
else if MPoints[ind] =']' then
begin
endPos := ind;
try
xValue := StrToInt(Copy(MPoints,beginPos+1,separatorPos-beginPos-1));
yValue := StrToInt(Copy(MPoints,separatorPos+1,endPos-separatorPos-1));
MatrixPoints[indM,0] := xValue;
MatrixPoints[indM,1] := yValue;
inc(indM);
except
ErrorCode := ENoLongValue;
break;
end;
end;
end;
//создание массива вершин:
for ind := 1 to indM-1 do
begin
v[ind].X := MatrixPoints[ind,0];
v[ind].Y := MatrixPoints[ind,1];
end;
//вызов функции для построения сложной области:
Result := Windows.CreatePolygonRgn(v,indM,WINDING);
Finalize(MPoints);
Finalize(v);
end;
end;
end;
Я пробывал сделать массив не динамическим, а ограничить его [0..100000]. Тогда все получается. Но я думаю что и с динамическим должно получаться. Уважаемые участники форума, помогите разобраться, почему так происходит.
На основании этой строки я создаю массив элементов типа TPoints, который передаю в функцию CreatePolygonRgn. Количество вершин в строке не фиксированное, поэтому и массив я делаю динамическим. А когда использую его,функция возвращает значение 0, область не получается.
Код функции приведен ниже:
function CreateCompositRgn_v2(MPoints:String; ErrorCode:Integer):HRGN;
const
ENoBeginPos = 1; //скобка не открыта
ENoEndPos = 2; //скобка не закрыта
ENoSeparator = 3; //нехватает запятой
ENoLongValue = 4; //нечисловое значение
var
ind:Integer;
separatorPos,
beginPos,
endPos:Integer;
MatrixPoints: array of array of Integer; //Хранит значения вершин полученных из текстовой строки
xValue, yValue:integer;
indM:integer;
v:array of TPoint; //массив вершин передаваемый в функцию
rgn:HRGN;
begin
separatorPos :=0;
beginPos := 0;
endPos := 0;
ErrorCode := 0;
//подсчет специальных символов
for ind := 0 to Length(MPoints) do
begin
if MPoints[ind] = '[' then
inc(beginPos)
else if Mpoints[ind] = ']' then
inc(endPos)
else if MPoints[ind] =',' then
inc(separatorPos);
end;
//проверка правильности строки:
if beginPos < endPos then ErrorCode := ENoBeginPos
else if endPos < beginPos then ErrorCode := ENoEndPos
else if beginPos = endPos then
begin
if separatorPos <> beginPos then ErrorCode := ENoSeparator
else
begin
//установка размеров массивов:
SetLength(MatrixPoints,beginPos,2);
SetLength(v,beginPos);
separatorPos :=0;
beginPos := 0;
endPos := 0;
//получение данных из строки:
indM :=0;
for ind := 0 to Length(MPoints) do
begin
if MPoints[ind] = '[' then
beginPos := ind
else if MPoints[ind] = ',' then
separatorPos := ind
else if MPoints[ind] =']' then
begin
endPos := ind;
try
xValue := StrToInt(Copy(MPoints,beginPos+1,separatorPos-beginPos-1));
yValue := StrToInt(Copy(MPoints,separatorPos+1,endPos-separatorPos-1));
MatrixPoints[indM,0] := xValue;
MatrixPoints[indM,1] := yValue;
inc(indM);
except
ErrorCode := ENoLongValue;
break;
end;
end;
end;
//создание массива вершин:
for ind := 1 to indM-1 do
begin
v[ind].X := MatrixPoints[ind,0];
v[ind].Y := MatrixPoints[ind,1];
end;
//вызов функции для построения сложной области:
Result := Windows.CreatePolygonRgn(v,indM,WINDING);
Finalize(MPoints);
Finalize(v);
end;
end;
end;
Я пробывал сделать массив не динамическим, а ограничить его [0..100000]. Тогда все получается. Но я думаю что и с динамическим должно получаться. Уважаемые участники форума, помогите разобраться, почему так происходит.