Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Помогите решить проблему с удалением фигур

Автор: SkyEdge 13.12.2017 1:17

Добрый день или вечер.
Подскажите пожалуйста как правильно создать функцию удаления фигур с формы.
Моих навыков программирования хватило только на написания функции Off которая изменяет параметр Visible, однако мне надо чтобы фигура совсем стиралась с Формы.

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

Автор: SkyEdge 13.12.2017 2:07

Фрагменты кода


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 13.12.2017 7:35

Цитата(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, который умеет двигать. И он ещё умеет автоуничтожение делать своим элементам при удалении.

Автор: nishaknapp 16.01.2023 7:01

Why not settling on games that is fun and at the same time your earning. Well it'll make suspense because the game is well but dude just try it and it gave me hope while pandemic is real rn. https://tellingdad.com/craps-meet-the-dice-game/