📄 fproperty.class
字号:
' Gambas class filePRIVATE $iBackground AS IntegerPRIVATE $cIndex AS NEW CollectionPRIVATE $bMany AS BooleanPRIVATE $hObject AS ObjectPRIVATE $hForm AS ObjectPRIVATE $iLast AS IntegerPRIVATE $sLast AS StringPRIVATE $sType AS StringPRIVATE $hEditor AS ObjectPRIVATE $sOldVal AS StringPRIVATE $bFreeze AS BooleanPRIVATE $bButton AS BooleanPRIVATE $bIgnoreHide AS BooleanPUBLIC SUB _new() grdProperty.Columns.Count = 2 grdProperty.ScrollBar = Scroll.Vertical grdProperty.Columns.Resizable = TRUE $iBackground = grdProperty.Background ME.Move(Desktop.Width - ME.Width, 0) Config.LoadWindow(ME, "/FProperty") ReadConfigENDPUBLIC SUB Form_Close() Config.SaveWindow(ME, "/FProperty")ENDPUBLIC SUB Form_Resize() DIM iWidth AS Integer lblMessage.Width = ME.ClientW - lblMessage.X * 2 grdProperty.Move(0, 0, ME.ClientWidth, ME.ClientHeight) IF grdProperty.Columns.Count < 2 THEN RETURN iWidth = Min(128, grdProperty.ClientWidth \ 2) grdProperty.Columns[0].Width = iWidth grdProperty.Columns[1].Width = grdProperty.ClientWidth - iWidth 'grdProperty.Columns.Width = 100 'ME.ClientWidth / 4 MoveProperty 'CATCH $$ Non déréférencement en cas d'erreurENDPUBLIC SUB RefreshAll() DIM cSelection AS Collection DIM hCtrl AS CControl DIM sClass AS String DIM bDiff AS Boolean DIM cProp AS String[] DIM hProp AS CPropertyInfo DIM iRow AS Integer DIM sProp AS String DIM sVal AS String DIM hCtrlAlone AS CControl DIM cKeyProp AS Collection $hForm = Project.ActiveForm IF NOT $hForm THEN RETURN 'GOTO _HIDE TRY cSelection = $hForm.Selection IF NOT cSelection THEN RETURN $cIndex.Clear $bMany = FALSE HideProperty $hObject = NULL IF NOT cSelection THEN GOTO _HIDE IF cSelection.Count = 0 THEN cSelection = NEW Collection cSelection.Add($hForm.Control[$hForm.Name], $hForm.Name) ENDIF $bMany = cSelection.Count > 1 FOR EACH hCtrl IN cSelection IF sClass = "" THEN $hObject = hCtrl sClass = hCtrl.Kind ELSE IF sClass <> hCtrl.Kind THEN bDiff = TRUE ENDIF NEXT IF bDiff THEN sClass = "Control" 'PRINT "Kind = "; sClass 'cProp = CControl.PropertiesInOrder[sClass] cProp = CComponent.Classes[sClass].PropertyList 'PRINT "FProperty: "; sClass; ": "; cProp.Join() grdProperty.Rows.Count = cProp.Count + 3 grdProperty.Columns.Count = 2 'grdProperty.Clear grdProperty[iRow, 0].Text = "(Class)" grdProperty[iRow, 1].Text = $hObject.Kind INC iRow grdProperty[iRow, 0].Text = "(Name)" IF $bMany THEN grdProperty[iRow, 1].Text = "" ELSE grdProperty[iRow, 1].Text = $hObject.Name ENDIF iRow = iRow + 1 'grdProperty[iRow, 0].Text = "(Event name)" 'IF $bMany THEN ' grdProperty[iRow, 1].Text = "" 'ELSE ' grdProperty[iRow, 1].Text = $hObject.EventName 'ENDIF ' 'iRow = iRow + 1 FOR EACH sProp IN cProp 'PRINT sProp hProp = CComponent.Classes[sClass].GetProperties()[sProp] IF hProp.Hidden THEN CONTINUE $cIndex[sProp] = iRow grdProperty[iRow, 0].Text = sProp sVal = GetProperty(sProp) grdProperty[iRow, 1].Text = sVal INC iRow NEXT grdProperty.Rows.Count = iRow Form_Resize grdProperty.Visible = TRUE RETURN_HIDE: HideAllENDPUBLIC SUB HideAll() HideProperty grdProperty.Visible = FALSEENDPUBLIC SUB RefreshOne(hCtrl AS CControl, sProp AS String) IF NOT $bMany THEN IF $hObject <> hCtrl THEN RETURN ENDIF IF sProp = "Name" THEN IF $bMany THEN RETURN grdProperty[1, 1].Text = $hObject.Name ELSE IF NOT $cIndex.Exist(sProp) THEN RETURN grdProperty[$cIndex[sProp], 1].Text = GetProperty(sProp) ENDIF IF sProp = $sLast THEN CancelProperty ENDIFENDPRIVATE FUNCTION SaveProperty() AS Boolean DIM vVal AS Variant DIM hCtrl AS CControl DIM sMsg AS String IF IsNull($hEditor) THEN RETURN FALSE vVal = $hEditor.Text IF vVal = $sOldVal THEN RETURN FALSE SELECT $sType CASE "Name" IF IsNull(vVal) THEN GOTO _CANCEL IF CControl.CheckName(vVal) THEN sMsg = ("Forbidden characters in control name.") GOTO _CANCEL ENDIF IF $hObject.Rename(vVal) THEN sMsg = ("This name is already in use.") GOTO _CANCEL ENDIF RefreshOne($hObject, "Name") RETURN FALSE CASE "Group" IF CControl.CheckName(vVal) THEN sMsg = ("Forbidden characters in control group.") GOTO _CANCEL ENDIF 'CASE "EventName" ' ' FOR EACH hCtrl IN $hForm.Selection ' hCtrl.EventName = vVal ' NEXT ' RefreshOne($hObject, "EventName") ' RETURN FALSE CASE "i", "b", "f", "d" vVal = Val(vVal) IF IsNull(vVal) THEN GOTO _BAD CASE "Color" IF NOT IsNull(vVal) THEN vVal = Val(vVal) IF IsNull(vVal) THEN GOTO _BAD ENDIF CASE "s", "Font", "Picture", "Constant", "List", "Path" CASE ELSE RETURN FALSE END SELECT IF $bMany THEN FOR EACH hCtrl IN $hForm.Selection IF hCtrl.SetProperty($sLast, vVal) THEN GOTO _BAD NEXT ELSE IF $hObject.SetProperty($sLast, vVal) THEN GOTO _BAD ENDIF $sOldVal = $hEditor.Text RETURN_BAD: sMsg = ("Incorrect property value.")_CANCEL: CancelProperty $hEditor.SetFocus IF sMsg THEN Message.Warning(sMsg) RETURN TRUEENDPRIVATE SUB HideProperty() IF $bIgnoreHide THEN RETURN IF $sLast THEN IF SaveProperty() THEN RETURN cmbProperty.Visible = FALSE txtProperty.Visible = FALSE btnProperty.Visible = FALSE $sLast = "" $iLast = -1 $hEditor = NULL ENDIFENDPRIVATE SUB MoveProperty() DIM iW AS Integer IF IsNull($hEditor) THEN RETURN WITH grdProperty[grdProperty.Row, 1] iW = .Width - 2 IF $bButton THEN iW = iW - (.Height - 2) $hEditor.Move(grdProperty.X + .X + 2, grdProperty.Y + .Y + 2, iW, .Height - 2) $hEditor.Raise END WITH IF $bButton THEN btnProperty.Resize(txtProperty.Height, txtProperty.Height) btnProperty.Move(txtProperty.X + txtProperty.Width, txtProperty.Y) btnProperty.Raise ENDIFENDPRIVATE SUB CancelProperty() IF IsNull($hEditor) THEN RETURN $sOldVal = grdProperty[grdProperty.Row, 1].Text IF $hEditor.Text <> $sOldVal THEN $hEditor.Text = $sOldVal ENDIFENDPRIVATE SUB ShowProperty() DIM hProp AS CPropertyInfo DIM sType AS String DIM bButton AS Boolean DIM sProp AS String DIM sConst AS String IF Project.Running THEN RETURN IF grdProperty.Row = 0 THEN RETURN IF grdProperty.Row = 1 THEN IF $hObject.Name = $hForm.Name THEN RETURN IF $bMany THEN RETURN sProp = "Name" sType = "Name" ELSE IF grdProperty.Row = 2 THEN IF $hObject.Name = $hForm.Name THEN RETURN sProp = CPropertyInfo.EVENT_NAME sType = "Group" ELSE sProp = grdProperty[grdProperty.Row, 0].Text 'hProp = CControl.Properties[$hObject.Kind][sProp] hProp = CComponent.Classes[$hObject.Kind].GetProperties()[sProp] sType = hProp.Type ENDIF IF $sLast THEN HideProperty $sLast = sProp $sType = sType $hEditor = txtProperty txtProperty.ReadOnly = FALSE SELECT CASE $sType CASE "i", "f", "d", "v", "Name", "Group" ', "EventName" CASE "s" bButton = TRUE CASE "List" bButton = TRUE txtProperty.ReadOnly = TRUE CASE "Constant" IF hProp.ConstantClass THEN $hEditor = cmbProperty cmbProperty.ReadOnly = TRUE cmbProperty.Clear FOR EACH sConst IN hProp.ConstantList cmbProperty.Add(sConst) NEXT 'cmbProperty.Sort ENDIF CASE "b" $hEditor = cmbProperty cmbProperty.ReadOnly = TRUE cmbProperty.Clear cmbProperty.Add("False") cmbProperty.Add("True") CASE "Color" bButton = TRUE CASE "Font", "Picture", "Path" bButton = TRUE txtProperty.ReadOnly = TRUE CASE ELSE END SELECT CancelProperty '$hEditor.Border = Border.None $bButton = bButton MoveProperty $hEditor.Visible = TRUE btnProperty.Visible = bButton $hEditor.SetFocus IF $hEditor = txtProperty THEN 'IF NOT txtProperty.ReadOnly THEN txtProperty.Selection 'ENDIF ENDIFENDPUBLIC SUB cmbProperty_Activate() SavePropertyENDPUBLIC SUB cmbProperty_Click() SavePropertyENDPUBLIC SUB txtProperty_Activate() SavePropertyENDPUBLIC SUB txtProperty_Change() IF $sLast = "Text" THEN $bFreeze = TRUE SaveProperty $bFreeze = FALSE ENDIFENDPUBLIC SUB txtProperty_KeyPress() IF txtProperty.ReadOnly THEN IF $sType = "Font" OR $sType = "Picture" OR $sType = "List" OR $sType = "Path" THEN IF Key.Code = Key.Delete OR Key.Code = Key.Backspace THEN txtProperty.Text = "" SaveProperty ENDIF ENDIF ENDIFENDPRIVATE FUNCTION GetFont() AS String DIM sFont AS String DIM bDefault AS Boolean sFont = Dialog.Font.ToString() bDefault = Instr(sFont, Application.Font.Name) = 1 IF bDefault THEN sFont = Replace(sFont, Application.Font.Name, "") sFont = Replace(sFont, CStr(Application.Font.Size), "") WHILE Left$(sFont) = "," sFont = Mid$(sFont, 2) WEND ENDIF RETURN sFontENDPUBLIC SUB btnProperty_Click() DIM sDir AS String DIM sVal AS String DIM sSrc AS String DIM sDest AS String $bIgnoreHide = TRUE SELECT $sType CASE "s" IF FText.Run($sOldVal) THEN GOTO _EXIT $hEditor.Text = FText.Value CASE "List" IF FList.Run($sOldVal) THEN GOTO _EXIT $hEditor.Text = FList.Value CASE "Font" IF $sOldVal THEN Dialog.Font = Font[$sOldVal] ELSE Dialog.Font = $hForm.Font ENDIF IF Dialog.SelectFont() THEN GOTO _EXIT $hEditor.Text = GetFont() CASE "Color" IF $sOldVal THEN Dialog.Color = Val($sOldVal) ELSE Dialog.Color = 0 ENDIF IF Dialog.SelectColor() THEN GOTO _EXIT $hEditor.Text = "&H" & Hex$(Dialog.Color, 6) & "&" CASE "Picture" sDest = FGetIcon.Run($sOldVal) 'GetPicture() IF NOT sDest THEN GOTO _EXIT $hEditor.Text = sDest CASE "Path" Dialog.Path = $sOldVal IF Dialog.OpenFile() THEN GOTO _EXIT $hEditor.Text = Dialog.Path END SELECT SaveProperty_EXIT: $bIgnoreHide = FALSEENDPUBLIC SUB grdProperty_DblClick() IF cmbProperty.Visible THEN IF cmbProperty.ReadOnly THEN cmbProperty.Index = (cmbProperty.Index + 1) MOD cmbProperty.Count ENDIF ELSE IF btnProperty.Visible THEN btnProperty_Click ENDIFENDPRIVATE FUNCTION GetProperty(sProp AS String) AS String DIM sVal AS String DIM hCtrl AS CControl DIM bFirst AS Boolean IF NOT $bMany THEN RETURN $hObject.GetPropertyString(sProp) FOR EACH hCtrl IN $hForm.Selection IF bFirst THEN IF sVal <> hCtrl.GetPropertyString(sProp) THEN RETURN "" ENDIF ELSE sVal = hCtrl.GetPropertyString(sProp) bFirst = TRUE ENDIF NEXT RETURN sValEND' PUBLIC SUB grdProperty_MouseDown(X AS Integer, Y AS Integer, Button AS Integer)'' grdProperty.Raise'' END''PUBLIC SUB grdProperty_MouseUp() ShowPropertyENDPUBLIC SUB grdProperty_Scroll() MovePropertyENDPUBLIC SUB txtProperty_LostFocus() SavePropertyENDPUBLIC SUB ReadConfig() grdProperty.Font.Size = If(Settings["/UseSmallFont", FALSE], 8, 10) txtProperty.Font = grdProperty.Font cmbProperty.Font = grdProperty.Font MovePropertyEND
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -