2013-10-04 30 views
0

我們的項目在我們的ProLan(編程語言)主題是創建一個FoxPro版本的記事本。我的表單已經完全看起來與記事本相同。我已經完成了菜單欄。現在我的問題是如何訪問我的ThisForm.edit1.Value(我可以輸入或查看我的文本的編輯框)到我的菜單程序。因爲有一個錯誤說THISFORM應該在方法中。THISFORM在一個菜單中(Visual FoxPro)

這裏有一個示例代碼塊,我想改變,但仍然不知道如何。

PROCEDURE proc_Save 
cMessage = ALLTRIM(ThisForm.Edit1.Value) 
cFile = GETFILE('Txt:TXT', 'Enter File:', 'Open', 0, 'Open files') && contains the complete path for your file 
gnErrFile = FCREATE(cFile) 
IF gnErrFile < 0 
    WAIT 'Cannot open or create out[ut file' WINDOW NOWAIT 
ELSE 
    = FWRITE(gnErrFile, cMessage) 
ENDIF 
= FCLOSE(gnErrFile) 
IF gnErrFile = 0 
    MESSAGEBOX("File saved.", 64, "Saved") 
    ENDIF 
cMessage = "" 

上面的代碼顯示我對保存菜單彈出代碼,但每次我要點擊保存時,會返回一個錯誤。這段代碼在命令按鈕中工作得很好。但由於我使用的是菜單程序(命令應該在彈出式菜單中),我無法訪問編輯框。

無論如何這裏是我的完整源代碼。唯一的錯誤是THISFORM.edit1.Value的行。

LPARAMETERS oFormRef, getMenuName, lUniquePopups, parm4, parm5, parm6, parm7, parm8, parm9 
LOCAL cMenuName, nTotPops, a_menupops, cTypeParm2, cSaveFormName 
IF TYPE("m.oFormRef") # 'O' OR ; 
    LOWER(m.oFormRef.BaseClass) # 'form' OR ; 
    m.oFormRef.ShowWindow # 2 
    MESSAGEBOX("Error") 
      RETURN 
ENDIF 
m.cTypeParm2 = TYPE("m.getMenuName") 
m.cMenuName = SYS(2015) 
m.cSaveFormName = m.oFormRef.Name 
IF m.cTypeParm2 = "C" OR (m.cTypeParm2 = "L" AND m.getMenuName) 
    m.oFormRef.Name = m.cMenuName 
ENDIF 
IF m.cTypeParm2 = "C" AND !EMPTY(m.getMenuName) 
    m.cMenuName = m.getMenuName 
ENDIF 
DIMENSION a_menupops[3] 
IF TYPE ("m.lUniquePopups")="L" AND m.lUniquePopups 
    FOR nTotPops = 1 TO ALEN(a_menupops) 
      a_menupops[m.nTotPops] = SYS(2015) 
    ENDFOR 
ELSE 
    a_menupops[1] = "file" 
    a_menupops[2] = "edit" 
    a_menupops[3] = "help" 
ENDIF 

DEFINE MENU (m.cMenuName) IN (m.oFormRef.Name) BAR 

DEFINE PAD mpFile OF (m.cMenuName) PROMPT "\<File" COLOR SCHEME 3 ; 
    KEY ALT+F, "" 
DEFINE PAD mpEdit OF (m.cMenuName) PROMPT "\<Edit" COLOR SCHEME 3 ; 
    KEY ALT+E, "" 
DEFINE PAD mpHelp OF (m.cMenuName) PROMPT "\<Help" COLOR SCHEME 3 ; 
    KEY ALT+W, "" 

ON PAD mpFile OF (m.cMenuName) ACTIVATE POPUP (a_menupops[1]) 
ON PAD mpEdit OF (m.cMenuName) ACTIVATE POPUP (a_menupops[2]) 
ON PAD mpHelp OF (m.cMenuName) ACTIVATE POPUP (a_menupops[3]) 

DEFINE POPUP (a_menupops[1]) MARGIN RELATIVE SHADOW COLOR SCHEME 4 
DEFINE BAR 1 OF (a_menupops[1]) PROMPT "\<New" ; 
    KEY CTRL+N, "Ctrl+N" 
DEFINE BAR 2 OF (a_menupops[1]) PROMPT "\<Open..."; 
    KEY CTRL+O, "Ctrl+O" 
DEFINE BAR 3 OF (a_menupops[1]) PROMPT "\<Save" ; 
    KEY CTRL+S, "Ctrl+S" 
DEFINE BAR 4 OF (a_menupops[1]) PROMPT "\-" 
DEFINE BAR 5 OF (a_menupops[1]) PROMPT "E\<xit" 

ON SELECTION BAR 1 OF (a_menupops[1]) ; 
    DO proc_New 
ON SELECTION BAR 2 OF (a_menupops[1]) ; 
    DO proc_Open 
ON SELECTION BAR 3 OF (a_menupops[1]) ; 
    DO proc_Save 
