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

StackOverflow https://stackoverflow.com/questions/2822117

Вопрос

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

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

рама/единица/класс/управление

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top