ComboBox

dział ogólny

ComboBox

Nowy postprzez mckri » wtorek, 11 listopada 2008, 22:35

Witam.
Brakuje mi w standardowej kontrolce mozliwości ustawienia obektu ComboBox jako tylko do odczytu, z mozliwością wstawiania tekstu do własciwości 'Text' tego obiektu. Chciałbym uzyskac efekt zachowania ComboBox w stylu 'csDropDownList', ale z możliwością wstawienia do własciwości 'Text' treści z listy.
Dla stylu 'csDropDownList' to nie zadziała:
Kod: Zaznacz cały
ComboBox1->Text="kiszka";

Czy jest jakiś sposób połączenia tych dwóch właściwości (treść tylko do odczytu+mozliwość z poziomu kodu ustawiania właściwości 'Text') w obiekcie ComboBox?
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
PodziÄ™kowaÅ‚ : 10
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    NieznanyNieznana

Re: ComboBox

Nowy postprzez Cyfrowy Baron » Å›roda, 12 listopada 2008, 09:29

Jedno z drugim nie działa, ale można zrobić tak, że nie da sie wprowadzić żadnego tekstu z klawiatury do obiektu ComboBox i będzie go można wprowadzać.
W tym celu ustawiasz właściwość Style obiektu ComboBox na csDropDown. Nastęnie tworzysz zdarzenie OnKeyPress dla ComboBox z takim kodem:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1KeyPress(TObject *Sender, char &Key)
{
   Key = 0;   
}
//---------------------------------------------------------------------------
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: ComboBox

Nowy postprzez mckri » Å›roda, 12 listopada 2008, 15:08

Takie rzeczy juz próbowałem, ale nadal masz mozliwość kasowania zaznaczonego tekstu klawiszem Del. oraz aktywny klawisz z klawiatury menu kontekstowego (zamiast prawego przycisku myszki). Próbowałem juz wyłączyć ten klawisz (Key=93), ale chyba się nie da.
Chodzi mi o całkowite zablokowanie combobox z mozliwością programowego wstawiania tekstu.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
PodziÄ™kowaÅ‚ : 10
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    NieznanyNieznana

Re: ComboBox

Nowy postprzez Cyfrowy Baron » Å›roda, 12 listopada 2008, 18:54

Takiej możliwości nie ma, ale zawsze możesz wstawiać element listy do ComboBox, tylko, że nie jest to to samo co dodawanie właściwości Text, gdyż dodawany jest nowy element do listy.

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ComboBox1->Items->Insert(0, "jakiÅ› tekst");
ComboBox1->ItemIndex = 0;
}
//---------------------------------------------------------------------------




Możesz też spróbować tak:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1KeyPress(TObject *Sender, char &Key)
{
   Key = '\0' ;
}
//---------------------------------------------------------------------------


Tutaj żaden klawisz nie zadziała.
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: ComboBox

Nowy postprzez mckri » Å›roda, 12 listopada 2008, 23:40

Po skompilowaniu nie widać róznicy w zachowaniu ComboBox czy to jest Key=0, czy Key='\0'.
Pole kombi lepiej zachowuje się w takiej sytuaci dla zdarzenia 'ComboBox1KeyDown'. Tam faktycznie przyciski sa zablokowane. Ale nadal dla pola kombi aktywny jest przycisk 93 (klawiaturowy odpowiednik prawego przycisku myszki). Pozostaje w takiej sytuacji chyba jedynie obejść ten problem tylko przez zrobienie funkcji, sprawdzającej przy zdarzeniach OnKey... czy zawartośc tekstu zmieniła sie względem zawartości listy.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
PodziÄ™kowaÅ‚ : 10
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    NieznanyNieznana

Re: ComboBox

Nowy postprzez Cyfrowy Baron » Å›roda, 12 listopada 2008, 23:49

Więc to jest najwyraźniej różnica w bibloitekach. Ja korzystam z środowiska C++ Builder 10 i u mnie sprawdza się to doskonale. Po wstawieniu kodu:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1KeyPress(TObject *Sender, char &Key)
{
       Key = '\0' ;
}
//---------------------------------------------------------------------------


i ustawieniu właściwości Style ComboBox na csDropDown nie mogę wprowadzić do ComboBox żadnego znaku z klawiatury.
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: ComboBox

Nowy postprzez Witold » czwartek, 13 listopada 2008, 01:26

mckri napisał(a):Czy jest jakiś sposób połączenia tych dwóch właściwości (treść tylko do odczytu+mozliwość z poziomu kodu ustawiania właściwości 'Text') w obiekcie ComboBox?

