Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 514

/ вопрос открыт /

Здравствуйте!

Прошу знатоков пояснить, можно ли во время прогона программы получить список того, что есть на главной форме Form1 (panel, label, Button, Grid, MainMenu и т.д.).
И пробежаться по нему.

vsorokin Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: vsorokin (статус: Посетитель)
Вопрос отправлен: 11 февраля 2014, 13:58
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: DNK

Здравствуйте, vsorokin!

procedure TForm1.FormShow(Sender: TObject);
 var i: integer; Temp: TControl;
   s : string;
   len: Integer;
 begin
   for i := 0 to ComponentCount - 1 do
   begin
     if Components[i] is TControl then begin
       TEMP := Components[i] as TControl;
       Len := Temp.GetTextLen;
       SetString(s, PChar(nil), Len);
       if Len <> 0 then Temp.GetTextBuf(Pointer(s), Len + 1);
       S := Temp.Name + ': '+ Temp.ClassName+ '; '+Temp.Hint + '; ' + s;
     end else if Components[i] is TMenuItem then
       with Components[i] as TMenuItem do
         S := Name + ': '+ ClassName+ '; '+ Hint + '; ' + Caption
     else
       S := Components[i].Name + ': '+ Components[i].ClassName;
     Memo1.Lines.Add(S);
   end;
 end;

Ответ отправил: DNK (статус: Студент)
Время отправки: 12 февраля 2014, 13:27
Оценка за ответ: 1

Комментарий к оценке: Спасибо!
Еще маленький доп. вопрос:
из основной программы я открываю второе окно (ShowModal). Как получить то же самое (список того, что на втором окне) для второго окна?

Мини-форум вопроса

Всего сообщений: 17; последнее сообщение — 16 февраля 2014, 18:53; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 11 февраля 2014, 14:06 [#1]:

Да, можно. У каждого потомка TComponent есть свойство Components[Index] и ComponentCount.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 11 февраля 2014, 14:32 [#2]:

У меня дежавю! Тот же человек - и практически тот же вопрос.
"Digital Networked Knight"
vsorokin

vsorokin (статус: Посетитель), 11 февраля 2014, 14:50 [#3]:

Спасибо DNK за напоминание :)
Помогли!

Прошу не закрывать!

У меня в продолжение:
нужно вывести также пункты главного меню.

Их не вижу :

procedure TForm1.FormShow(Sender: TObject);
var i: integer; Temp: TControl;
s : string;
len: Integer;
begin
for i := 0 to ComponentCount - 1 do
begin
if not (Components[i] is TControl) then Continue;
TEMP := Components[i] as TControl;
Len := Temp.GetTextLen;
SetString(s, PChar(nil), Len);
if Len <> 0 then Temp.GetTextBuf(Pointer(s), Len + 1);
S := Temp.Name + ': '+ Temp.ClassName+ '; '+Temp.Hint + '; ' + s;
Memo1.Lines.Add(S);
end;
end;

11 февраля 2014, 14:55: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с компонентами и библиотеками модератором DNK

11 февраля 2014, 14:57: Вопрос закрыт (решение принял DNK): Тренеруем память!

11 февраля 2014, 15:07: Вопрос вновь открыт (изменение состояния произвёл автор вопроса — vsorokin): Прошу не закрывать!

У меня в продолжение:
нужно вывести также пункты главного меню.

Их не вижу.

min@y™

min@y™ (статус: Доктор наук), 11 февраля 2014, 15:17 [#4]:

Цитата (vsorokin):

нужно вывести также пункты главного меню.

У наследников TMenu есть свойство Items:
property Items: TMenuItem; default;
Научись, наконец, читать хэлп уже, ёмаё!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 11 февраля 2014, 15:21 [#5]:

Естественно не увидишь. Меню, как это не странно, считается невизуальным компонентом. А в предыдущем пример стоит Continue для невизуальных компонентов. Поэтому тело цикла надо переделать:
if Components[i] is TControl then begin
  // генерируем строку для визуальных компонентов
end else if Components[i] is TMenuItem then begin
  // генерируем строку для меню
end;
"Digital Networked Knight"
vsorokin

vsorokin (статус: Посетитель), 11 февраля 2014, 16:22 [#6]:

Спасибо, в основном понял.
:-)
vsorokin

vsorokin (статус: Посетитель), 12 февраля 2014, 14:24 [#7]:

Спасибо!
Еще маленький доп. вопрос:
из основной программы я открываю второе окно (ShowModal). Как получить то же самое (список того, что на втором окне) для второго окна?
min@y™

min@y™ (статус: Доктор наук), 12 февраля 2014, 15:28 [#8]:

Ну дык создай общий модуль вот с такой функцией:
function GetWindowInfo(AComponent: TComponent; AList: TStrings): Integer;
var
  Index: Integer; // параметр цикла for 
begin
  if not (Assigned(AComponent) and Assigned(AList))
    then Exit;
 
  AList.Clear();
 
  for Index:= 0 to AComponent.ComponentCount - 1 do
    begin  
      // Здесь - код DNK, только вместо Memo добавляешь инфу в AList
    end; // for
 
  Result:= <можно вернуть какой-нить результат проверочный>;
end;
и пользуйся ею для всех своих форм.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
vsorokin

vsorokin (статус: Посетитель), 12 февраля 2014, 15:51 [#9]:

Спасибо, попробую!
DNK

DNK (статус: Студент), 12 февраля 2014, 16:02 [#10]:

Мда... Жадный нынче народ пошел...
"Digital Networked Knight"
min@y™

min@y™ (статус: Доктор наук), 12 февраля 2014, 16:05 [#11]:

Цитата (DNK):

Мда... Жадный нынче народ пошел...

Эт ты апчом?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 12 февраля 2014, 16:20 [#12]:

Цитата (vsorokin):


Оценка за ответ: 1
Комментарий к оценке: Спасибо!


Я чойта не понял, эт чо за перфоманс?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Толяныч

Толяныч (статус: 4-ый класс), 13 февраля 2014, 23:38 [#13]:

Да, вот и отвечай после этого... Разжёвано, растолковано. 1 - в переводе с цифры на слова : " Да я больше забыл, чем ты знаешь !"
Будем надеяться, что ТС не ту клавишу натиснул, извинится и попросит модератора исправить на нормальную.
DNK

DNK (статус: Студент), 14 февраля 2014, 00:10 [#14]:

Вы только поглядите на рейтинг лучших экспертов - я намбер уан! 8-)
"Digital Networked Knight"
vsorokin

vsorokin (статус: Посетитель), 14 февраля 2014, 08:30 [#15]:

Спасибо всем!
Больше одного плюсика за ответ не удалось поставить.
Не дает :-( :-)
min@y™

min@y™ (статус: Доктор наук), 14 февраля 2014, 10:29 [#16]:

Цитата (vsorokin):

Больше одного плюсика за ответ не удалось поставить.

Тебе не о том говорят. Не про +1 к репутации, а про оценку ответа на вопрос по 5-балльной шкале.
Сразу видно, что правила ты не читал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Толяныч

Толяныч (статус: 4-ый класс), 16 февраля 2014, 18:53 [#17]:

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

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:53
Выполнено за 0.03 сек.