Variáveis locais da unidade Delphi - como tornar cada instância única?
-
26-09-2019 - |
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.
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:
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.