ВБ.НЕТ: Шта се догодило за контролу поља

Пропуштање контролних низова са ВБ.НЕТ-а представља изазов за оне који предају о низовима.

  • Више није могуће једноставно копирати контролу, попут текстуалне кутије, и затим је залепити (једном или неколико пута) да бисте створили контролни низ.
  • ВБ.НЕТ код за креирање структуре сличне контролном пољу је у свим књигама на ВБ.НЕТ-у које сам купио и на мрежи много дужи и сложенији. Недостаје му једноставност кодирања контролног низа који се налази у ВБ6.

Ако референцирате на библиотеку компатибилности ВБ6, тамо се налазе предмети који делују слично као контролни низови. Да бисте видели шта мислим, једноставно користите чаробњака за надоградњу ВБ.НЕТ с програмом који садржи контролни низ. Код је опет ружан, али функционише. Лоша вест је да Мицрософт неће гарантовати да ће компоненте компатибилности и даље бити подржане, а ви их не бисте требали користити.

ВБ.НЕТ код за креирање и употребу "контролних низова" је много дужи и много сложенији.

Према Мицрософту, направити нешто што је чак и ближе ономе што можете учинити у ВБ 6 захтева стварање „једноставне компоненте која дуплира функционалност контролног низа“.

instagram viewer

За илустрацију вам требају и нова класа и образац за хостинг. Класа заправо ствара и уништава нове етикете. Комплетан код класе је следећи:

Јавна класа ЛабелАрраи
Систем наследства. Збирке. ЦоллецтионБасе
Приватни РеадОнли ХостФорм као _
Систем. Виндовс. Обрасци. Образац
Јавна функција АддНевЛабел () _
Као систем. Виндовс. Обрасци. Етикета
'Креирајте нову инстанцу класе Лабел.
Дим аЛабел Као нови систем. Виндовс. Обрасци. Етикета
'Додајте етикету колекцијама
'интерна листа.
Ја. Листа. Додај (аЛабел)
'Додајте Налепницу у колекцију Контроле
'обрасца на који се односи поље ХостФорм.
ХостФорм. Контроле. Додај (аЛабел)
'Поставите иницијална својства за објект Лабел.
ознака. Топ = Број * 25
ознака. Ширина = 50
ознака. Лево = 140
ознака. Таг = ја. Гроф
ознака. Тект = "Ознака" и ја. Гроф. ТоСтринг
Врати ознаку
Завршна функција
Публиц Суб Нев (_
БиВал хост као систем. Виндовс. Обрасци. Образац)
ХостФорм = хост
Ја. АддНевЛабел ()
Енд Суб
Дефаулт Публиц РеадОнли Проперти _
Ставка (БиВал индекс као цео број) Као _
Систем. Виндовс. Обрасци. Етикета
Добити
Врати ЦТипе (Ме. Списак. Артикал (индекс), _
Систем. Виндовс. Обрасци. Етикета)
Енд Гет
Енд Проперти
Јавно под уклањање ()
„Проверите да ли постоји налепница коју треба уклонити.
Иф Ме. Број> 0 Затим
'Уклоните задњу налепницу која је додата у низ
'из колекције контрола обрасца хоста.
'Имајте на уму употребу подразумеваног својства у
'приступ низу.
ХостФорм. Контроле. Уклони (Ја (Ме. Број - 1))
Ја. Листа. РемовеАт (Ме. Број - 1)
Енд Иф
Енд Суб
Енд Цласс

Да бисте илустровали како ће се код ове класе користити, можете креирати образац који га позива. Морате користити код приказан доле у ​​обрасцу:

Јавна класа Форм1. Систем наследства. Виндовс. Обрасци. Образац. #Регион "Код генерисан од стране Виндовс облика дизајнера" 'Такође морате додати изјаву:' МиЦонтролАрраи = Нови ЛабелАрраи (Ја) 'након позива ИнитиализеЦомпонент () у. 'скривени код регије. 'Прогласите нови објект БуттонАрраи. Дим МиЦонтролАрраи Као ЛабелАрраи. Приватни Суб бтнЛабелАдд_Цлицк (_. БиВал пошиљалац Ас Систем. Објекат, _. БиВал е као систем. ЕвентАргс) _. Рукује бтнЛабелАдд. Кликните на. 'Позовите методу АддНевЛабел. 'МиЦонтролАрраи. МиЦонтролАрраи. АддНевЛабел () 'Промените својство БацкЦолор. 'дугмета 0. МиЦонтролАрраи (0) .БацкЦолор = _. Систем. Цртање. Боја. Црвено. Енд Суб. Приватни Суб бтнЛабелРемове_Цлицк (_. БиВал пошиљалац Ас Систем. Објекат, _. БиВал е као систем. ЕвентАргс) _. Ручке бтнЛабелРемове. Кликните на. 'Позовите методу за уклањање МиЦонтролАрраи. МиЦонтролАрраи. Уклони () Енд Суб. Енд Цласс

