Pergunta

Na unidade abaixo, tenho uma variável declarada na seção de implementação - local da unidade. Eu também tenho um procedimento, declarado na seção de tipo que leva um argumento e atribui esse argumento à variável local em questão. Cada instância deste TFRame é passada uma variável única via passMeTheVar.

O que eu quero que ele faça é que cada instância do quadro mantenha sua própria versão dessa variável, diferente dos outros, e use -a para definir como ele opera. O que parece estar acontecendo, no entanto, é que todas as instâncias estão usando o mesmo valor, mesmo que eu passe explicitamente a cada instância uma variável diferente.

ou seja:

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;

Agora, em algum lugar, de outra forma, soltei esse quadro no painel de design, às vezes dois desses quadros de uma forma, e o declarei nos lugares adequados, etc. Cada um é único nisso:

ThisFlexibleUnit : TFlexibleUnit;
ThatFlexibleUnit : TFlexibleUnit;

E quando eu faço:

ThisFlexibleUnit.makeThisInstanceX(var1); //want to behave in way "var1"
ThatFlexibleUnit.makeThisInstanceX(var2); //want to behave in way "var2"

Parece que ambos compartilham a mesma variável "MyLocalvar".

Estou fazendo isso errado, em princípio? Se esse é o método correto, é uma questão de depurar o que tenho (que é grande demais para postar), mas se isso não estiver correto em princípio, existe uma maneira de fazer o que estou sugerindo?

EDITAR:

OK, então a lição aprendida aqui é que a definição de classe é exatamente isso. Muitas classes podem ir em uma unidade e todas as instâncias de todas as classes no Type Seção Compartilhe a seção de implementação da unidade.

Foi útil?

Solução

O Mylocalvar é uma variável global, mas apenas visível dentro da unidade.

Uma variável local estaria em um procedimento/função, como

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

Se você deseja uma variável de instância, esse é um quadro tem sua própria cópia, coloque -a na classe:

type
  TFlexibleUnit = class(TFrame)
     procedure makeThisInstanceX(passMeTheVar:integer);
  private
    myLocalVar: Integer;
  ...
  end;

Outras dicas

Você está chamando o makeThisInstanceX Método como um método de classe (estática), em vez de criar uma instância da classe e chamá -la de método de objeto. Dê uma olhada nesta referência:

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

quadro / unidade / classe / controle

Aplaudo sua tentativa heróica de melhorar o código. No entanto, a julgar por suas perguntas e comentários, lamento informar que seu entendimento é muito limitado.

Um quadro não é uma unidade que não é uma classe. Um quadro é uma classe, mas nem toda classe é um quadro. Um quadro é um controle, mas nem todo controle é um quadro. As unidades possuem seções de interface e implementação (e inicialização e finalização). As aulas têm peças privadas e públicas (e protegidas e publicadas).

Não coloquei o último parágrafo para tentar ensinar, mas permitir que você avalie seu nível de entendimento. Um desenvolvedor da Delphi não deve ter problemas com o parágrafo. Não estou tentando fazer você se sentir mal ou se exibir - apenas tentando ajudar. Talvez o Stack Overflow não seja a ferramenta certa para você neste momento.

Como alguém apenas aprendendo Delphi pela primeira vez, posso ficar confuso com alguns dos recursos aparentemente redundantes. Mas o produto tem uma longa história e cada adição fazia sentido no momento em que foi adicionado. Também era mais fácil aprender quando você só tinha que aprender uma peça de cada vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top