![]() |
|
#1
|
|||
|
|||
![]() Здравствуйте, помогите со следующей задачей.
на форме находятся объекты Timage, listbox, checklistbox и кнопка удалить. на image по щелчку ставятся точки, их координаты отображаются в листбоксах. Проблемы с реализацией удаления: по нажатию кнопки удалить должны удаляться выбранные в чеклистбоксе точки и соответственно их координаты в чеклистбоксе. точки то удаляются, но появляется ошибка list index out of bounds(..) Код:
unit Lab3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, jpeg, CheckLst; type mass = array[1..1000] of integer; TForm1 = class(TForm) Path: TImage; ListBox1: TListBox; CheckListBox1: TCheckListBox; Button1: TButton; procedure PathMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ListBox1DblClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; a,b:mass; m,n:integer; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin a[1]:=-10; b[1]:=-10; n:=2; end; function Check(x,y:integer):boolean; begin Check:=true; a[n]:=x; b[n]:=y; for m:=1 to N-1 do begin if (sqrt(sqr(a[m]-x)+sqr(b[m]-y))<=10) then begin Check:=false; break; end; end; inc(n); end; procedure TForm1.PathMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var st:string; begin if Check(X,Y) then begin Path.Canvas.Brush.Color:=clblack; Path.Canvas.Ellipse(X-3,Y-3,X+3,Y+3); st:='('+inttostr(X)+','+inttostr(Y)+')'; Listbox1.Items.Add(st); CheckListBox1.Items.Add(st); end; end; procedure TForm1.ListBox1DblClick(Sender: TObject); var z,i,j:integer; s,s1,s2:string; begin z:=listbox1.ItemIndex; s:=ListBox1.Items[ListBox1.ItemIndex]; for i:=2 to length(s) do begin if s[i]=',' then break else s1:=s1+s[i]; j:=i; end; for i:=j+2 to length(s) do begin if s[i]=')' then break else s2:=s2+s[i]; end; Path.Canvas.Pen.Color:=clwhite; Path.Canvas.Brush.Color:=clwhite; Path.Canvas.Ellipse(strtoint(s1)-3,strtoint(s2)-3,strtoint(s1)+3,strtoint(s2)+3); listbox1.Items.Delete(z); end; procedure TForm1.Button1Click(Sender: TObject); var p,z,i,j:integer; s,s1,s2:string; begin for p:=0 to CheckListBox1.Count-1 do begin if CheckListBox1.Checked[p] then begin z:=CheckListBox1.ItemIndex; s:=CheckListBox1.Items[p]; for i:=2 to length(s) do begin if s[i]=',' then break else s1:=s1+s[i]; j:=i; end; for i:=j+2 to length(s) do begin if s[i]=')' then break else s2:=s2+s[i]; end; Path.Canvas.Pen.Color:=clwhite; Path.Canvas.Brush.Color:=clwhite; Path.Canvas.Ellipse(strtoint(s1)-3,strtoint(s2)-3,strtoint(s1)+3,strtoint(s2)+3); CheckListBox1.Items.Delete(z); end; end; end; end. |
#2
|
||||
|
||||
![]() Код:
for i:=CheckListBox1.Count-1 downto 0 |
#3
|
|||
|
|||
![]() не помогло(
|
#4
|
|||
|
|||
![]() Код:
//=================================================== procedure TForm1.Button1Click(Sender: TObject); var p,z,i,j:integer; s,s1,s2:string; begin for p:=0 to CheckListBox1.Count-1 do begin if CheckListBox1.Checked[p] then begin ==> z:=CheckListBox1.ItemIndex; !!! Вот это - зачем ??? ... ... ==> CheckListBox1.Items.Delete(z); !!! И вот это - зачем ??? end; end; end; //=================================================== Может быть лучше что-то вроде этого: //=================================================== procedure TForm1.Button1Click(Sender: TObject); var p,z,i,j:integer; s,s1,s2:string; begin p:=-1; while p<(CheckListBox1.Count-1) do begin p:=p+1; if CheckListBox1.Checked[p] then begin //------------------------------ //здесь "удалить" соотв. точку ... ... //------------------------------ CheckListBox1.Items.Delete(p); p:=p-1; end; end; end; //=================================================== |
#5
|
|||
|
|||
![]() переменная z лишняя, от старого метода не убрал...
Спс, почти все получилось, координаты всех точек удаляются, но вот если выделено несколько точек закрашивается только первая точка. PS: все исправил, тему можно закрыть Последний раз редактировалось Antihrist174, 19.11.2010 в 15:38. |