Локальные переменные модуля Delphi - как сделать каждый экземпляр уникальным?

В приведенном ниже модуле у меня есть переменная, объявленная в разделе РЕАЛИЗАЦИЯ - локальная для модуля. У меня также есть процедура, объявленная в разделе TYPE, которая принимает аргумент и назначает этот аргумент соответствующей локальной переменной. Каждому экземпляру этого TFrame передается уникальная переменная через passMeTheVar.

Я хочу, чтобы каждый экземпляр кадра сохранял свою собственную версию этой переменной, отличную от других, и использовал ее для определения того, как она работает. Однако, похоже, происходит то, что все экземпляры используют одно и то же значение, даже если я явно передаю каждому экземпляру другую переменную.

ie:

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 разделяют раздел реализации модуля.


person J...    schedule 12.05.2010    source источник


Ответы (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;
person jasonpenny    schedule 12.05.2010
comment
Джастин, обратите внимание, что переменные, объявленные в области видимости модуля, не имеют абсолютно никакого отношения к классам, объявленным в области видимости модуля. Вы можете путать вещи с Java, где все принадлежит классу, а на каждый исходный файл приходится только один класс. В Delphi все это неверно. - person Rob Kennedy; 13.05.2010
comment
Переменные в разделе реализации являются локальными для модуля, но глобальными для всего кода внутри модуля. Это не имеет ничего общего с классами или экземплярами, поскольку Delphi не является чистым объектно-ориентированным языком. - person Mason Wheeler; 13.05.2010

Вы вызываете метод makeThisInstanceX как метод класса (статический), а не создаете экземпляр класса и вызываете его как метод объекта. Взгляните на эту ссылку:

http://oreilly.com/catalog/delphi/chapter/ch02.html

person David M    schedule 12.05.2010

кадр / блок / класс / контроль

Я приветствую вашу героическую попытку улучшить код. Однако, судя по вашим вопросам и комментариям, с сожалением сообщаю вам, что ваше понимание очень ограничено.

Фрейм - это не единица, не являющаяся классом. Фрейм - это класс, но не каждый класс - это фрейм. Фрейм - это элемент управления, но не каждый элемент управления является фреймом. Модули имеют разделы интерфейса и реализации (а также инициализации и завершения). Классы имеют частные и общедоступные (а также защищенные и опубликованные) части.

Я вставил последний абзац не для того, чтобы научить, а для того, чтобы вы могли оценить свой уровень понимания. У разработчика Delphi не должно быть проблем с абзацем. Я не пытаюсь заставить вас чувствовать себя плохо или выставлять напоказ - просто пытаюсь помочь. Возможно, в настоящее время Stack Overflow вам не подходит.

Как человек, который только изучает Delphi впервые, меня могут смутить некоторые, казалось бы, избыточные функции. Но у этого продукта долгая история, и каждое добавление имело смысл в то время, когда оно было добавлено. Кроме того, его было легче выучить, когда вам нужно было разучивать его по частям.

person Pete R.    schedule 12.05.2010
comment
SO - подходящее место для всех, у кого есть проблемы с программированием. Я не люблю понижать голос, но я не понимаю, как демотивирование и отправка OP с этого сайта кому-либо может быть полезна, извините. - person Wouter van Nifterick; 13.05.2010
comment
-1, поскольку это не ответ, и по тем же причинам, что и верхний. Просто будь клевым ! - person TridenT; 13.05.2010
comment
Мне жаль, что я произвел впечатление пассивно-агрессивного. Уверяю вас, это не было моим намерением. Поскольку вы не могли слышать мой голос, не говоря уже о том, чтобы видеть мое лицо и язык тела, вам приходилось оценивать мои эмоции исключительно по моим письменным словам. (Возможно, мне стоило попробовать смайлики.) Однако я более чем когда-либо убежден, что SO - это ограниченный инструмент. Он позволяет обмениваться информацией, но, как показывают комментарии, не всегда правильно передает эмоции. - person Pete R.; 23.05.2010