1

Konu: Obje klonlama

Merhaba,
Objelerle ilgili bir sorunum var ve bir türlü çözemedim.

Visual Fox Pro
DEFINE CLASS Kons AS Custom

    vertarih=CTOD("")
    isteyen=""
    neden=""
    teden=""
    talan=""
    yakin=""
    iletisim=""
    blok=.F.
    bloksayi=0
    blokistem=.F.
    he=.F.
    hesayi=0
    heistem=.F.
    ihk=.F.
    ihksayi=0
    ihkistem=.F.
    sito=.F.
    sitosayi=0
    sitoistem=.F.
    boyasiz=.F.
    boyasizsay=0
    doku=.F.
    notlar=""
    geritarih=CTOD("")
    gerinotlar=""
    geriblok=0
    gerihe=0
    gerihk=0
    gerisito=0
    sonuc=""
    sontarih=CTOD("")
    sonrapor=.F.
    tutanakbas=CTOT("")
ENDDEFINE


şeklinde bir klasım var. Buna uygun olarak bir obje yaratıyorum.

Visual Fox Pro
o1=CREATEOBJECT("kons")


Daha sonra bu objenin property lerine değerler atıyorum. Örneğin o1.vertarih=date() gibi. Programımın bir yerinde bu objenin propertyler ve değerleriyle aynı olan bir klon oluşturmam gerekiyor. Bunun için daha önceki sorumda Çetin'in verdiği aşağıdaki procedure'ı kullanmak istediğimde  CONTROLS is not an object gibi bir hata mesajı veriyor.

Visual Fox Pro
Procedure KlonObject( toSource, toTarget )

  Local ix,jx
  Local Array aEleman[1]
  For ix=1 To Amembers(aEleman, toSource)
    Do Case
      Case Type( 'toSource.'+aEleman[m.ix] , 1) = 'A'
        AddProperty( toTarget, ;
          aEleman[m.ix]+'['+Transform(Alen(toSource.&aEleman[m.ix].))+']' )
        For jx=1 To Alen(toSource.&aEleman[m.ix].)
          If Type('toSource.'+aEleman[m.ix]+'[m.jx]') = 'O'
            toTarget.&aEleman[m.ix].[m.jx] = Createobject('Empty')
            KlonObject(toSource.&aEleman[m.ix].[m.jx],toTarget.&aEleman[m.ix].[m.jx])
          Else
            toTarget.&aEleman[m.ix].[m.jx] = toSource.&aEleman[m.ix].[m.jx]
          Endif
        Endfor
      Case Type( 'toSource.'+aEleman[m.ix]) = 'O'
        AddProperty( toTarget, aEleman[m.ix], Createobject('Empty') )
        KlonObject( toSource.&aEleman[m.ix]. , toTarget.&aEleman[m.ix]. )
      Otherwise
        AddProperty( toTarget, aEleman[m.ix], Evaluate('toSource.'+aEleman[m.ix]))
    Endcase
  Endfor
Endproc


Nerede hata yapıyorum bir türlü anlayamadım.
Teşekkürler şimdiden.

2

Re: Obje klonlama

sorunu yanlış anladım sanırım. çünkü o1 objesini klonlamak çok basit:

o2=o1

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

3

Re: Obje klonlama

Metin Bey,
keşke o kadar kolay olsaydı.
o2=o1 deyince objeyi değil referansını kopyalıyor (İki yıl önce, Çetin'in bana yazdığı yanıttaki sözü bu) Benim istediğim birbirinin aynı fakat bağımsız 2 obje. Şunu yapınca referansını kopyaladığını görürsünüz zaten.

o1.vertarih=date()
o2=o1
? o2.vertarih  ==> bugünün tarihi
o1.vertarih=date(2009,10,10)
? o2.vertarih  ==> 2009'lu tarihi gösteriyor

4

Re: Obje klonlama

evet o şekilde referansı kopyalanır sadece. bildiğim kadarıyla vfp'de objenin kendisini kopyalayan bir komut yok.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

5

Re: Obje klonlama

Visual Fox Pro
Do Case

      CASE PEMSTATUS(toSource, aEleman[m.ix],1) OR ;
          PEMSTATUS(toSource, aEleman[m.ix],2) OR ;
          !PEMSTATUS(toSource, aEleman[m.ix],0)
          * skip

6

Re: Obje klonlama

bilgimin sorunu çözmeye yetecek kadar olmadığını düşünüyorum,
meraktan - aşağıdaki metodu neden kullanmıyorsun ?
o1=CREATEOBJECT("kons")
o2=CREATEOBJECT("kons")

o1.sontarih=DATE()
o2.sontarih=DATE()-10

?o1.sontarih=o2.sontarih    && .f.

-----
bir de U anahtarı var, sadece senin değerleri sıralayan ?
amembers(aEl,o1,1,U)

VFP9 SP2

7

Re: Obje klonlama

Çetin Bey, PEMSTATUS'u deneyemedim henüz teşekkürler.

Ali bey (konuka), doğaldır ki bilginin sonu yok. Benim istediğim propertyleri ve onları aldıkları değerleriyle aynı olan iki bağımsız obje. CREATEOBJECT ile sadece propertyleri aynı olan iki obje yaratılıyor. İlginç olan AMEMBERS obje içindeki propertyleri alfabetik sıralıyor. "U" sviçi ile sadece sayılarını veriyor. Sadece U (user-defined) larıın değerlerini kopyala diyemiyoruz anlaşılan.
İlginize teşekkürler..

8 Son düzenleyen, konuka (30.08.2010 16:44:46)

Re: Obje klonlama

peki aşağıdakineden olmuyor - sorunu çok mu basit algılıyorum

Visual Fox Pro
PUBLIC o1,o2

PUBLIC ARRAY aEleman(1)
o1=CREATEOBJECT("kons")
o2=CREATEOBJECT("kons")
o1.neden="değişik"
o1.bloksayi=1
o1.vertarih=DATE()
o1.blok=.t.
Amembers(aEleman, o1, 0, "U")
 
FOR m.xi=1 TO ALEN(aEleman)
  m.komut="o2."+aEleman[m.xi]+"=o1."+aEleman[m.xi]
  &komut
ENDF
CLEAR
?o1.neden
?o1.bloksayi
?o1.vertarih
?o1.blok
?"----"
?o2.neden
?o2.bloksayi
?o2.vertarih
?o2.blok
?"----"
o2.neden="2.değişiklik"
?o1.neden
?o2.neden
 
DEFINE CLASS Kons AS Custom
    vertarih=CTOD("")
    neden=""
    blok=.F.
    bloksayi=0
ENDDEFINE
VFP9 SP2

9

Re: Obje klonlama

Eger objenin dizi ya da obje olan elemanlari varsa ne yazik ki o2.X = o1.X yetmiyor. Onlar yoksa ve sadece User defined propertyler klonlanacak ise o tabii ki olur:) Yalniz affina siginarak ufak bir degisiklik yapmak isterim:

Visual Fox Pro
For m.xi=1 To Alen(aEleman)

    Store Getpem(o1, aEleman[m.xi]) To ("o2."+aEleman[m.xi])
Endif