Vb6 çıkmazları

Başlatan Ramiz, 11 Şubat 2014, 20:28:04

Ramiz

Son günlerde Vb6 ile bir yapılmış eski bir projemi tamamlamaya uğraşıyordum.. Bu yüzden forum a çok soru sorduğumu ve bu yüzden birkaç farklı başlık açtığımı farkettim. Hepsini bir başlıkta sormak daha mantıklı olur diye düşündüm..


Soru 1:

Vb6 ile While komutuna 2 adet parametrenin doğruluğunu test ederek işlem yaptıracağım.

        Atak = 0
        Do While Form11.Text7.Text <> "1" Or Atak <> 200    ' string aranıyor (buraya arama yapacağın stringi çek)
        Atak = Atak + 1
        On Error Resume Next
        Form11.Data1.Recordset.MoveNext
        Loop


Yukarıdaki komutları, database içersinde "1" stringini arıyor ve 200 arama sonucunda bulamazsa, while dan çıkması isteniyor ama while dan çıkmayıp, yazılım while içersinde takılı kalıyor.

Sanırım buradaki Do While Form11.Text7.Text <> "1" Or Atak = 200  "OR" komutu işe yaramıyor.

Visual Basic 6 da OR komutu lojik VEYA ya karşılık gelmiyormuydu?
Electrical & Electronics Engineering -> Step one

influx

        
        Atak = 0
        Do Until Form11.Text7.Text = "1" Or Atak = 200    ' string aranıyor (buraya arama yapacağın stringi çek)
        Atak = Atak + 1
        On Error Resume Next
        Form11.Data1.Recordset.MoveNext
        Loop

Ramiz

Bu tam olarak işe yaramıyor.

İki şartlı while gibi düşünün.

Eğer Text7.text in içeriği "1" değilse veya Atak = 200 olmamışsa, göngüde kal.

Do until ile döngüde bir kalıp, çıkılıyor.
Electrical & Electronics Engineering -> Step one

iyildirim

While ile test edilirken şart ın  true olması döngü içerisinde kalınacağını söylediğinden  ifadeler AND ile birleşmeli.
Do While Form11.Text7.Text <> "1" AND Atak <> 200    ' string aranıyor (buraya arama yapacağın stringi çek)         
Atak = Atak + 1         
On Error Resume Next         
Form11.Data1.Recordset.MoveNext         
Loop


@influx un verdiği örnek de çalışır. Sorun ne anlamadım.


Logic şartlar doğru bile olsa Recordset içerisinde 200 den daha az kayıt olursa sonsuz döngüde kalınır.
movenext de hata olur. Ama resume next den dolayı aynı kayıt üzerinde kalıp döngüde kalır.

movenext den önce recorset in sona gelip gelmediğini kontrol edin. 

if Form11.Data1.Recordset.EOF Then Exit Do
Form11.Data1.Recordset.MoveNext


gibi..

Ayrıca,
Amaç ne bilmiyorum ama, DB içerisinde birşey aramak için tüm tabloyu bound kontrollere okuyup kontrol etmek pek doğru bir yöntem değil. 
Recordset içerisinde filter, find gibi metotlar kullanılabilir.  Yada direkt recorset açılırken SQL cümlesinin kriterleri ile recordset içeriğinin istediğiniz gibi olmasını sağlayabilirsiniz.

Ramiz

Sorunu gece yarısı şöyle hallettim.

          On Error Resume Next
          Form11.Data1.Recordset.MoveFirst        ' kayıtlar en başına alınıyor
        
          Do While Form11.Text7.Text <> "1"       ' string aranıyor (buraya arama yapacağın stringi çek)
            On Error GoTo Devam1:
            Form11.Data1.Recordset.MoveNext
          Loop
Devam1:



Şimdi olay şu idi, database içersinde bir hücre, text7 ye yönlendirilmişti.(ID hücresi) Bizde ilk 1 numaralı hücreyi bulmaya çalışıyorduk. 1 numaralı hücre 1. satırda olabileceği gibi, 199. hatta 200. satırdada olabilir ama 201. satır olamaz..

Bu program parçacığı, while döndüsü ile Text7 = "1" olana kadar çalışır. Fakat ya içersinde hiç 1 yoksa? O zamanda while döngüsünden kurtulması gerekir. 200 satır sonrası olmadığı için, 200 kere şansını denemesini istiyoruz.

Database zaten 200 satır. While ile denemeye başlıyor. Bulursa, zaten o anda döngüden kurtuluyor, bulamayıp, 200 kez denedikten sonra MoveNext te hata oluşuyor(ve biz 200 kez denendiğini anlıyoruz) yine döngüden kurtuluyor..

