THISFORM в меню (Visual FoxPro)

Нашият проект в нашата тема ProLan (езици за програмиране) е да създадем FoxPro версия на Notepad. Формулярът ми вече изглежда перфектно като бележник. Вече приключих с лентата с менюта. Сега проблемът ми е как мога да получа достъп до моя 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....

По този начин не е нужно да се притеснявате, ако бъде стартиран друг вторичен формуляр и IT стане „ActiveForm“

person DRapp    schedule 05.10.2013