📄 fform.class
字号:
' Gambas class filePUBLIC Name AS StringPUBLIC Path AS StringPUBLIC Master AS CControlPUBLIC Selection AS NEW CollectionPUBLIC Control AS CollectionPUBLIC Menus AS NEW Object[]PRIVATE $bDoNotModify AS BooleanPRIVATE $bModify AS BooleanPRIVATE $bSelChange AS BooleanPRIVATE $bReadOnly AS BooleanPRIVATE $bActivate AS Boolean' Gestion de la sourisPRIVATE $iMode AS IntegerPRIVATE CONST MODE_NOTHING AS Integer = 0PRIVATE CONST MODE_CREATE AS Integer = 1PRIVATE CONST MODE_MOVE AS Integer = 2PRIVATE CONST MODE_SELECT AS Integer = 3PRIVATE $sTool AS StringPRIVATE $hCurrent AS CControlPRIVATE $X AS IntegerPRIVATE $Y AS IntegerPRIVATE $MX AS IntegerPRIVATE $MY AS IntegerPRIVATE $W AS IntegerPRIVATE $H AS IntegerPRIVATE $XS AS IntegerPRIVATE $YS AS IntegerPRIVATE $WS AS IntegerPRIVATE $HS AS IntegerPRIVATE CONST MIN_WIDTH AS Integer = 4PRIVATE CONST MIN_HEIGHT AS Integer = 4' Gestion de la sauvegardePRIVATE $sSave AS StringPRIVATE $iSaveX AS IntegerPRIVATE $iSaveY AS Integer'PRIVATE $iIndent AS INTEGERPRIVATE $iSaveLevel AS IntegerPRIVATE $bSelectNew AS BooleanPRIVATE $bMustArrange AS BooleanPRIVATE CONST FORM_CLIPBOARD_FORMAT AS String = "text/x-gambas-form"'PRIVATE CONST FORM_NAME AS String = "$"PUBLIC SUB _new(sPath AS String) DIM sData AS String Path = sPath Name = File.BaseName(sPath) Control = NEW Collection(gb.Text) 'mnuSave.Enabled = NOT Project.ReadOnly SetReadOnly sData = File.Load(sPath) IF UCase(Left$(sData, Len(Project.FORM_MAGIC))) <> UCase(Project.FORM_MAGIC) THEN Message.Warning(("Bad form file")) RETURN ENDIF 'ME.Font.Size = $bDoNotModify = TRUE sData = Mid$(sData, Len(Project.FORM_MAGIC) + 1) FromString(sData) DrawTitle RefreshMenuENDPRIVATE SUB FromString(sData AS String, OPTIONAL hParent AS CControl) DIM hCtrl AS Object 'DIM hParent AS OBJECT DIM sName AS String DIM sClass AS String DIM iPos AS Integer DIM sLine AS String DIM hData AS CControl DIM sProperty AS String DIM sValue AS String DIM vValue AS Variant DIM iLevel AS Integer DIM bFirst AS Boolean DIM sEventName AS String DIM cCoord AS String[] hCtrl = hParent bFirst = TRUE WHILE sData iPos = Instr(sData, gb.newLine) IF iPos = 0 THEN sLine = Trim(sData) sData = "" ELSE sLine = Trim(Left$(sData, iPos - 1)) sData = Mid$(sData, iPos + 1) ENDIF 'PRINT "> "; sLine IF Len(sLine) = 0 THEN CONTINUE IF Left$(sLine, 1) = "#" THEN sLine = Mid$(sLine, 2) IF Left$(sLine, 1) = "{" THEN sLine = Trim(Mid$(sLine, 2)) iPos = Instr(sLine, " ") sName = Left$(sLine, iPos - 1) sClass = Trim(Mid$(sLine, iPos + 1)) iPos = Instr(sClass, " ") IF iPos THEN sEventName = Trim(Mid$(sClass, iPos + 1)) sClass = Trim(Left$(sClass, iPos - 1)) ELSE sEventName = "" ENDIF IF Left$(sClass) = "#" THEN sClass = Mid$(sClass, 2) IF IsNull(hCtrl) THEN sName = Name IF sClass = "Image" THEN PRINT "Image -> PictureBox" sClass = "PictureBox" ENDIF hCtrl = CreateControl(sClass, hCtrl, sName) IF sEventName THEN hCtrl.SetProperty(CPropertyInfo.EVENT_NAME, sEventName) INC iLevel ELSE IF Left$(sLine, 1) = "}" THEN 'IF hCtrl = hParent THEN RETURN DEC iLevel IF iLevel = 0 THEN IF $bSelectNew THEN hCtrl.Select(ME, bFirst) bFirst = FALSE ENDIF ENDIF hCtrl = hCtrl.Parent ELSE iPos = Instr(sLine, "=") IF iPos THEN sProperty = Trim(Left$(sLine, iPos - 1)) sValue = Trim(Mid$(sLine, iPos + 1)) vValue = Val(sValue) IF IsNull(vValue) THEN IF Left$(sValue, 2) = "(" & Chr$(34) THEN sValue = Mid$(sValue, 2, -1) ENDIF IF Left$(sValue, 1) = Chr$(34) THEN vValue = Mid$(sValue, 2, Len(sValue) - 2) vValue = Replace(vValue, "\\n", gb.NewLine) vValue = Replace(vValue, "\\" & Chr$(34), Chr$(34)) vValue = Replace(vValue, "\\\\", "\\") ELSE IF Left$(sValue, 5) = "Font[" THEN vValue = Mid$(sValue, 7, -2) ELSE IF Left$(sValue, 8) = "Picture[" THEN vValue = Mid$(sValue, 10, -2) 'PRINT File.Dir(Project.Path) &/ Mid$(sValue, 9, -1) 'vValue = Picture[File.Dir(Project.Path) &/ Mid$(sValue, 9, -1)] ELSE IF UCase(sValue) = "TRUE" THEN vValue = TRUE ELSE IF UCase(sValue) = "FALSE" THEN vValue = FALSE ELSE IF Left$(sValue, 6) = "CDate(" THEN vValue = CDate(Mid$(sValue, 8, -2)) ELSE iPos = Instr(sValue, ".") IF iPos THEN vValue = Mid$(sValue, iPos + 1) ELSE PRINT "Bad property value "; sValue ENDIF ENDIF ENDIF IF hCtrl.SetProperty(sProperty, vValue) THEN PRINT "Error: "; hCtrl.Kind; "."; sProperty; " = "; sValue ENDIF ELSE IF Left$(sLine, 5) = "Move(" THEN cCoord = Split(Mid$(sLine, 6, -1)) 'TRY PRINT cCoord[0]; ","; cCoord[1]; ","; cCoord[2]; ","; cCoord[3] TRY hCtrl.Move(Val(cCoord[0]), Val(cCoord[1]), TRUE) 'TRY hCtrl.SetProperty("X", Val(cCoord[0])) 'TRY hCtrl.SetProperty("Y", Val(cCoord[1])) IF cCoord.Count >= 2 THEN TRY hCtrl.Resize(Val(cCoord[2]), Val(cCoord[3]), TRUE) ENDIF IF ERROR THEN PRINT "Error: Syntax error: "; sLine ELSE PRINT "Error: Syntax error: "; sLine ENDIF ENDIF WENDENDPUBLIC FUNCTION Save() AS Boolean DIM hFic AS File IF Project.ReadOnly THEN RETURN IF NOT $bModify THEN RETURN UnselectAll Save.Begin(Path) ResetSave AddLine(Project.FORM_MAGIC) AddLine() SaveOne(Control[Name]) File.Save(Path, $sSave) Project.SetFormIcon(ME) 'OPEN Path & ".test" FOR CREATE AS #hFic ' y a un truc bizarre avec CREATE ! 'PRINT #hFic, $sSave 'CLOSE #hFic $sSave = "" $bModify = FALSE DrawTitle Save.End()CATCH RETURN Save.Error()ENDPUBLIC SUB AddLine(OPTIONAL sLig AS String) DIM sAdd AS String 'IF Left$(sLig, 1) = "}" THEN $iIndent = $iIndent - 1 sAdd = Space$($iSaveLevel * 2) & sLig 'PRINT sAdd $sSave = $sSave & sAdd & gb.NewLine 'IF Left$(sLig, 1) = "{" THEN $iIndent = $iIndent + 1ENDPUBLIC FUNCTION GetChildren(sName AS String) AS Object[] DIM cList AS NEW Object[] DIM hCtrl AS CControl DIM hChild AS Control DIM iTab AS Integer DIM hMenu AS Menu DIM hTab AS TabStrip hCtrl = Control[sName] IF IsNull(hCtrl) THEN RETURN IF NOT hCtrl.IsContainer() THEN RETURN IF hCtrl.Kind = "Form" THEN FOR EACH hMenu IN ME.Menus cList.Add(Control[hMenu.Tag]) NEXT FOR EACH hChild IN hCtrl.Control.Children cList.Add(Control[hChild.Tag]) NEXT ELSE IF hCtrl.Kind = "TabStrip" THEN hTab = hCtrl.Control FOR iTab = 0 TO hTab.Count - 1 FOR EACH hChild IN hTab[iTab].Children cList.Add(Control[hChild.Tag]) NEXT NEXT ELSE IF hCtrl.Kind = "Menu" THEN FOR EACH hMenu IN hCtrl.Control.Children cList.Add(Control[hMenu.Tag]) NEXT ELSE FOR EACH hChild IN hCtrl.Control.Children cList.Add(Control[hChild.Tag]) NEXT ENDIF RETURN cListENDPRIVATE SUB SaveOne(hCtrl AS CControl) DIM hChild AS Control DIM sLine AS String DIM hMenu AS Menu DIM hMenuCtrl AS CControl DIM cProp AS String[] DIM hTab AS TabStrip DIM iTab AS Integer DIM sVal AS String DIM vVal AS Variant DIM iArr AS Integer 'hCtrl = Control[sName] IF IsNull(hCtrl) THEN RETURN IF hCtrl.Virtual THEN AddLine(Trim("{ " & hCtrl.Name & " #" & hCtrl.Kind & " " & hCtrl.GetProperty(CPropertyInfo.EVENT_NAME))) ELSE AddLine(Trim("{ " & hCtrl.Name & " " & hCtrl.Kind & " " & hCtrl.GetProperty(CPropertyInfo.EVENT_NAME))) ENDIF IF $iSaveLevel = 0 THEN cProp = hCtrl.GetEachProperty($iSaveX, $iSaveY) ELSE cProp = hCtrl.GetEachProperty(0, 0) ENDIF $iSaveLevel = $iSaveLevel + 1 FOR EACH sLine IN cProp AddLine(sLine) NEXT IF hCtrl.IsContainer() THEN TRY iArr = CComponent.Classes[hCtrl.Kind].Symbols["_Arrangement"].Value IF NOT ERROR THEN IF iArr = Arrange.Fill THEN iArr = 0 TRY iArr = CComponent.Classes["Arrange"].Symbols[hCtrl.GetProperty("Arrangement")].Value ENDIF IF iArr THEN IF hCtrl.Kind = "TabStrip" THEN ELSE ArrangeContainer(hCtrl.Control, iArr, FALSE) ENDIF ENDIF ENDIF IF hCtrl.Kind = "Form" THEN FOR EACH hMenuCtrl IN ME.Menus SaveOne(hMenuCtrl) NEXT FOR EACH hChild IN hCtrl.Control.Children SaveOne(Control[hChild.Tag]) NEXT ELSE IF hCtrl.Kind = "TabStrip" THEN hTab = hCtrl.Control FOR iTab = 0 TO hTab.Count - 1 AddLine("Index = " & CStr(iTab)) sVal = Replace(hTab[iTab].Text, "\\", "\\\\") sVal = Replace(sVal, Chr$(34), "\\" & Chr$(34)) sVal = Replace(sVal, gb.NewLine, "\\n") AddLine("Text = (" & Chr$(34) & sVal & Chr$(34) & ")") IF hCtrl.Tag THEN sVal = hCtrl.Tag[iTab] IF sVal THEN AddLine("Picture = Picture[" & Chr$(34) & sVal & Chr$(34) & "]") ENDIF ENDIF FOR EACH hChild IN hTab[iTab].Children SaveOne(Control[hChild.Tag]) NEXT NEXT 'AddLine("Index = " & CStr(hTab.Index)) AddLine("Index = 0") ELSE IF hCtrl.Kind = "Menu" THEN FOR EACH hMenu IN hCtrl.Control.Children SaveOne(Control[hMenu.Tag]) NEXT ELSE FOR EACH hChild IN hCtrl.Control.Children SaveOne(Control[hChild.Tag]) NEXT ENDIF ENDIF $iSaveLevel = $iSaveLevel - 1 AddLine("}")ENDPUBLIC SUB Form_Resize() IF NOT LAST.Visible THEN RETURN WITH Control[Name] .Control.Resize(ME.ClientWidth, ME.ClientHeight) .SetProperty("Width", ME.Width) .SetProperty("Height", ME.Height) END WITHEND'PUBLIC SUB Form_KeyPress(Ascii AS String, Code AS Integer, State AS Integer)'' Project.Shortcut(Code, Ascii, State)''ENDPRIVATE $bInFormMove AS BooleanPUBLIC SUB Form_Move() IF NOT LAST.Visible THEN RETURN IF $bInFormMove THEN RETURN 'PRINT "Form_Move"; ME.X; ME.Y $bInFormMove = TRUE WITH Control[Name] 'PRINT "Set X" .SetProperty("X", ME.X, TRUE) 'PRINT "Set Y" .SetProperty("Y", ME.Y, TRUE) END WITH 'Control[Name].Parent.Move(ME.X, ME.Y) $bInFormMove = FALSEENDPUBLIC SUB Control_MouseDown() 'PRINT "> Control_MouseDown" DIM X AS Integer DIM Y AS Integer X = Mouse.X Y = Mouse.Y $hCurrent = Control[LAST.Tag] $sTool = FToolBox.GetTool() $X = LAST.X $Y = LAST.Y $MX = LAST.ScreenX + X $MY = LAST.ScreenY + Y 'IF $hCurrent.Kind = "GridView" THEN ' PRINT "MouseDown: $X ="; $X; " $Y ="; $Y; " $MX ="; $MX; " $MY ="; $MY ' PRINT "X ="; X; " Y ="; Y 'ENDIF IF $sTool = "" THEN IF Mouse.Control OR $hCurrent.Name = Name THEN $XS = X $YS = Y $iMode = MODE_SELECT $W = 0 $H = 0 GOTO FIN ELSE IF Master <> $hCurrent THEN IF NOT $hCurrent.Selected THEN UnSelectAll ENDIF SelectCurrent(TRUE) ENDIF IF $bReadOnly THEN RETURN $iMode = MODE_MOVE ENDIF ELSE IF $bReadOnly THEN RETURN IF NOT $hCurrent.IsContainer() THEN X = X + $hCurrent.Control.X + $hCurrent.Control.Parent.ClientX Y = Y + $hCurrent.Control.Y + $hCurrent.Control.Parent.ClientY $hCurrent = $hCurrent.Parent IF $hCurrent.Kind = "ScrollView" THEN X = X - $hCurrent.Control.ScrollX Y = Y - $hCurrent.Control.ScrollY ENDIF ENDIF $iMode = MODE_CREATE $X = X $Y = Y '$hCurrent = CreateControl(, $sTool, $hCurrent) ENDIF RefreshPropertyFIN: 'PRINT "< Control_MouseDown"ENDPUBLIC SUB Control_MouseMove() DIM X AS Integer DIM Y AS Integer DIM iDepX AS Integer DIM iDepY AS Integer DIM hCtrl AS CControl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -