Gå til innhold

Form.Show() med retur verdi


Anbefalte innlegg

Heisan folkens

Mulig jeg spør banalt her, men jeg lurer på en liten sak

 

Jeg har en prosedyre som skal vise et login vindu. Dette vinduet setter bare en del egenskaper på et object som jeg har overført med ByRef. Vinduet har de nødvendige påloggingsinformasjonen samt to knapper, OK og AVBRYT. Jeg vil ha til slik at loggon ikke skjer når bruker trykker AVBRYT. Sånn jeg ser det er det flere veier til ROM og ønsker deres vurdering og forslag på den beste løsningen.

 

Dette er måtene jeg har forestillt meg løsningen:

1. Jeg kan overføre en tillegsverdi BYREF og lese denne ut igjen samt at vinduet åpnes med SHOWDIALOG() i stedet for SHOW()

2. Jeg kan sette et globalt flagg som jeg derav kan avlese

3. Jeg kan sette et flagg i objektet jeg overfører

 

Slik jeg ser det vil alle disse virke. Nr. 2 derimot vil ha begrensninger i antall pålogginger, og det kan jeg ikke ha da programmet mitt tillater mange tilkoblinger til forskjellige services.

 

Det beste ville være å gjøre det samme som MessageBox.Show() gjør. Den returnerer jo hvilken knapp som ble trykket på.

 

Noen forslag? Lar det seg f.eks. gjøre å bruke messagebox klassen her? Eller er det rett og slett muliug å bruke SHOWDIALOG() metoden?

 

mvh

Ole

Lenke til kommentar
Videoannonse
Annonse

Hva jeg ville gjort, men det kan sikkert gjøres mer elegant. ;)

 

Override konstruktøren i formen din.

Dim mitt_object as Object

Public Sub New(Byval mitt_reff_objekt as Object)
   mitt_object = mitt_reff_object
End Sub


Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
   mitt_object = "Hei og hallo"
   Me.DialogResult = Windows.Forms.DialogResult.OK
End Sub

 

 

Kall den så på vanlig måte.

Dim obj As String = "Hei på deg"
Dim frm As New frmAdd(obj)
Msgbox(obj) 'Bør gi "Hei og hallo"

 

 

Har jeg glemt noe?

Lenke til kommentar

Vanlig måte å gjøre det på, er å sette formen sin AcceptButton til btnOk, og CancelButton til btnCancel, sett btnOk sin DialogResult til Ok, og btnCancel sin til Cancel, og deretter kalle ShowDialog() på f.eks. denne måten:

 

Public Class LoginCallBackObject
 Private m_userName As String
 Private m_userPassword As String
 Private m_userPasswordHash As Integer
 Public Property UserName() As String
   Get
     Return m_userName
   End Get
   Set(value As Integer)
     m_userName = value
   End Set
 End Property
 Public Property Password() As String
   Get
     Return m_userPassword
   End Get
   Set(value As String)
     m_userPassword = value
     CreateHash()
   End Set
 End Property
 Protected Sub CreateHash()
   ' Password hash algoritme
 End Sub
 Public Overrides Function GetHash() As Integer
   Return m_userPasswordHash
 End Function
End Class
Public Class UserLogin
 Private callback As LoginCallBackObject
 Public Function PerformLogin() As Boolean
   callback = New LoginCallBackObject
   dlgLogin = new frmLogin(callback)
   Return dlgLogin.ShowDialog() == DialogResult.OK
 End Function
End Class

Public Class frmLogin (delvis)
 Private LoginCallBackObject m_callback
 Public Sub New(LoginCallBackObject obj)
   m_callback = obj
 End Sub

 Private Sub btnOk_Click(sender As Object, e As EventArgs)
   m_callback.UserName = txtUserName.Text
   m_callback.Password = txtPassword.Text
 End Sub
End Class

Lenke til kommentar

Jeg må si meg enig med GeirGrusom... De andre måtene var rotete og tungvindte (og vil ikke fungere).

 

En helt annen måte å gjøre dette på er å bruke events.

 

dim mf as new MinForm()

AddHandler mf.FerdigMedTing, addressof MinFunksjon

mf.Show()

 

function MinFunksjon( sender as object, e as MinEventArgs )

messagebox.show( e.Svar )

end function

Lenke til kommentar

Vell, jeg tror faktisk jeg fant ut hva som er den RIKTIGE måten folkens og antagligvis er det nok på denne måten det er beregnet å bli brukt. Jeg prøvde tidligere å sette egenskapene på selve FORM da det er egne properties som heter "AcceptButton" og "CancelButton". Disse virker ikke slik som jeg forventet. Men det er faktisk også en property på alle knapper man setter ut i et vindu. De har propertyet "DialogResult". Denne kan man enten proppe med kode:

me.OKKnapp.DialogResult = Windows.Forms.DialogResult.OK

Eller man kan sette denne rett i property inspectoren i form designeren. Dermed vil programmet sette ME.DIALOGRESULT lik det som er sat tpå knappen. Derfor vil følgende kode være gjeldende:

 

Select Case Me.DialogWindow()
 Case Windows.Forms.DialogResult.Cancel
   ' Utfør kode for AVBRYT
 Case Windows.Forms.DialogResult.OK
   ' Utfør kode for OK
End Select

Som dere ser, mye enklere, og utrolig mye mer lesbart. Og i tillegg kan man også sette Me.DialogResult med kode, slik at det også er mulig å avslutte en dialog uten at bruker har trykket på en knapp:

Me.DialogResult = Windows.Forms.DialogResult.OK
Me.Close()

 

Moskus: Tror du var inne på dette

 

Uansett, takker for svar

 

Ole

Endret av HDSoftware
Lenke til kommentar
De andre måtene var rotete og tungvindte (og vil ikke fungere).

7676026[/snapback]

Dette er jo å skyte seg selv i foten (det å argumenter mot to .NET-guruer), men allikevel:

 

Det er jo enkelt og det fungerer som bare juling! ;)

7676427[/snapback]

 

Sikker?

 

1) Du viser jo ikke formen (minform.Show())

2) Når formen vises så fortsetter koden under med en gang, så i linjen med MsgBox så vil aldri noen ha rukket å trykke på knappen.

 

Ok, den vil vel virke med ShowDialog da :)

 

 

Tips; bruk ByRef istedenfor å sende Object som parametere, da vil den virke med string (value types) også :)

 

 

Uansett så virker alle de standard .Net dialogene på en annen måte, de har heller properties som kan leses. F.eks. FileDialog har MinFileDialog.FileName. Og man slipper å sende inn objektet som denne skal lagres i constructoren.

Lenke til kommentar
1) Du viser jo ikke formen (minform.Show())

2) Når formen vises så fortsetter koden under med en gang, så i linjen med MsgBox så vil aldri noen ha rukket å trykke på knappen.

7678598[/snapback]

Alle kan jo se at jeg glemte frm.ShowDialog. Det løser jo en del... :p

 

 

 

Uansett så virker alle de standard .Net dialogene på en annen måte, de har heller properties som kan leses. F.eks. FileDialog har MinFileDialog.FileName. Og man slipper å sende inn objektet som denne skal lagres i constructoren.

7678598[/snapback]

Det er sant, og man lærer noe nytt hver dag! :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...