У меня сейчас сильная головная боль с типизацией свойств компонентов.
В моей форме у меня есть TPanel под названием "сцена". Также в форме у меня есть кнопка, которая создает TSelection
, и внутри этого TSelection
создает TImage
, а затем загружает изображение в этот TImage. Имя для TSelection назначается через TEdit, известный как «ImgObjName». Затем он записывает это имя в файл. События для TSelection назначаются процедурам в другом месте кода. Как вы знаете, компонент TSelection можно перемещать (и изменять его размер) во время выполнения. У TImage отключен HitTest, а у TSelection -
Вышесказанное работает так, как я хочу, но следующая часть - то, где я застрял. По сути, по таймеру я хочу написать несколько выбранных свойств каждого дочернего компонента в TMemIniFile. Есть 2 способа, которыми я хочу сделать это;
1) Запишите свойства каждого дочернего элемента для разделения TMemInifiles.
2) Запишите свойства каждого дочернего элемента в один TMemIniFile, но заставьте section
определить, к какому компоненту относятся значения в этом разделе.
Я пробовал несколько разных методов, но все они вызвали у меня серьезные проблемы (обычно «индекс за пределами»).
Мой текущий метод как таковой;
ChgPos
- это глобальная логическая переменная, которая имеет значение ИСТИНА, когда событие mousedown на одном из объектов TSelection является пожаром, и ЛОЖЬ, когда событие MouseUp вызывается. Эта логическая процедура отлично подходит для этих целей, поэтому никаких изменений там не требуется.
TimerBar
- это TTrackBar
, созданный во время разработки. Это значение изменяется в зависимости от таймера.
AnimIni
- это TMemIniFile, который был назначен ранее в коде. Для этого я настроил его не освобождать файл (чтобы не было нарушений прав доступа).
var
i: Integer;
PosX, PosY: Integer;
begin
for i := 0 to Scene.ChildrenCount - 1 do
begin
if Scene.Components[i] is TSelection then
begin
PosX := AnimIni.ReadInteger(IntToStr(Round(TimerBar.Value)) + '_Object' +
IntToStr(i), 'PosX', PosX);
PosY := AnimIni.ReadInteger(IntToStr(Round(TimerBar.Value)) + '_Object' +
IntToStr(i), 'PosY', PosY);
end;
end;
if ChgPos = False then
begin
if Scene.Components[i] is TSelection then
begin
(Scene.Components[i] as TSelection).Position.X := PosX;
(Scene.Components[i] as TSelection).Position.Y := PosY;
end;
end
else if ChgPos = True then
begin
AnimIni.WriteInteger(IntToStr(Round(TimerBar.Value)) + '_Object' +
IntToStr(i), 'PosX', Round((Scene.Children[i] as TSelection).Position.X));
AnimIni.WriteInteger(IntToStr(Round(TimerBar.Value)) + '_Object' +
IntToStr(i), 'PosY', Round((Scene.Children[i] as TSelection).Position.Y));
end;
end;
Я изо всех сил пытаюсь выяснить, куда идти с этим. Я получаю ошибки "Индекс вне диапазона" с ним. Мне также нужно сохранить свойства компонента TImage (в частности, местоположение родителя и растровое изображение, но я чувствую, что для меня важно, чтобы код работал с хотя бы одним компонентом на данный момент).
Я немного новичок в Typecasting (так как все мои предыдущие проекты работали без необходимости в этом), но весь мой опыт работы с ним до сих пор был успешным. Просто в данном конкретном случае это оказалось сложнее, чем я могу работать без посторонней помощи.
Я пробовал WriteComponent
и ReadComponent
и использовал несколько файлов для потоковой передачи данных в реальном времени относительно значения TimerBar, но это слишком медленно для того, чего я хочу достичь (особенно для функции записи). Метод inifile работает из моего более раннего тестирования, но на самом деле он работает с типизацией нескольких компонентов, созданных во время выполнения, с которыми у меня возникают проблемы.
Может ли кто-нибудь пролить свет на потенциальное решение или направление, в котором я должен идти?