Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: .NET mene riville & muutama muu pikku ongelma

Sivun loppuun

Juice [11.09.2004 20:27:17]

#

Teen tekstieditoria, ja vastaani on tullut tähän mennessä kaksi hankalaa ongelmaa. Toinen on, että miten pääsen RichTextBoxin tietylle riville. Kokeilemani WinAPI-funktio SendMessage ei oikein toimi. Tähän on varmaan jokin helppo ominaisuus tai funktio vaan kun en löydä.
Tässä kokeilemani koodi:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

Private Sub mnuGotoLine_Click(sender As System.Object, e As System.EventArgs)
			rivi = InputBox("Rivi")
			rtbMain.SelectionStart=SendMessage(Handle.ToInt32, &HBBS, rivi, 0)
		End Sub

Tämän pätkän löysin kiinalaiselta sivustolta (LOL), joten ei oikein kommenteista ollut apua, ja koodikin oli VB6:lle.

Toinen ongelma on paljon helpompi. Tämän päivän metsästin ongelmaa xor-(de)kryptaajastani.
Tässä kryptaaja:

'KRYPTAA
		Private Sub mnuKryptaa_Click(sender As System.Object, e As System.EventArgs)
			Try
				avain = InputBox( _
				"Anna salauskoodi. Huomaa, että jos unohdat salauskoodin, tekstin salausta ei voi enää purkaa. Koodin on oltava luku.","Salakirjoittaminen")
				If avain="" Then Exit Sub
				koodi = CShort(avain)
			Catch
				MessageBox.Show("Epäkelpo salauskoodi.")
				Exit Sub
			End Try
			For i=0 To rtbMain.Text.Length - 1
				kirjain = rtbMain.Text.SubString(i,1)
				teksti &= Asc(kirjain) Xor koodi
			Next
			rtbMain.Text = teksti
		End Sub

Ja tämä dekryptaa:

'PURA KRYPTAUS
		Private Sub mnuDekryptaa_Click(sender As System.Object, e As System.EventArgs)
			Dim numero As Short
			Dim ch As Char
			Try
				avain = InputBox( _
				"Anna salauskoodi, jolla teksti on salattu. Koodin on oltava luku.", "Salakirjoituksen purku")
				If avain = "" Then Exit Sub
				koodi=CShort(avain)
			Catch
				MsgBox("Epäkelpo salauskoodi.")
				Exit Sub
			End Try

			'Tämä ei ole kyllä vuorenvarma, mutta kuka nyt numeroita haluaa kryptata :P
If Not IsNumeric (rtbMain.Text.SubString(i,1)) Then
				MsgBox("Tekstin pitää ensin olla salakirjoitettu!")
				Exit Sub
			End If
			'Itse purku
			For i=0 To rtbMain.Text.Length - 1
				numero = rtbMain.Text.SubString(i,1)
				ch = Chr(numero Xor koodi)
				teksti &= ch
			Next
			rtbMain.Text = teksti
		End Sub

Tämä projekti etenee muuten hienosti. Vapaaehtoisia testaajia otetaan vastaan...
EDIT: Jahah, taaskin näköjään sisennykset qc.

Meitzi [12.09.2004 18:44:49]

#

Tuo kiinalaisjuttu on kyllä aikalailla pielessä.
rtbMain.SelectionStart=SendMessage lauseessa ei ole mitään järkeä.

Tässä toimiva scrollauskoodi:

'*** turha rivi jotta putka näyttäisi paremmin
    Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    Private Const EM_GETLINECOUNT As Integer = &HBA
    Private Const EM_LINESCROLL As Integer = &HB6
    Private Const EM_GETFIRSTVISIBLELINE As Integer = &HCE

    Private Sub ScrollaaRiville(ByVal Rivi As Integer, ByVal Kahva As IntPtr)
        Dim NKohta As Integer
        'Suora komento ei ole mahdollista joten,
        'Ensin selvitetään millä rivillä controlli on nyt
        NKohta = SendMessage(Kahva, EM_GETFIRSTVISIBLELINE, 0, 0)
        'Nyt voidaan laskea pitääkö scrollata ylöspäin vai alaspäin ja minkä verran
        Rivi = Rivi - NKohta
        SendMessage(Kahva, EM_LINESCROLL, 0, Rivi) '0 = ei vertical scrollausta
    End Sub

    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
        Dim Rivi As Integer
        Rivi = CInt(100 * Rnd())
        'Esimerkki
        ScrollaaRiville(Rivi, RichTextBox1.Handle)
        Form1.ActiveForm.Text = CStr(Rivi)
    End Sub

