![]() |
|
|
|
|
#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. |