TStringList- jak odwołać się do zdarzenia z innego miejsca

dział ogólny

TStringList- jak odwołać się do zdarzenia z innego miejsca

Nowy postprzez frogtjl » poniedziaÅ‚ek, 9 listopada 2009, 18:35

Witam wszystkich:)
Jestem początkującym w C++ Builder i zatrzymałem się na takim problemie i bardzo proszę o pomoc:)

Gdy otwieram Form1, w zdarzeniu(Events) OnShow tworzę sobie 2 listy ListaPro i ListaProBlk poprzez TStringList, które potem wrzucam do ComboBox'a (listę ListaPro) i do Memo1 (listę ListaProBlk). Do ListaPro i ListaProBlk ładuje dane z bazy Interbase.
Z załadowaniem ListaPro do ComboBox1 nie mam problemu, ale chciałem zrobić teraz tak, że w ComboBox1 na zdarzenie(Events) OnChange chciałem pobrać aktualny numer wybranej pozycji w ComboBox1 i za pomocą tej wartości wyświetlić odpowiednia do niej pozycję z ListaProBlk w Memo1.
Mój problem polega na tym, że gdy jestem w OnChange w ComboBox1 to nie wiem jak się odwołać do utworzonej listy ListaProBlk w zdarzeniu OnShow, bo kompilator pisze ze "Nie zna ListaProBlk"
Chodzi tu za pewne o odpowiednie odwolanie się do Form1::FormShow, ale nie jak to zrobić:(

Mam nadzieje, że nie zamieszałem:)

Kod: Zaznacz cały
void __fastcall TForm1::FormShow(TObject *Sender)
{
ComboBox1->Clear();
TStringList *ListaPro= new TStringList;
TStringList *ListaProBlk= new TStringList;

DM->IBQuery1->SQL->Clear();
DM->IBQuery1->SQL->Text = "select * from produkty";
DM->IBQuery1->Open();
while(!DM->IBQuery1->Eof)
   {
   ListaPro->Add(DM->IBQuery1->FieldByName("NAZWA_PRO")->AsString);
   ListaProBlk->Add(DM->IBQuery1->FieldByName("BIALKO")->AsString);
        DM->IBQuery1->Next();
   }
ComboBox1->Items= ListaPro;
}



Kod: Zaznacz cały
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
Memo1->Text=ListaProBlk->Strings[CmBxPro->ItemIndex];//[b]i tu wywala blad ze nie zna ListaProBlk[/b]
}
Avatar użytkownika
frogtjl
Bladawiec
Bladawiec
 
Posty: 6
Dołączył(a): poniedziałek, 9 listopada 2009, 18:03
Lokalizacja: Będzin
PodziÄ™kowaÅ‚ : 3
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 2003 JG Extreme II
BCB chodzi szybko, wolno podpowiada:(
Kompilator: C++ Builder 6
    NieznanyNieznana

Re: TStringList- jak odwołać się do zdarzenia z innego miejsca

Nowy postprzez banita » poniedziaÅ‚ek, 9 listopada 2009, 18:42

Kod: Zaznacz cały
TStringList *ListaPro= new TStringList;
TStringList *ListaProBlk= new TStringList;

wskazniki maja zasieg zdarzenia OnShow(funkcji).
po wyjsciu z funkcji tracisz mozliwosc odwolania sie do nich(wyciek pamieci).
musisz zadeklarowac te wskazniki jako pola klasy a w funkcji przypisac im pamiec.
w innych miejscach mozesz dolaczyc naglowek(jesli tzreba) i odwolac sie albo poprzez formX->zmienna (jesli publiczne) badz (tak byc powinno) za pomoca akcesora czyli zmienan jest prywatna i wykozystujesz Get... i Set..., w przypadku C++Buildera mozesz tutaj zastosowac rozszerzenie jezyka c++ - property.

Za ten post autor banita otrzymał podziękowanie od:
frogtjl
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: TStringList- jak odwołać się do zdarzenia z innego miejsca

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 9 listopada 2009, 20:26

banita - przecież on napisał:

Jestem początkującym w C++ Builder i zatrzymałem się na takim problemie i bardzo proszę o pomoc:)


a Ty piszesz tak, że nawet ja miałem problem zrozumieć o co Tobie chodzi.



Mój problem polega na tym, że gdy jestem w OnChange w ComboBox1 to nie wiem jak się odwołać do utworzonej listy ListaProBlk w zdarzeniu OnShow, bo kompilator pisze ze "Nie zna ListaProBlk"


Zadeklarowałeś te listy w zdarzeniu OnShow formularza, dlatego poza zdarzeniem nie istnieją. Musisz je zadeklarować w pliku nagłówkowym w sekcji private lub public i zdefiniować najlepiej w konstruktorze klasy formularza lub w zdarzeniu OnCreate, w OnShow możesz zrobić resztę:

plik nagłówkowy, np. Unit1.h:
Kod: Zaznacz cały
private:
        TStringList *ListaPro;
        TStringList *ListaProBlk;


Plik źródłowy, np. Unit1.cpp:
Kod: Zaznacz cały
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  ListaPro= new TStringList;
  ListaProBlk= new TStringList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
  ComboBox1->Clear();

  DM->IBQuery1->SQL->Clear();
  DM->IBQuery1->SQL->Text = "select * from produkty";
  DM->IBQuery1->Open();
  while(!DM->IBQuery1->Eof)
  {
    ListaPro->Add(DM->IBQuery1->FieldByName("NAZWA_PRO")->AsString);
    ListaProBlk->Add(DM->IBQuery1->FieldByName("BIALKO")->AsString);
     DM->IBQuery1->Next();
  }
  ComboBox1->Items= ListaPro;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
  Memo1->Text = ListaProBlk->Strings[CmBxPro->ItemIndex];
}


w ten sposób listy są deklarowane jako globalne. W sekcji private są globalne dla formularza na którym są deklarowane, tutaj na Form1. W sekcji public są deklarowane jako publiczne dla całej aplikacji dostępne na każdym formularzu aplikacji po odpowiednim zaadresowaniu.

Zanim zaczniesz dalej pracować nad tym programem sugerują byś zapoznał się z artykułami:
► patrz serwis: Cyfrowy Baron dziaÅ‚: teoria -> Funkcje.
► patrz serwis: Cyfrowy Baron dziaÅ‚: teoria -> Tworzenie klas.
► patrz serwis: Cyfrowy Baron dziaÅ‚: teoria -> Przekazywanie obiektów i funkcji pomiÄ™dzy formularzami

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
frogtjl
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
    NieznanyNieznana

Re: TStringList- jak odwołać się do zdarzenia z innego miejsca

Nowy postprzez frogtjl » Å›roda, 18 listopada 2009, 11:19

Dziękuję bardzo za pomoc:) Wszystko śmiga teraz;) Dziękuję również za bardzo dokładną odpowiedź:)
pozdrawiam
Avatar użytkownika
frogtjl
Bladawiec
Bladawiec
 
Posty: 6
Dołączył(a): poniedziałek, 9 listopada 2009, 18:03
Lokalizacja: Będzin
PodziÄ™kowaÅ‚ : 3
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 2003 JG Extreme II
BCB chodzi szybko, wolno podpowiada:(
Kompilator: C++ Builder 6
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

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