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 SubTä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 SubJa 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 SubTämä projekti etenee muuten hienosti. Vapaaehtoisia testaajia otetaan vastaan...
EDIT: Jahah, taaskin näköjään sisennykset qc.
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 SubEdelleenkin näyttäisi kooditagi sisentävän ekarivin väärin.
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?
Kerro nyt ainakin, miten haluat kryptauksen toimivan ja mikä vika siinä tällä hetkellä on...
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 SubRichTextBox1.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)
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]
Juice kirjoitti:
EDIT: Onko kellään muuten kokemuksia WinApi-kryptauksesta?
Mitäs se semmonen on? o_O
Itseasiassa viisainta olisi käyttää CapiComia. Se on Mikkiksen ilmainen kryptaamis rajapinta joka tukee mm. des kryptausta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.