Нужна помощь по Shape

  • Автор темы PaVeL111
  • Дата начала
P

PaVeL111

Гость
#1
Ребята, у меня рамнодмно появляются Шейпы таким образом:
for i:=1 to x do
begin
shape.Left:=Random(440);
shape.Top:=Random(384);
shape.Visible:=True;

end;

макс 50.

Каким образом можно узнать пару наимение удаленных из них?
Напишите плизз код, буду оч благодарен!
Зарание спасибо.
 
P

PaVeL111

Гость
#3
Не, домустим создал 6 шейпов и надо проверить какие из них будум минимально наближены между собой, от их тогда и покрасить в красный цвет, что бы било видно.
А как проверить все возможные растаяния?
 
09.11.2009
665
1
23
Киев
#4
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;

type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
shape:array[1..10] of TShape;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject); //ищем и красим
const kolichestvo=10;
var i,j,ind_i1,ind_i2:integer;
l1,l:real;
begin

ind_i1:=1; //для начала берем растояние между первым и вторым
ind_i2:=2;

//находим это растояние

l:=sqrt(sqr(shape[1].left+shape[1].width div 2 - shape[2].left-shape[2].width div 2)+ 
sqr(shape[1].top+shape[1].height div 2 - shape[2].top-shape[2].height div 2));

l1:=l;

for i:=1 to kolichestvo do
for j:=1 to kolichestvo do
begin
if i<>j then 
begin
l1:=sqrt(sqr(shape[i].left+shape[i].width div 2 - shape[j].left-shape[j].width div 2)+
sqr(shape[i].top+shape[i].height div 2 - shape[j].top-shape[j].height div 2));
//находим растояние между остальными
if l1<l then //и проверяем эго с минимальным
begin
l:=l1; //если найденое меньше то запоминаем новое минимальное растояние
ind_i1:=i; //запоминаем их номера
ind_i2:=j;
end;
end;
end;

shape[ind_i1].brush.color:=clred; //красим
shape[ind_i2].brush.color:=clred;

end;


procedure TForm1.Button1Click(Sender: TObject); //меняем положения
var i:integer;
begin
for i:=1 to 10 do
begin
shape[i].top:=random(200);
shape[i].left:=random(300);
shape[i].width:=random(5)+10;
shape[i].height:=shape[i].width;
shape[i].Brush.Color:=clwhite;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
for i:=1 to 10 do
begin
shape[i]:=TShape.create(self); //создаем шейпы
shape[i].parent:=form1;
shape[i].top:=random(200);
shape[i].left:=random(300);
shape[i].width:=random(5)+10;
shape[i].height:=shape[i].width;
end;

end;

end.
 
P

PaVeL111

Гость
#5
Спасибо большое%))
А как я могу вам поставить "+"? а то нажимаю на зелёный плюсик и ничего не происходит... ;)
 
P

PaVeL111

Гость
#7
тогда щас розкручусь хотя б в етой теме)))
и ещо одно, создал GroupBox1 но он получается поверх всех кнопок, текста и тд, как сделать что бы на нем было все а не под ним?
 
09.11.2009
665
1
23
Киев
#8
Если динамически то незнаю, а если просто кидаеш на форму то клик правой кнопкой на GroupBox1->control->Send to back
ЗЫ В дальнейшем создавай для этого отдельные темы.Одна тема-Один вопрос

Добавлено: Если динамически то при создании допиши Имя_обекта.SendToBack;
 

sinkopa

Well-Known Member
#10
тогда щас розкручусь хотя б в етой теме)))
и ещо одно, создал GroupBox1 но он получается поверх всех кнопок, текста и тд, как сделать что бы на нем было все а не под ним?
Код:
// Если надо поместить контролы внутрь групбокса
shape[i].Parent := GroupBox1;
...
Button1.Parent := GroupBox1;


// Если групбокс просто "для красоты"
GroupBox1.SendToBack;