Konu: birden fazla parametre döndürülebilir mi?
merhaba üsdatlar,kullanmak istediğim fonksiyona 2 adet parametre gönderiyorum,2 adet parametrenin de geri dönmesini istiyorum.Bu işlemi public değişkenler kullanmadan nasıl yapabilirim::cool:
Giriş yapmadınız. Lütfen giriş yapın yada kayıt olun.
merhaba üsdatlar,kullanmak istediğim fonksiyona 2 adet parametre gönderiyorum,2 adet parametrenin de geri dönmesini istiyorum.Bu işlemi public değişkenler kullanmadan nasıl yapabilirim::cool:
Geriye array dönderebilirsin.
üsdat anladığım kadarı ile,geriye döndürmek istediğim paramatreleri,fonksiyon içerisinde diziye atacağım ve onu return(diziadı) şeklinde kullanarak okuyacağım doğru mudur?
Tek bir degiskenle istedigin kadar 'sey' dondurebilirsin cunku objeler de bir degisken:) Ornek:
function getRangeAndIds
local loReturn
loReturn = createobject("Empty") && eski versiyonlarda custom, line, relation, scatter name hilesi ...
*....
addproperty(loReturn, 'BaslangicTarihi', {})
addproperty(loReturn, 'BitisTarihi', date())
addproperty(loReturn, 'Id[10]')
loReturn.Id[1] = ...
*....
return loReturn
Bunu sadece dondurmek icin degil bir yere parametre gondermekte de kullanabilirsin. Eger bulursam birazdan baska yere postaladigim bir calisan ornek gondereyim.
Foxpro2xten gecenler ... tarzindan bir baslik altinda da burada ornek vardi.
Not:
Bu arada cok basit cok eski bir yol madem iki parametre 'gonderiyorsun' onlari geri almak:
MyProcedure(@p1,@p2)
veya:
do MyProcedure with p1, p2
ikisi de parameterleri referans ile gonderdiginden procedureden geri dondugunde yeni degerleri olur.
Kod biraz uzun ve gereginden fazlasi var farkli teknikleri gostermek icin:( Original yeri:
http://forums.microsoft.com/MSDN/ShowPo … p;SiteID=1
clear
*/ COMM_OPTIONS.PRG - Defines Comm Port Parameters on Local Machine /*
*/ Variable declarations copied from main PRG file. Values restored from .CFG file. /*
LOCAL loPortSettings
loPortSettings = GetPortSettings()
? "Commport via hardcoded property:", loPortSettings.CommPort && check via property name
* or dynamically check all properties
LOCAL ix
FOR ix = 1 TO AMEMBERS(aProps,loPortSettings)
? aProps[m.ix]+ " is:", GETPEM(m.loPortSettings,aProps[m.ix])
endfor
FUNCTION GetPortSettings
Local oForm,loParm
Create Cursor parmCreator (CommPort l, BaudRate l, Parity l, ByteLength l, StopBit l)
Scatter Name loParm
Use In "parmCreator" && done with it
* load defaults to parameter object
loParm.CommPort = 1
loParm.BaudRate = 5
loParm.Parity = 0
loParm.ByteLength = 7
loParm.StopBit = 0
oForm = Createobject('myForm',loParm) && create form
oForm.Show(1) && Show as a modal form
*****
* Code would reach here when form's visiblity is false - hide(),visible=.f.,release()
*****
Local laRet[1]
*Since we didn't release but simply hide the form we still have access to it via its ref var
With oForm
Acopy(.rtnVal, laRet ) && copy array to a local array
* set values from form selected values
If !(.Tag == "CANCELLED") && check cancel flag
loParm.CommPort = .OptionGroup1.Value - 1
loParm.BaudRate = .OptionGroup2.Value
loParm.Parity = .OptionGroup3.Value - 1
loParm.ByteLength = Iif(.OptionGroup4.Value = 1, 8, 7)
loParm.StopBit = Iif(.OptionGroup4.Value = 3, 2, 1)
Endif
Endwith
*done with form release it
oForm.Release()
Release oForm && also its variable
* show array
LOCAL ix
FOR ix = 1 TO 5
? "Array member:",m.ix,"Value:",laRet[m.ix]
ENDFOR
RETURN loParm && return settings to caller
endproc
Define Class myForm As Form
ControlBox = .F. && Disable the Control menu box
AlwaysOnTop = .T. && Make option form remain on top
AutoCenter = .T.
Width = 530
Height = 220
BackColor = Rgb(239,239,239)
Caption = "EBU32 Serial Port Settings"
Dimension rtnVal[5] && don't really need this - showing possibilities only
&& Header caption for comm port buttons
Add Object hLabel1 As Label With Top = 10, Left = 20, Caption = 'Ports'
&& Header caption for baud rate buttons
Add Object hLabel2 As Label With Top = 10, Left = 140, Caption = 'Baud'
&& Header caption for parity buttons
Add Object hLabel3 As Label With Top = 10, Left = 250, Caption = 'Parity'
&& Header caption for bytelength/stopbit buttons
Add Object hLabel4 As Label With Top = 10, Left = 350, Caption = 'Byte Length'
&& Comm port buttons group - Value = m.CommPort + 1
Add Object OptionGroup1 As OptionGroup With ;
ButtonCount = 4, Top = 30, Left = 20, AutoSize = .T.,;
BackColor = Rgb(239,239,239),BorderStyle = 0,;
Option1.Caption = "Comm1", Option1.Top = 0,;
Option2.Caption = "Comm2", Option2.Top = 30,;
Option3.Caption = "Comm3", Option3.Top = 60,;
Option4.Caption = "Comm4", Option4.Top = 90
&& Baud rate buttons group - Value = m.BaudRate
Add Object OptionGroup2 As OptionGroup With ;
ButtonCount = 6, Top = 30, Left = 140, AutoSize = .T.,;
BackColor = Rgb(239,239,239),BorderStyle = 0,;
Option1.Caption = "300", Option1.Top = 0,;
Option2.Caption = "1200", Option2.Top = 30,;
Option3.Caption = "2400", Option3.Top = 60,;
Option4.Caption = "4800", Option4.Top = 90,;
Option5.Caption = "9600", Option5.Top = 120,;
Option6.Caption = "19200", Option6.Top = 150
&& Parity buttons group - Value = m.Parity + 1
Add Object OptionGroup3 As OptionGroup With ;
ButtonCount = 3, Top = 30, Left = 250, AutoSize = .T.,;
BackColor = Rgb(239,239,239),BorderStyle = 0,;
Option1.Caption = "None", Option1.Top = 0,;
Option2.Caption = "Odd", Option2.Top = 30,;
Option3.Caption = "Even", Option3.Top = 60
&& Byte length/stop bits buttons group
*Value = Iif(m.ByteLength = 8, 1, Iif(m.Stopbit = 2, 3, 2))
Add Object OptionGroup4 As OptionGroup With ;
ButtonCount = 3, Top = 30, Left = 350, AutoSize = .T.,;
BackColor = Rgb(239,239,239),BorderStyle = 0,;
Option1.Caption = "8 bit byte/1 stop bit", Option1.Top = 0,;
Option2.Caption = "7 bit byte/1 stop bit", Option2.Top = 30,;
Option3.Caption = "7 bit byte/2 stop bit", Option3.Top = 60
&& Create OK command button
Add Object MyCmndBtn1 As CommandButton With ;
Caption = '\<OK', Left = 315, Top = 150, Height = 24, Width = 48
&& Create Cancel command button
Add Object MyCmndBtn2 As CommandButton With ;
Caption = '\<Cancel', Cancel = .T., Left = 385, Top = 150, Height = 24,Width = 48
Procedure Init
Lparameters toParm
With This
.SetAll("Height",30,"OptionButton")
.SetAll("Width",100,"OptionButton")
.SetAll("BackColor",Rgb(239,239,239),"OptionButton")
.SetAll("BackColor",Rgb(239,239,239),"Label")
.SetAll("ForeColor",Rgb(0,51,102),"OptionButton")
.SetAll("ForeColor",Rgb(0,51,102),"Label")
.SetAll("FontSize",12,"OptionButton")
.SetAll("FontSize",12,"Label")
.SetAll("FontBold",.T.,"OptionButton")
.SetAll("FontBold",.T.,"Label")
.SetAll("FontName",'Arial',"OptionButton")
.SetAll("FontName",'Arial',"Label")
.SetAll("TabStop",.F.,"OptionButton")
.SetAll("Autosize",.T.,"Label")
* Set values based on based parameters
.OptionGroup1.Value = toParm.CommPort + 1
.OptionGroup2.Value = toParm.BaudRate
.OptionGroup3.Value = toParm.Parity + 1
.OptionGroup4.Value = Iif(toParm.ByteLength = 8, 1, Iif(toParm.StopBit = 2, 3, 2))
Endwith
Endproc
Procedure MyCmndBtn1.Click
With Thisform
.rtnVal[1] = .OptionGroup1.Value - 1
.rtnVal[2] = .OptionGroup2.Value
.rtnVal[3] = .OptionGroup3.Value - 1
.rtnVal[4] = Iif(.OptionGroup4.Value = 1, 8, 7)
.rtnVal[5] = Iif(.OptionGroup4.Value = 3, 2, 1)
* close Form
.Hide()
Endwith
Endproc
Procedure MyCmndBtn2.Click
* close Form
Thisform.Hide()
Thisform.Tag = "CANCELLED" && set a flag
Endproc
Enddefine
Madem objelerden bahsettik ben de kullandığım bir yöntemden bahsedeyim
Bir formu başka bir form üzerinden çağırıyorum ve çağrılan form çağıran formun tüm property ve methodlarını kullanması gerekiyor. Bu durumda çağrılan formun Init'inde
LParameters toForm As Form
*!* Daha önceden forma oForm adında bir özellik ekledim.
ThisForm.oForm = m.toForm
Formun herhangi bir yerinde çağıran formla ilgili bir işlem yapacaksam
With ThisForm.oForm
.Caption = "Merhaba"
.HerhangiBirMethod
EndWith
Formu çağırırkende
Do Form FormAdi With ThisForm
Şeklinde kullanıyorum.
arkadaşlar açıklamalarınız için teşekkür ederim