Poszukuję komponentu CheckComboBox

0

Witam!
Na początku mała uwaga, aby nie odpowiadać: "Poszukaj na torry", bo ściągnąłem stamtąd wszystkie komponenty, które choć w części pasowały do opisu tego, którego szukam - i nic ;(
A czego dokładnie szukam?
Otóż komponentu, który łączyłby w sobie funkcjonalność ComboBox i CheckList. Wygląda i zachowuje się tak jak ten pierwszy, a jedyną zmianą jest to, że każdy element zawiera nie tylko tekst, ale również parametr Checked oraz stosowny "kwadracik" obok danej pozycji.

Napisałem sobie takie coś i działa świetnie, ale nie jako oddzielny komponent, tylko modyfikacja poszczególnego ComboBoxa. Jeśli chciałbym przenieść ten kod i utworzyć z niego odrębny komponent, to musiałbym użyć dosyć zawiłego mechanizmu zawierającego tzw. WrapperClass (tak, jak jest to zrobione w standardowym komponencie CheckList).

Jeśli ktoś z Was posiada takowy komponent, to byłbym wdzięczny za przesłanie mi go na skrzynkę (ewentualnie podanie tutaj stosownego odnośnika).

0

Ale czemu nie chcesz zrobić z tego komponentu?
Ja spróbuje coś takiego zrobić. :-)

0

Chcę z tego zrobić komponent, ale nie za bardzo mi się to udaje. Jak chcesz, to mogę Ci przesłać kod jak ja to zrobiłem (C++).

0

Jakiego używasz C++, jeżeli Borland, to chyba można przenosić komponenty z Delphi do niego?

0

Używam C++Builder'a 5.0. Działają w nim prawie wszystkie komponenty napisane do Delphi do wersji 5.0. Tych do 6.0 nie miałem okazji testować.

0

Ja mam Delphi 5 Standard. Zrobie ten komponencik może jescze dzis i dam go na 4programers.

0

Dzięki! Gdyby to nie sprawiło Ci kłopotu, to podrzuć mi to od razu na maila. Thnx! [browar]

0

Marooned, chciałbym się Ciebie zapytać, czy CheckListBox może być umieszczony na formie?

Aaaaa... leń ze mnie.
Ściągnij sobie z [utl]http://delphi.icm.edu.pl/ftp/d30free/chcombox.zip</url>.

0

Marooned, chciałbym się Ciebie zapytać, czy CheckListBox może być umieszczony na formie?

Nie rozumiem - to ma zwięzek z tematem? Jeśli chodzi Ci o to, czy można na własną formę wrzucić CheckListBox, to jest to chyba oczywiste, że tak. Inaczej po co byłby taki komponent? Ale chyba nie oto Ci chodziło :| .

Ściągnij sobie z http://delphi.icm.edu.pl/ftp/d30free/chcombox.zip.

Tak się składa, że mam ten komponent (dużo szukałem, zanim wrzuciłem tu to pytanie). I nie do końca o taki mi chodzi. Ja potrzebuję taki, aby wyglądał i zachowywał się dokładnie jak zwykły ComboBox. Jedyna różnica to taka, że każdy element musi posiadać właściwość Checked oraz stosowny "kwadracik" obok napisu na rozwijanej liście.

0

Ja potrzebuję taki, aby wyglądał i zachowywał się dokładnie jak zwykły ComboBox. Jedyną różnica to taka, że każdy element musi posiadać właściwość Checked oraz stosowny "kwadracik" obok napisu na rozwijanej liście.

Aż cały komponent robić? Może wystarczy OwnerDraw?

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
Check: TRect;
begin
Check.Left := Rect.Left + 1;
Check.Top := Rect.Top + 1;
Check.Right := Rect.Bottom - Rect.Top;
Check.Bottom := Rect.Bottom - 1;
with (Control as TCustomCombo).Canvas do
begin
Rectangle(Rect);
TextRect(Rect, 30, Rect.Top, ComboBox1.Items[Index]);
Rectangle(Check);
end;
end;

Oczywiście gdzieś przydałoby się przetrzymywać listę stanów i zależnie od niej rysować "x" lub nie. A po kliknięciu na item zminiać stan zależnie od ItemIndex.

0

Aż cały komponent robić? Może wystarczy OwnerDraw?
Oczywiście gdzieś przydałoby się przetrzymywać listę stanów i zależnie od niej rysować "x" lub nie. A po kliknięciu na item zminiać stan zależnie od ItemIndex.

No właśnie nie! Tak jak mówisz, to ja już zrobiłem (tylko bardziej profesjonalnie, bo z przesunięciem "mrówek" oraz z użyciem funkcji DrawFrameControl). Źródło można sobie ściągnąć stąd: http://marooned.prv.pl/CheckComboBox.rar.
A ja chcę, aby właściwość Checked była "wbudowana" w komponent i aby nie trzeba było tworzyć dodatkowej tablicy do każdego ComboBoxa.

0

Marooned. Chodziło mi o to, że wysowana część Combobox'u byłaby na formie, na której byłby CheckListBox, nie kapujesz?? A potem przy OndDropDown byłaby wywoływana. Dryobates ma racje, tylko przy kliknięciu na coś takiego lista by się zamykała.

0

Teraz kapuję :-) , ale czy odpalałeś programik, do którego link podałem 2 posty wyżej? Da się to zrobić elegancko - bez żadnych udziwnień w postaci dodatkowego komponentu CheckListBox.

0

Nie mam Borlanda C++.

[dopisek]

Dryobates on chyba sobie już z tym poradził. Gadałem z nim na GG.

0

A ja chcę, aby właściwość Checked była "wbudowana" w komponent i aby nie trzeba było tworzyć dodatkowej tablicy do każdego ComboBoxa

Więc można to zrobić na 3 sposoby:

  1. Zrobić komponent na tej zasadzie jak podane. W konstruktorze obiektu tworzona byłaby tablica.
  2. Zrobić mały brzydki przekręt. Tworzymy komponent podobnie jak było opisane. Pierwszy znak itema oznaczałby czy zaznaczone, czy nie. Należałoby jedynie nadpisać procedury wyświetlające tekst, tak by kopiowały wszystko poza pierwszym znakiem. I w zależności od pierwszego znaku dokonywać rysowania zaznaczonego lub nie. Jeżeli chodzi o podobny wygodny dostęp do sprawdzania czy znaznaczone czy nie to możnaby napisać funkcję/metodę która by sprawdzała w zależności od podanego argumentu.
  3. Napisać komponent bazujący na CustomListControl i zamiast Items: TStrings użyć własnej odmiany TStrings wzbogaconej o wartość checked...

A tak w ogóle, to jakby was to interesowało to w komponencie TCheckedListBox właściwość Chcecked itemów jest dodana wykorzystując dodatkowy obiekt TList

1 użytkowników online, w tym zalogowanych: 0, gości: 1