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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 6 318

/ вопрос решён /

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

Есть у меня программа на Delphi.
В ней - главная форма, на которой размещены некоторые объекты.

У меня следующий вопрос. Как в процессе выполнения программы прочитать и вывести в файл информацию об объектах.
В частности - Caption и Hint.

Например, в текстовом виде (Caption и Hint через точку с запятой):

Form1: Пример;;
GroupBox1: Группа; Здесь размещены еще объекты;
Button1: Кнопка; Выход из программы;
...
и т.п.

vsorokin Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: vsorokin (статус: Посетитель)
Вопрос отправлен: 26 ноября 2012, 16:33
Состояние вопроса: решён, ответов: 1.

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

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

for i := 0 to ComponentCount - 1 downto 0 do begin
  if not (Components[i] is TControl) then Continue;
  ctrl := Components[i] as TControl;
  AddString(format('%s;%s;%s;', [ctrl.Name, ctrl.Caption, ctrl.Hint]));
end;

Ответ отправил: DNK (статус: Студент)
Время отправки: 26 ноября 2012, 17:11
Оценка за ответ: 3

Комментарий к оценке: Не работает :(
ctrl.Caption, ctrl.Hint не видно из TComponent

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

Всего сообщений: 11; последнее сообщение — 27 ноября 2012, 17:50; участников в обсуждении: 3.
vsorokin

vsorokin (статус: Посетитель), 26 ноября 2012, 16:37 [#1]:

Добавление: нужно вывести информацию о всех объектах программы, помещенных на главную форму.
Т.е. нужен какой-то цикл (просмотр дерева объектов).

26 ноября 2012, 17:02: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с компонентами и библиотеками модератором DNK Причина: Вопрос конкретно по VCL

DNK

DNK (статус: Студент), 26 ноября 2012, 20:35 [#2]:

А кто говорит о TComponent?
var ctrl: TControl
"Digital Networked Knight"
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 26 ноября 2012, 20:36 [#3]:

Цитата (DNK):

downto 0

это зачем?
DNK

DNK (статус: Студент), 26 ноября 2012, 20:42 [#4]:

А почему бы и нет? вот "0 to" лишнее. :)
"Digital Networked Knight"
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 26 ноября 2012, 20:51 [#5]:

Цитата (DNK):

А почему бы и нет?

downto - цикл крутится от большего к меньшему. тогда и условие цикла надо местами поменять от ComponentCount-1 до 0. Иначе он ни разу не выполниться
DNK

DNK (статус: Студент), 27 ноября 2012, 00:41 [#6]:

Цитата (Мережников Андрей):

Иначе он ни разу не выполниться


Я даже больше скажу. Он ни разу не выполниться, потому что не скомпилится.
"Digital Networked Knight"
vsorokin

vsorokin (статус: Посетитель), 27 ноября 2012, 08:51 [#7]:

DNK: "А кто говорит о TComponent?

var ctrl: TControl"

Действительно, TControl позволяет видеть ctrl.Hint.
Но не показывает напрямую ctrl.Caption.
Как быть?
DNK

DNK (статус: Студент), 27 ноября 2012, 14:51 [#8]:

А что же он показывает?
"Digital Networked Knight"
vsorokin

vsorokin (статус: Посетитель), 27 ноября 2012, 15:48 [#9]:

При попытке ввести Temp.Caption Delphi ругается и до компиляции дело не доходит
procedure TForm1.FormShow(Sender: TObject);
 var i: integer; Temp: TControl;
 s : string;
begin
  for i := 0 to ComponentCount - 1  do begin
  if not (Components[i] is TControl) then Continue;
  TEMP := Components[i] as TControl;
  S := Temp.Name + ': '+ Temp.ClassName+ '; '+Temp.Hint;// + '; ' + Temp.Caption;
  Memo1.Lines.Add(S);
 end;
:-(
DNK

DNK (статус: Студент), 27 ноября 2012, 16:26 [#10]:

Ну да! Запамятовал что там оно приватное. Остается попробовать такую магию.
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;
"Digital Networked Knight"
vsorokin

vsorokin (статус: Посетитель), 27 ноября 2012, 17:50 [#11]:

Спасибо, DNK!
:-)

24 декабря 2012, 09:34: Статус вопроса изменён на решённый (изменил модератор DNK): Даже поблагодарили

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

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