Może taka prowizorka:
Kod: Zaznacz cały
//---------------------------------------------------------------------------
void UstawStrCBoxa(TComboBox * cbx, AnsiString str)
{
  if (cbx->Items->Count>0)
  {
   const int ii = cbx->ItemIndex;
   cbx->Items->Strings[ii] = str;
   cbx->ItemIndex = ii;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ComboBox1->Style = csDropDownList;
  UstawStrCBoxa(ComboBox1, "kiszka");
}
//---------------------------------------------------------------------------
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: ComboBox

Nowy postprzez Cyfrowy Baron » czwartek, 13 listopada 2008, 09:53

Ja bym nieco poprawił ten kod:

Kod: Zaznacz cały
void UstawStrCBoxa(TComboBox * cbx, AnsiString str)
{
  if (cbx->Items->Count > 0 && cbx->ItemIndex != -1)
  {
   const int ii = cbx->ItemIndex;
   cbx->Items->Strings[ii] = str;
   cbx->ItemIndex = ii;
  }

}




Poza tym nie trzeba tworzyć żadnej funkcji do takich celów, gdyż ComboBox ma już wbudowaną podobną funkcję:

Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// Style = csDropDownList), przy csDropDown też działa
ComboBox1->ItemIndex = ComboBox1->Items->IndexOf("kiszka");
}

► patrz serwis: Cyfrowy Baron porady -> ComboBox -> Wybranie pozycji z ComboBox poprzez podanie nazwy elementu listy.

Jednak autorowi porady, chyba nie o to chodzi, gdyż tutaj nadal nie można zmienić właściwości Text obiektu ComboBox. Przytoczone przykłady służą tylko wybieraniu i wyświetlaniu elementu listy poprzez podanie nazwy tegoż elementu, podczas gdy Text nie wybiera żadnego elementu z listy i nie wstawia niczego na listę, wstawia tylko tekst w pole ComboBox, czyli właściwość Text obiektu ComboBox działa tak samo jak np. właściwość Text obiektu Edit.
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: ComboBox

Nowy postprzez Witold » czwartek, 13 listopada 2008, 13:09

Sprawdzenia czy ItemIndex !=-1 bez wątpienia brakowało.

Cyfrowy Baron napisał(a):Poza tym nie trzeba tworzyć żadnej funkcji do takich celów, gdyż ComboBox ma już wbudowaną podobną funkcję:
...
ComboBox1->ItemIndex = ComboBox1->Items->IndexOf("kiszka");


Tego nie rozumiem. Ta prowizorka którą podałem zmienia wartość elementu ComboBox -> tego który jest w danej chwili aktywny (wskazuje go ItemIndex).

Cyfrowy Baron napisał(a):Jednak autorowi porady, chyba nie o to chodzi, gdyż tutaj nadal nie można zmienić właściwości Text obiektu ComboBox.


Pewnie tak.

Moża by spróbować zmienić: Key na 0 dla ComboBox1KeyPress, ComboBox1KeyDown, podmienić PopupMenu i przechwycić WM_CONTEXTMENU i może coś jeszcze ;) .
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: ComboBox

Nowy postprzez Cyfrowy Baron » czwartek, 13 listopada 2008, 13:47

Kod: Zaznacz cały
ComboBox1->ItemIndex = ComboBox1->Items->IndexOf("kiszka");


No tak!... nie zauważyłem. Twoja funkcja podmienia nazwę wybranego elementu listy, ale to chyba już wogóle nie wchodzi w grę, gdyż zmianie ulega zawartość listy, co ze wszech miar wydaje się efektem niepożądanym.
Nie bardzo łapię sens podmiany elementu listy, tylko po to żeby wyświetlić jego zawartość skoro za pomocą funkcje IndexOf można wybrać i wyświetlić pożądany element listy bez wprowadzania jakichkolwiek zmian w liście.
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: ComboBox

Nowy postprzez Witold » czwartek, 13 listopada 2008, 16:23

Cyfrowy Baron napisał(a):
Kod: Zaznacz cały
ComboBox1->ItemIndex = ComboBox1->Items->IndexOf("kiszka");

...
Nie bardzo łapię sens podmiany elementu listy, tylko po to żeby wyświetlić jego zawartość skoro za pomocą funkcje IndexOf można wybrać i wyświetlić pożądany element listy bez wprowadzania jakichkolwiek zmian w liście.


Dla jakisString którego nie ma wśród ComboBox1->Items:

ComboBox1->ItemIndex = ComboBox1->Items->IndexOf(jakisString);

Nie zadziała (dla csDropDownList będzie puste pole), w takim wypadku trzeba jakisString dodać do listy. Można by połączyć wykorzystanie IndexOf z wstawianiem np. tylko do Items->Strings[0] i ten element (0) traktować jako nie istotny dla listy. Zresztą przyznałem że pewnie autorowi nie o to chodzi.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: ComboBox

Nowy postprzez Cyfrowy Baron » czwartek, 13 listopada 2008, 19:27

W takim przypadku należałoby dodać taki element do listy, ale mniejsza już o to.
Chcąc zmienić wartość elementu, mzna to zrobić prościej, ComboBox posiada już niezbędne funkcje:

Kod: Zaznacz cały
  int x = ComboBox1->ItemIndex;
  if(x != -1) ComboBox1->Items->Strings[i] = "kiszka";
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: ComboBox

Nowy postprzez mckri » czwartek, 13 listopada 2008, 21:27

Polecenie
Kod: Zaznacz cały
ComboBox1->ItemIndex = ComboBox1->Items->IndexOf("kiszka");

W zupełności mnie zadowala. Dzieki.

Co do Key=0 lub Key='\0' to osobiscie nie widzę różnicy w działaniu na wersji 11 Buildera. Byc może ktoś potwierdzi lub zaprzeczy na forum.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
PodziÄ™kowaÅ‚ : 10
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    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 6 gości