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

Вниз

необходимо очистить все TlistBox`ы на странице TTabSheet   Найти похожие ветки 

 
Веретен   (2005-11-08 18:04) [0]

Необходимо очистить все TlistBox`ы на странице TTabSheet?


 
umbra ©   (2005-11-08 18:17) [1]

так в чем проблема?


 
Tonich ©   (2005-11-08 18:24) [2]

в том что хотим отчистить, а книжки читать не хотим


 
Джо ©   (2005-11-08 18:30) [3]


procedure ClearListBoxes (Parent: TWinControl);
var
 I: Integer;
begin
 for I := 0 to Parent.ControlCount-1 do
   if Parent.Controls[I] is TListBox then
     TListBox(Parent.Controls[I]).Clear;
end;

Пример:

procedure TForm12.Button1Click(Sender: TObject);
begin
 ClearListBoxes(PageControl1.ActivePage);
end;


 
Ega23 ©   (2005-11-08 18:55) [4]


> Джо ©   (08.11.05 18:30) [3]


Низачот.
А если TListBox лежит на Panel3, которая лежит на Panel2, которая лежит на Panel1, которая лежит на искомом TabSheet"е?


 
Джо ©   (2005-11-08 19:09) [5]


>  [4] Ega23 ©   (08.11.05 18:55)

Какая постановка, такое и решение.


 
Ega23 ©   (2005-11-08 19:21) [6]


> Какая постановка, такое и решение.


:-)
Откровенно говоря, я уже давным-давно хочу такую универсальую функцию написать. Чтобы рекурсивно по контролам шарилась.
Да всё времени не хватает...  :-)


 
Джо ©   (2005-11-08 19:23) [7]


>  [6] Ega23 ©   (08.11.05 19:21)

Ага :)) Вот и мне тоже лень ;>


 
Ega23 ©   (2005-11-08 19:29) [8]


> Ага :)) Вот и мне тоже лень ;>


Да, пожалуй ты прав. Не "не хватает времени", а именно ЛЕНЬ.    :о)


 
Джо ©   (2005-11-08 19:36) [9]

Стоп. А вообще-то, кажется, можно и без рекурсии обойтись в этом случае. Вот такой навскидку вариант (может, где и накосячил):

// служебная функция, ищет родительский TabSheet для Control
// по всем уровням или возвращает nil, если не найден
function GetParentTabSheet (Control: TControl): TTabSheet;
begin
 while (not (Control is TTabSheet)) and (Control.Parent <> nil) do
   Control := Control.Parent;
 if Control is TTabSheet then
   Result := TTabSheet(Control)
 else
   Result := nil;
end;

// рабочая процедура
procedure ClearListBoxes (Parent: TWinControl; Form: TForm);
var
 I: Integer;
begin
 for I := 0 to Form.ComponentCount-1 do
   if (Form.Components[I] is TListBox) then
     if GetParentTabSheet(TListBox(Form.Components[I])) = Parent then
       TListBox (Form.Components[I]).Clear;
end;

// пример
procedure TForm12.Button1Click(Sender: TObject);
begin
 ClearListBoxes(PageControl1.ActivePage, Self);
end;


 
Джо ©   (2005-11-08 19:45) [10]


> [9] Джо ©   (08.11.05 19:36)

Один из передаваемых параметров можно убрать:

procedure ClearListBoxes (Parent: TWinControl);
var
 I: Integer;
 Form: TCustomForm;
begin
 Form := GetParentForm (Parent);
 if Form = nil then
   Exit;

 for I := 0 to Form.ComponentCount-1 do
   if (Form.Components[I] is TListBox) then
     if GetParentTabSheet(TListBox(Form.Components[I])) = Parent then
       TListBox (Form.Components[I]).Clear;
end;


 
Джо ©   (2005-11-08 20:26) [11]

2 Ega32.
По-прежнему сыроватый, но более универсальный вариант. Поборол-таки лень :))


function IsParenthIerarchically (Control: TControl; Parent: TWinControl): Boolean;
begin
 Result := False;
 while (Control.Parent <> nil) do
 begin
   Control := Control.Parent;
   if Control = Parent then
   begin
     Result := True;
     Break
   end
 end;
end;

// Главная процедура, инициирующая энумерацию.
// Вызывает callback для каждого контролла, чей класс задается в ControlClass
// и родитель (на любом уровне иерархии) - Parent
procedure EnumerateControls (Parent: TWinControl; ControlClass: TControlClass;
 CallBackProc: TNotifyEvent);
var
 I: Integer;
 Form: TCustomForm;
begin
 Form := GetParentForm (Parent);
 if Form = nil then
   Exit;

 for I := 0 to Form.ComponentCount-1 do
   if (Form.Components[I] is ControlClass) then
     if IsParenthIerarchically(TControl(Form.Components[I]),Parent) then
       CallBackProc(Form.Components[I]);
end;


Пример:


 TForm12 = class(TForm)
   ...
 private
   procedure OnListBoxFound (Sender: TObject);
 public
 end;
...
procedure TForm12.Button1Click(Sender: TObject);
begin
 EnumerateControls(PageControl1.ActivePage,TListBox,OnListBoxFound);
end;

procedure TForm12.OnListBoxFound(Sender: TObject);
begin
 ShowMessage (TListBox(Sender).Name);
end;

По-прежнему не уверен, может где и накосячил... но вроде как нет )



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

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

Наверх




Память: 0.5 MB
Время: 0.044 c
2-1130844404
Moningstar
2005-11-01 14:26
2005.12.04
Из DLL не в DLL


2-1132330146
angelikas
2005-11-18 19:09
2005.12.04
Ошибка при компилирование программы – связанная с Tstrings.


2-1132053293
Fer
2005-11-15 14:14
2005.12.04
помогите начать работать с SQL


10-1108642942
Карелин Артем
2005-02-17 15:22
2005.12.04
Авторизация для вызова удаленного com-интерфейса. Как?


14-1131617779
Jeer
2005-11-10 13:16
2005.12.04
Правительство Эстонии оплатит расходы на установку памятника эсэс