Edelleenkin näyttäisi kooditagi sisentävän ekarivin väärin.

Juice [12.09.2004 19:20:53]

#

Kiitos Meitzi! Toimii hyvin. Muistan sinua krediiteissä... Mutta tota kryptausta en vieläkään ole saanut toimimaan eikä siinäkään kyllä pitäisi olla paljoa pielessä.

EDIT: Ai niin... Miten saisi kursorin kohdistettua sille riville?

Antti Laaksonen [12.09.2004 20:36:01]

#

Kerro nyt ainakin, miten haluat kryptauksen toimivan ja mikä vika siinä tällä hetkellä on...

Juice [12.09.2004 20:59:04]

#

Kryptaus toimii tällä hetkellä niin, että se kyllä muuttaa kirjaimet numeroiksi, mutta purku tulostaa vääriä merkkejä, yleensä neliöitä ja ÿ-merkkejä sekä saman numerosarjan, vaikka koodi on sama. Esimerkiksi merkkijono "pekka" kryptattaisiin avaimella 123 muotoon 1130161626. Purettaessa samalla avaimella tulee 1130161626zzx{z}z}y}. Olen hiukkasen muokannut dekryptausta:

Dim avain, teksti As String
		Dim koodi, i, numero As Short
		Dim kirjain As Char

'PURA KRYPTAUS
		Private Sub mnuDekryptaa_Click(sender As System.Object, e As System.EventArgs)
			Try
				avain = InputBox( _
				"Anna salauskoodi, jolla teksti on salattu. Koodin on oltava luku.", "Salakirjoituksen purku")
				If avain = "" Then Exit Sub
				koodi=CShort(avain)
			Catch
				MsgBox("Epäkelpo salauskoodi.")
				Exit Sub
			End Try

			If Not IsNumeric (rtbMain.Text.SubString(i,1)) Then
				MsgBox("Tekstin pitää ensin olla salakirjoitettu!")
				Exit Sub
			End If
			'Itse purku
			For i=0 To rtbMain.Text.Length - 1
				numero = rtbMain.Text.SubString(i,1)
				kirjain = Chr(numero Xor koodi)
				teksti &= kirjain
			Next
			rtbMain.Text = teksti
		End Sub

Meitzi [13.09.2004 20:03:12]

#

RichTextBox1.Select(100, 0)
siirtää kursorin 100 merkin kohdalle. (ei siis rivin)

Tuossa kryptauksessahan on se iso ongelma, että kun kryptaat vaikka kirjaimen A koodilla 1 tulee vastaukseksi 96. Et voi tämän jälkeen purkaa sitä numeroilla 9 ja 6 vaan se on numero 96.

Ratkaisu, ryhmitä numerot niin että voi eroittaa ne toisistaan. (123 2 234 44 23 jne)

Juice [13.09.2004 20:17:44]

#

Meitzi kirjoitti:

Tuossa kryptauksessahan on se iso ongelma, että kun kryptaat vaikka kirjaimen A koodilla 1 tulee vastaukseksi 96. Et voi tämän jälkeen purkaa sitä numeroilla 9 ja 6 vaan se on numero 96.

Lisäksi tulee pidempiä jonoja kryptaillessa errori "Aritmetreettinen toiminto aiheutti ylivuodon". Pitänee tonkia esille putkan XOR-esimerkki.

EDIT: Onko kellään muuten kokemuksia WinApi-kryptauksesta?

[/lainaus]

Blaze [13.09.2004 22:20:49]

#

Juice kirjoitti:

EDIT: Onko kellään muuten kokemuksia WinApi-kryptauksesta?

Mitäs se semmonen on? o_O

Antti [14.09.2004 01:06:08]

#

Itseasiassa viisainta olisi käyttää CapiComia. Se on Mikkiksen ilmainen kryptaamis rajapinta joka tukee mm. des kryptausta.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta