Zmieniający się adres elementu w obiekcie TStrings

0

Cześć.
Mam taki problem. Mam klasę(dziedziczy po TCustomComboBox), która jak wiadomo zawiera w sobie obiekt typu TStrings.

Tworzę sobie jakieś elementy:

Items.Add('Test');

Następnie chcę pobrać adres tego elementu i przypisać go do elementu innej klasy:

p:=Pointer(Items[0]);
elementInnejKlasy[1].ItemAddress:=p;

Od razu mówię, że nie mogę się tutaj posłużyć listą Objects z klasy TStrings.

I co się okazuje.
Okazuje się, że adresy elementów TStrings zmieniają się.
Czyli, jeśli wcześniej pobrałem i przypisałem adres: Pointer(Items[0]), to za jakiś czas elementowi Items[0] zostanie zmieniony adres i całe powiązanie szlag trafia.

Czy można jakoś tą zmianę przechwycić? Albo inne powiązanie zrobić? Tyle, że Objects i ItemIndex odpadają.

0

Nie bardzo wiem jak Tobie pomóc. A możesz napisać, dlaczego nie chcesz czy nie możesz
skorzystać z Objects, bo to chyba najlepsze wyjście, ja skorzystał bym z TStringList, gdyż
to nie jest obiekt abstrakcyjny, skoro już korzystasz z obiektu dostępnego chyba w VCL, a
to oznacza że nie potrzebujesz go chyba do aplikacji WinAPI, to może warto skorzystać, z
jego wszystkich dobrodziejstw. I przy skorzystaniu z Objects nie powinno być problemów.

0

OK chodzi o to, że tworzę sobie komponent CheckComboBox. Wzoruję się trochę na TCheckListBox, ale niestety kilka rzeczy jest rozwiązane inaczej w przodkach.

Chodzi o to, że musi być wrapper, który przechowuje informacje m.in. o tym, czy element w combo jest zaptaszkowany, czy nie.
TCheckListBox wiąże tego wrappera z odpowiednim elementem za pomocą Objects i wszystko działa. Niestety, jeśli ja wiążę za pomocą Objects, to potem nie mogę używać Objects, używając tego komponentu :) Krótko mówiąc Objects staje się nie do użycia.

Tak jak wspomniałem są pewne różnice między przodkami TCheckListBox i TCustomComboBox, które powodują takie, a nie inne działanie. Próbowałem to jakoś pogodzić, ale nie udało mi się.

Powiązać za pomocą indeksu też nie mogę, bo jeśli ktoś zrobi chociaż zwykły Insert(nie mówiąc już o zamianie elementów miejscami), to wszystko pójdzie w pi..u.

0

No niestety ja nie wiem jak pomóc, takich kombinacji z komponentami nie robiłem.
Za leniwy jestem, ale może w obiekcie przechowywanym w Objects dało by się też
poza tekstem czy booleanem odpowiedzialnym za Checked - przechować ten adres
na ktorym Tobie zależy. A jeżeli da się przechwycić metody, takie jak Insert albo i
inne zmieniające zawartośc ComboBoxa to wtedy zamiast na Itemie, operować na
całym obiekcie. Ale podejrzewam, że tak już próbowałeś. Swoją drogą uzywałem w
jednym zawieszonym projekcie, bo już póki co nie rozwijają TEasyGG komponentu
TGGList, dziedziczącego po TListBox i tam każdy user miał obok nicka ikonkę jego
statusu pobieraną z ImageList. Dane o nickach i statusach pobierał z ListView - to
tak myślę, czy jeżeli da się rysować małe Image obok itema, to może da się też i
narysować na ComboBoxie CheckBoxy, a stany zaznaczenia Itemów, przechwywać
w Objects, ewentualnie jak nie w Objects to w jakiejś dodatkowej TStringList i w
jej obiektach. Może nie potrzeba scalać ze sobą ComboBox i CheckBoxList, ale to
pewnie też próbowałeś. Staram się doradzić ale pewnie wiele sam posprawdzałeś.

0

No chodzi o to, że ja nie scalam. Ja piszę komponent całkowicie dziedziczący po TCustomComboBox. Wzoruję się na TCheckListBox jeśli chodzi tylko o rysowanie checkBoxów itp. Nic, będę chyba musiał jakoś pokombinować jeszcze z tym Objects. Ale jakby ktoś miał jakiś pomysł, to czekam :)

0

MisiekD podał linki do gotowców, ja myślałem że Juhas koniecznie chce samodzielnie.
W sumie ten http://www.torry.net/vcl/lbcb/checklistandcomboboxes/chcombox.zip mi
wygląda na ok, składa się z innych komponentów, button ma z resourców, ale efekt z
migającym kursorem w polu edycyjnym trzeba by jakoś zlikwidować - i wtedy wedlug
mnie by to lepiej wyglądało. Albo sprawdzić czy jakiś inny z torry - nie będzie lepszy.

0
Misiekd napisał(a)

http://www.torry.net/pages.php?id=136
http://users.otenet.gr/~tsoyran/engdelphi.htm
ale lepiej wymyślać koło od nowa...

Oczywiście, że najpierw szukałem. I te co znalazłem w żaden sposób mi nie odpowiadały, bo albo nie pochodziły bezpośrednio po TCustomComboBox, albo nie można było ich zainstalować, albo wymagały jakiś dodatkowych dziwnych pakietów itp, itd.

0

OK, wydaje się, że uporałem się z problemem. Musiałem przeładować Items tworząc własną klasę dziedziczącą po TStrings. Ale wydaje się, że wszystko działa. Niedługo wrzucę komponent na 4p i będzie se można potestować i pobawić się.

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