Локальные переменные Delphi Unit - как сделать каждый экземпляр уникальным? - PullRequest
1 голос
/ 12 мая 2010

В приведенном ниже блоке у меня есть переменная, объявленная в разделе РЕАЛИЗАЦИЯ - локальная для блока. У меня также есть процедура, объявленная в разделе 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".

Я делаю это неправильно, в принципе? Если это правильный метод, то это вопрос отладки того, что у меня есть (что слишком велико для публикации), но если это не правильно в принципе, то есть ли способ сделать то, что я предлагаю?

EDIT:

Хорошо, урок, полученный здесь, заключается в том, что определение класса это именно то. Многие классы могут идти в одном модуле, и все экземпляры всех классов в разделе Type разделяют раздел реализации модуля.

Ответы [ 3 ]

8 голосов
/ 12 мая 2010

myLocalVar - глобальная переменная, но видимая только внутри устройства.

Локальная переменная будет в процедуре / функции, как

procedure makeThisInstanceX(passMeTheVar: integer);
var
  myLocalVar: Integer;
begin
  myLocalVar := passMeTheVar;
end;

если вы хотите переменную экземпляра, то есть каждый кадр имеет свою копию, поместите ее в класс:

type
  TFlexibleUnit = class(TFrame)
     procedure makeThisInstanceX(passMeTheVar:integer);
  private
    myLocalVar: Integer;
  ...
  end;
1 голос
/ 12 мая 2010

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

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

0 голосов
/ 13 мая 2010

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

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

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

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

Поскольку кто-то впервые изучает Delphi, меня могут смущать некоторые, казалось бы, избыточные функции. Но продукт имеет долгую историю, и каждое добавление имело смысл в то время, когда оно было добавлено. Также было легче учиться, когда нужно было учить его только по частям.

...