|
Страници по тази тема: 1 | 2 | 3 | 4 | >> (покажи всички)
Тема
|
Има ли начин
|
|
Автор |
Timo (собствен ник ) |
Публикувано | 21.03.12 01:16 |
|
Има ли начин вместо да кълва постояно:
CheckBox1.Enabled:=False;
CheckBox2.Enabled:=False;
CheckBox3.Enabled:=False;
CheckBox4.Enabled:=False;
CheckBox5.Enabled:=False;
CheckBox6.Enabled:=False;
CheckBox7.Enabled:=False;
CheckBox8.Enabled:=False;
CheckBox9.Enabled:=False;
CheckBox10.Enabled:=False;
да напиша нещо обобщаващо
примерно CheckBox1-10:=False
| |
Тема
|
Re: Има ли начин
[re: Timo]
|
|
Автор |
Naki (Company PC Guy) |
Публикувано | 21.03.12 01:32 |
|
Има начин, с цикъл.
Сега е късно, утре ще дам повече инфо.
| |
|
Има много начини да го направиш. Не мога да ти кажа, кой е най-подходящ за теб, защото не ти познавам проекта. Така че ти ще си избереш.
Можеш да си направиш един масив (или списък) от контролите и да обхождаш него:
var aCheckBoxes: Array[1..10] of TCheckBox;
aCheckBoxes[1] := CheckBox1;
...
aCheckBoxes[10] := CheckBox10;
for idx := 1 to 10 do aCheckBoxes[idx].Checked := False;
Можеш да си обхождаш контейнера (форма, панел), в който се намират те и да си ги търсиш:
for idx := 0 to Container.ControlCount - 1 do
if Container.Controls[idx] is TCheckBox then
(Container.Controls[idx] as TCheckBox).Checked := False;
Това можеш да го направиш и рекурсивно, ако имаш вложени панели например.
Също така можеш да използва RTTI за да си вземеш компонентите и да им пипаш пропъртитата. Виж например за повече информация.
Linux isn't free, it's worthless.
| |
|
Странни решения, аз не бих го направил така.
Особено това със RTTI-то ми се струва като биене на пилци с топ.
Вярно, аз пиша на C++ Builder, а не на Делфи.
Ето кода:
for(char i=1;i<=10;i++)
((TCheckBox*)FindComponent("CheckBox"+IntToStr(i)))->Enabled=false;
Не знам как баш се транслира това към Делфи код, ама трябва да стане.
Редактирано от Naki на 21.03.12 12:35.
| |
|
Толкова много полезна информация даде с постингите си по темата, че чак ми стана интересно какво решение предлагаш на човека... Би ли го споделил с нас все пак?
Linux isn't free, it's worthless.
| |
|
Да, редактирах се и го дадох.
| |
|
Това е същото, като вариант 2, но с търсене по име, а не по индекс. Ако няма други компоненти в контейнера, много по-ефективно е да си ги обходиш веднъж.
Linux isn't free, it's worthless.
| |
|
* По-късо е.
* Твоят вариант 2 ще смени всички checkbox-и. А той може да иска да смени веднъж само от 1 до 10ти, веднъж само от 5 до 10, или от 20 до 30/etc.
* Какво значи по-ефективно? Колко ms разлика?
Редактирано от Naki на 21.03.12 12:45.
| |
|
* По-късо е.
По-късо е, защото си си спестил проверките. Със същия успех можеш да напишеш
for idx := 0 to Container.ControlCount - 1 do (Container.Controls[idx] as TCheckBox).Checked := False;
Какво ще стане ако изтрие CheckBox7? Проектът ще се компилира без проблем и ще получиш красиви AV-та по време на изпълнение на програмата. Обикновено това се случва само при клиента, нали се сещаш?
И защо всичките С-джии смятате, че по-късият израз е по-добър? Обикновено е само по-неясен.
* Твоят вариант 2 ще смени всички checkbox-и. А той може да иска да смени веднъж само от 1 до 10ти, веднъж само от 5 до 10, или от 20 до 30/etc.
Ако те са си обособени в някакъв контейнер (както би било логично), това си е каквото иска. Аз му дадох няколко алтернативи. Само той си знае проекта какъв е, какво прави и как го прави. Винаги може да комбинира няколко от 4-те предложени му подхода.
* Какво значи по-ефективно? Колко ms разлика?
Какво означава "Колко ms"? Въпросът е в излишните операции. Освен индексирането, ти обхождаш компонентите на всяка итерация наново, плюс това сравняваш стрингове. Ако тази допълнителна гъвкавост не ти е необходима, защо трябва да ги правиш?
И защо изобщо го водиш този спор? Ако ще предлагаш на човека решение - предложи му! А не "Ще ти кажа, ама друг път". Все едно си пазиш ред, да не те изпревари някой. Или "Аз не бих го направил така" ама без и да казваш как...
Linux isn't free, it's worthless.
| |
|
Е ОК, дай да видиме питащия какво ще каже...
А иначе, това дето съм написал след 1 часа през ноща беше от таблет (докато лежах в леглото), и затова просто нямаше как да дам кода.
EDIT: Спомена "клиент" - не съм сигурен, че човека има клиент, може би все още няма и/или прави некви нещица за себе си.
Редактирано от Naki на 21.03.12 19:08.
| |
|
Страници по тази тема: 1 | 2 | 3 | 4 | >> (покажи всички)
|
|
|