Има ли начин
38 отговора
0 прегледа
Има ли начин
Има ли начин вместо да кълва постояно:
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
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: Има ли начин
Има много начини да го направиш. Не мога да ти кажа, кой е най-подходящ за теб, защото не ти познавам проекта. Така че ти ще си избереш.
Можеш да си направиш един масив (или списък) от контролите и да обхождаш него:
Можеш да си обхождаш контейнера (форма, панел), в който се намират те и да си ги търсиш:
Това можеш да го направиш и рекурсивно, ако имаш вложени панели например.
Също така можеш да използва RTTI за да си вземеш компонентите и да им пипаш пропъртитата. Виж например това за повече информация.
Linux isn't free, it's worthless.
Можеш да си направиш един масив (или списък) от контролите и да обхождаш него:
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.
Re: Има ли начин
Странни решения, аз не бих го направил така.
Особено това със RTTI-то ми се струва като биене на пилци с топ.
Вярно, аз пиша на C++ Builder, а не на Делфи.
Ето кода:
Не знам как баш се транслира това към Делфи код, ама трябва да стане.
Особено това със RTTI-то ми се струва като биене на пилци с топ.
Вярно, аз пиша на C++ Builder, а не на Делфи.
Ето кода:
for(char i=1;i<=10;i++)
((TCheckBox*)FindComponent("CheckBox"+IntToStr(i)))->Enabled=false;
Не знам как баш се транслира това към Делфи код, ама трябва да стане.
Редактирано от Naki на
Re: Има ли начин
Толкова много полезна информация даде с постингите си по темата, че чак ми стана интересно какво решение предлагаш на човека... Би ли го споделил с нас все пак?
Linux isn't free, it's worthless.
Linux isn't free, it's worthless.
Re: Има ли начин
Това е същото, като вариант 2, но с търсене по име, а не по индекс. Ако няма други компоненти в контейнера, много по-ефективно е да си ги обходиш веднъж.
Linux isn't free, it's worthless.
Linux isn't free, it's worthless.
Re: Има ли начин
* По-късо е.
* Твоят вариант 2 ще смени всички checkbox-и. А той може да иска да смени веднъж само от 1 до 10ти, веднъж само от 5 до 10, или от 20 до 30/etc.
* Какво значи по-ефективно? Колко ms разлика?
* Твоят вариант 2 ще смени всички checkbox-и. А той може да иска да смени веднъж само от 1 до 10ти, веднъж само от 5 до 10, или от 20 до 30/etc.
* Какво значи по-ефективно? Колко ms разлика?
Редактирано от Naki на
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.
По-късо е, защото си си спестил проверките. Със същия успех можеш да напишеш
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.
Re: Има ли начин
Е ОК, дай да видиме питащия какво ще каже...
А иначе, това дето съм написал след 1 часа през ноща беше от таблет (докато лежах в леглото), и затова просто нямаше как да дам кода.
EDIT: Спомена "клиент" - не съм сигурен, че човека има клиент, може би все още няма и/или прави некви нещица за себе си.
А иначе, това дето съм написал след 1 часа през ноща беше от таблет (докато лежах в леглото), и затова просто нямаше как да дам кода.
EDIT: Спомена "клиент" - не съм сигурен, че човека има клиент, може би все още няма и/или прави некви нещица за себе си.
Редактирано от Naki на
Re: Има ли начин
Въобще не е "същия" успех - вече ти казах. Това дето даваш ще смени ВСИЧКИ checkbox-и, човекът мисля ясно каза, че иска от 1 до 10 чекбокс, а не всички.
И иначе да, не знаеме ползва ли контейнери, не ползва ли, нека той да каже.
И иначе да, не знаеме ползва ли контейнери, не ползва ли, нека той да каже.
Re: Има ли начин
Не, няма проект пропсто се образовам. Четох по надолу за бутоните и се сетих че доста се забавлявам докато пиша всяко по едно и исках да попитам дали има по интересен вариант или да продължавам да кълва. Просто исках да се консултирам вие как го правите и кой вариант бихте предпочели.
А иначе аз си ги правя в стек и си ги вкам от време на време и така се ангажирам само с основната програма ( по лесно ми е )
А иначе аз си ги правя в стек и си ги вкам от време на време и така се ангажирам само с основната програма ( по лесно ми е )
Re: Има ли начин
А каква точно ти е версията на Delphi?
Какво значи "си ги правя в стек"?
Да не е отделен thread (нишка)?
Какво значи "си ги правя в стек"?
Да не е отделен thread (нишка)?
Re: Има ли начин
Я дай моя код, прекроен за Делфи? Мерси предварително!
Затруднява ме частта със кастването на типа - не съм сигурен, как баш става под Делфи.
Затруднява ме частта със кастването на типа - не съм сигурен, как баш става под Делфи.
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;
Нещо от този род и когато ми трябва го викам.
Интересуваше ме дали има друг тарикатлък да си спестя малко мастило
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;
Нещо от този род и когато ми трябва го викам.
Интересуваше ме дали има друг тарикатлък да си спестя малко мастило
Re: Има ли начин
Ясно, това е кода, който аз предлагам:
for(char i=1;i<=10;i++)
((TCheckBox*)FindComponent("CheckBox"+IntToStr(i)))->Enabled=false;
ама кода е за C++ Builder. Не знам как точно ще стане на Делфи, а колегата некъде се покри, може би ще види темата днеска или утре по-късно...
И все пак, коя ти е версията на Delphi??
for(char i=1;i<=10;i++)
((TCheckBox*)FindComponent("CheckBox"+IntToStr(i)))->Enabled=false;
ама кода е за C++ Builder. Не знам как точно ще стане на Делфи, а колегата некъде се покри, може би ще види темата днеска или утре по-късно...
И все пак, коя ти е версията на Delphi??
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;
Май това е най добрият вариант.
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;
Май това е най добрият вариант.
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;
Може още да се прецизира.
for idx := 1 to 10 do
begin
CName:='CheckBox'+IntToStr(idx);
CBox:=TCheckBox(FindComponent(CName));
if (CBox=nil) then continue;
CBox.Enabled:=false;
end;
Може още да се прецизира.
Re: Има ли начин
Не, не е. Както Андрей спомена по-горе, сравнението по низове е по-бавно, а и FindComponent всеки път обхожда всички компоненти в контрола, т.е. това е допълнитрелен (излишен) вложен цикъл.
Mixy
Mixy
Re: Има ли начин
Все пак, можеш ли да ми/ни кажеш, как това дето аз съм дал ще стане на Делфи?
Мерси!
Мерси!