|
Тема
|
Чудя се от известно време...
|
|
Автор |
orange! () |
Публикувано | 27.06.03 02:48 |
|
Чудя се от известно време може ли да се оптимизира следния код:
Примерно имам 50 Label -а, и искам да ги изчистя:
Label1.Caption:=' ';
Label2.Caption:=' ';
.....
Label50.Caption:=' ';
Та въпроса ми е:
Горното може ли да се напише по-елегантно и по-функционално, примерно с цикъл или нещо такова ???
Дайте акъл!
Дотук добре!
казал падащия от 13-тия етаж, като минал покрай 8-мия.
| |
Тема
|
Re: Чудя се от известно време...
[re: orange!]
|
|
Автор |
PhantomAS (няма) |
Публикувано | 27.06.03 06:33 |
|
Може ;-))))
for i:=1 to 50 do
(FindComponent('Label'+IntToStr(i)) as TLabel).Caption := ''
това е - сигурно може и по лесно ;-)))) ама струва ли си
---
Е т'ва е живот!
| |
|
това те задължава лейбълите ти да имат точно тези имена, по-хубаво е
procedure TForm1.Button1Click(Sender: TObject);
var
j: Integer;
begin
with Form1 do begin
for j := 0 to ControlCount - 1 do begin
if Controls[j] is TLabel then begin
(Controls[j] as TLabel).Caption := '';
end;
end;
end;
end;
-
Ако искаш само някои Label-и да си сменят Caption-ите можеш да ги сложиш в GroupBox примерно, и вместу Form1 да ползваш GroupBox1, а ако интерфейса не ти го позволява, можеш да им сложиш Tag = -1 и после да нулираш само тези, чиито Tag = -1
-------------
Special killer double trouble triple extra nicotine monster!Редактирано от z_free на 27.06.03 15:12.
| |
|
Много усложнения - за нищо - реално при първото пускане ако има нещо ще изгърми - а пък тази проверка която е правиш забавя цикъла (не че FIndComponent е много бърз ;-))) . И ако човека наистина иска да си промени само етикетите от група LabelXX - ще трябва да прави разни фокуси ;-))) - не винаги средствата оправдава целта(в случая да измениш заданието само и само после да се изпълнява по бързо).
---
Е т'ва е живот!Редактирано от PhantomAS на 27.06.03 17:09.
| |
Тема
|
Re: Не така ве,
[re: PhantomAS]
|
|
Автор |
SDR (TaskMaster) |
Публикувано | 27.06.03 17:54 |
|
a na mene ideqta s tag=grupa mnoo mi dopada - taka mojesh da si krashtawash labalite kakto te kefne i s edin zamah za dabarshesh opredelena grupa.... braos!!
------------------------------
I got a COMPILER, and I'm not afraid to use it!
| |
|
Не спорете кое е по-ефективно, аз всъщност се интересувах от варианта с функцията FindComponent, знаех че има такава функция но не можах да намеря как се казва, затова питах;
Другия вариант също може да бъде полезен.
Благодаря Ви за помощта
Дотук добре!
казал падащия от 13-тия етаж, като минал покрай 8-мия.
| |
Тема
|
Re: Не така ве,
[re: z_free]
|
|
Автор | mf2hd (Нерегистриран) |
Публикувано | 01.07.03 17:03 |
|
Я да се намеся и аз :)))
Лично според мене варианта на z_free е по-добър, но си мисля че няма нужда първо да се прави проверка с "is" , а после и а "as". Според мен това е достатъчно :
with Form1 do begin
for j := 0 to ControlCount - 1 do
if (Controls[j] is TLabel) then begin
TLabel(Controls[j]).Caption := '';
end;
ще е по-ефективно. А за още по-ефективно може просто да се провери името на класа , но това си мисля че не е много удачен вариант :)
Освен това може да се използва и списъка - Components[ComponentCount]. TLabel все пак е компонент.
Що се отнася за FIndComponent. Си мисля че не е много добре да се използва в цикъл, едно, че е бавно и друго , ако после реши да смени имената на етикетите и ще му стане приятно , особенно ако нямат такава удобна връзка имената им :).
| |
Тема
|
Re: Не така ве,
[re: mf2hd]
|
|
Автор |
z_free (людоед) |
Публикувано | 01.07.03 17:28 |
|
Аве с "as" няма проблем, "is"-а е бавен, ама по този начин хващаш и наследниците... с какви глупости само се занимаваме в края на работния ден
-------------
Special killer double trouble triple extra nicotine monster!Редактирано от z_free на 01.07.03 17:29.
| |
|
|
|
|