Vb den çok uzak kalmışım.. :) o yüzden belki bu sorular ilginç veya basit geliyor olabilir..
Electrical & Electronics Engineering -> Step one

Ramiz

iyildirim

data1.recordset.findfirst sanırım benim işimi görüyor ve benim manual olarak yaptığım şeyi, o otomatikman yapıyor.

Yalnız çalışma mantığını bir türlü anlayamadım.

Alan3 isimli kolonda, "1" stringini arayan bir findfirst kodu paylaşabilirmisin?
Electrical & Electronics Engineering -> Step one

iyildirim

Sanırım DAO kullanıyorsunuz.
Kendi adıma DAO hiç kullanmadım. DAO varken ODBC direct kullanırdım. Sonrada ADO..
Ekteki örnek DAO Help dosyasından.

Find için WHERE kısmına yazdığınız gibi şartı yazıyorsunuz. Sizin konu için  "ID=1"  şeklinde.
Findfirst metodunu işlettikten sonra En alt satırdaki   "FindAny = IIf(rstTemp.NoMatch, False, True)"  gibi nomatch  ile kritere uygun kayıt varmı diye bakıyorsunuz.


Sub FindFirstX()

    Dim dbsNorthwind As Database
    Dim rstCustomers As Recordset
    Dim strCountry As String
    Dim varBookmark As Variant
    Dim strMessage As String
    Dim intCommand As Integer

    Set dbsNorthwind = OpenDatabase("Northwind.mdb")
    Set rstCustomers = dbsNorthwind.OpenRecordset( _
        "SELECT CompanyName, City, Country " & _
        "FROM Customers ORDER BY CompanyName", _
        dbOpenSnapshot)

    Do While True
        ' Get user input and build search string.

strCountry = _
            Trim(InputBox("Enter country for search."))
        If strCountry = "" Then Exit Do
        strCountry = "Country = '" & strCountry & "'"

        With rstCustomers
            ' Populate recordset.
            .MoveLast
            ' Find first record satisfying search string. Exit 
            ' loop if no such record exists.
            .FindFirst strCountry
            If .NoMatch Then
                MsgBox "No records found with " & _
                    strCountry & "."
                Exit Do

End If

            Do While True
                ' Store bookmark of current record.
                varBookmark = .Bookmark
                ' Get user choice of which method to use.
                strMessage = "Company: " & !CompanyName & _
                    vbCr & "Location: " & !City & ", " & _
                    !Country & vbCr & vbCr & _
                    strCountry & vbCr & vbCr & _
                    "[1 - FindFirst, 2 - FindLast, " & _
                    vbCr & "3 - FindNext, " & _
                    "4 - FindPrevious]"
                intCommand = Val(Left(InputBox(strMessage), 1))

If intCommand < 1 Or intCommand > 4 Then Exit Do

                ' Use selected Find method. If the Find fails, 
                ' return to the last current record.
                If FindAny(intCommand, rstCustomers, _
                        strCountry) = False Then
                    .Bookmark = varBookmark
                    MsgBox "No match--returning to " & _
                        "current record."
                End If

            Loop

        End With

        Exit Do
    Loop

    rstCustomers.Close
    dbsNorthwind.Close

End Sub

Function FindAny(intChoice As Integer, _
    rstTemp As Recordset, _
    strFind As String) As Boolean

    ' Use Find method based on user input.
    Select Case intChoice
        Case 1
            rstTemp.FindFirst strFind
        Case 2
            rstTemp.FindLast strFind
        Case 3
            rstTemp.FindNext strFind
        Case 4
            rstTemp.FindPrevious strFind
    End Select

    ' Set return value based on NoMatch property.
    FindAny = IIf(rstTemp.NoMatch, False, True)

End Function



Öte yandan örnekte olduğu gibi recordset açılırken 
"FROM TABLOXXX WHERE  ID= 1 ORDER BY ID"   burada olduğu gibi direkt tablo açmak yerine  WHERE kısmını da yazıp direkt olarak sadece istediğimiz kayıdı içeren bir recordset de oluşturulabilir. 
Recordset de kayıt varmı kısmı ise on error goto-resume  yerine rs.EOF veya rs.BOF ile kontrol edilmeli. Bu amaç için  On error kullanımı hatalı.

İlle de tablo açacaksanız aradığınız kayıdın rastgele bir yerde olmaması için index de belirtebilirsiniz. Veya "SELECT * FROM TABLOXXX ORDER BY ID" gibi de tüm kayıtları ID alanına göre sıralı olarak alabilirsiniz.

