THISFORM в меню (Visual FoxPro)

Наш проект по предмету ProLan (языки программирования) заключается в создании версии Notepad для FoxPro. Моя форма уже отлично выглядит как блокнот. Я уже закончил со строкой меню. Теперь моя проблема заключается в том, как я могу получить доступ к моему ThisForm.edit1.Value (окно редактирования, где я могу вводить или просматривать свои тексты) в моей программе меню. Потому что есть ошибка, говорящая, что THISFORM должна быть в методе.

вот пример блочного кода, который я хочу изменить, но до сих пор не знаю, как это сделать.

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 = ""    

person Mc-e Joo Alonzo Cojuangco    schedule 04.10.2013    source источник


Ответы (2)


В меню вместо ThisForm используйте _SCREEN.ActiveForm.

person Tamar E. Granor    schedule 04.10.2013

Или, как упомянула Тамар, используйте другую переменную... В этом случае я бы в этом случае сделал что-то в методе Init() вашей формы, например

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

_Screen.myNotePadForm = THISFORM

Затем в вашем меню можно использовать

_Screen.myNotePadForm.whatEver....

Таким образом, вам не нужно беспокоиться, если будет запущена другая вторичная форма, и ИТ станет «ActiveForm».

person DRapp    schedule 05.10.2013