📄 fdata.class
字号:
' Gambas class filePUBLIC Connection AS CConnectionPUBLIC Table AS StringPRIVATE $sTable AS StringPRIVATE $rData AS ResultPRIVATE $cData AS NEW CollectionPRIVATE $cDelete AS NEW CollectionPRIVATE $hDataEditor AS CTableViewEditorPRIVATE $bModify AS BooleanPRIVATE $bReadOnly AS BooleanPRIVATE $sCharset AS StringPRIVATE $frmTable AS FTableSTATIC PRIVATE $hNullValue AS Object ' Used for representing the NULL value in a CollectionSTATIC PUBLIC SUB _init() $hNullValue = NEW Integer[]ENDPUBLIC SUB _new(frmTable AS FTable, hConn AS CConnection, sTable AS String, OPTIONAL bReadOnly AS Boolean) $sTable = sTable $bReadOnly = bReadOnly $frmTable = frmTable Connection = hConn Table = sTable IF NOT $bReadOnly THEN $hDataEditor = NEW CTableViewEditor(tbvData) AS "tbvData" $sCharset = Connection.GetCharset() 'RefreshTitle ReadDataENDPUBLIC SUB EncodingChange() $sCharset = Connection.GetCharset() tbvData.RefreshEND' PRIVATE SUB RefreshTitle()'' DIM sTitle AS String'' sTitle = $sTable & " - " & Connection.Name & " - " & Connection.Server.Name' IF $bModify THEN sTitle = sTitle & " [" & ("modified") & "]"'' ME.Title = sTitle'' 'btnSaveData.Enabled = $bModify'' ENDPRIVATE SUB Modify(OPTIONAL bModify AS Boolean = TRUE) $bModify = bModify $frmTable.RefreshTitleENDPUBLIC FUNCTION IsModified() AS Boolean RETURN $bModifyENDPRIVATE SUB ReadData() DIM hTable AS Table DIM sField AS String DIM iInd AS Integer DIM iLen AS Integer DIM hField AS ResultField INC Application.Busy tbvData.Rows.Count = 0 $cData.Clear $cDelete.Clear IF $bReadOnly THEN $rData = Connection.Handle.Find($sTable) ELSE IF $hDataEditor.Hide() THEN RETURN $rData = Connection.Handle.Edit($sTable) ENDIF tbvData.Columns.Count = $rData.Fields.Count hTable = Connection.Handle.Tables[$sTable] FOR EACH hField IN $rData.Fields 'hTable.Field.Find($rData.Field.Name) WITH tbvData.Columns[iInd] .Text = hField.Name .Width = Connection.WidthFromType(tbvData, hField.Type, hField.Length, hField.Name) END WITH INC iInd NEXT 'tbvData.Columns.Width = -1 tbvData.Rows.Count = $rData.Count '+ 1 Modify(FALSE) 'tbvData.Rows[$rData.Count].Text = "•"FINALLY DEC Application.BusyCATCH Message.Error(("Cannot read table data.") & "\n\n" & Error.Text)ENDPUBLIC FUNCTION WriteData() AS Boolean DIM iInd AS Integer DIM vVal AS Variant DIM sField AS String DIM rCreate AS Result IF $hDataEditor.Hide() THEN RETURN INC Application.Busy WITH tbvData Connection.Handle.Begin $rData.MoveFirst FOR iInd = 0 TO $rData.Count - 1 IF $cDelete.Exist(iInd) THEN $rData.Delete ELSE IF $cData.Exist(iInd) THEN FOR EACH vVal IN $cData[iInd] sField = $cData[iInd].Key IF IsObject(Vval) THEN $rData[sField] = NULL ELSE $rData[sField] = vVal ENDIF NEXT $rData.Update ENDIF $rData.MoveNext NEXT rCreate = Connection.Handle.Create($sTable) FOR iInd = $rData.Count TO .Rows.Count - 1 IF $cDelete.Exist(iInd) THEN CONTINUE IF NOT $cData.Exist(iInd) THEN CONTINUE FOR EACH vVal IN $cData[iInd] sField = $cData[iInd].Key IF IsObject(Vval) THEN rCreate[sField] = NULL ELSE rCreate[sField] = vVal ENDIF NEXT rCreate.Update NEXT END WITH Connection.Handle.Commit ReadDataFINALLY DEC Application.BusyCATCH Connection.Handle.RollBack Message.Error(("Cannot write table data.") & "\n\n" & Error.Text) TRY $hDataEditor.MoveTo(iInd, 0) RETURN TRUEEND' PRIVATE FUNCTION FindFieldIndexFromName(sName AS String) AS Integer'' DIM iInd AS Integer' DIM sField AS String'''' FOR EACH sField IN $rData.Fields' IF sField = sName THEN RETURN iInd' INC iInd' NEXT'' RETURN -1' ENDPUBLIC SUB btnRefresh_Click() IF CheckModify() THEN RETURN ReadData 'tbvData.RefreshENDPUBLIC SUB tbvData_Data(Row AS Integer, Column AS Integer) DIM vVal AS Variant DIM sField AS String $rData.MoveTo(Row) WITH tbvData IF $cDelete.Exist(Row) THEN .Data.Background = Color.LightGray sField = .Columns[Column].Text TRY vVal = $cData[Row][sField] IF IsNull(vVal) THEN IF $rData.Available THEN vVal = $rData[sField] ENDIF ELSE IF IsObject(vVal) THEN vVal = NULL ENDIF ENDIF IF TypeOf(vVal) = gb.String THEN IF $sCharset THEN TRY .Data.Text = Conv(vVal, $sCharset, Desktop.Charset) IF ERROR THEN .Data.Text = vVal ELSE .Data.Text = vVal ENDIF ELSE .Data.Text = Str(vVal) ENDIF .Data.Alignment = Align.TopNormal END WITHENDPUBLIC SUB tbvData_Change() DIM hTable AS Table DIM hField AS Field DIM sField AS String DIM bMandatory AS Boolean IF $bReadOnly THEN RETURN WITH tbvData IF $cDelete.Exist(.Row) THEN $hDataEditor.Hide tbvData.SetFocus RETURN ENDIF sField = .Columns[.Column].Text END WITH hTable = Connection.Handle.Tables[$sTable] hField = hTable.Fields[sField] bMandatory = NOT IsNull(hField.Default) WITH $hDataEditor SELECT CASE hField.Type CASE gb.Boolean .ShowComboBox("True\nFalse", bMandatory, TRUE) CASE gb.Integer, gb.Float, gb.Date .ShowTextBox(bMandatory, TRUE) CASE gb.String IF hField.Length = 0 THEN .ShowTextArea(bMandatory, FALSE) ELSE .ShowTextBox(bMandatory, FALSE, hField.Length) ENDIF END SELECT END WITHENDPRIVATE SUB SetData(iRow AS Integer, sField AS String, vData AS Variant) DIM cVal AS Collection cVal = $cData[iRow] IF NOT cVal THEN cVal = NEW Collection $cData[iRow] = cVal 'tbvData.Rows[iRow].Text = tbvData.Rows[iRow].Text & "*" ENDIF IF IsNull(vData) THEN cVal[sField] = $hNullValue ELSE cVal[sField] = vData ENDIF ModifyENDPUBLIC FUNCTION tbvData_Save(Row AS Integer, Column AS Integer, sData AS String) AS Boolean DIM hTable AS Table DIM hField AS Field DIM sField AS String DIM iVal AS Integer DIM vVal AS Variant DIM iType AS Integer IF $bReadOnly THEN RETURN WITH tbvData sField = .Columns[.Column].Text END WITH hTable = Connection.Handle.Tables[$sTable] hField = hTable.Fields[sField] iType = hField.Type IF iType <> gb.String THEN IF sData THEN vVal = Val(sData) IF iType = gb.Float THEN IF TypeOf(vVal) = gb.Integer THEN vVal = CFloat(vVal) ENDIF ENDIF IF TypeOf(vVal) <> iType THEN Message.Warning(("Incorrect value.")) RETURN TRUE ENDIF ENDIF ELSE IF $sCharset THEN vVal = Conv$(sData, Desktop.Charset, $sCharset) ELSE vVal = sData ENDIF ENDIF SetData(Row, sField, vVal)ENDPUBLIC SUB btnNewData_Click() DIM cNew AS NEW Collection DIM hTable AS Table DIM hField AS Field DIM vVal AS Variant IF $bReadOnly THEN RETURN hTable = Connection.Handle.Tables[$sTable] FOR EACH hField IN hTable.Fields vVal = hField.Default IF NOT IsNull(vVal) THEN cNew[hField.Name] = vVal ENDIF NEXT IF cNew.Count THEN $cData[tbvData.Rows.Count] = cNew INC tbvData.Rows.Count tbvData.Rows[tbvData.Rows.Count - 1].Text = "•" $hDataEditor.MoveTo(tbvData.Rows.Count - 1, 0) ModifyENDPUBLIC SUB btnKillData_Click() DIM iInd AS Integer IF $bReadOnly THEN RETURN $hDataEditor.Hide WITH tbvData FOR iInd = 0 TO .Rows.Count - 1 IF .Rows[iInd].Selected THEN $cDelete[iInd] = TRUE .Rows[iInd].Text = "" '"•" .Rows[iInd].Refresh ENDIF NEXT END WITH ModifyENDPUBLIC SUB Form_Close() 'PRINT "FData.Form_Close" $frmTable = NULL IF $bReadOnly THEN RETURN $hDataEditor.CloseENDPUBLIC SUB Form_Resize() tbvData.Move(0, 0, panData.ClientW, panData.ClientH) IF NOT $bReadOnly THEN $hDataEditor.Resize ENDIFENDPRIVATE FUNCTION CheckModify() AS Boolean DIM bCancel AS Boolean IF $bModify THEN SELECT CASE Message.Question(Subst(("The data of table '&1' have been modified.\nDo you want to save it ?"), $sTable), ("Save"), ("Do not save"), ("Cancel")) CASE 1 bCancel = WriteData() CASE 3 bCancel = TRUE END SELECT ENDIF RETURN bCancelEND'' PUBLIC FUNCTION Form_Close() AS Boolean'' RETURN CheckModify()'' ENDPUBLIC SUB btnSaveData_Click() IF $bReadOnly THEN RETURN WriteDataENDPUBLIC SUB btnTable_Click() Connection.OpenTable($sTable, FALSE)ENDPUBLIC SUB tbvData_Create() btnNewData_ClickEND
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -