Il linguaggio di programmazione Delphi
 

On DrawItem

Stark 1 Mar 2017 17:40
Ho un ComboBox i cui items carico da una ObjectList che ordino in vari modi
a secondo di quello che serve. Avrei voluto evidenziare in qualche modo gli
items che rispondono a certe caratteristiche, ma ho una difficoltà che non
sono riuscito a superare, Il comboBox è caricato dalla lista, ma ha una riga
iniziale in più ('Nuovo').
Riducendo al minimo la proc On Draw, ho tentato quanto segue:

with TComboBox(Control), TComboBox(Control).Canvas do
begin
if Index > 0 then
if TTitolo(OListTitoli.Items[Index-1]).C = 'C' then
Font.Color := clWhite ;
else
Font.Color := clBlack ;
FillRect(Rect);
TextOut(Rect.Left + 1,Rect.Top + 1, TComboBox(Control).Items[Index]);
end;

Al clic sull'ultimo item del comboBox va in errore 'List index out of
bound'.
Non sono riuscito a rimediare. C'è un modo di farlo ?
4ndre4 1 Mar 2017 18:11
On Wednesday, 1 March 2017 16:40:18 UTC, Stark wrote:

> with TComboBox(Control), TComboBox(Control).Canvas do

Il modo migliore di spararsi nei piedi. Non uno, ben due.

> begin
> if Index > 0 then
> if TTitolo(OListTitoli.Items[Index-1]).C = 'C' then
> Font.Color := clWhite ;
> else
> Font.Color := clBlack ;

Altro codice orribile. L'else sembra essere riferito all'if piu` esterno. Usa
begin/end anche quando hai un if solo.

> FillRect(Rect);
> TextOut(Rect.Left + 1,Rect.Top + 1, TComboBox(Control).Items[Index]);

Se ti va in list index out of bounds e` perche` hai o index = -1 o index
maggiore del numero di elementi. Immagino sia il primo caso. Prova a racchiudere
TUTTO il codice dentro l'if all'inizio.
Alberto Salvati 1 Mar 2017 18:33
Questa sintassi è una *******
> with TComboBox(Control), TComboBox(Control).Canvas do

MALEDETTO SIA IL WITH, ORA E SEMPRE, MA UN DOPPIO WITH PER ME NON SAREBBE CAUSA
DI LICENZIAMENTO MA DA CALCI SULLE GENGIVE.


> Non sono riuscito a rimediare. C'è un modo di farlo ?

Breakpoint e vai di debug linea per linea.

A.
Stark 1 Mar 2017 19:14
"Alberto Salvati" ha scritto nel messaggio
news:f88134e2-29ac-4efb-8491-244176eebb94@googlegroups.com...
Breakpoint e vai di debug linea per linea.
A.
--
Ok, il problema sta nella circostanza che quando agisco sull'ultimo elemento
del comboBox, questo è l'elemento con indice 12. Poi con quell'indice
indirizzo la Lista, dove invece lo stesso item è l'undicesimo elemento.
Questo perchè il comboBox ha l'elemento zero con una stringa 'Nuovo' (che
però c'è solo per certe transazioni).
Insomma la asincronia tra comboBox e Lista mi sta dando un sacco di
problemi..
Forse potrei cambiare la combobox per caricare gli oggetti della lista,
piuttosto che solo una stringa e usare l'oggetto del comboBox piuttosto che
quello della Lista... Mi sembrava una duplicazione inutile (anche se solo
solo degli indirizzi). Che ne dite ?

PS: A parte l'obiezione al with, che capisco, ma perchè
TComboBox(Control).Canvas fa schifo ? Come indirizzo il comboBox dentro
l'OnDraw ?
4ndre4 1 Mar 2017 22:58
On Wednesday, 1 March 2017 18:14:10 UTC, Stark wrote:

> Ok, il problema sta nella circostanza che quando agisco sull'ultimo elemento
> del comboBox, questo è l'elemento con indice 12. Poi con quell'indice
> indirizzo la Lista, dove invece lo stesso item è l'undicesimo elemento.

Quando inserisci gli elementi nel combobox, puoi usare la proprieta` "Tag"
(TObject) per puntare all'oggetto della lista, o usando l'index o usando un
riferimento all'oggetto stesso.

> PS: A parte l'obiezione al with, che capisco, ma perchè
> TComboBox(Control).Canvas fa schifo ? Come indirizzo il comboBox dentro
> l'OnDraw ?

Si sta riferendo all'uso del with. Evitalo.
Daniele 6 Mar 2017 09:58
Ciao,
come ti ha gia' suggerito Andrea quel tipo di errore capita se l'index
e' -1 o supera il numero degli item che hai.
Nel tuo caso capita perche' superi il limite (da quello che tu scrivi).

> Ok, il problema sta nella circostanza che quando agisco sull'ultimo
> elemento del comboBox, questo è l'elemento con indice 12. Poi con
> quell'indice indirizzo la Lista, dove invece lo stesso item è l'undicesimo
> elemento. Questo perchè il comboBox ha l'elemento zero con una stringa
> 'Nuovo' (che però c'è solo per certe transazioni).
> Insomma la asincronia tra comboBox e Lista mi sta dando un sacco di
> problemi..
Una volta che hai caricato la lista nella lista del combobox la sincronia la
gestisci tu.
Nel tuo caso devi solo togliere 1.
Se nel combobox sei sull'ottavo item, nella tua listbox l'ottavo corrisponde
al settimo (perche' nel combo box hai NUOVO).

La butto li, perche' non metti un bottoncino a destra del combo con "Nuovo"
?

Ciao

Daniele
4ndre4 6 Mar 2017 17:24
On Monday, 6 March 2017 08:58:54 UTC, Daniele wrote:

[...]
> Nel tuo caso devi solo togliere 1.
> Se nel combobox sei sull'ottavo item, nella tua listbox l'ottavo corrisponde
> al settimo (perche' nel combo box hai NUOVO).

Non c'e` neanche bisogno di fare arzigogolati calcoli sugli indici. Basta usare
la proprieta` Tag che ogni componente possiede per linkare l'oggetto
corrispondente.

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio di programmazione Delphi | Tutti i gruppi | it.comp.lang.delphi | Notizie e discussioni delphi | Delphi Mobile | Servizio di consultazione news.