NODEFAULT ile DODEFAULT arasinda isim benzerligi var ama biribirinin tersi seyler degiller tam olarak.
VFP'nun uzerinde hazir gelen event kodlari (bu kodlari hic gormuyorsun ama var) daima calisir. O eventlere kod yazman onlarin calismasini engellemez. Ornek olarak:
MouseDown, MouseOver, Click, Keypress, Gotfocus, Lostfocus ... Mesela bir tusa bastiginda Keypress kodu sayesinde o controlde birsey yapiliyor. Tipik orneklerden birisi Lostfocus. Herhangi bir textbox'in Lostfocus'una:
yazip dene. Hicbir etkisinin olmadigini gorursun. Nedeni VFP'nin kendi kodu senin kodundan sonra calisip yapmasi gereken "Lost focus" isini yapiyor ve focusu kaybediyor. Onu calistirmak icin NODEFAULT diyerek VFP kodunu engellemen lazim:
Visual Fox Pro
NoDefault
this.SetFocus()
DoDefault() ise, biraz yanlis verilmis bir isim, parent class kodu varsa ve her neyse, kullandigin yere sanki copy&paste ile koymussun gibi calistirmak.
Yani DoDefault() uzun suredir kullanicilarin unuttugu :: (scope resolution) operatorunun kisitli bir versiyonunu yapiyor.
Visual Fox Pro
clear
o = CREATEOBJECT('c3')
? 'o.TestProcedure1()'
o.TestProcedure1()
?
? '----------------------'
? 'o.TestProcedure2()'
o.TestProcedure2()
?
? '----------------------'
? 'o.TestProcedure3()'
o.TestProcedure3()
Define Class c1 As Custom
Procedure TestProcedure1
? "C1 TestProcedure1"
Endproc
Procedure TestProcedure2
? "C1 TestProcedure2"
Endproc
Procedure TestProcedure3
? "C1 TestProcedure3"
Endproc
ENDDEFINE
Define Class c2 As c1
Procedure TestProcedure1
? "C2 TestProcedure1"
Endproc
Procedure TestProcedure2
? "C2 TestProcedure2"
Endproc
Procedure TestProcedure3
? "C2 TestProcedure3"
Endproc
ENDDEFINE
Define Class c3 As c2
Procedure TestProcedure1
? "C3 TestProcedure1"
* NODEFAULT gereksiz - VFP built-in event degil
* Burada en ufak kod oncekileri baskilar - 'override'
Endproc
Procedure TestProcedure2
DODEFAULT() && ParentClass::TestProcedure2
? "C3 TestProcedure2"
DODEFAULT()
Endproc
Procedure TestProcedure3
C1::TestProcedure1()
C1::TestProcedure3() && dodefault()'a benzer
C2::TestProcedure3() && dodefault()
? "C3 TestProcedure3"
Custom::Application.DoCmd("? 'Custom'") && base class Custom
Endproc
ENDDEFINE