Форум: "Основная";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
ВнизКое что ещё про компоненты Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c