작은 문제가 있습니다.
두 가지를 상상해보십시오. 양식, 덮어야 할 것 - 표지 양식; Cover-Form-Tiles를 덮을 양식 등이 있습니다. 내 주요 목표는 내 표지 양식을 타일로 덮는 것입니다. 그래서 그것은 타일처럼 보일 것입니다. 이 이미지를 아래 그림으로 설명합니다.
노란색은 커버 폼, 갈색 형태 - 타일입니다. 이 이미지에서 양식이 서로 너무 가깝게 배치되어 있음을 볼 수 있습니다. 양식 사이에 여유 공간이 없습니다. 그게 내가 필요한거야.
그러나 동일한 효과를 얻으려고하면 불만족스러운 결과를 얻습니다. 아래 사진에 표시됩니다.
두 번째 이미지는 마지막 타일 다음에 옵셋이 있습니다. 크기의 차이로 인해 발생합니다. 내 표지 양식에 어떤 너비가 있는지 정확히 알지 못합니다. 나는 단순히 Cover-Form의 전체 너비를 세 부분으로 나눕니다. 그러나 Cover-Form의 너비가 예를 들어 173 픽셀 인 경우, 각 타일의 너비는 173/3 = 57.6 픽셀, 즉 58도, 58 * 3 = 174이며 폭이 좁습니다.델파이에서 양식의 위치 계산 오류가 발생했습니다
아래의 코드는 두 번째 이미지와 같은 상황입니다.
type
TTileArray = Array of Array of TPoint;
// This routine comes here from David's answer below and were changed by me
procedure EvenlySpacedTiles(PixelCountH, PixelCountV, TileCount: Integer; var ArrayOut: TTileArray);
var
X: Integer;
Y: Integer;
OldH: Integer;
OldV: Integer;
OldCount: Integer;
OldCount1: Integer;
TempInt: Integer;
begin
if (PixelCountH) or (PixelCountV) or(TileCount) = 0 then
Exit;
OldH := PixelCountH;
OldCount1 := TileCount;
for X:=Low(ArrayOut) to High(ArrayOut) do
begin
OldV := PixelCountV;
OldCount := TileCount;
TempInt := OldH div OldCount1;
Dec(OldH, TempInt);
Dec(OldCount1);
for Y:=Low(ArrayOut) to High(ArrayOut) do
begin
ArrayOut[X, Y] := Point(TempInt, OldV div OldCount);
Dec(OldV, ArrayOut[X, Y].Y);
Dec(OldCount);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
F: TForm;
P: TForm;
Delta: Integer;
PrevLeft: Integer;
PrevTop: Integer;
X:Integer;
Y: Integer;
Arr: TTileArray;
IncLeft: Integer;
begin
Delta := 3;
F := TForm.Create(Application);
F.BorderStyle := Forms.bsNone;
F.SetBounds(0, 0, 173, 115);
F.Position := poDesktopCenter;
F.Color := $11DFEE;
F.Show;
SetLength(Arr, Delta, Delta);
EvenlySpacedTiles(F.Width, F.Height, Delta, Arr);
PrevLeft := F.Left;
PrevTop := F.Top;
IncLeft := 0;
for X:=Low(Arr) to High(Arr) do
begin
PrevTop := F.Top;
Inc(PrevLeft, IncLeft);
for Y:=Low(Arr) to High(Arr) do
begin
P := TForm.Create(Application);
P.FormStyle := fsStayOnTop;
P.BorderStyle := Forms.bsNone;
P.Color := Random($FFFFFF);//clSkyBlue;
P.Show;
P.Width := Arr[X, Y].X;
P.Height := Arr[X, Y].Y;
P.Left := PrevLeft;
P.Top := PrevTop;
P.Canvas.Rectangle(P.ClientRect);
Inc(PrevTop, Arr[X, Y].y);
IncLeft := Arr[X, Y].X;
end;
end;
end;
그래서 제 질문이있다 : 어떻게 독립적으로 커버 형태의 폭의 모든 타일 (행 당 3)의 폭을 조정할 수 있습니다?
미리 감사드립니다.
편집
P.S. 위 코드의 일부를 수정했습니다. 이제는 매우 작고 큰 Cover-Form 폭 (67px)에서도 완벽하게 작동합니다. ~ 1237px 물론이 코드를 개선 할 수있는 방법이 있지만 주요 목표는 달성됩니다. 내일 수직 타일을 완성하고이 부분을 게시 할 수 있다고 생각합니다.
David은 여러 가지 방법으로이 작업을 수행하는 방법을 알려줍니다. 고마워, 데이빗!
P.S.
David의 첫 번째 의견을 대각선으로 읽었으므로 코드를 다른 방식으로 업데이트하지만 결과는 여전히 좋지 않습니다. 아래 사진에서 볼 수 있습니다.
첫 번째 타일은 57px입니다. 폭; 두 번째 것 - 59 px; 세 번째 타일 - 단 31 픽셀.
David의 코멘트에서 제안 된 알고리즘을 사용하여 타일을 올바르게 배치하는 방법을 알 수 없습니다.
P.S.S.
그리고 다시 결과가 없습니다.
오른쪽 빨간색 선은 마지막 타일의 큰 크기를 보여줍니다. 각 타일의 너비는 58 픽셀입니다.
데이빗 작성 :
173/3 = 58. 173-58 = 115. 115/2 = 58이다. 115-58 = 57. 57/1 = 57
실생활에서 계산할 수 있지만 코드에서 구현할 수 없습니다.
소스 코드가 업데이트되었습니다.
피니시 S.S.S.
데이비드의 절차는해야 할 일을하지 않습니다. 아래 그림은 그것을 보여줍니다.
첫 번째 타일과 두 번째 타일 사이에는 간격이 있으며, 오른쪽에는 이전 그림과 같이 빨간색 줄이 있습니다.
피니시 S.S.S.
글쎄,이 시점에서 내 작업의 첫 번째 부분이 수행됩니다. 두 번째 것은 더 많은 타일을 추가하는 것이지만, 실제로 타일이 필요한지 확실하지 않습니다. 그리고 이것에 대해 감사합니다 David Heffernan !! 그는 나에게 어떤 것을 설명하는 데 많은 시간을 할애하며, 나는 '감사합니다.'라고 말하는 것보다 더 많이 말할 줄 모른다. 나는 두려워서, 나는 그의 명성을 높이고 그의 대답을 대답으로 받아 들일 수있다. 그것은 정말로 일을한다! 우리는 결과를 볼 수 있습니다 에 사진 나는
P.S.S.S.S.S.S. 필요
타일을 세로로 배치 할 수 있도록 소스 코드를 업데이트했습니다.
173은 정확히 3으로 나눌 수 없습니다. Ergo, 각 열에 대해 동일한 너비를 사용할 수 없습니다. 대신 이것을 좋아하십시오. Npx 픽셀로 시작하십시오. 둥근 Ncol로 나눕니다. 이 값을 열 0으로 사용하십시오. Npx에서 해당 값을 빼고 Ncol-1로 나눕니다. 해당 값을 반올림하여 열 1에 사용합니다. 픽셀과 열을 다 쓸 때까지 반복합니다. –
또한 간략하게 설명하지 않은 이유가 없으면 각 타일을 별도의 형식으로 구현하지 않을 것입니다. 대신 쉐이프 나 다른 것을 사용하십시오. – DNR
@DavidHeffernan, 다음 상황을 의미합니까? 내가 173 픽셀 너비의 Cover-Form을 가지고 있다고 가정 해보십시오. 나는 행당 3 개의 타일을 놓아야한다는 것을 알고 있으므로 173/3 = 57로 나눕니다. 이것은 각 타일의 너비입니다. 그 다음 나는 3 타일을 57로 곱하고 171을 얻습니다. 저는 171이 173보다 작고이 사실에 따라 저는 173 - 171 = 2를해야한다고 압니다. 이것은 마지막 타일 다음에 두 번째 타일 이미지이므로, 마지막 TIle의 폭을 늘려 Cover-Form에 완전히 맞 춥니 다. 이 방법에 대해 어떻게 생각하십니까? – Dima