Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.47 MB
Время: 0.009 c
1-64196
Маркыч
2003-03-08 09:04
2003.03.20
List Box. Owner Draw.


14-64346
user_000
2003-03-05 09:46
2003.03.20
как работать с RARом???


7-64398
GrBob
2003-01-20 20:19
2003.03.20
Перехват лампочки Scroll Lock на клавиатуре


14-64331
sancho{ne_hochu_parol_v_ceshe_ostavit'}
2003-03-04 21:47
2003.03.20
Аудиоплейр


14-64361
Vint
2003-03-05 11:12
2003.03.20
Тату ваще офигели!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский