Локальные переменные Delphi Unit – как сделать каждый экземпляр уникальным?
-
26-09-2019 - |
Вопрос
В модуле ниже у меня есть переменная, объявленная в разделе РЕАЛИЗАЦИЯ, локальная для модуля.У меня также есть процедура, объявленная в разделе TYPE, которая принимает аргумент и присваивает этот аргумент рассматриваемой локальной переменной.Каждому экземпляру этого TFrame передается уникальная переменная через passMeTheVar
.
Я хочу, чтобы каждый экземпляр фрейма сохранял свою собственную версию этой переменной, отличную от других, и использовал ее для определения того, как она работает.Однако, похоже, происходит то, что все экземпляры используют одно и то же значение, даже если я явно передаю каждому экземпляру другую переменную.
то есть:
Unit FlexibleUnit;
interface
uses
//the uses stuff
type
TFlexibleUnit=class(TFrame)
//declarations including
procedure makeThisInstanceX(passMeTheVar:integer);
private
//
public
//
end;
implementation
uses //the uses
var myLocalVar;
procedure makeThisInstanceX(passMeTheVar:integer);
begin
myLocalVar:=passMeTheVar;
end;
//other procedures using myLocalVar
//etc to the
end;
Теперь где-то в другой форме я поместил этот фрейм на панель «Дизайн», иногда два таких фрейма в одну форму, и объявил его в нужных местах и т. д.Каждый уникален тем, что:
ThisFlexibleUnit : TFlexibleUnit;
ThatFlexibleUnit : TFlexibleUnit;
и когда я делаю:
ThisFlexibleUnit.makeThisInstanceX(var1); //want to behave in way "var1"
ThatFlexibleUnit.makeThisInstanceX(var2); //want to behave in way "var2"
кажется, что они оба используют одну и ту же переменную «myLocalVar».
Я в принципе делаю это неправильно?Если это правильный метод, то это вопрос отладки того, что у меня есть (которое слишком велико для публикации), но если это в принципе неверно, то есть ли способ сделать то, что я предлагаю?
РЕДАКТИРОВАТЬ:
Итак, урок, извлеченный здесь, заключается в том, что определение класса - это именно так.Многие классы могут быть объединены в один модуль, и все экземпляры всех классов в Type
раздел поделиться разделом реализации модуля.
Решение
myLocalVar — глобальная переменная, но видимая только внутри модуля.
Локальная переменная может находиться в процедуре/функции, например
procedure makeThisInstanceX(passMeTheVar: integer);
var
myLocalVar: Integer;
begin
myLocalVar := passMeTheVar;
end;
если вам нужна переменная экземпляра, то есть каждый кадр имеет свою копию, поместите ее в класс:
type
TFlexibleUnit = class(TFrame)
procedure makeThisInstanceX(passMeTheVar:integer);
private
myLocalVar: Integer;
...
end;
Другие советы
Вы звоните в makeThisInstanceX
метод как метод класса (статический), а не создавать экземпляр класса и вызывать его как метод объекта.Взгляните на эту ссылку:
рама/единица/класс/управление
Я аплодирую вашей героической попытке улучшить код.Однако, судя по вашим вопросам и комментариям, я с сожалением сообщаю вам, что ваше понимание очень ограничено.
Фрейм — это не единица, которая не является классом.Фрейм — это класс, но не каждый класс является фреймом.Фрейм — это элемент управления, но не каждый элемент управления является фреймом.Модули имеют разделы интерфейса и реализации (а также инициализации и финализации).Классы имеют приватную и публичную (а также защищенную и опубликованную) части.
Я включил последний абзац не для того, чтобы научить, а для того, чтобы вы могли оценить свой уровень понимания.У разработчика Delphi не должно возникнуть проблем с этим абзацем.Я не пытаюсь заставить вас чувствовать себя плохо или выпендриваться – просто пытаюсь помочь.Возможно, Stack Overflow в данный момент вам не подходит.
Меня, как человека, впервые изучающего Delphi, могут смутить некоторые, казалось бы, излишние функции.Но у продукта долгая история, и каждое дополнение имело смысл в тот момент, когда оно было добавлено.Кроме того, было легче учиться, когда вам нужно было выучить это только по частям.