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.
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.
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 Sub
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)
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.