Ramiz

#7
iyildirim



Konuyu kendi yönetemim ile çözdüm. 200 satırı taramak, hissedilemeyecek kadar küçük bir zaman kaybı..

Yeni soru:


Vb6 ile Wav dosyası çaldırmak istiyorum. Netteki örneklere bakındım. Çaldırma, durdurma, ilerletme gibi çok fonksiyonlu örnekler var ve benim böyle fonksiyonlara ihtiyacım yok.

Dosya yeri, XXX Wav dosyasını çal demem yeterli. Eskiden anımsadığım kadarı ile, bu işi tek satır kod ile hallediyorduk. Fakat şimdi onu bulamadım..



mesaj birleştirme:: 15 Şubat 2014, 15:17:11

sndPlaySound "sesdosyasy.wav", 1

Buldum!

sesdosyası kısmına wav ın dosya uzantısını yazıyoruz. Bu kadar.. :)
Electrical & Electronics Engineering -> Step one

muhittin_kaplan

Ramiz eger proje yemiyse hic vb60 la ugrasma hadi ugrastin dao ile ugrasma, adodc var

Ramiz

Proje 2005 yılının. Üzerinde değişiklikler yapmam gerekli idi ve şuan bitti.

Çok ama çok boşta olduğum bir zamanda bu yazılımı C# a taşımayı düşünüyorum ama kapsam biraz geniş olduğundan her seferinde üşeniyorum. Çünkü basit 1-2 formlu birşey değil..
Electrical & Electronics Engineering -> Step one

984sami

Alıntı yapılan: Ramiz - 15 Şubat 2014, 16:23:30
Proje 2005 yılının. Üzerinde değişiklikler yapmam gerekli idi ve şuan bitti.

Çok ama çok boşta olduğum bir zamanda bu yazılımı C# a taşımayı düşünüyorum ama kapsam biraz geniş olduğundan her seferinde üşeniyorum. Çünkü basit 1-2 formlu birşey değil..

Çok fazla uğraşmanıza gerek yok, visual studio ile VB6 projelerinizi açtığınızda kodlarınız vb.net kodlarına güncellenir. Yükseltme işlemi sırasında/sonrasında bir rapor düzenlenir ve uyumsuz bir durum varsa bildirilir. Bu raporda; varsa güncellemeden önce değiştirmeniz gerekenler veya güncellemeden sonra kendinizin düzeltmesi gerekenler hata, uyarı gibi gruplar halinde detaylı olarak gösterilir. Sonrasında ise basic kodlarını c# kodlarına çevirmek için uygulamalar var, bir örneği burada : http://www.developerfusion.com/tools/convert/vb-to-csharp/ Artık desteklenmeyen vb6 yı bir an önce terketmenizi tavsiye ederim, tabi öncesinde buna benzer aramalar yapıp biraz bilgi edinmeniz yerinde olur.

Ramiz

Sami bey,

Projemde 18 windows formu, 8 database ve bir çok component var.. Bunu diğer platforma taşırken uğraşılıcak sıkıntılar, O platformda oturup yazmaktan daha ağır olur.
Electrical & Electronics Engineering -> Step one

984sami

Alıntı yapılan: Ramiz - 15 Şubat 2014, 22:16:07
Sami bey,

Projemde 18 windows formu, 8 database ve bir çok component var.. Bunu diğer platforma taşırken uğraşılıcak sıkıntılar, O platformda oturup yazmaktan daha ağır olur.

Projenin bir yedeğini Visual Studio ile açın ve Visual Studio Conversion Wizard a bir şans verin yani en azından deneyin derim, önce yazdığım gibi conversion report size bir durum raporu verir ve karar almanızı kolaylaştırır.

Windows formları designer dosyalarındaki kodlardan ibarettir ve yükseltmede hiç bir sıkıntı çıkarmaz, veritabanı yönetimi VS da çok daha kolaydır, componentlerin ise net veya com referansı olarak daha gelişmiş versiyonları VS da mevcuttur. Net yardım konuları (MSDN kütüphanesi) VB6 ya göre oldukça fazladır, bu ise içerikte kaybolma şeklinde zaman zaman sıkıntı yaratabilir.

VS2005 çıktığında bana o kadar değişik gelmişti ki eski bilgilerimden dolayı inatla VB6 bir programcık yazmıştım. NET yapısını öğrenmek ve VS yi tanımak için aynı kodları vb.nette yazdığımda aslında inat değil aptallık ettiğimi anlamış oldum :)