Локальные переменные Delphi Unit - как сделать каждый экземпляр уникальным?
В приведенном ниже блоке у меня есть переменная, объявленная в разделе РЕАЛИЗАЦИЯ - локальная для блока. У меня также есть процедура, объявленная в разделе 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
раздел доля реализации раздела блока.
3 ответа
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 не должно быть проблем с абзацем. Я не пытаюсь заставить вас чувствовать себя плохо или хвастаться - просто пытаюсь помочь. Возможно, переполнение стека не подходит вам сейчас.
Как кто-то, кто только впервые изучает Delphi, меня могут смущать некоторые, казалось бы, избыточные функции. Но продукт имеет долгую историю, и каждое добавление имело смысл на момент его добавления. Также было легче учиться, когда нужно было учить его по частям за раз.