2010-05-12 9 views
1

아래의 유닛에는 구현 섹션에서 선언 한 변수가 있습니다. 유닛에 국한됩니다. 또한 프로 시저를 인수를 취하고 해당 인수를 해당 지역 변수에 지정하는 TYPE 절에서 선언했습니다. 이 TFrame의 각 인스턴스는 passMeTheVar을 통해 고유 한 변수를 전달받습니다.Delphi Unit 로컬 변수 - 각 인스턴스를 고유하게 만드는 방법?

내가 원하는 것은 프레임의 각 인스턴스가 다른 변수와 다른 변수의 자체 버전을 유지하고이를 사용하여 작동 방식을 정의하는 것입니다. 그러나 어떤 일이 벌어지고있는 것처럼 보이는지는 각 인스턴스에 다른 변수를 명시 적으로 전달하더라도 모든 인스턴스가 동일한 값을 사용한다는 것입니다.

예 :

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 섹션에있는 모든 클래스의 모든 인스턴스는 유닛의 구현 섹션을 공유합니다.

답변

8

myLocalVar 전역 변수 만 단위 내에서만 볼 수 있습니다.

type 
    TFlexibleUnit = class(TFrame) 
    procedure makeThisInstanceX(passMeTheVar:integer); 
    private 
    myLocalVar: Integer; 
    ... 
    end; 
: 당신이 인스턴스 변수를 원하는 경우

로컬 변수가

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

같은 절차/기능에있을 것입니다, 그 클래스에 넣어, 각 프레임은 자신의 복사본을 가지고있다

+1

저스틴, 단위 범위에서 선언 된 * 변수 *는 단위 범위에서 선언 된 * 클래스 *와 절대 관계가 없습니다. 모든 것이 클래스에 속하며 소스 파일 당 하나의 클래스 만있는 Java와 혼동 스러울 수 있습니다. 델파이에서는 그 중 어느 것도 사실이 아닙니다. –

+2

구현 섹션의 변수는 유닛 *에 국한되지만 유닛 내부의 모든 코드에 대해 전역입니다. Delphi는 "순수한"객체 지향 언어가 아니기 때문에 클래스 나 인스턴스와 아무 관련이 없습니다. –

1

makeThisInstanceX 메서드를 클래스 인스턴스를 만들고이를 객체 메서드로 호출하는 대신 클래스 (정적) 메서드로 호출하고 있습니다. 이 기준에서 살펴 보자 :

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

-2

프레임/유닛/클래스/컨트롤

나는 코드를 개선하기 위해 영웅적인 시도에 박수를 보냅니다. 그러나 귀하의 질문과 의견을 판단하여 귀하의 이해가 매우 제한적이라는 것을 알려드립니다.

프레임이 클래스가 아닌 단위는 아닙니다. 프레임은 클래스이지만 모든 클래스가 프레임이 아닙니다. 프레임은 컨트롤이지만 모든 컨트롤이 프레임이 아닙니다. 단위에는 인터페이스 및 구현 (및 초기화 및 종료) 섹션이 있습니다. 수업에는 개인 및 공개 (보호되고 게시 된) 부분이 있습니다.

나는 마지막 단락을 가르치려고하지 않았지만 이해 수준을 측정 할 수 있도록했다. 델파이 개발자는 단락에 아무런 문제가 없어야합니다. 나는 너를 기분 나쁘게 보이려고 노력하지 않고있다. 아마도 스택 오버플로가 현재로서는 적절한 도구가 아닙니다.

처음으로 델파이를 배운 사람으로서, 필자는 중복 기능 중 일부가 혼란 스러울 수 있습니다. 그러나이 제품은 오랜 역사를 가지고 있으며 추가 될 때마다 추가되었습니다. 한 번에 한 곡씩 배워야 만했을 때 배우기도 쉬웠습니다.

+0

모든 종류의 프로그래밍 문제가있는 모든이를위한 적절한 장소입니다. 나는 downvote하는 것을 싫어하지만,이 사이트에서 OP를 어떻게 demotivating하고 보내는 것이 누군가에게 도움이되는지, 미안하다. –

+0

-1 답변이 없으므로 상단과 같은 이유로 그냥 멋지다! – TridenT

+1

수동적으로 공격적으로 다닌 것을 유감스럽게 생각합니다. 내 의도가 아니라는 것을 당신에게 확신시킵니다. 내 얼굴과 몸의 언어를 보지 않고 내 목소리를들을 수 없기 때문에 내 감정을 내 서면의 말만으로 평가해야했습니다. (어쩌면 나는 이모티콘을 시도해 보았어야했다.) 그러나 나는 SO가 제한된 도구라는 것을 그 어느 때보다도 확신하고있다. 그것은 정보 교환을 허용하지만, 코멘트가 보여 주듯이 항상 감정을 정확하게 전달하지는 않습니다. –