Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.11.2010, 15:27
Antihrist174 Antihrist174 вне форума
Прохожий
 
Регистрация: 17.11.2010
Сообщения: 3
Репутация: 10
По умолчанию CheckListBox

Здравствуйте, помогите со следующей задачей.
на форме находятся объекты 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  
Старый 17.11.2010, 16:59
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Код:
for i:=CheckListBox1.Count-1 downto 0
Ответить с цитированием
  #3  
Старый 17.11.2010, 21:40
Antihrist174 Antihrist174 вне форума
Прохожий
 
Регистрация: 17.11.2010
Сообщения: 3
Репутация: 10
По умолчанию

не помогло(
Вложения
Тип файла: rar Lab3.part1.rar (156.0 Кбайт, 0 просмотров)
Тип файла: rar Lab3.part2.rar (68.6 Кбайт, 0 просмотров)
Ответить с цитированием
  #4  
Старый 17.11.2010, 21:54
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Код:
//===================================================          
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  
Старый 17.11.2010, 22:11
Antihrist174 Antihrist174 вне форума
Прохожий
 
Регистрация: 17.11.2010
Сообщения: 3
Репутация: 10
По умолчанию

переменная z лишняя, от старого метода не убрал...

Спс, почти все получилось, координаты всех точек удаляются, но вот если выделено несколько точек закрашивается только первая точка.

PS: все исправил, тему можно закрыть

Последний раз редактировалось Antihrist174, 19.11.2010 в 15:38.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:01.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025