• 0
نهى عيسى

استخدام التايمر

سؤال

لذى كود الحفظ  واريد ان تظهر لي رسالة الحفظ في ثانية وتختفي تلقائيا بدون الضغط على زر موافق 

وهذا هو الكود

  mycon = New SqlClient.SqlConnection(myconstring)
        Try
            mycon.Open()
            Dim myInsertquery As String = "InSert into arrival_stream(e_nr,a_tr,da,mo,ye)values('" & TextBox6.Text & "','" & TextBox7.Text & "','" & TextBox3.Text & "','" & TextBox4.Text & "','" & TextBox5.Text & "')"
            Dim mycom As SqlClient.SqlCommand = New SqlClient.SqlCommand(myInsertquery)
            mycom.Connection = mycon
            RA = mycom.ExecuteNonQuery()
            MessageBox.Show("عملية الاضافة تمت" & RA)
            mycon.Close()
        Catch ex As Exception
            MsgBox("عملية الاضافة لم تنم")
        End Try
        TextBox1.Text = ""
        TextBox6.Text = ""
    End Sub

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

3 إجابة على هذا السؤال .

  • 1

أفضل حل هو انشاء فورم جديد مخصص لعرض هذه الرسالة وانشاء مؤقت داخله للاغلاق الذاتي

مثال

Public Class Form1
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Using frm2 = New Form2
      frm2.ShowDialog()
    End Using
  End Sub
End Class

'الفورم المخصص لعرض الرسالة

Public Class Form2
  Private WithEvents tm As New Timer
  Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    tm.Interval = 10000
    tm.Start()
  End Sub
  Private Sub tm_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tm.Tick
    Close()
  End Sub
End Class

او استخدام الوندوز api

مثال

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte,
                       ByVal bScan As Byte, _
                       ByVal dwFlags As Byte, _
                       ByVal dwExtraInfo As Byte)

    Private Const VK_RETURN As Byte = &HD
    Private Const KEYEVENTF_KEYDOWN As Byte = &H0
    Private Const KEYEVENTF_KEYUP As Byte = &H2

    Public Sub msgboxautoclose(ByVal Message As String, Optional ByVal Style As MsgBoxStyle = Nothing, Optional ByVal title As String = Nothing, Optional ByVal delay As Integer = 5)
        Dim t As New Threading.Thread(AddressOf closeMsgbox)
        t.Start(delay) 
        MsgBox(Message, Style, title)
    End Sub

    Private Sub closeMsgbox(ByVal delay As Object)
        Threading.Thread.Sleep(CInt(delay) * 1000)
        AppActivate(Me.Text)
        keybd_event(VK_RETURN, 0, KEYEVENTF_KEYDOWN, 0)
        keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0)
    End Sub

لاظهار الرسالة استخدمي

msgboxautoclose("Sample message goes here", MsgBoxStyle.Information, "Title Message", 5)

عدلي زمن العرض بالثواني - في المثال تعرض الرسالة لخمس ثوان

المصدر/ http://www.vbforums.com/showthread.php?605979-self-closing-message-box&p=3745046#post3745046

تم تعديل بواسطه Mohamed Krayem
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 1

صحيح

افتراضيا الـ messagebox لا يمكن اغلاقها برمجيا بعد فتحها الا بالطريقة الثانية windows api

خليني اشرح الطريقة الاولى اولا وبعدين اختاري اللي يناسبك

في الطريقة الاولى كانت الفكرة انك تصممي فورم جديد بنفس واجهة رسالة الخطأ، يعني اعتبري انك تصممي في messagebox وممكن تلغي البوردر منها وممكن تكون من غير زر موافق وكذا

وعند الحاجة لاظهار الرسالة نستدعي الفورم الجديد وكانه هو الرسالة ونستخدم معه تايمر لاغلاقه بعد مدة معينة

لاننا نستطيع اغلاق الفورم برمجيا ولا نستطيع اغلاق الرسالة برمجيا

هذا المغزى من الفكرة الاولى

أما الفكرة الثانية فهي مناسبة جدا لطلبك ولا تستخدم فورم جديد وانما تتعامل مع المسج بوكس مع تغيير بسيط في كود استدعاء الرسالة

كل ما عليك هو اضافة الفنكشن الى الملف خارج حدث اللود وهذا هو الكود -اضيفيه بعد اغلاق حدث اللود-

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte,
                       ByVal bScan As Byte, _
                       ByVal dwFlags As Byte, _
                       ByVal dwExtraInfo As Byte)

    Private Const VK_RETURN As Byte = &HD
    Private Const KEYEVENTF_KEYDOWN As Byte = &H0
    Private Const KEYEVENTF_KEYUP As Byte = &H2

    Public Sub msgboxautoclose(ByVal Message As String, Optional ByVal Style As MsgBoxStyle = Nothing, Optional ByVal title As String = Nothing, Optional ByVal delay As Integer = 5)
        Dim t As New Threading.Thread(AddressOf closeMsgbox)
        t.Start(delay) 
        MsgBox(Message, Style, title)
    End Sub

    Private Sub closeMsgbox(ByVal delay As Object)
        Threading.Thread.Sleep(CInt(delay) * 1000)
        AppActivate(Me.Text)
        keybd_event(VK_RETURN, 0, KEYEVENTF_KEYDOWN, 0)
        keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0)
    End Sub

والان نعود الى كود البرنامج الاساسي الذي يتحقق من الموظف

عندك في سطرين

الاول

            MessageBox.Show("عملية الاضافة تمت" & RA)

والثاني

            MsgBox("عملية الاضافة لم تنم")

 

استبدلي كليهما بالاستدعاء الجديد

        msgboxautoclose("نص الرسالة", MsgBoxStyle.Information, "عنوان الرسالة", 5)

غيري "نص الرسالة" حسب الحاجة

وغيري مدة العرض قبل الاغلاق التلقائي حسب ما يناسبك، هي الان 5 ثواني 

اتمنى ان تكون الفكرة وضحت الان

==================

لدي فكرة اخرى لو كنت محلك لاعتمدتها هي

لان من غير المناسب ان اعرض رسالة خطأ لمدة ثانية واحدة وتختفي

الفكرة انك تضيفي label في الفورم وتكبري حجمه واثناء فحص الموظف اذا نجح نغير خلفية الـ label الى اخضر ونصه الى نص النجاح -عملية الاضافة تمت-

واذا لم تنجح نغير اللون احمر والنص الى نص رسالة الفشل او اعادة المحاولة

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

انا مافهمت هل هذا كله لاجل عرض الرسالة زمن معين 

وانا الكود يلي استخدمته  مكتوب في الفورم لود وهي فورم لتسجيل حضور الموظف  وهي خالية من اي button 

اي بمجر ما يقوم الموظف بتمرير بطاقته على جهاز الباركود تثم عملية الحفظ اي اتتبيث الحضور  انا اريد عند ظهور رسالة تمت عملية الحفظ تختفي تلقائيا بعد ثانية 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .