1

Konu: Objeleri eşitlemek

Önemli bir sorunum var. Bilindiği gibi Çetin Bey PUBLIC değişkenleri sevmiyor (haklı olarak). Ben de bunu göz önüne alarak tüm projemdeki public değişkenleri bir objeye aktardım.
Kullanıcının değişkenleri değiştirip değiştirmediğini anlamak için bu classtan 2 obje yarattım.
oOlgu = NEWOBJECT("olgu")
oOlgu2= NEWOBJECT("olgu")
DEFINE CLASS olgu
  var1 = ""
  var2 =""
  ..
  ..
ENDDEFINE

İlk objedeki değişkenler atandığında ikinci objeye de atanması için şu ifadeyi kullandım.
oOlgu2 = oOlgu
Kullanıcı bundan sonra birinci objedeki değişkenlerden birini değiştirdiği zaman
COMPOBJ(oOlgu,oOlgu2) ile saptayabileceğimi düşündüm. Ancak ilginç olan, kullanıcı oOlgu objesindeki herhngi bir değişkeni değiştirdiğinde ikinci oOlgu2 objesindeki de değişiyor. Bu sorunu nasıl çözebilirim? Bütün değiştirme emeğim yabana gidecek.

2

Re: Objeleri eşitlemek

kandilzade yazdı:

Önemli bir sorunum var. Bilindiği gibi Çetin Bey PUBLIC değişkenleri sevmiyor (haklı olarak). Ben de bunu göz önüne alarak tüm projemdeki public değişkenleri bir objeye aktardım.
Kullanıcının değişkenleri değiştirip değiştirmediğini anlamak için bu classtan 2 obje yarattım.
oOlgu = NEWOBJECT("olgu")
oOlgu2= NEWOBJECT("olgu")
DEFINE CLASS olgu
  var1 = ""
  var2 =""
  ..
  ..
ENDDEFINE

İlk objedeki değişkenler atandığında ikinci objeye de atanması için şu ifadeyi kullandım.
oOlgu2 = oOlgu
Kullanıcı bundan sonra birinci objedeki değişkenlerden birini değiştirdiği zaman
COMPOBJ(oOlgu,oOlgu2) ile saptayabileceğimi düşündüm. Ancak ilginç olan, kullanıcı oOlgu objesindeki herhngi bir değişkeni değiştirdiğinde ikinci oOlgu2 objesindeki de değişiyor. Bu sorunu nasıl çözebilirim? Bütün değiştirme emeğim yabana gidecek.


bildiğim kadarı ile
oOlgu2 = oOlgu ifadesi referansları eşitler.. yani aynı objeyi gösterir.. sıkıntı burda..
bir objeden başka bir objeye değer aktarımı bu şekilde olmaz diye düşünüyorum..

3

Re: Objeleri eşitlemek

Haklısınız. Yapabildiğim araştırmaya göre iki objenin değerlerini eşitleyecek pratik bir yöntem ya da fonksiyon yok görünüyor.
Çare, tek tek değerleri atamak:

oOlgu2.var1 = oOlgu.var1  gibi.

4

Re: Objeleri eşitlemek

amembers()

5

Re: Objeleri eşitlemek

Yanıtlar için teşekkürler.
Yalnız ben yine yapamadım. AMEMBERS sadece property adlarını alıyor. Değerlerini almıyor. Aşağıdaki gibi bir loop ile atama yapmak istedim ama hata veriyor.

m.PropertySayi=AMEMBERS(aOlgu,oOlgu)
FOR m.i = 1 TO m.PropertySayi
   oOlgu2.&aOlgu[m.iX] = oOlgu.&aOlgu[m.iX]
ENDFOR

6 Son düzenleyen, foxman (12.02.2008 11:57:00)

Re: Objeleri eşitlemek

Visual Fox Pro
oOlgu =CREATEOBJECT("olgu")

oOlgu2=CREATEOBJECT("olgu")
 
oOlgu.userid  = "001"
oOlgu.username= "ahmet"
oOlgu.password= "a001"
 
m.PropertySayi=AMEMBERS(aOlgu,oOlgu,0,"U")
FOR m.i = 1 TO m.PropertySayi
  oOlgu2.&aOlgu[m.i] = oOlgu.&aOlgu[m.i]
ENDFOR
 
?oOlgu1.userid,oOlgu1.username,oOlgu1.password
?oOlgu2.userid,oOlgu2.username,oOlgu2.password
 
DEFINE CLASS olgu as Custom
    userid   = SPACE(10)
    username = SPACE(30)
    password = SPACE(10)
ENDDEFINE

7

Re: Objeleri eşitlemek

Visual Fox Pro
USE customer

SCATTER NAME o1
 
o2 = CREATEOBJECT('empty')
FOR ix = 1 TO AMEMBERS(aEleman,o1)
  AddProperty(o2,aEleman[m.ix],Eval("o1."+aEleman[m.ix]))
Endfor

8

Re: Objeleri eşitlemek

Son iki yanıt çok iyi ve öğretici oldu benim için.

Hele bir objenin boş (empty) ve temiz (hiçbir method ya da property yok) olarak yaratılabileceğini öğrenmek mükemmel oldu. Yalnız yine bir sorunum var. Tek tek değişkenleri diğer objeye değerleriyle birlikte aktarmak çok iyi ama; eğer ilk objede array varsa bu aktarılamıyor.
örneğin:

o1 = CREATEOBJECT('empty')
addproperty(o1, "ad", "")
addproperty(o1, "soyad", "")
addproperty(o1, "yerkod[1]", "")

olduğunda bunu aşağıdaki kodla ya da AMEMBERS() kullanan herhangi bir kodla aktarmak mümkün olmuyor. Array'in sadece adını alıp karakter değişken muamelesi yapıyor. Yani yukarıdaki örnekteki yerkod adındaki array'i tek bir karakter değişken olarak görüyor.

FOR ix = 1 TO AMEMBERS(aEleman,o1)
  AddProperty(o2,aEleman[m.ix],Eval("o1."+aEleman[m.ix]))
Endfor

Benim için ilginç bir nokta da; Programı çalıştırıp çıktıktan sonra VFP ortamına döndüğünüzde obje PUBLIC olduğu halde boş obje olarak görüyor. Yani command window'da diğer PUBLIC değişkenlerin değerleri korunmuş iken bu yolla yaratılan obje var ama empty görünüyor.
Teşekkürler

9

Re: Objeleri eşitlemek

Array icin acopy() kullanabilirsin. Bu arada sana daha jenerik bir obje klonlama kodu vereyim:

Visual Fox Pro
Clear

Local o1,o2
 
o1 = Createobject('Empty')
AddProperty(o1, 'p1', 1)
AddProperty(o1, 'p2', Date())
AddProperty(o1, 'p3', 'kandilzade')
AddProperty(o1, 'p4[1]')
AddProperty(o1, 'p5', Createobject('Empty') )
AddProperty(o1.p5, 'p5a[1]')
AddProperty(o1, 'orderdetail[1]')
 
Select * From customer Into Array o1.p4
Use In 'customer'
Select * From orders Where Val(order_id) = 10002 Into Array o1.p5.p5a
Use In 'orders'
Use orditems
Dimension o1.orderdetail[RECCOUNT()]
Scan
  Scatter Name o1.orderdetail[RECNO()]
Endscan
Use In 'orditems'
 
o2 = Createobject('Empty')
KlonObject(o1,o2)
o1.p1 = 2
o1.p4[1,2] = "o1 P4 edited"
o1.p5.p5a[1,2] = "o1 p5 edited"
o1.orderdetail[1].Quantity = o1.orderdetail[1].Quantity * 5
 
? "o1",o1.p1, Padr(o1.p4[1,2],40), Padr(o1.p5.p5a[1,2],40), o1.orderdetail[1].Quantity
? "o2",o2.p1, Padr(o2.p4[1,2],40), Padr(o2.p5.p5a[1,2],40), o2.orderdetail[1].Quantity
Return o2
 
 
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

Bu basit gorunen sekli:

Visual Fox Pro
o2 = CREATEOBJECT('Empty')

ADDPROPERTY(o2, 'oCopy', o1)

ancak bununla kopyeleme olmuyor onun yerine o2'ye oCopy objesi eklemis ve:
o2.oCopy = o1
demis oluyorsun (yani referansi tutuyor, o2.oCopy ile o1 ayni obje)

Public kullanma demis miydim hic:) Her neyse yine de kullanirsan dedigin gibi bir sorun yok. Bir yerde degisitiriyorsundur (onun icin public kullanma:)