Прво, ово чак и не ради посао у Десигн Тиме-у као што смо то радили у ВБ 6! И друго, они нису у низу, они су у ВБ.НЕТ колекцији - много другачија ствар од низа.

Разлог због којег ВБ.НЕТ не подржава ВБ 6 „контролни низ“ је тај што не постоји таква „контролна матрица“ (имајте на уму промену наводника). ВБ 6 креира колекцију у позадини и чини је да се појављује као низ за програмере. Али то није низ и имате малу контролу над њим изван функција које пружа ИДЕ.

ВБ.НЕТ, с друге стране, назива то што јесте: колекција објеката. И кључеве краљевства предају програмеру стварајући читаву ствар на отвореном.

Као пример врста предности које ово даје програмеру, у ВБ 6 контроле су морале бити истог типа и морале су имати исто име. Пошто су ово само објекти у ВБ.НЕТ-у, можете их правити различитим типовима и давати им различита имена и даље их управљати у истој колекцији објеката.

У овом примеру, исти Цлицк евент обрађује два дугмета и потврдни оквир и приказује на који је кликнут. Учините то у једној линији кода са ВБ 6!

Привате Суб МикедЦонтролс_Цлицк (_
БиВал пошиљалац Ас Систем. Објекат, _
БиВал е као систем. ЕвентАргс) _
Хандле Буттон1.Цлицк, _
Буттон2.Цлицк, _
ЦхецкБок1.Цлицк
'Изјава испод мора бити једна дуга изјава!
„Овде је на четири линије да би је остало уско
'довољно да се уклопи на веб страницу
Лабел2.Тект =
Мицрософт. Вижуал бејзик. Тачно (пошиљалац). ГетТипе ТоСтринг,
Лен (пошиљалац) ГетТипе ТоСтринг) -
(ИнСтр (пошиљалац) ГетТипе ТоСтринг, "Обрасци") + 5))
Енд Суб

Прорачун подстране је некако сложен, али овде заправо није оно о чему причамо. У случају Цлицк можете учинити било шта. Можете, на пример, употребити Тип контроле у ​​исказу Иф да бисте радили различите ствари за различите контроле.

Франк-ове групе за рачунарске студије Повратне информације о низовима

Франк'с Студи Гроуп је дао пример са обрасцем који има 4 налепнице и 2 дугмета. Дугме 1 брише налепнице, а дугме 2 их испуњава. Добра је идеја поново прочитати Франково оригинално питање и примјетити да је примјер који је користио био петља која се користи за брисање својства Цаптион од низа компоненти Лабел. Ево ВБ.НЕТ еквивалента ВБ 6 кода. Ова шифра чини оно што је Франк првобитно тражио!

Јавна класа Форм1. Систем наследства. Виндовс. Обрасци. Образац. #Регион "Код генерисан од стране Виндовс облика дизајнера" Дим ЛабелАрраи (4) Као ознака. 'прогласи низ налепница. Привате Суб Форм1_Лоад (_. БиВал пошиљалац Ас Систем. Објекат, _. БиВал е као систем. ЕвентАргс) _. Рукује МиБасе. Оптерећење. СетЦонтролАрраи () Енд Суб. Под СетЦонтролАрраи () ЛабелАрраи (1) = Лабел1. ЛабелАрраи (2) = Лабел2. ЛабелАрраи (3) = Лабел3. ЛабелАрраи (4) = Лабел4. Енд Суб. Приватно пот дугме1_Цлицк (_. БиВал пошиљалац Ас Систем. Објекат, _. БиВал е као систем. ЕвентАргс) _. Хандле Буттон1.Цлицк. 'Дугме 1 Очисти низ. Дим а Ас Интегер. За а = 1 до 4. ЛабелАрраи (а) .Тект = "" Следећи. Енд Суб. Приватно пот дугме2_Цлицк (_. БиВал пошиљалац Ас Систем. Објекат, _. БиВал е као систем. ЕвентАргс) _. Ручке дугмета2.Кликните. 'Дугме 2 Попуните низ. Дим а Ас Интегер. За а = 1 до 4. ЛабелАрраи (а) .Тект = _. "Контролни низ" и ЦСтр (а) Следећи. Енд Суб. Енд Цласс

