В настоящее время у меня сильная головная боль при типизации свойств компонента.Свойства дочерних компонентов Typecast для ini-файла
В моей форме у меня есть TPanel под названием «сцена». Также в форме у меня есть кнопка, которая создает TSelection
, и в этом TSelection
создает TImage
, а затем загружает изображение в этот TImage. Имя TSelection присваивается с помощью TEdit, известного как «ImgObjName». Затем он записывает это имя в новшество. События для TSelection присваиваются процедурам в другом месте кода. Как вы знаете, компонент TSelection можно перемещать (и изменять размер) во время выполнения. TImage отключил HitTest, когда TSelection включился.
Вышеупомянутые работы, как я хочу, но следующая часть, где я застрял. По существу, по таймеру я хочу написать несколько избранных свойств каждого дочернего компонента в TMemIniFile. Есть два способа, которыми я готов это сделать;
1) Напишите свойства каждого ребенка для разделения TMemInifiles.
2) Напишите свойства каждого дочернего элемента в один TMemIniFile, но сделайте section
определите, к какому компоненту относятся значения в этом разделе.
Я пробовал несколько разных методов, но все они вызвали у меня некоторые серьезные проблемы (обычно «индекс за пределами границ»).
Мой текущий метод как таковой;
ChgPos
- глобальная логическая переменная, которая является ИСТИНА, когда событие mousedown на одном из объектов TSelection является огнем и FALSE, когда событие 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 (в частности, родительское и Bitmap-расположение, но я считаю, что для меня важно, чтобы код работал с хотя бы одним компонентом на данный момент).
Я несколько новичок в области машинного перевода (поскольку все мои предыдущие проекты работали без его необходимости), но все мои опыты с ним до сих пор были успешными. Именно в этом конкретном случае доказано, что он становится более сложным, чем я могу работать без какой-либо помощи.
Я попробовал WriteComponent
и ReadComponent
и использовал несколько файлов для передачи данных в реальном времени по отношению к значению TimerBar, но он слишком медленный для того, чего я хочу достичь (особенно в функции записи). Метод inifile работает с моим предыдущим тестированием, но на самом деле он работает с типизацией нескольких компонентов, созданных во время выполнения, с которыми у меня возникают проблемы.
Может ли кто-нибудь пролить свет на потенциальное решение или направление, в которое я должен войти?
Ваш цикл i заканчивается слишком рано. Состояние i в вашем 'if ChgPos' (и остальном) не определено. –