CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [Builder C++] ListBox + lista dwukierunkowa

[Builder C++] ListBox + lista dwukierunkowa

problemy z funkcjonowaniem bibliotek, komponentów itp.

[Builder C++] ListBox + lista dwukierunkowa

Nowy postprzez JarTSW » piątek, 7 stycznia 2011, 20:53

Witajcie! Mam pewien problem. Używam Buildera
W swoim programie mam komponent ListBox1 - uzupełniam go danymi z mojej listy dwukierunkowej (która jest oczywiście w pamięci programu) w taki sposób:
Kod: Zaznacz cały
void wyswietl_calosc(osoba *temp)
{
while(temp)
{
     Form1->ListBox1->Items->Add(temp->nazwa.c_str());
     temp=temp->nastepny;
}
}

i wszystko jest ok, wyświetla się prawidłowo. Teraz jeśli chcę usunąć element z ListBoxa, to stworzylem sobie SpeedButtona i nadałem mu takie coś na OnClick:

Kod: Zaznacz cały
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
ParentShowHint = false;
ShowHint=true;
ListBox1->Items->Delete(ListBox1->ItemIndex);
}


i też wszystko ok. Element z listy po zaznaczeniu i klknięciu buttona przestaje na liście widnieć. Jednak pojawia się pytanie, w jaki sposób usunąć element z listy dwukierunkowej? jak sprawdzić, który element został usunięty z ListBoxa i jego wywalić z pamięci (potrzebny by był np jego adres).

Proszę o pomoc.
Avatar użytkownika
JarTSW
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 7 stycznia 2011, 20:38
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows VistaFirefox

Re: [Builder C++] ListBox + lista dwukierunkowa

Nowy postprzez Cyfrowy Baron » piątek, 7 stycznia 2011, 21:04

Po pierwsze kolego to:

KOD cpp:     UKRYJ  
Form1->ListBox1->Items->Add(temp->nazwa.c_str());


Funkcja Add oczekuje wartości typu String, więc konwersja na char z wykorzystaniem c_str() jest nie tylko nie na miejscu, ale jest to również błąd.

w jaki sposób usunąć element z listy dwukierunkowej? jak sprawdzić, który element został usunięty z ListBoxa i jego wywalić z pamięci (potrzebny by był np jego adres).


A skąd ktokolwiek poza tobą może wiedzieć jak ta lista wygląda, skoro nigdzie nie przytoczyłeś żadnego przykładu tej listy, czyli jakiego typu to lista, jak ją wypełniasz.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [Builder C++] ListBox + lista dwukierunkowa

Nowy postprzez JarTSW » sobota, 8 stycznia 2011, 11:34

Funkcja Add oczekuje wartości typu String, więc konwersja na char z wykorzystaniem c_str() jest nie tylko nie na miejscu, ale jest to również błąd.

Czemu błąd? ja tylko dodam, że to jest konwersja ze string na String i kompilator nie sygnalizuje nic

A co do mojej listy, to może źle sprecyzowałem pytanie, dlatego zrobię to jeszcze raz:
Chciałbym, żeby po kliknięciu w jakiś element ListBoxa poznać jego numer. Czyli na przykład mam taką listę:
Element 1
Element 2
Element 3

i po kliknięciu np na Element1 chciałbym uzyskać 1 (czy też 0, zależy jak to tam jest liczone), czyli po prostu poznać index w tym ListBoxie.
Jeśli będę miał ten index, to w swojej liście bez problemu sobie przejdę do tej wartości, usuwając ją z pamięci komputera.
Avatar użytkownika
JarTSW
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 7 stycznia 2011, 20:38
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows VistaFirefox

Re: [Builder C++] ListBox + lista dwukierunkowa

Nowy postprzez MisticFrezer » sobota, 8 stycznia 2011, 11:51

Wystarczy
Kod: Zaznacz cały
int index = ListBox1->ItemIndex;