Ако експериментишете са овим кодом, открићете да поред подешавања својстава Етикете можете да позивате и методе. Па зашто сам (и Мицрософт) кренуо у све проблеме око стварања „ружног“ кода у И делу чланка?

Морам се не сложити да је то заиста „Цонтрол Арраи“ у класичном ВБ смислу. ВБ 6 Цонтрол Арраи је подржани део ВБ 6 синтаксе, а не само техника. Заправо, можда је начин да се овај пример опише јесте да је то низ контрола, а не контролни низ.

У првом делу сам се жалио да је Мицрософт пример САМО радио у време извођења, а не време дизајнирања. Контроле можете додавати и брисати из обрасца динамички, али цела ствар мора бити имплементирана у код. Не можете да превучете и испустите контроле да бисте их креирали као што можете у ВБ 6. Овај пример делује углавном у време дизајна, а не у време извођења. Контроле не можете динамички додавати и брисати у току времена. На неки начин то је потпуна супротност примеру И дела.

Пример класичног ВБ 6 управљачког поља је исти онај који је имплементиран у ВБ .НЕТ код. Овде у ВБ 6 коду (преузет је из Мезицк & Хиллиер-а, Водич за испитни испит за Висуал Басиц 6, стр. 206 - мало измењена, јер пример из књиге даје контроле које се не могу видети):

Дим МиТектБок као ВБ.ТектБок. Статички интНумбер као цео број. интНумбер = интНумбер + 1. Подесите МиТектБок = _. Ја. Контроле. Додај („ВБ.ТектБок“, _. "Текст" и интНумбер) МиТектБок. Текст = МиТектБок. Име. МиТектБок. Видљиво = Тачно. МиТектБок. Лево = _. (интНумбер - 1) * 1200

Али како се Мицрософт (и ја) слажемо, контролни низ ВБ 6 није могућ у ВБ.НЕТ-у. Дакле, најбоље што можете учинити је дуплицирати функционалност. Мој је чланак дуплицирао функционалност која се налази у примјеру Мезицк & Хиллиер. Код Студи Гроуп дуплира функционалност могућности постављања својстава и метода позива.

Дакле, суштина је да заиста зависи од тога шта желите да урадите. ВБ.НЕТ не садржи читаву ствар као део језика - али - али на крају је далеко флексибилнији.

Јохн Фаннон је преузео контролне низове

Џон је написао: Требали су ми контролни низови јер сам желео да у време трајања ставим једноставну табелу бројева у образац. Нисам хтео мучнину да их све сместим појединачно и хтео сам да користим ВБ.НЕТ. Мицрософт нуди веома детаљно решење једноставног проблема, али то је веома велики маљ за разбијање врло мале матице. Након неког експеримента, коначно сам наишао на решење. Ево како сам то урадио.

Горњи пример Абоут Висуал Басиц показује како можете створити ТектБок на обрасцу креирањем инстанције објекта, постављање својстава и додавање у колекцију Цонтролс која је део Обрасца објекта.

Дим тктДатаСхов Ас Нев ТектБок
тктДатаСхов. Висина = 19
тктДатаСхов. Ширина = 80
тктДатаСхов. Локација = Нова тачка (Кс, И)
Ја. Контроле. Додај (тктДатаСхов)
Иако Мицрософтово решење ствара класу, закључио сам да би било могуће све ово замотати у подпрограм. Сваки пут када позовете ову подпрограму креирате нову инстанцу оквира за текст на обрасцу. Ево комплетног кода:

Јавна класа Форм1
Систем наследства. Виндовс. Обрасци. Образац

#Регион "Код генерисан од стране Виндовс облика дизајнера"

Привате Суб БтнСтарт_Цлицк (_
БиВал пошиљалац Ас Систем. Објекат, _
БиВал е као систем. ЕвентАргс) _
Рукује бтнСтарт. Кликните на

Дим И као Интегер
Дим сДата као стринг
За И = 1 до 5
сДата = ЦСтр (И)
Позовите АддДатаСхов (сДата, И)
Следећи
Енд Суб
Суб АддДатаСхов (_
БиВал сТект Ас Стринг, _
БиВал И као целина)

