快过年了,但思路还一直在程序上啊,这是不是咱们程序员的悲哀?
问题如下:我现在想做一个有关数据库的查询分析器(具体模样与SQLSERVER的相同)。但在处理时碰到了问题第一个,在输入的过程中,如果输入了关键字,则让其改变颜色显示。如输入SELECT,则令其用另外一种颜色显示。如果不是,则显示为普通颜色。另外,如果在SELECT左右加入了方括号,即[SELECT],则又是普通颜色,该怎么处理?第二个,如果碰到了多条SQL语句,比如说编辑器中有两条SQL语句,则应当在两个表格中显示,但我怎么判断它是两条SQL语句啊?谢谢大家了,如果解决了问题,还可另开贴加分(我只能加200了,不然我就按最高的来了)。
问题如下:我现在想做一个有关数据库的查询分析器(具体模样与SQLSERVER的相同)。但在处理时碰到了问题第一个,在输入的过程中,如果输入了关键字,则让其改变颜色显示。如输入SELECT,则令其用另外一种颜色显示。如果不是,则显示为普通颜色。另外,如果在SELECT左右加入了方括号,即[SELECT],则又是普通颜色,该怎么处理?第二个,如果碰到了多条SQL语句,比如说编辑器中有两条SQL语句,则应当在两个表格中显示,但我怎么判断它是两条SQL语句啊?谢谢大家了,如果解决了问题,还可另开贴加分(我只能加200了,不然我就按最高的来了)。
检查 string 如果有 select等字样的 检查他的上一个字符和下一个字符 如果上一个和下一个字符是 空格,或没有上一个字符,则改变输入条的 fontcolor对于第二个,不会ing 我是初学者,不知道 vb还没学全 ^_^
思路:
单词的出现.
1.由于单词是以空格为开始的.所以,在两个空格的中间部分必单词.
2.如果输入点在输入框的最后,那么,从最后向上的倒数第一个空至最后部分必是单词.
由于SQL的关键字是小于32个字符的,所以,我们可以在输入点的向上16个字符和向下16个字符中查找该单词.'==========================================
Dim SqlKey() As String '用于记录关键字.Private Sub Form_Load()
SqlKey() = Split("select,case,updata,where", ",")
End SubPrivate Sub RichTextBox1_Change()
Dim A As Long
Dim B As Long
Dim C As Long
Dim STR As String
Dim STRB As String
Dim D As Long
Dim E As Long
Dim F As Long
Dim K As String
Dim TextLen As Long
Dim O As Long
Dim P As Long
A = rt1.SelStart + 1
TextLen = Len(rt1.Text)
If A <= 16 Then
C = 1
D = A
Else
C = A - 16
D = 16
End If
STR = Mid$(rt1.Text, C, D) '向前取16位字符串.
E = InStrRev(STR, " ") '向前查找空格 If A <> TextLen Then
STRB = Mid$(rt1.Text, D + 1, 16) '向后取16位字符串.
F = InStr(STRB, " ") '向后查找空格
End If
If E + F = 0 Then
K = STR & STRB
Else
K = Mid$(STR & STRB, IIf(E = 0, 1, E), Len(STR) - E + F + 1)
End If
K = Trim$(K) '找出单词.
Me.Caption = K
If FindKey(K) Then '判断是否是关键字.
O = rt1.SelStart
rt1.SelStart = IIf(O > 1, O - Len(K), 1)
rt1.SelLength = Len(K)
rt1.SelColor = RGB(255, 0, 0)
Else
O = rt1.SelStart
rt1.SelStart = IIf(O > 1, O - Len(K), 1)
rt1.SelLength = Len(K)
rt1.SelColor = RGB(0, 0, 0)
End If
rt1.SelStart = O
rt1.SelLength = 0End Sub'最好改为快速查找法.
Function FindKey(KeyStr As String) As Boolean
Dim t As Long
Dim RetVal As Boolean
RetVal = False
For t = 0 To UBound(SqlKey)
If UCase$(KeyStr) = UCase$(SqlKey(t)) Then
RetVal = True
Exit For
End If
Next
FindKey = RetVal
End Function第二个,如果碰到了多条SQL语句,比如说编辑器中有两条SQL语句,则应当在两个表格中显示,但我怎么判断它是两条SQL语句啊?情况一.如果只运行查询语句,可以将回车符CHR(13)作为每条语句的分隔符.
情况二.如果还有其它部分,那么,问题将会变得复杂起来.例如:建表语句,就可以包括很多个回车符.这种情形下,你只能以某个单词开始的为分隔符.常用开始单词有.
SELECT UPDATA INSET INTO CREATE .等等 .....
将该类型单词至下一个单词的开始的中间部分可作为一条语句.
Select (Select Max(ID) From Other Where Tool.Name=Other.Name) From Tool第二个问题:语句同上,中间的Select似乎无法成为分隔符。谢谢解答
E = InStrRev(STR, " ") '向前查找空格
STR = Mid$(rt1.Text, C, D) '向前取16位字符串.
T = InStrRev(STR, ")") '向前查找)
IF T>E THEN E=T STRB = Mid$(rt1.Text, D + 1, 16) '向后取16位字符串.
F = InStr(STRB, " ") '向后查找空格
G = InStr(STRB, ")") '向后查找)格
IF G<F THEN F=G
DIM SQLQUY() AS STRING
SQLQUY=SPLIT(RTF.TEXT,"#GO")
那么,数组SQLQUY保存是就是分隔后的SQL语句.
可以這麽來做,但是這樣程度會有限制,因為編譯器的文字變色是在控件前的基礎上做的,也就是直接在視圖的底層上進行操作,用VB只能是在控制項的基礎上做,速度肯定跟不上.2.比較簡單的方法是在不同的SQL語句後面用分號隔開. PB就是這麽實現的~~~~~
http://www.c-sharpcorner.com/Code/2003/June/ColorSyntaxEditor.asp
另:谢谢rainstormmaster(暴风雨 v2.0)给的代码,正是我想要的结果,我试着改成VB代码试试。大家再帮我分析一下如何判断多个SQL语句啊。