Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите решить проблему с удалением фигур
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
SkyEdge
Добрый день или вечер.
Подскажите пожалуйста как правильно создать функцию удаления фигур с формы.
Моих навыков программирования хватило только на написания функции Off которая изменяет параметр Visible, однако мне надо чтобы фигура совсем стиралась с Формы.

И ещё. Деструктор можно использовать для удаления элементов из массива (У меня под каждую фигуру выделен массив). В нем можно реализовать это удаление?
SkyEdge
Фрагменты кода


constructor TFigure.create (x1,y1,r1 : integer; Color1 : TColor; TekForm1 : TForm);
begin
x:= x1;
y:= y1;
r:= r1;
Color:= Color1;
TekForm:= TekForm1;
Width:=5;
Visible:=True;
Draw;
end;

procedure TTreug.Draw; //Процедура рисования треугольника
var dx,dy : integer;
begin
TekForm.Canvas.Pen.Color:= Color;
TekForm.Canvas.Pen.Width:= Width;
dy:= round(r/2);
dx:= round(r*cos(pi/6));
TekForm.Canvas.MoveTo(x-dx,y+dy); //поместить карандаш в т1
TekForm.Canvas.LineTo(x,y-r); //линия 1-2
TekForm.Canvas.LineTo(x+dx,y+dy); //линия 2-3
TekForm.Canvas.LineTo(x-dx,y+dy); //линия 3-1
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Ru1:=round(sqrt(sqr(X-Xu1)+sqr(Y-Yu1)));
if (FlagFig1 = True) or (FlagFig2= True) or (FlagFig3= True) or (FlagFig4=True) then
begin
ColorDialog1.Execute; // вызов цветовой палитры
ColorFig:= ColorDialog1.Color; // присвоение цвета из цветовой палитры в переменную ColorFig
if FlagFig1 = True then // Cоздание треугольника
begin
CountFigura:=CountFigura+1;
nTekFigura:=CountFigura-1;
CountTreug:= CountTreug+1;
nTekTreug:= CountTreug-1;
setlength(MTreug,CountTreug); // Увеличить массив МTreug на значение CountTreug
MTreug[nTekTreug]:= TTreug.create(Xu1,Yu1,Ru1,ColorFig,Form1);
FlagFig1:=False;
ListBox1.Items.Add(IntToStr(nTekTreug)+'-Треугольник');
ListBox1.ItemIndex:=nTekTreug;
ListBox1.Selected[nTekTreug];
if (CountTreug>1) then MTreug[nTekTreug-1].pWidth:=1; // Предыдущий треугольник становятся простой(не выделенный)

if CountKrug>0 then lst1.Selected[nTekKrug]:=False;
if CountPrUg>0 then lst2.Selected[nTekPrUg]:=False;
if CountTrap>0 then lst3.Selected[nTekTrap]:=False;
end;
OCTAGRAM
Цитата(SkyEdge @ 13.12.2017 1:17) *
Добрый день или вечер.
Подскажите пожалуйста как правильно создать функцию удаления фигур с формы.


Насколько я понимаю, если не делать по совсем нормальному пути (безоконным компонентом вроде стандартных TLabel или TShape), то хотя бы на форму поставить TPaintBox, и в его OnDraw рисовать все фигуры. А в конструкторе и деструкторе фигур только делать Invalidate.

Цитата(SkyEdge @ 13.12.2017 1:17) *
И ещё. Деструктор можно использовать для удаления элементов из массива (У меня под каждую фигуру выделен массив). В нем можно реализовать это удаление?


Да. Компоненты внутри TComponentList ведут себя так.


Цитата(SkyEdge @ 13.12.2017 2:07) *
                setlength(MTreug,CountTreug);    // Увеличить массив МTreug на значение CountTreug
MTreug[nTekTreug]:= TTreug.create(Xu1,Yu1,Ru1,ColorFig,Form1);
Вот тут бы двигать элементы ещё надо.

Или взять TObjectList, который умеет двигать. И он ещё умеет автоуничтожение делать своим элементам при удалении.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.