ON SELECTION BAR 5 OF (a_menupops[1]) QUIT 

DEFINE POPUP (a_menupops[2]) MARGIN RELATIVE SHADOW COLOR SCHEME 4 
DEFINE BAR _med_cut OF (a_menupops[2]) PROMPT "Cu\<t" ; 
    KEY CTRL+X, "Ctrl+X" ; 
    MESSAGE "Removes the selection and places it onto the Clipboard." 
DEFINE BAR _med_copy OF (a_menupops[2]) PROMPT "\<Copy" ; 
    KEY CTRL+C, "Ctrl+C" ; 
    MESSAGE "Copies the Selection onto the Clipboard." 
DEFINE BAR _med_paste OF (a_menupops[2]) PROMPT "\<Paste" ;  
    KEY CTRL+V, "Ctrl+V" ; 
    MESSAGE "Paste the contents on the Clipboard." 
DEFINE BAR 6 OF (a_menupops[2]) PROMPT "\-" 
DEFINE BAR 7 OF (a_menupops[2]) PROMPT "Select \<All" ; 
    KEY CTRL+A, "Ctrl+A" ; 
    MESSAGE "Selects all items on this page." 

DEFINE POPUP (a_menupops[3]) MARGIN RELATIVE SHADOW COLOR SCHEME 4 
DEFINE BAR 8 OF (a_menupops[3]) PROMPT "\<View Help" ; 
    KEY CTRL+H, "Ctrl+H" 
DEFINE BAR 9 OF (a_menupops[3]) PROMPT "\-" 
DEFINE BAR 10 OF (a_menupops[3]) PROMPT "\<About Notepad" ; 
    KEY CTRL+A, "Ctrl+A" 


ACTIVATE MENU (m.cMenuName) NOWAIT 

IF m.cTypeParm2 = "C" 
    m.getMenuName = m.cMenuName 
    m.oFormRef.Name = m.cSaveFormName 
ENDIF 


PROCEDURE proc_New 
    cMessage = ALLTRIM(ThisForm.Edit1.Value) 
    cFile = GETFILE('Txt:TXT', 'Enter File:', 'Open', 0, 'Open files') 
    gnErrFile = FCREATE(cFile) 
    IF gnErrFile < 0 
      WAIT 'Cannot open or create out[ut file' WINDOW NOWAIT 
    ELSE 
      = FWRITE(gnErrFile, cMessage) 
    ENDIF 
      = FCLOSE(gnErrFile) 
    IF gnErrFile = 0 
    MESSAGEBOX("File saved.", 64, "Saved") 
      ENDIF 
    cMessage = "" 

PROCEDURE proc_Open 
    LOCAL cFile 
    cFile = "" 
    cFile = GETFILE('Txt:TXT', 'Enter File:', 'Open', 0, 'Open files') 
    DO CASE 
      CASE ".txt" $ LOWER(cFile) && checks if path has a ".txt" string 
        WAIT WINDOW "opening file..." NOWAIT 
          LOCAL gnFileHandle, nSize 
          gnFileHandle = FOPEN(cFile) 
          nSize = FSEEK(gnFileHandle, 0, 2) 
          IF nSize <= 0 
            MESSAGEBOX("This file is empty.", 64, "Message") 
          ELSE 
            = FSEEK(gnFileHandle, 0, 0) 
            cMessage = FREAD(gnFileHandle, nSize) 
            ThisForm.edit1.Value = ALLTRIM(cMessage) 
          ENDIF 
            = FCLOSE(gnFileHandle) 
          WAIT CLEAR 
      OTHERWISE 
        MESSAGEBOX("Error please choose a valid text file.", 16, "Error") 
    ENDCASE 

PROCEDURE proc_Save 
    cMessage = ALLTRIM(ThisForm.Edit1.Value) 
    cFile = GETFILE('Txt:TXT', 'Enter File:', 'Open', 0, 'Open files') 
    gnErrFile = FCREATE(cFile) 
    IF gnErrFile < 0 
      WAIT 'Cannot open or create out[ut file' WINDOW NOWAIT 
    ELSE 
      = FWRITE(gnErrFile, cMessage) 
    ENDIF 
    = FCLOSE(gnErrFile) 
    IF gnErrFile = 0 
      MESSAGEBOX("File saved.", 64, "Saved") 
      ENDIF 
    cMessage = ""  

回答

2

在菜單中,而不是ThisForm,使用_SCREEN.ActiveForm。

1

或者,如添馬艦提到的,使用另一個變量... 在這種情況下,我會在這種情況下做一些事情在你的格式爲」 init()之類

if not pemstatus(_Screen, "myNotePadForm", 5) 
    _Screen.AddProperty("myNotePadForm") 
endif 

_Screen.myNotePadForm = THISFORM 

然後,在你的菜單中使用的方法可以做

_Screen.myNotePadForm.whatEver.... 

這樣你就不需要,如果另一個次要形式推出,並擔心其成爲「的ActiveForm」