Текущий архив: 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