Za ten post autor MisticFrezer otrzymał podziękowanie od:
JarTSW
Avatar użytkownika
MisticFrezer
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): wtorek, 23 lutego 2010, 23:57
Lokalizacja: Wrocław
Podziękował : 1
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP3, Windows 7 Pro
Kompilator: BCB6, RAD Studio 2010, VS 2010
Gadu Gadu: 0
    Windows 7Opera

Re: [Builder C++] ListBox + lista dwukierunkowa

Nowy postprzez Cyfrowy Baron » sobota, 8 stycznia 2011, 13:20

JarTSW napisał(a):Chciałbym, żeby po kliknięciu w jakiś element ListBoxa poznać jego numer. Czyli na przykład mam taką listę:


Człowieku. Listę w pliku to możesz mieć jaką sobie wymyślisz. Do czego tą listę wczytujesz? Wcześniej napisałeś:

JarTSW napisał(a):uzupełniam go danymi z mojej listy dwukierunkowej (która jest oczywiście w pamięci programu)


Chodzi właśnie to tą listę w pamięci. Jaki to rodzaj listy? Jak wczytujesz dane do tej listy z pliku?

JarTSW napisał(a):Czemu błąd? ja tylko dodam, że to jest konwersja ze string na String i kompilator nie sygnalizuje nic


Po co mieszasz string ze String?! :shock: Przecież do przechowywania listy w pamięci możesz użyć klasy TStringList. Daje to dwie korzyści: obiekt typu TListBox ma metodę Items, która jest typu TStrings, a TStringList również bazuje na TStrings, więc wymiana danych będzie prostsza i zarządzanie indeksami łatwiejsze.
Kompilator nie sygnalizuje błędu, gdyż dokonywana jest niejawna konwersja z char na String, co nie zmienia faktu, że funkcja oczekuje jako argumentu typu String a nie char, więc po co używać typu char, a potem konwersji nawet niejawnej, skoro potrzebny jest typ String.

Plik nagłówkowy Unit1.h:
KOD cpp:     UKRYJ  
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TListBox *ListBox1;
        TButton *Button1;
        TButton *Button2;
        TListBox *ListBox2;
        TButton *Button3;
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
private:        // User declarations
        TStringList *memList;
public:         // User declarations
        __fastcall TForm1(TComponent* Owner);
};


Plik źródłowy Unit1.cpp:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 memList = new TStringList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 delete memList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 // wczytanie listy z pliku do listy w pamięci
 String fileName = ExtractFilePath( ParamStr(0) ) + "lista.txt";
 memList->LoadFromFile(fileName);

 // przykład dodania wartości do wczytanej już listy w pamięci
 memList->Add("Nowy Element listy 1");
 memList->Add("Nowy Element listy 2");
 memList->Add("Nowy Element listy 3");

 // przepisanie listy z pamięci do ListBox1
 ListBox1->Items->Assign(memList);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 // usuwanie wybranego elementu z ListBox1
 int index = ListBox1->ItemIndex;
 if(index < 0) return; // przerwanie jeżeli nic nie wybrano
 String delValue = ListBox1->Items->Strings[index]; /* potrzebne do odszukania elementu na liście memList */
 ListBox1->Items->Delete(index);

 /* usuwanie elementu z listy w pamięci - memList
   Lista może być posortowana, czyli kolejność elementów może być inna
   niż na liście ListBox1 a i tak usunięty zostanie ten sam element */

 index = memList->IndexOf(delValue);
 memList->Delete(index);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 /* Sprawdzam co zawiera memList w celu porównania, czy jej zawartość zgadza
   się z zawartością ListBox1, wynik wyświetlam w ListBox2 */


 ListBox2->Items->Clear(); // czyszczę zawartość ListBox2
 ListBox2->Items->Assign(memList);
}
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
JarTSW
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Biblioteki i komponenty

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości

cron