Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про Button.Free [D6, XP]


vegarulez ©   (2007-09-15 09:06:00) 

Привет Мастерам! У меня такой вопрос. Етсь TPanel, в котором есть Button`ы, я их очишаю с помощью такого кода, но тут у меня пролблемка одна, когда он убивает допустим батон, то контролкаунт уменьшается и i уже нету там - вылазиет ошибка... подскажите как быть?

     for i:=0 to P_Panel.ControlCount-1 do
     if P_Panel.Controls[i] is TButton then
       begin
        with (P_Panel.Controls[i] as TButton) do
         Begin
          //s:=Name;
            If pos(FormMain.a+'_',Name)<>0 then
            BEGIN
             Free;
            END;
         End;
       end;


vegarulez   (2007-09-15 15:31:00) [1]

>> {RASkov} ©   (15.09.07 10:38) [1]
>> Что такое - FormMain.a ??

Да тут стринг просто. переменная с другой формы.

ту ол:
Ок. Всё понял. Большой Пасип. ;)


{RASkov}   (2007-09-15 11:28:00) [2]

> downto0 и работает вроде как быстрее, так как с нулем сравнивать
> проще чем ... не с нулем :)

"Фишка" тут конечно же не в быстроте, а в постоянстве последнего значения цикла, поэтому переменная цикла все время жизни цикла будет идти по "правильным" индексам массива Controls. И следовательно ошибка из-за этого исключена.
P.S:(последнее предложение нужно понять правильно)


{RASkov}   (2007-09-15 11:04:00) [3]

> Освой downto

Ну конечно же.... ведь хотел еще переделать, причем еще во [2] посте :) так и оставил не верно... :(
downto 0 и работает вроде как быстрее, так как с нулем сравнивать проще чем ... не с нулем :)


Anatoly Podgoretsky   (2007-09-15 10:59:00) [4]

Освой downto


{RASkov}   (2007-09-15 10:42:00) [5]

> {$<выключить полное вычисление логических выражений>}
> for i:=0 to P_Panel.ControlCount-1 do
>  if (P_Panel.Controls[i] is TButton) and (pos(FormMain.a+'_',
> (P_Panel.Controls[i] as TButton).Name)<>0) then
>   TButton(P_Panel.Controls[i]).Free;
> {$<венуть как было - полное вычисление логических выражений>}

Впрочем можно и так.... без дериктив компилятору

for i:=0 to P_Panel.ControlCount-1 do
 try
  if (P_Panel.Controls[i] is TButton) and ({pos(FormMain.a+'_', (P_Panel.Controls[i] as TControl).Name)<>0}) then
   P_Panel.Controls[i].Free;
  except
   Continue;
  end;


{RASkov}   (2007-09-15 10:38:00) [6]

 
{$<выключить полное вычисление логических выражений>}
 for i:=0 to P_Panel.ControlCount-1 do
  if (P_Panel.Controls[i] is TButton) and (pos(FormMain.a+'_', (P_Panel.Controls[i] as TButton).Name)<>0) then
   TButton(P_Panel.Controls[i]).Free;
{$<венуть как было - полное вычисление логических выражений>}


Вот это вот
pos( FormMain.a+'_',Name)<>0
я не совсем понял что это такое, но думаю тут сам разберешься.
Что такое - FormMain.a ??
Наверное тебе нужно так
pos('pnButt_', (P_Panel.Controls[i] as TButton).Name)=1
и соответственно все бутоны на панели должны иметь имена типа такие pnButt_1, pnButt_2, pnButt_3....


Наверх

Титульная страница Поиск, карта сайта Написать письмо