C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
удаление ел-тов из ListBox, ещё 1 ламерский вопрос
gorod
Отправлено: 19.12.2006, 11:05


Ученик-кочегар

Группа: Участник
Сообщений: 21



такая проблемма
надо из одного лист бокса переместить выделенные сторки в другой
и ,потом,удалить эти строки из 1-го
переместиь получается а вот удалить нет
на deletе билдер говорит что я пытаюсь удалить указатель а не элемент
вопрос: как удальть и то,и другое??
Romikgy
Отправлено: 19.12.2006, 11:25


Дежурный стрелочник

Группа: Участник
Сообщений: 72



CODE

ListBox-> Items->Delete( номер удаляемой строки);

только удаляй с конца списка!
gorod
Отправлено: 19.12.2006, 11:59


Ученик-кочегар

Группа: Участник
Сообщений: 21



я про конец строки не понял
на сколько я помню строки считаются с 0-й,и конец или начало не важно
и если писать
CODE
delete(ListBox1->ItemIndex)

что и должно означать номер выбранной строки, меня билдер шлет на...

Отредактировано gorod — 19.12.2006, 12:02
Romikgy
Отправлено: 19.12.2006, 12:16


Дежурный стрелочник

Группа: Участник
Сообщений: 72



в дебагере посмотри что в ListBox1->ItemIndex
и лучше писать полностью
ListBox1-> Items->Delete(ListBox1->ItemIndex)
только удостоверятся что ListBox1->ItemIndex в пределах кол-ва строк
Doga
Отправлено: 19.12.2006, 14:01


Мастер участка

Группа: Участник
Сообщений: 575



Как только Вы удалите элемент списка с индексом ListBox1->ItemIndex (если конечно он до этого ещё не был равен -1),
ListBox1->ItemIndex автоматически примет значение -1. При с ледующем вызове Delete возникнет ошибка — что естественно. Вообще, лучше не пользоваться свойством ItemIndex в качестве индекса элемента при удалении, или по крайней мере, после каждого вызова Delete, принудительно изменять его значение в пределах 0...Count-1.

Удалять с конца не обязательно, можно и сначала. Только надо после удаления декрементировать значение итератора.

CODE

for (int k = 0; k < ListBox->Items->Count; k++)
{
 if ((ListBox->Items->Strings[k] == "AAA") || (ListBox->Items->Strings[k] == "BBB"))
 {
   ListBox->Items->Delete(k);
   k--;
 }
}
Romikgy
Отправлено: 19.12.2006, 14:51


Дежурный стрелочник

Группа: Участник
Сообщений: 72



А не проще ли так?
CODE

for (int k = ListBox->Items->Count-1; k >=0; k--)
{
if ((ListBox->Items->Strings[k] == "AAA") || (ListBox->Items->Strings[k] == "BBB"))
{
  ListBox->Items->Delete(k);
  }
}
gorod
Отправлено: 19.12.2006, 17:52


Ученик-кочегар

Группа: Участник
Сообщений: 21



господа вы недопоняли
у меня в лист бокс может
быть введена любая строка,
перемещатся и удалятся ,соответственно,тоже.
и ваши советы немного не в тему
вот так я копирую
CODE
int i,j= ListBox1->ItemIndex — ListBox1->SelCount +1;
 for (int k=0,i=j;k < ListBox1->SelCount; k++,i++)

ListBox2->Items->Insert(k,ListBox1->Items->Strings[i]);
delete(ListBox1->Items->Strings[i]);//

нужно удалить скопированные строки
AVC
Отправлено: 19.12.2006, 17:59


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (gorod @ 19.12.2006, 16:52)
господа вы недопоняли
нужно удалить скопированные строки

Если внимательно посмотреть на ответы, то можно увидеть что вам советуют элементы листбокса удаляятьне так
delete(ListBox1->Items->Strings[i]);//
а так
ListBox->Items->Delete(i);
gorod
Отправлено: 19.12.2006, 19:31


Ученик-кочегар

Группа: Участник
Сообщений: 21



неа не получается
"[C++ Error] Unit1.cpp(44): E2280 Member identifier expected"
ожидаемая ошибка идентификатора
Romikgy
Отправлено: 19.12.2006, 23:14


Дежурный стрелочник

Группа: Участник
Сообщений: 72



создаешь новое приложение, кидаешь на форму 2 листбокса, и 2 баттона
CODE

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 for (int i=0;i<15;i++)
ListBox1->Items->Add("Privet"+IntToStr(i));
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
ListBox1->MultiSelect=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
for (int i=ListBox1->Count-1;i>=0;i--)
if (ListBox1->Selected[i])
{
 ListBox2->Items->Insert(0,ListBox1->Items->Strings[i]);
 ListBox1->Items->Delete(i);
}
}
//---------------------------------------------------------------------------


вставляешь этот код и смотришь, как делатся то что те нужно!

PS кнопка 1 заполняет листбокс 1 ,
потом выделяешь сколько надо и нажимаешь на кнопку 2

Отредактировано Romikgy — 19.12.2006, 22:16
Make
Отправлено: 20.12.2006, 09:22


Ученик-кочегар

Группа: Участник
Сообщений: 13



Ёу yu.gif, тока позавчера сделал тоже само, тока коду более получилось
Romikgy
Отправлено: 20.12.2006, 10:05


Дежурный стрелочник

Группа: Участник
Сообщений: 72



Экономь на коду smile.gif
gorod
Отправлено: 20.12.2006, 10:27


Ученик-кочегар

Группа: Участник
Сообщений: 21



CODE

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ListBox1->Items->Add(Edit1->Text);//Add strings
Edit1->Clear();
   
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
ListBox2->Items->Add(Edit1->Text);//Add strings
Edit1->Clear();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Application -> Terminate();//Close form      
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int i,j= ListBox1->ItemIndex — ListBox1->SelCount +1;
 for (int k=0,i=j;k < ListBox1->SelCount; k++,i++)

ListBox2->Items->Insert(k,ListBox1->Items->Strings[i]);
ListBox1->Items->delete(i);//
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
 int i,j= ListBox2->ItemIndex — ListBox2->SelCount +1;
 for (int k=0,i=j;k < ListBox2->SelCount; k++,i++)

ListBox1->Items->Insert(k,ListBox2->Items->Strings[i]);
ListBox2->Items->delete(i);//
}
//---------------------------------------------------------------------------
а это разве не то?
Romikgy
Отправлено: 20.12.2006, 11:58


Дежурный стрелочник

Группа: Участник
Сообщений: 72



У тя это работает так как ты хошь?
если да , то и сказал бы что уже не надо !
gorod
Отправлено: 20.12.2006, 19:54


Ученик-кочегар

Группа: Участник
Сообщений: 21



в том-то и дело что не работает((((
Romikgy
Отправлено: 21.12.2006, 00:11


Дежурный стрелочник

Группа: Участник
Сообщений: 72



А мой код?
gorod
Отправлено: 22.12.2006, 16:19


Ученик-кочегар

Группа: Участник
Сообщений: 21



Ваше-работает)))
МОГУЧИЕ ШАЙТАНСТВО!!!))) wizard.gif

Вернуться в Вопросы программирования в C++Builder