“Tipi di effettivi e formali parametri var devono essere identici” errore di procedura

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

  •  08-10-2019
  •  | 
  •  

Domanda

Sto cercando di scrivere una procedura in Delphi. Questa procedura prende il nome di elemento TControl discendente e quindi provare a modificare alcune proprietà. Ma quando cerco di farlo, Delphi dà un errore del tipo:

  

E2033 Tipi di effettiva e formale var   parametri devono essere identici

Procedura:

procedure Change_prop(var Control: TControl;height:integer;width:integer);
begin
//......
end;

Esempio di utilizzo: Change_prop(Label1, 50,200); Che cosa può essere la soluzione di quel error..Thanks.

È stato utile?

Soluzione

Hai solo bisogno di rimuovere la var nel parametro di controllo e renderlo un parametro di valore. Poiché gli oggetti Delphi sono effettivamente implementati come tipi riferimento, è possibile chiamare i metodi su di loro, campi membro cambiamento, ecc, anche se li passano a una procedura come valore o un parametro const.

Altri suggerimenti

È sufficiente rimuovere var - non è necessario per modificare le proprietà di controllo:

procedure Change_prop(Control: TControl;height:integer;width:integer);
begin
......
end;

Come David ha detto, il problema è nella var . Ciò non significa che è possibile modificare i membri del TControl, significa che è possibile sostituisci il TControl con un altro, completamente diverso TControl, perché gli oggetti sono tipi di riferimento.

Se si sta passando un oggetto a un var parametro, la variabile si passa deve essere dichiarato come esattamente lo stesso tipo come parametro al fine di preservare la sicurezza tipo. In caso contrario, si potrebbe fare questo:

procedure TForm1.VarControl(var control: TControl);
begin
  control := TButton.Create;
end;

procedure TForm1.Mistake;
begin
  VarControl(self.Memo1); //defined as TMemo
  Memo1.Lines.Text := 'Undefined behavior here...';
end;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top