On Fri, 14 May 2010, Graeme Geldenhuys wrote:
Hi, I tried using FPC 2.5.1 today to see how compatible is our application with it compared to FPC 2.4.1 I got stacks of the following errors. Why is this change forced in FPC 2.5.1? TBulkInvoiceRateListForm class is a descendant of TfpgWindowBase so there should be a problem. I don't understand. :-/ ------------- frm_bulkinvoiceratelist.pas(84,77) Error: Call by var for arg no. 2 has to match exactly: Got "TBulkInvoiceRateListForm" expected "TfpgWindowBase" fpg_base.pas(2207,31) Hint: Found declaration: TfpgApplicationBase.CreateForm(TComponentClass,out TfpgWindowBase); frm_bulkinvoiceratelist.pas(307) Fatal: There were 1 errors compiling module, stopping -------------------- To get my code to compile again, I have to change the following code from fpgApplication.CreateForm(TBulkInvoiceRateListForm, BulkDiscountListForm); ...to this... fpgApplication.CreateForm(TBulkInvoiceRateListForm, TfpgWindowBase(BulkDiscountListForm)); Now I have to include ugly casts all over the place. :-( I got similar issues with TStrings and TStringList. TStringList is a descendant of TStrings, but I can't pass a TStringList type as a parameter to a method declared with TStrings. Maybe I don't understand the var parameter correctly (but haven't tested to see what happens if I remove var from parameter list). If I have a class instance, when should I pass it to a method or function/procedure as var and when don't I need to use var parameters?
You only need var/out when you want to change the instance pointer, i.e. switch to another instance. And I count FreeAndNil() among this. (.Free
on the other hand is still possible, but not recommended). If you just want to set properties or call methods on an existing instance, there is no need to use out or var. Michael. _______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-devel