Има ли начин

38 отговора 0 прегледа
#1

Има ли начин

Има ли начин вместо да кълва постояно:
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

Отговор
в отговор на Timo #2

Re: Има ли начин

Има начин, с цикъл.
Сега е късно, утре ще дам повече инфо.


Отговор
в отговор на Timo #3

Re: Има ли начин

Има много начини да го направиш. Не мога да ти кажа, кой е най-подходящ за теб, защото не ти познавам проекта. Така че ти ще си избереш.
Можеш да си направиш един масив (или списък) от контролите и да обхождаш него:

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.


Отговор
в отговор на andrew_nikoloff #4

Re: Има ли начин

Странни решения, аз не бих го направил така.
Особено това със RTTI-то ми се струва като биене на пилци с топ.
Вярно, аз пиша на C++ Builder, а не на Делфи.

Ето кода:

for(char i=1;i<=10;i++)
((TCheckBox*)FindComponent("CheckBox"+IntToStr(i)))->Enabled=false;


Не знам как баш се транслира това към Делфи код, ама трябва да стане.


Редактирано от Naki на

Отговор
в отговор на Naki #5

Re: Има ли начин

Толкова много полезна информация даде с постингите си по темата, че чак ми стана интересно какво решение предлагаш на човека... Би ли го споделил с нас все пак?

Linux isn't free, it's worthless.


Отговор
в отговор на andrew_nikoloff #6

Re: Има ли начин

Да, редактирах се и го дадох.


Отговор
в отговор на Naki #7

Re: Има ли начин

Това е същото, като вариант 2, но с търсене по име, а не по индекс. Ако няма други компоненти в контейнера, много по-ефективно е да си ги обходиш веднъж.

Linux isn't free, it's worthless.


Отговор
в отговор на andrew_nikoloff #8

Re: Има ли начин

* По-късо е.
* Твоят вариант 2 ще смени всички checkbox-и. А той може да иска да смени веднъж само от 1 до 10ти, веднъж само от 5 до 10, или от 20 до 30/etc.
* Какво значи по-ефективно? Колко ms разлика?


Редактирано от Naki на

Отговор
в отговор на Naki #9

Re: Има ли начин

* По-късо е.
По-късо е, защото си си спестил проверките. Със същия успех можеш да напишеш
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.


Отговор
в отговор на andrew_nikoloff #10

Re: Има ли начин

Е ОК, дай да видиме питащия какво ще каже...

А иначе, това дето съм написал след 1 часа през ноща беше от таблет (докато лежах в леглото), и затова просто нямаше как да дам кода.

EDIT: Спомена "клиент" - не съм сигурен, че човека има клиент, може би все още няма и/или прави некви нещица за себе си.


Редактирано от Naki на

Отговор
в отговор на andrew_nikoloff #11

Re: Има ли начин

Въобще не е "същия" успех - вече ти казах. Това дето даваш ще смени ВСИЧКИ checkbox-и, човекът мисля ясно каза, че иска от 1 до 10 чекбокс, а не всички.

И иначе да, не знаеме ползва ли контейнери, не ползва ли, нека той да каже.


Отговор
в отговор на Naki #12

Re: Има ли начин

Не, няма проект пропсто се образовам. Четох по надолу за бутоните и се сетих че доста се забавлявам докато пиша всяко по едно и исках да попитам дали има по интересен вариант или да продължавам да кълва. Просто исках да се консултирам вие как го правите и кой вариант бихте предпочели.
А иначе аз си ги правя в стек и си ги вкам от време на време и така се ангажирам само с основната програма ( по лесно ми е )

Отговор
в отговор на Timo #13

Re: Има ли начин

А каква точно ти е версията на Delphi?
Какво значи "си ги правя в стек"?
Да не е отделен thread (нишка)?


Отговор
в отговор на andrew_nikoloff #14

Re: Има ли начин

Я дай моя код, прекроен за Делфи? Мерси предварително!
Затруднява ме частта със кастването на типа - не съм сигурен, как баш става под Делфи.


Отговор
в отговор на Naki #15

Re: Има ли начин

procedure form1.checkne6tosi;

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;
end;
Нещо от този род и когато ми трябва го викам.
Интересуваше ме дали има друг тарикатлък да си спестя малко мастило

Отговор
в отговор на Timo #16

Re: Има ли начин

Ясно, това е кода, който аз предлагам:

for(char i=1;i<=10;i++)

((TCheckBox*)FindComponent("CheckBox"+IntToStr(i)))->Enabled=false;

ама кода е за C++ Builder. Не знам как точно ще стане на Делфи, а колегата некъде се покри, може би ще види темата днеска или утре по-късно...

И все пак, коя ти е версията на Delphi??


Отговор
в отговор на Naki #17

Re: Има ли начин

Немога да се логна с ника, та отговора е тука

procedure TForm1.CloseClick(Sender: TObject);
var
R:Integer;
begin
for R := 0 to 10 - 1 do (Controls[R] as TCheckBox).Checked := False;
end;

procedure TForm1.OpenClick(Sender: TObject);
var
R:Integer;
begin
for R := 0 to 10 - 1 do (Controls[R] as TCheckBox).Checked := True;
end;

Май това е най добрият вариант.

Отговор
в отговор на Timo #18

Re: Има ли начин

Това не е ли по-добро?

for idx := 1 to 10 do
begin
CName:='CheckBox'+IntToStr(idx);
CBox:=TCheckBox(FindComponent(CName));
if (CBox=nil) then continue;
CBox.Enabled:=false;
end;

Може още да се прецизира.

Отговор
в отговор на Ada #19

Re: Има ли начин

Не, не е. Както Андрей спомена по-горе, сравнението по низове е по-бавно, а и FindComponent всеки път обхожда всички компоненти в контрола, т.е. това е допълнитрелен (излишен) вложен цикъл.

Mixy
Отговор
в отговор на Mixy #20

Re: Има ли начин

Все пак, можеш ли да ми/ни кажеш, как това дето аз съм дал ще стане на Делфи?
Мерси!


Отговор