Hej! Hej Tobias okej tack ska testa det ;)!! Du kan lägga alla kommandon i en array och sedan iterera igenom den för att kolla om inmatningen är ett kommando. okej?? Vad är det som krånglar med "Split()-koden" menar du? Humm,, det fungerar inte riktigt som det ska värkar det som! Sorry, "LCase" skall det vara, inte "ToLower" :) Fel språk det ;) Tack tack,, Hej igen Tackar och bugar.. Sorry igen :) Tack tack nu funkar allt utom en liten sak, det är att om jag tex skriver help så komer texten upp som den ska sen flyttas den där blinkande | längst upp och hamnar på en ny egen rad.. God kväll Tack så mycket, jag har fått allt att funka nu,, fick ändra en del men nu funkar allt! Nu får du tänka till lite.Textbox ej skrivbar??
Jag håller på med ett program som ska funger ungefär som "windows cmd", jag har komigt en bit på vägen men nu har jag fått stopp,, det är så att jag har en svart textbox som man skiver i med vit text.
Jag har gjort så att när man trycker på "ENTER" så hoppar det ner en rad, och då skickas informationen som man skrev till en string men här får jag problem, för jag vet inte riktigt hur jag ska göra för att plocka ut just den texten man nyss skrev. Då tänkte jag att för varje gång man trycker "enter" så sparar man allt i en string och sen nästa gång så sparar man allt i en string igen och sen tar man den "gammla texten" och tar minus den "nya" texten men jag får det inte att funka riktigt här är koden:
<code>
Private Sub txtcom1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
If strTextGammla = "" Then
strTextNya = txtCom1.Text
Else
strTextGammla = strTextNya
strTextNya = txtCom1.Text
strTextNya = strTextGammla - strTextNya
End If
MsgBox strTextNya
End If
End Sub
</code>
Sen har jag ett annat problem med jag undrar hur man gör om man tex skriver först detta:
Hej
Hej
hej <-- Nu är vi på denna rad..
Det ser ju bra ut men hur går man om man vill göra så att man inte kan ändra den texten som står ovanför för just nu kan man skriva var man fill ungefär!
//Hoppas ni fattar
MVH Tobias LindbergSv: Textbox ej skrivbar??
Du krånglar till det för dig :)
Om jag har förstått det rätt, så vill du hämta ut raden längst ner i din TextBox.
Varför inte bara dela upp texten i inmatningsrutan efter vbCrLf? Då har du "det man nyss skrev" sist i arrayen som genererades av Split funktionen.
Som svar på din andra fråga kan du kontrollera på vilken rad markören befinner sig. Detta går att göra med API-anrop, men också genom att själv implementera funktionaliteten för KeyPress (down/up).
Som svar på din tredje fråga, angående QUIT, så kontrollerar du enkelt den sista texten i ovanstående array.
Nåt i stil med:
Dim strInput as String
Dim strArray
strArray = Split(txtDOS.Text, vbCrLf)
strInput = strArray(Len(strArray))
If ToLower(strInput) = "quit" Then End
/ Peter
Sv:Textbox ej skrivbar??
Men asså för jag hadde tänkt så att jag inte behöver en if sats för varje "comando" för asså typ help, quit är bara en början hadde tänkt att fylla på med mer sen!
Så jag undrar finns det något efektivt sätt att göra så att man inte behöver ha 100- tals if satser!Sv: Textbox ej skrivbar??
Men du måste ändå veta VILKET kommando det är.
Det enklaste är ändå att du använder flera kontroll-satser.
Du kan göra det mer lättläst med en Select-sats:
Select Case strInput
"help":
' Visa hjälptext.
"quit":
' Avsluta program.
End Select
/ Peter
Sv:Textbox ej skrivbar??
Asså den koden som du skrev fick jag inte det att funka med riktigt!!
Så jag anväder denna med 2 textboxar:
<code>
Private Sub txtcom2_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
strTextSkicka = txtCom2
txtCom1 = txtCom1 + vbCrLf + strTextSkicka
txtCom2 = ""
If strTextSkicka = "Help" Then
txtCom1 = txtCom1 + vbCrLf + "|->Här är alla comandon du kan använda än så länge!" + vbCrLf + "|->--------------------" + vbCrLf + "|->| Help |" + vbCrLf + "|->--------------------"
End If
If strTextSkicka = "quit" Then
Unload Me
ElseIf strTextSkicka = "Quit" Then
Unload Me
ElseIf strTextSkicka = "QUIT" Then
Unload Me
End If
End If
End Sub
</code>
Villket sätt skulle vara det enklaste här att använda så man inte behöver ha så många if satser??Sv: Textbox ej skrivbar??
Ev. skriver du:
strInput = strArray(Len(strArray)-1)
Ang. "if-satserna", kan kan du istället använda Select (vilket är mer lättläst än många if):
(och du bör använda & istället för +)
Select Case ToLower(strInput)
"help":
txtCom1 = txtCom1 & _
vbCrLf & "|->Här är alla comandon du kan använda än så länge!" & _
vbCrLf & "|->--------------------" & _
vbCrLf & "|->| Help |" & _
vbCrLf & "|->--------------------"
"quit":
Unload Me
End Select
/ Peter
Sv: Textbox ej skrivbar??
Fört så blir "help": oxh "quit": röda sen så när jag startar programet så säger vb att där det står:
ToLower det står fölande som felmedelande:
Compile error:
Sub or function not defined
Sen har jag en fråga till KayAscii = 13 är väl lika med enter eller?Sv:Textbox ej skrivbar??
Nej, "KayAscii = 13" är inte Enter, men däremot är "KeyAscii = 13" det ;);)
(Använd "vbKeyEnter/vbEnter/vbKeyReturn" (eller nåt liknande) istället för 13)
/ PeterSv: Textbox ej skrivbar??
Man jag får fortfarande fel med
"help": och "quit":
Compile error:
Expected: line number or label or statement or end of statement
sen så har jag en fråga om jag skriver:
if KeyAscii = 13
Din kod händer är
endif
( jag har allt detta i Private Sub txtcom1_KeyPress(KeyAscii As Integer) )Sv:Textbox ej skrivbar??
Sorry igen, jag som skriver för hastigt.
Koden jag skriver testar jag inte innan, så det kan finnas små syntax-fel ibland kanske, som här.
Men du är väl familiär med all syntax i VB??
Det skall vara:
Select Case ToLower(strInput)
case "help":
txtCom1 = txtCom1 & _
vbCrLf & "|->Här är alla comandon du kan använda än så länge!" & _
vbCrLf & "|->--------------------" & _
vbCrLf & "|->| Help |" & _
vbCrLf & "|->--------------------"
case "quit":
Unload Me
End Select
Och i din kod
if KeyAscii = 13
Din kod händer är
endif
så har du glömt "Then".
Det skall alltså vara:
if KeyAscii = 13 Then
Din kod händer är
endif
/ Peter
Sv: Textbox ej skrivbar??
( det där med keyascii , jag hadde bara glömt att skriva then i slutet här på sidan :P )
Men med din kod får jag fortfarande fel på denna rad:
strInput = strArray(Len(strArray) - 1)
Såhär ser strArry ut:
strArray = Split(txtCom1.Text, vbCrLf)
Felmedelande:
Run-time error '13':
Type mismatch
Syntex?? ledsen men jag är rätt så ny innan detta ämne!Sv:Textbox ej skrivbar??
UBound skall du använda dig av.
strInput = strArray(UBound(strArray) - 1)
/ Peter
Sv: Textbox ej skrivbar??
Sen var ju egentligen min "huvud" fråga hur man gör så man inte kan ändra något som redan är skrevigt, om jag text skriver:
Help
så kommer detta upp
|->Här är alla comandon du kan använda än så länge!
|-> --------------------
|->| Help |
|-> --------------------
och jag vill ha det så man inte kan ändra det går det??Sv:Textbox ej skrivbar??
För att kontrollera var markören befinner sig, använder du dig av property'n "SelStart" för TextBoxen.
Sedan kontrollerar du att text endast får skrivas i OMM SelStart > Len(txtCom1.Text)-Len(strInput), dvs att positionen för den blinkande markören befinner sig på den "sista raden".
SelStart = 1 för tecken 1 i textboxen, =2 för tecken 2 osv... (eller om det börjar med =0)
Alltså måste SelStart vara större än längden för all text EXKLUSIVE längden för sista raden.
Denna kontroll bör du göra för de händelser som kan inträffa, vilka ändrar markörens position (key left/right/up/down, Click osv...)
För att inaktivera inmatning (då ovanstående kriterie ej uppfylls (SelStart > Len(txtDOS.Text)-Len(strInput)), så sätter du följande i KeyDown (eller om det är KeyPress):
KeyAscii = 0
Detta avbryter inmatningen.
För att flytta markören till slutet sätter du alltså:
txtCom1.SelStart = Len(txtCom1.SelStart)
/ Peter
Sv: Textbox ej skrivbar??
Då har jag bara en fråga till, om tex någon skriver in:
Open internet
så ska ett internet fönster öppnas, det är inget kostigt med det men jag undrar hur jag ska göra om dom ska få skriva in "egen" kod där alltså regestrera egna commando:
Regestry 'internet' 'C:\Program\Internet Explorer\IEXPLORE.EXE'
hur ska jag göra det?
först blir det väll: Case "Regestry":
men sen då?
Sen där ni ser att det står ' det menas med att det ska vara en avgränsare av ett slag så man vet var det börjar och slutar för dom kan ju lika gärna regestrera 'Internet Explorer' !Sv:Textbox ej skrivbar??
Vad behöver du göra för att parsa nedanstående?
<code>
Register "<name link>" "<program address>"
</code>
Jo, du får dela upp strängen med avgränsare " för att sedan kunna identifiera "Register".
Du får då:
pos 0 = "register "
pos 1 = "<name link>"
pos 2 = ""
pos 3 = "<program address>"
Med andra ord följande:
1. Dela upp med Split
2. Kontrollera första cell
3. Spara till fil/registret
Tredje punkten bör du kontrollera att <name link> inte redan existerar.
Du måste alltså skriva FÖR-definierade kommandon som användarna kan använda sig av.
Register
Delete
Edit
...
Istället för att dela upp efter ", kan du också använda dig av ett reguljärt uttryck för att plocka fram de olika delarna.
Typ:
^register \"(.+)\" \"(.+)\"$
Om det går hämta ut det som står inom parentes på ett smidigt sätt (typ genom \1 \2), vet jag inte riktigt.
Men det går säkert.
/ Peter