你那個Grid是想幹嘛的?

授人以渔,不授人以鱼。
程序代码:
CLEAR ALL
SET PATH TO "E:\Projects\mytools"
SET PROCEDURE TO "MyTools"
Main()
CLEAR ALL
RETURN
*-----------------------------
* 程序主入口
*-----------------------------
PROCEDURE Main()
LOCAL loMainForm
loMainForm = CREATEOBJECT("_MainForm") && 在內存中創建已定義的類對象實例
loMainForm.Show && 讓窗體在屏幕上呈現出來可見
READ EVENTS && 啟動交互事務處理機制,窗體才不會一閃而過
ENDPROC
*-----------------------------
* 主窗體的數據環境
*-----------------------------
DEFINE CLASS _DataEnvironment AS DataEnvironment
AutoOpenTables = .T. && 數據環境在窗體創建時自動生效
AutoCloseTables = .T. && 在窗體關閉時自動關閉數據環境
*-------------------------
* 打開數據
*-------------------------
PROCEDURE OpenTables
OPEN DATABASE 数据1 SHARED
USE 财务信息 ALIAS FinancialInfo SHARED IN 0
ENDPROC
*-------------------------
* 關閉數據
*-------------------------
PROCEDURE CloseTables
CLOSE DATABASES ALL
ENDPROC
ENDDEFINE
*-----------------------------
* 主窗體表單類設計
*-----------------------------
DEFINE CLASS _MainForm AS myForm
*-------------------------
* 在表單設計器中填寫相應的屬性的行爲即是被轉換為以下的賦値語句
Caption = "修改財務信息"
WindowState = 2
ShowWindow = 2
MinHeight = 600
MinWidth = 800
DEClassLibrary = "TEST.PRG"
DEClass = "_DataEnvironment"
*-------------------------
*-------------------------
* 給窗體添加控件,在表單設計器中拖拉控件到窗體上即被轉換為以下語句
ADD OBJECT Label1 AS Label WITH Caption = "修改財務信息", FontSize = 16, FontBold = .T., Alignment = 2
ADD OBJECT Grid1 AS Grid
ADD OBJECT Edit1 AS _EditContainer
*-------------------------
*-------------------------
* 設計Grid1的行爲
PROCEDURE Grid1.Init
WITH This
.DeleteMark = .F. && 不顯示刪除記錄標誌列(請注意SET DELETED的設置情況,應與ON匹配)
.SetAll("FontBold", .T., "Header") && 把所有Grid列標題文字加粗
.ReadOnly = .T. && 不允許在Grid中編輯數據(本來直接在這裡編輯數據即可)
.HighlightStyle = 2
ENDWITH
ENDPROC
PROCEDURE Grid1.AfterRowColChange(tnColumnIndex)
* 當Grid上的單元格變動時刷新表單內容,編輯文本框上的數據即會自動刷新
ThisForm.Refresh
ENDPROC
*-------------------------
*-------------------------
* 根據窗體的動態尺寸排列其上的控件,當用戶改變窗體尺寸時自動縮放控件
*-------------------------
PROCEDURE Arrange
WITH ThisForm.Label1
.Top = 5
.Left = 0
.Height = 30
.Width = ThisForm.Width
ENDWITH
WITH ThisForm.Grid1
.Top = 2 * ThisForm.Height / 3
.Left = 5
.Height = ThisForm.Height - .Top - 5
.Width = ThisForm.Width - .Left - 5
ENDWITH
WITH ThisForm.Edit1
.Top = ThisForm.Label1.Top + ThisForm.Label1.Height + 5
.Left = 5
.Height = ThisForm.Grid1.Top - .Top - 5
.Width = ThisForm.Width - .Left - 5
ENDWITH
ENDPROC
PROCEDURE Refresh
DODEFAULT()
ThisForm.Grid1.AutoFit() && Grid控件的列寬根據內容自動調整
ENDPROC
ENDDEFINE
*-----------------------------
* 字段編輯容器類定義
*-----------------------------
DEFINE CLASS _EditContainer AS Container
BackStyle = 0
BorderWidth = 0
*-------------------------
* 動態添加編輯項目,通過輪詢表字段而得
*-------------------------
PROCEDURE Init
LOCAL lnIndex, lcControlName, lnHeight, laStruct[1]
AFIELDS(laStruct, "FinancialInfo")
lnHeight = 25
WITH This
FOR lnIndex = 1 TO FCOUNT("FinancialInfo")
lcControlName = "Get" + TRANSFORM(lnIndex, "@L 99")
.AddObject(lcControlName, "myGet") && 所有用AddObject()方法添加的控件均是動態添加
WITH .&lcControlName
.Top = 5 + (lnIndex - 1) * (lnHeight + 5)
.Left = 5
.AddObject("Label1", "Label")
WITH .Label1
.Caption = FIELD(lnIndex, "FinancialInfo", 1) + ": " && 當是數據庫表時,用此函數獲得字段Caption字符串
.FontBold = .T.
.Width = 80
.Alignment = 1
ENDWITH
.AddObject("Text1", "_GetTextBox")
WITH .Text1
.ControlSource = "FinancialInfo." + FIELD(lnIndex, "FinancialInfo") && 綁定文本框的數據源到字段上
.Width = laStruct[lnIndex,3] * 7 && 文本框的寬度按字段設計寬度等比例設置
ENDWITH
.SetAll("Height", lnHeight)
.SetAll("Visible", .T.) && 動態添加的控件必須設置此屬性讓其可視
.Arrange && 根據向Get容器添加的控件數目和尺寸調整位置及容器尺寸
ENDWITH
NEXT
.SetAll("Visible", .T.) && 讓Get容器可視
ENDWITH
ENDPROC
ENDDEFINE
*-----------------------------
* 編輯字段的文本框類定義
*-----------------------------
DEFINE CLASS _GetTextBox AS TextBox
PROCEDURE Valid
* 當離開文本框時刷新表單內容,主要是Grid控件中的欄寬自適應要在此觸發
ThisForm.Refresh
ENDPROC
ENDDEFINE
