Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.20;
Скачать: CL | DM;

Вниз

Кое что ещё про компоненты   Найти похожие ветки 

 
Baxs/B   (2003-03-07 10:21) [0]

Подскажите, как правильно можно циклом уничтожить группу компонентов с формы...
Я точно не знаю правильный ли это код можеть знающие скажут
for i := 8 downto 1 do //я точно знаю что компонентов 8
for c:= Form1.ComponentCount -1 downto 0 do
if (Form1.Components[c] is TNSimg) then
// Воть тут ищу компонент по имени
if (Form1.Components[c] as TNSimg).Name = "But"+IntToStr(i) then
Form1.Components[c].Free; // и если он есть то удаляю


 
stone ©   (2003-03-07 10:26) [1]

for i := ComponentCount-1 downto 0 do
begin
c := Components[i];
if c is TNSimg then
if (c as TNSimg).Name = "But"+IntToStr(i) then
c.Free;
end;


 
Anatoly Podgoretsky ©   (2003-03-07 10:52) [2]

Только как написал stone © (07.03.03 10:26) не делай, удалигь все ButN если такие будут.

Цикл по i может быть и прямым.
Нужна ли глобальная переменная Form1, приведи заголовок процедуры в которой ты удаляешь ButN, вообще это дурная привычка задавать вопрос и не указывать полной информации, в результате иожет быть неправильный ответ или его отсутствие.
Приведение AS можно заменить прямым приведением, но это не важно. На самом деле приведение вообще не нужно, это и так уже компонент с таким свойством.
Последовательность циклов лучше поменять на
for C
for I
а то ты крушишь восемь раз внутри больщой цикл, а так будет один нащ восемь маленьких.


for C := Form1.ComponentCount - 1 downto 0 do begin
if (Form1.Components[C] is TNSimg) then begin
for I := 1 to 8 do begin
if Form1.Components[C].Name = "But" + IntToStr(I) then begin
Form1.Components[C].Free;
end;
end;
end;
end;


 
alxx ©   (2003-03-07 11:01) [3]

А так будет работать?

For i:=1 to 8 do
Begin
C:=Self.FindComponent("But"+IntToStr(i));
If C<>nil Then (C AS TNSimg).Free;
End;


Кстати, в коде Anatoly Podgoretsky неплохо бы 5-ю строчку

Form1.Components[C].Free; Break; поставить, а то он будет у удаленного компонента имя смотреть.


 
alxx ©   (2003-03-07 11:02) [4]

И вообще... Количество компонентов то уменьшается при удалении, наверное, так что лучше код axs


 
Anatoly Podgoretsky ©   (2003-03-07 11:09) [5]

Да с пятой строчкой провал, не учел, конечно break нужен.


 
Anatoly Podgoretsky ©   (2003-03-07 11:23) [6]

Количество компонентов то уменьшается, но количество цикл нет так и останется 8*N

Он не будет у удаленного компонента имя смотреть, его заменит другой, будет другая неприятность, выход за пределы массива.

Вот это равносильно
C:=Self.FindComponent("But"+IntToStr(i));
If C<>nil Then (C AS TNSimg).Free;

Form1.FindComponent("But"+IntToStr(i)).Free;

При использовании данной конструкции, если ты ее предлагаешь взамен всей конструкции, нет вообще нужды в цикле for C, в этом случае вообще достаточно одного цикла I, мысль просто не ясна в контексте, если же только единственны цикл I то да это будет значительно оптимальнее.


 
alxx ©   (2003-03-07 11:27) [7]

А я и не собирался делать цикл С (я забыл написать строчку Var C:TComponent;)

Насчет оптимальности:

Функция FindComponent делает тот же цикл:

function TComponent.FindComponent(const AName: string): TComponent;
var
I: Integer;
begin
if (AName <> "") and (FComponents <> nil) then
for I := 0 to FComponents.Count - 1 do
begin
Result := FComponents[I];
if SameText(Result.FName, AName) then Exit;
end;
Result := nil;
end;

Правда, она выходит сразу как только найдет.


 
Sandman   (2003-03-07 16:05) [8]

for C := Form1.ComponentCount - 1 downto 0 do
if (Form1.Components[C] is TNSimg) then begin
CompName := Form1.Components[C].Name;
if Length(CompName)=4 then
if (Copy(CompName,1,3)="But") and (CompName[4] in ["1".."8"]) then
Form1.Components[C].Free;
end;



Страницы: 1 вся ветка

Текущий архив: 2003.03.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
1-64137
Roman_kv
2003-03-10 19:06
2003.03.20
Передача данных между формами


1-64130
Alex76S
2003-03-11 10:07
2003.03.20
Необходимо запустить exe файл и выполнить код после его закрытие


3-63992
Денис
2003-02-28 13:26
2003.03.20
Автоматическое создание таблиц


4-64430
[lamer]Barmaglot
2003-01-27 09:43
2003.03.20
Смена Font a у кнопки средствами WINAPI


3-64022
Kurt_
2003-03-01 15:01
2003.03.20
Не подскажите как в АДО фильтр на квери поставить типа name is N