E2197 Constant object cannot be passed as var parameter

Yapmak istediğiniz işle ilgili doğru bileşeni bulmak için burayı kullanabilirsiniz. Sadece bulmak için, diğer sorular Programlama forumuna lütfen.
Forum kuralları
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Cevapla
master_crazy
Üye
Mesajlar: 17
Kayıt: 09 Eyl 2016 11:57

E2197 Constant object cannot be passed as var parameter

Mesaj gönderen master_crazy »

Ekli dosya olarak Blong'dan bir örneğim var, hata alıyorum [dcc32 Error] CollectionClientMainForm.pas(96): E2197 Sabit nesne var parametresi olarak geçirilemez.
Birisi bana özel olarak ve bu hatayı nasıl çözeceğimi açıklayabilir mi?
şimdiden teşekkürler
{
procedure Enumerate(Collection: IDispatch; CallBack: TEnumerateCallBack);
var
EnumUnk, Element: OleVariant;
Enum: IEnumVariant;
Fetched: Cardinal;
Continue: Boolean;
const
DispParamNoArgs: TDispParams = (rgvarg: nil; rgdispidNamedArgs: nil; cArgs: 0; cNamedArgs: 0);
begin
//Call _NewEnum via its DispID and get enumerator object's IUnknown interface
OleCheck(Collection.Invoke(DISPID_NEWENUM, GUID_NULL, 0,
DISPATCH_PROPERTYGET, DispParamNoArgs, @EnumUnk, nil, nil)); //DispParamNoArgs, @EnumUnk, nil, nil));
//Check we got an IUnknown and get IEnumVariant from it
if VarType(EnumUnk) = varUnknown then
begin
Enum := IUnknown(EnumUnk) as IEnumVariant;
Continue := True;
//Use enumeration method to cycle through elements
while (Enum.Next(1, Element, Fetched) = S_OK) and Continue do
CallBack(Element, Continue)
end
end;
}
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: E2197 Constant object cannot be passed as var parameter

Mesaj gönderen ertank »

Merhaba,

Kod örneklerinizi tam olarak iletmenizde fayda var. Hata açık. Fonksiyonun değerini değiştirebilirim şeklinde tanımladığı parametreyi sabit ( const ) olarak kullanamazsınız.

Aşağıdaki şekilde düzenlendiğinde kod derlenebilir hale gelecektir.

Kod: Tümünü seç

uses
  Winapi.ActiveX,
  System.Win.ComObj;

type
  TEnumerateCallBack = procedure(Item: IDispatch; var Continue: Boolean) of object;

procedure Enumerate(Collection: IDispatch; CallBack: TEnumerateCallBack);
var
  EnumUnk, Element: OleVariant;
  Enum: IEnumVariant;
  Fetched: Cardinal;
  Continue: Boolean;
  DispParamNoArgs: TDispParams;
begin
  DispParamNoArgs.rgvarg := nil;
  DispParamNoArgs.rgdispidNamedArgs := nil;
  DispParamNoArgs.cArgs := 0;
  DispParamNoArgs.cNamedArgs := 0;

  //Call _NewEnum via its DispID and get enumerator object's IUnknown interface
  OleCheck(Collection.Invoke(DISPID_NEWENUM, GUID_NULL, 0, DISPATCH_PROPERTYGET, DispParamNoArgs, @EnumUnk, nil, nil));

  //Check we got an IUnknown and get IEnumVariant from it
  if VarType(EnumUnk) = varUnknown then
  begin
    Enum := IUnknown(EnumUnk) as IEnumVariant;
    Continue := True;
    //Use enumeration method to cycle through elements
    while (Enum.Next(1, Element, Fetched) = S_OK) and Continue do
      CallBack(Element, Continue)
  end
end;
Cevapla