Тхе ТЦомбоБок компонента комбинује оквир за уређивање са листама „пицк“ која се може померати. Корисници могу одабрати ставку са листе или је уписати директно у едит бок.
Падајуће листе
Када је комбиновани оквир у падајућем стању, Виндовс црта врсту контроле у оквиру за приказ ставки комбиноване кутије за избор.
Тхе ДропДовнЦоунт својство одређује максимални број ставки приказаних на падајућој листи.
Тхе ширина падајуће листе подразумевано би била једнака ширини комбинованог оквира.
Када дужина (низа) предмета прелази ширину комбобок-а, ставке се приказују као пресечене!
ТЦомбоБок не пружа начин за подешавање ширине падајуће листе :(
Фиксирање ширине падајуће листе ЦомбоБок
Ширину падајуће листе можемо подесити слањем посебног Виндовс порука до комбиноване кутије. Порука је ЦБ_СЕТДРОППЕДВИДТХ и шаље минималну дозвољену ширину, у пикселима, листе оквира комбиниране кутије.
Да бисте тврдо кодирали величину падајуће листе на, рецимо, 200 пиксела, могли бисте да урадите:
СендМессаге (тхеЦомбоБок). Ручка, ЦБ_СЕТДРОППЕДВИДТХ, 200, 0);
Ово је у реду само ако сте сигурни да су сви ваши тхеЦомбоБок. Предмети нису дужи од 200 пк (када их цртате).
Да бисмо обезбедили да нам је падајући списак увек довољно широк, можемо израчунати потребну ширину.
Ево функције за добијање потребне ширине падајуће листе и њено постављање:
процедура ЦомбоБок_АутоВидтх (цонст тхеЦомбоБок: ТЦомбобок); цонст
ХОРИЗОНТАЛ_ПАДДИНГ = 4; вар
итемсФуллВидтх: цели број; идк: интегер; итемВидтх: цео број; започети
итемсФуллВидтх: = 0; // добити максимум потребан за ставке у падајућем стањуза идк: = 0 до -1 + тхеЦомбоБок. Предмети. Гроф урадитизапочети
итемВидтх: = тхеЦомбоБок. Цанвас. ТектВидтх (тхеЦомбоБок). Предмети [идк]); Инц (шифра предмета, 2 * ХОРИЗОНТАЛ_ПАДДИНГ); иф (итемВидтх> итемсФуллВидтх) онда итемсФуллВидтх: = итемВидтх; крај; // подесите ширину пада према потребиако (итемсФуллВидтх> тхеЦомбоБок. Ширина) тада. започети// проверите да ли ће бити трака за помицањеако тхеЦомбоБок. ДропДовнЦоунт онда
итемсФуллВидтх: = итемсФуллВидтх + ГетСистемМетрицс (СМ_ЦКСВСЦРОЛЛ); СендМессаге (тхеЦомбоБок). Ручка, ЦБ_СЕТДРОППЕДВИДТХ, итемсФуллВидтх, 0); крај; крај;
Ширина најдужег низа користи се за ширину падајуће листе.
Када назвати ЦомбоБок_АутоВидтх?
Ако претходно попуните листу ставки (током пројектовања или приликом креирања обрасца) можете позвати поступак ЦомбоБок_АутоВидтх у оквиру обрасца ОнЦреате евент хандлер.
Ако динамички мењате листу ставки комбо бок-а, можете позвати поступак ЦомбоБок_АутоВидтх унутар ОнДропДовн руковатељ догађајима - догађа се када корисник отвори падајућу листу.
Тест
За тест, на обрасцу имамо 3 комбиниране кутије. Сви имају ставке са њиховим текстом ширим од стварне ширине поља. Трећи комбинирани оквир постављен је близу десне ивице обрасца обрасца.
Својство Итемс је, на пример, унапред попуњено - у обрасцу ОнЦреате догађаја зовемо наш ЦомбоБок_АутоВидтх за образац:
// Образац је ОнЦреатепроцедура ТФорм. ФормЦреате (пошиљалац: ТОбјецт); започети
ЦомбоБок_АутоВидтх (ЦомбоБок2); ЦомбоБок_АутоВидтх (ЦомбоБок3); крај;
Нисмо позвали ЦомбоБок_АутоВидтх за Цомбобок1 да бисмо видели разлику!
Имајте на уму да ће, када се покрене, падајућа листа за Цомбобок2 бити шира од Цомбобок2.
Читава падајућа листа искључена је за „Положај близу десне ивице“
За Цомбобок3, онај који се налази близу десне ивице, падајућа листа је одсечена.
Слање ЦБ_СЕТДРОППЕДВИДТХ увек ће проширити оквир падајуће листе десно. Када се ваш комбинирани оквир налази близу десне ивице, продужење оквира са списком удесно довешће до тога да ће се приказати оквир са списком.
Морамо некако проширити оквир листе улево када је то случај, а не десно!
ЦБ_СЕТДРОППЕДВИДТХ не може навести у ком правцу (лево или десно) продужити оквир са списком.
Решење: ВМ_ЦТЛЦОЛОРЛИСТБОКС
Таман када треба да се прикаже падајућа листа, Виндовс шаље ВМ_ЦТЛЦОЛОРЛИСТБОКС поруку родитељском прозору оквира са списком - у наш комбинирани оквир.
Могућност решавања проблема са ВМ_ЦТЛЦОЛОРЛИСТБОКС за комбиновални оквир близу десне ивице решила би проблем.
Свемогући прозорПроц
Свака ВЦЛ контрола излаже својство ВиндовПроц - поступак који реагује на поруке послате на контролу. Можемо користити својство ВиндовПроц да привремено надоместимо или подкласирамо поступак прозора контроле.
Ево нашег модификованог ВиндовПроц-а за Цомбобок3 (онај близу десне ивице):
// измењени ЦомбоБок3 ВиндовПроцпроцедура ТФорм. ЦомбоБок3ВиндовПроц (вар Порука: ТМессаге); вар
цр, лбр: ТРецт; започети// цртање оквира са ставкама у комбинацији
ако је порука. Мсг = ВМ_ЦТЛЦОЛОРЛИСТБОКС тада. започети
ГетВиндовРецт (ЦомбоБок3.Хандле, цр); // правоугаоник с листама
ГетВиндовРецт (Порука ЛПарам, лбр); // померите га улево да одговара десној ивициако цр. Тачно <> лбр. Јел тако онда
МовеВиндов (Порука ЛПарам, лбр. Лево- (лбр. Десно-цлбр. Тачно), лбр. Врх, лбр. Тачно-лбр. Лево, лбр. Дно-лбр. Топ, тачно); крајдруго
ЦомбоБок3ВиндовПроцОРИГИНАЛ (Порука); крај;
Ако је порука коју прима наш комбинирани оквир ВМ_ЦТЛЦОЛОРЛИСТБОКС добили смо правоугаоник његовог прозора, такође ћемо добити и правокутник оквира са списком (ГетВиндовРецт). Ако се покаже да ће се оквир са листом појављивати више десно - премештамо га улево тако да је комбинирана кутија и листа оквира десна ивица иста. Једноставно као то :)
Ако порука није ВМ_ЦТЛЦОЛОРЛИСТБОКС, једноставно зовемо оригинални поступак руковања порукама за комбиновани оквир (ЦомбоБок3ВиндовПроцОРИГИНАЛ).
Коначно, све ово може функционисати ако смо га правилно поставили (у обрасцу ОнЦреате догађаја за образац):
// Образац је ОнЦреатепроцедура ТФорм. ФормЦреате (пошиљалац: ТОбјецт); започети
ЦомбоБок_АутоВидтх (ЦомбоБок2); ЦомбоБок_АутоВидтх (ЦомбоБок3); // додајте модификовани / прилагођени ВиндовПроц за ЦомбоБок3
ЦомбоБок3ВиндовПроцОРИГИНАЛ: = ЦомбоБок3.ВиндовПроц; ЦомбоБок3.ВиндовПроц: = ЦомбоБок3ВиндовПроц; крај;
Где у декларацији обрасца имамо (целокупну):
тип
ТФорм = класа(ТФорм) ЦомбоБок1: ТЦомбоБок; ЦомбоБок2: ТЦомбоБок; ЦомбоБок3: ТЦомбоБок;процедура ФормЦреате (пошиљалац: ТОбјецт); приватни
ЦомбоБок3ВиндовПроцОРИГИНАЛ: ТВндМетход; процедура ЦомбоБок3ВиндовПроц (вар Порука: ТМессаге); јавни{Јавне изјаве}крај;
И то је то. Све обрађено :)