Domanda

Nell'unità di seguito ho una variabile dichiarata nella sezione implementazione - locale all'unità. Ho anche un procedimento, ha dichiarato nella sezione tipo che prende un argomento e assegna tale argomento alla variabile locale in questione. Ogni istanza di questo TFrame viene passata una variabile unica via passMeTheVar.

Quello che voglio fare è per ogni istanza del telaio per mantenere la propria versione di quella variabile, diverso dagli altri, e l'uso che per definire come funziona. Ciò che sembra accadere, tuttavia, è che tutte le istanze utilizzino lo stesso valore, anche se in modo esplicito passo ogni istanza una variabile diversa.

vale a dire:

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;

Ora da qualche parte in un altro'VE modulo I cadere questa immagine Pagina sul quadro di impostazione, a volte due di questi fotogrammi su una forma, e lo hanno dichiarato nei luoghi appropriati, ecc Ognuno è unico in quanto:

ThisFlexibleUnit : TFlexibleUnit;
ThatFlexibleUnit : TFlexibleUnit;

e quando faccio una:

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

sembra che entrambi condividono la stessa variabile "myLocalVar".

sto facendo questo sbagliato, in linea di principio? Se questo è il metodo corretto, allora si tratta di una questione di debug quello che ho (che è troppo grande per post), ma se questo non è corretto in linea di principio, allora c'è un modo per fare quello che sto suggerendo?

EDIT:

Ok, quindi la lezione appresa è che la definizione di classe è proprio questo. Molte classi possono andare in una sola unità e tutte le istanze di tutte le classi nella sezione Type condividere la sezione attuazione dell'unità.

È stato utile?

Soluzione

myLocalVar è una variabile globale, ma visibili solo all'interno dell'unità.

Una variabile locale sarebbe in una procedura / funzione, come

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

se si desidera una variabile di istanza, che è ogni fotogramma ha la propria copia, metterla nella classe:

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

Altri suggerimenti

Si sta chiamando il metodo makeThisInstanceX come metodo di classe (statico), piuttosto che la creazione di un'istanza della classe e definendolo come un metodo dell'oggetto. Date un'occhiata a questo riferimento:

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

telaio / unità / classe / controllo

Mi congratulo con il tuo eroico tentativo di meglio il codice. Tuttavia, a giudicare dalle domande e commenti mi rammarico di informarvi che la vostra comprensione è molto limitata.

Un frame non è un aggregato che non è una classe. Un telaio è una classe ma non ogni classe è una cornice. Un frame è un controllo ma non ogni controllo è un frame. Unità hanno interfaccia e implementazione (e inizializzazione e finalizzazione) sezioni. Le classi hanno parti private e pubbliche (e protette e pubblicati).

non ho messo l'ultimo paragrafo in per cercare di insegnare, ma per consentire di misurare il livello di comprensione. Un Delphi sviluppatore dovrebbe avere alcun problema con il paragrafo. Non sto cercando di farvi sentire male o per mostrare - solo cercando di aiutare. Forse Stack Overflow non è lo strumento giusto per te in questo momento.

Come qualcuno solo imparare Delphi per la prima volta, potrei essere confuso con alcune delle caratteristiche apparentemente ridondanti. Ma il prodotto ha una lunga storia e ogni aggiunta aveva un senso nel momento in cui è stata aggiunta. E 'stato anche più facile da imparare quando si doveva solo per imparare un pezzo alla volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top