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;
}
E2197 Constant object cannot be passed as var parameter
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.
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.
-
- Üye
- Mesajlar: 17
- Kayıt: 09 Eyl 2016 11:57
Re: E2197 Constant object cannot be passed as var parameter
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 ö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;