Дим тктДатаСхов Ас Нев ТектБок
Дим УсерЛфт, УсерТоп као Интегер
Дим Кс, И као цео број
УсерЛфт = 20
УсерТоп = 20
тктДатаСхов. Висина = 19
тктДатаСхов. Ширина = 25
тктДатаСхов. ТектАлигн = _
Хоризонтално поравнање. Центар
тктДатаСхов. БордерСтиле = _
БордерСтиле. ФикедСингле
тктДатаСхов. Текст = сТект
Кс = КорисникЛфт
И = УсерТоп + (И - 1) * тктДатаСхов. Висина
тктДатаСхов. Локација = Нова тачка (Кс, И)
Ја. Контроле. Додај (тктДатаСхов)
Енд Суб
Енд Цласс
Врло добро, Јохн. Ово је сигурно пуно једноставније од Мицрософтовог кода... па се питам зашто су инсистирали на томе да то ураде?

За почетак наше истраге, покушајмо да променимо један од својстава својстава у коду. Хајде да променимо

тктДатаСхов. Висина = 19
до

тктДатаСхов. Висина = 100
само да бисмо били сигурни да постоји приметна разлика.

Када поново покренемо код, добићемо... Вхаааат??? ... иста ствар. Нема промене уопште. У ствари, вредност можете приказати изјавом попут МсгБок (тктДатаСхов). Висина) и још увек добијате 20 као вредност некретнине без обзира на то што јој доделите. Зашто се то догађа?

Одговор је да не стварамо властиту Класу за стварање објеката, већ само додајемо ствари у другу класу, тако да морамо слиједити правила друге класе. А та правила кажу да не можете променити својство Хеигхт. (Велллллл... можете. Ако промените својство Мултилине у Труе, можете променити висину.)

Зашто ВБ.НЕТ иде напријед и извршава код без икаквог шаптања да можда нешто није у реду ако, у ствари, потпуно занемари вашу изјаву је сасвим 'још једна сметња'. Међутим, можда бих предложио барем упозорење у прегледу. (Наговестити! Наговестити! Наговестити! Да ли Мицрософт слуша?)

Пример из дела И наслеђује из друге класе, и то чини својства доступним коду у наследној класи. Промјена својства Хеигхт у 100 у овом примјеру даје нам очекиване резултате. (Опет... један одрицање одговорности: Када се створи нова инстанца велике компоненте Лабел, она прикрива стару. Да бисте заправо видели нове компоненте Лабел-а, морате додати методу позива аЛабел. Донети напред().)

Овај једноставан пример показује да, иако МОЖЕМО једноставно додати објекте у другу класу (а понекад је то исправна ствар), програмирање контроле над објектима захтева да их изводимо у Класи и на најорганизованији начин (усудим се рећи, „.НЕТ начин“ ??) је креирање својстава и метода у новој изведеној Класи које би променили ствари. Џон је у почетку остао неуверен. Рекао је да његов нови приступ одговара његовој сврси иако постоје ограничења да он не буде "ЦОО" (тачно оријентисан на објект). Међутим, у новије време, Јохн је написао

"... након што сам написао сет од 5 оквира за текст током извођења, хтео сам да ажурирам податке у следећем делу програма - али ништа се није променило - оригинални подаци су још увек били ту.

Открио сам да могу решити проблем писањем кода да скинем старе кутије и вратим их поново са новим подацима. Бољи начин да то учините било би коришћење Ме. Освјежи. Али овај проблем је скренуо моју пажњу на потребу да се обезбеди метода за одузимање оквира за текст и њихово додавање. "

Јохн-ов код је користио глобалну променљиву за праћење колико контрола је додато у образац тако да се метода ...

Привате Суб Форм1_Лоад (_
БиВал пошиљалац Ас Систем. Објекат, _
БиВал е као систем. ЕвентАргс) _
Рукује МиБасе. Оптерећење
ЦнтлЦнт0 = Ја. Контроле. Гроф
Енд Суб

Тада би "последња" контрола могла бити уклоњена ...

Н = Ја. Контроле. Бројање - 1
Ја. Контроле. РемовеАт (Н)
Џон је приметио да је, „можда је ово мало неспретно“.

То је начин на који Мицрософт води евиденцију објеката у ЦОМ АНД-у у горе наведеном "ружном" коду.

Сада сам се вратио на проблем динамичког стварања контрола на обрасцу у време покретања и поново сам погледао чланке „Шта се догодило с контролом поља“.

Направио сам часове и сада могу да поставим контроле у ​​форму на начин на који желим да буду.

Џон је показао како да контролише смјештање контрола у групни оквир користећи нове часове које је почео да користи. Можда је Мицрософт ипак имао право на њихово „ружно“ решење!