Окна

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Привет всем.

C55.06 (К.Щерба)

Есть главное окно (не Frame). Из этого окна вызываются другие окна.
Хотелось бы вызывать эти окна не в режиме Modal, а в MDI, и чтобы после закрытия главного окна закрывались все открытые окна. Как сделать это правильнее?

--------------------
С уважением,
Стефанович Александр
AlexAn_St@inbox.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

MDI можно открывать только из фрейма. Тебе наверно нужно чтобы была прописана цепочка родительских окон:

OPEN( entity [, access mode / owner ] )

entity The label of a FILE, VIEW, APPLICATION, WINDOW, or REPORT structure
owner The label of the APPLICATION or WINDOW structure which "owns" the window entity being opened. Normally, this parameter would be an &WINDOW reference variable. Valid only when the entity parameter names an APPLICATION or WINDOW structure.

A window with an owner always appears on top of its owner, and is automatically hidden if the owner is minimized or hidden. If the owner is closed, all owned windows are also automatically closed. MDI windows are implicitly owned by the frame window. Non-MDI windows do not have an owner by default.


WBR, Nick Tsigouro mailto:nick@arsis.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

Мне нужно, чтобы открываемые окна не были модальными по отношению к главному окну и можно было бы переключаться между окнами.

--------------------
С уважением,
Стефанович Александр
AlexAn_St@inbox.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

Запускай их STARTом в отдельном треде и сможешь переключаться между тредами.

WBR, Nick Tsigouro mailto:nick@arsis.ru
Написал: ClaList(2)
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

В общем правильный ответ по моему таков:

Создаешь очередь в которую пишешь треды открытых окон и при закрытии главного окна все их закрываешь...

Код: Выделить всё

                            PROGRAM

                            MAP
                              ChildProc()
                            END
                            INCLUDE('cwsynchm.inc')
                            INCLUDE('CWSYNCHC.INC')

QueueData        GROUP,THREAD
ThreadID           LONG
ThreadType         BYTE
                 END

NonThreadedQueue QUEUE,TYPE
Data               LIKE(QueueData)
                 END

QueueAccess      CLASS
QueueData          &NonThreadedQueue,PRIVATE
QueueLock          &ICriticalSection,PRIVATE
Construct          PROCEDURE
Destruct           PROCEDURE
AddThread          PROCEDURE(LONG Thread, BYTE ThreadType=0)
RemoveThread       PROCEDURE(LONG Thread)
RemoveThreads      PROCEDURE
                 END

QA               QueueAccess


Window WINDOW('Main window'),AT(,,277,148),FONT('MS Sans Serif',8,,FONT:regular),SYSTEM,GRAY,DOUBLE
       BUTTON('Start child window'),AT(9,8,92,14),USE(?Button1)
       BUTTON('Exit from programm'),AT(9,25,92,14),USE(?Button2)
     END

  CODE
  OPEN(Window)
  ACCEPT
    CASE ACCEPTED()
    OF ?Button1
      START(ChildProc,25000)
    OF ?Button2
      POST(EVENT:CloseDown)
    END
  END
  QA.RemoveThreads
  CLOSE(Window)
!---------------------------------------------------------
ChildProc             PROCEDURE
CWindow WINDOW('Child window'),AT(,,151,69),FONT('MS Sans Serif',8,,FONT:regular),SYSTEM,GRAY,DOUBLE
     END
  CODE
  QA.AddThread(THREAD())
  OPEN(CWindow)
  ACCEPT
  END
  QA.RemoveThread(THREAD())
  CLOSE(CWindow)

!---------------------------------------------------------
QueueAccess.Construct PROCEDURE
  CODE
  SELF.QueueLock &= NewCriticalSection()
  SELF.QueueData &= NEW(NonThreadedQueue)
QueueAccess.Destruct PROCEDURE
  CODE
  SELF.QueueLock.Kill()
  DISPOSE(SELF.QueueData)
QueueAccess.AddThread PROCEDURE(LONG Thread, BYTE ThreadType=0)
  CODE
  SELF.QueueLock.Wait()  !Lock access to NonThreadedQueue.
  SELF.QueueData.Data.ThreadId = Thread
  SELF.QueueData.Data.ThreadType = ThreadType
  GET(SELF.QueueData, SELF.QueueData.Data.ThreadId)
  IF ERRORCODE()
    ADD(SELF.QueueData)
  ELSE
    PUT(SELF.QueueData)
  END
  SELF.QueueLock.Release() !Allow other access to the queue
QueueAccess.RemoveThread PROCEDURE(LONG Thread)
  CODE
  SELF.QueueLock.Wait()  !Lock access to NonThreadedQueue.
  SELF.QueueData.Data.ThreadId = Thread
  GET(SELF.QueueData, SELF.QueueData.Data.ThreadId)
  DELETE(SELF.QueueData)
  SELF.QueueLock.Release() !Allow other access to the queue
QueueAccess.RemoveThreads PROCEDURE
  CODE
  SELF.QueueLock.Wait()  !Lock access to NonThreadedQueue.
  LOOP W# = 1 TO RECORDS(SELF.QueueData)
    GET(SELF.QueueData, W#)
    IF SELF.QueueData.Data.ThreadType = 2
      POST(EVENT:CloseDown,,SELF.QueueData.Data.ThreadId)
    ELSE
      POST(EVENT:CloseWindow,,SELF.QueueData.Data.ThreadId)
    END
  END
  LOOP 1000 TIMES
    YIELD
  END
  DELETE(SELF.QueueData)
  SELF.QueueLock.Release() !Allow other access to the queue
Написал: Mixer(144)
Ответить