HDSoftware Skrevet 8. januar 2007 Skrevet 8. januar 2007 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
Moskus Skrevet 8. januar 2007 Skrevet 8. januar 2007 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?
GeirGrusom Skrevet 8. januar 2007 Skrevet 8. januar 2007 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
j000rn Skrevet 8. januar 2007 Skrevet 8. januar 2007 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
Moskus Skrevet 8. januar 2007 Skrevet 8. januar 2007 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!
HDSoftware Skrevet 8. januar 2007 Forfatter Skrevet 8. januar 2007 (endret) 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 8. januar 2007 av HDSoftware
j000rn Skrevet 9. januar 2007 Skrevet 9. januar 2007 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.
Moskus Skrevet 9. januar 2007 Skrevet 9. januar 2007 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... 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!
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå