Можно ли получить названия объектов на форме

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Можно ли получить названия объектов на форме

Сообщение GAMER »

На форме есть Label. Их имена логике не поддаются. Можно ли получить массив с их именами?

Добавлено спустя 35 минут 39 секунд:

Код: Выделить всё

For i:=0 to Self.ControlCount-1 do
  ShowMessage(Self.Controls[i].name);     

Ну и проверять там все остальное.
RomanS
новенький
Сообщения: 33
Зарегистрирован: 10.12.2007 09:08:24

Сообщение RomanS »

Думаю лучше так, чтоб выбрать только TLabel

Код: Выделить всё

  with Self do
    for i := 0 to ComponentCount - 1 do
      if Components[i] is TLabel then
        ShowMessage(Self.Controls[i].name)
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Я согласен, просто задача у меня стоит более глобально, а вопрос задал попроще :)
Вообще задача стоит так: получить и хранить на время работы начальные параметры Top, Left, Height, Width объектов на форме, чтобы потом их использовать при ресайзе формы.
Создал массив записей

Код: Выделить всё

  RObjects = record
    Name: string;
    Top: word;
    Left: word;
    Height: word;
    Width: word;
    FontHeight: integer;
  end;     
TObjArr = Array [1..30] of RObjects; 
ObjArr: TObjArr;   


Присваиваю так:

Код: Выделить всё

 For i:=0 to Self.ControlCount-1 do
 begin
  ObjArr[i].Top:=Self.Controls[i].Top;
  ObjArr[i].Left:=Self.Controls[i].Left;
  ObjArr[i].Height:=Self.Controls[i].Height;
  ObjArr[i].Width:=Self.Controls[i].Width;
  ObjArr[i].FontHeight:=Self.Controls[i].Font.Height;
 end;   


Все нормально, пока не начинаю присваивать значения в

Код: Выделить всё

  ObjArr[i].FontHeight:=Self.Controls[i].Font.Height;


Ошибка вилазит совершенно в другом месте, которое никакое отношение не имеет к даному массиву. Не пойму в чем проблема.
Ошибка типа SIGSEGV.

Остнавливается на строке

Код: Выделить всё

UnEtapstatus:=EmptyToZero(tmpStrArray[1]);
которая никакого отношения не имеет к данному массиву.
Ошибка также возникает, если делать присвоение отрицательного числа

Код: Выделить всё

ObjArr[i].FontHeight:=-13;
.
RomanS
новенький
Сообщения: 33
Зарегистрирован: 10.12.2007 09:08:24

Сообщение RomanS »

а здесь не может ошибки
размерность массива начинается с 1

Код: Выделить всё

TObjArr = Array [1..30] of RObjects; 

а цикл идет с 0

Код: Выделить всё

For i:=0 to Self.ControlCount-1 do
begin
  ObjArr[i].Top:=Self.Controls[i].Top;
...
end;
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

2RomanS.
Вы правы, проблема в этом была, но прикол в том, что проявилась она совершенно не там, где ожидалось :)
Странно, что range check error не проявился, но наверное это что-то с настройками.
RomanS
новенький
Сообщения: 33
Зарегистрирован: 10.12.2007 09:08:24

Сообщение RomanS »

рад что помог :)
такие ошибки очень трудно найти, особенно если проект большой.
Ответить