2013-10-04 3 views
0

Наш проект в нашем языке ProLan (языки программирования) составляет . Создайте версию Notepad 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»

Смежные вопросы