Window - ответы на часто задаваемые вопросы по CfW


Как окно сделать активным

Вопрос:  Возникла такая проблема: имеется Frame, пpи запyске программы она вызывает
два Thread. После окончания загрузки активным оказывается не то MDI Child-окно.
Как сделать активным то окно, котоpое мне нyжно?  Подозpеваю, что нyжно
использовать SETTARGET, но кyда его вставить?   Использyю C5EE, ABC.

Ответ1:  Здесь нужно Window{Prop:Active} = True   
Отвечал Nick Tsigouro 24.05.200

Ответ2:  
Определяешь в глобальных данных что-то вроде:

EVENT:Active    EQUATE(401h)
T1    BYTE
T2    BYTE
    Сохраняешь номера thread-ов, скажем:
    T1=START(MDI1)
    T2=START(MDI2)
    Когда надо, пуляешь евент в нужный thread:
    POST(EVENT:Active,,T1)
    В обработчик событий каждого окна вставляешь:
    CASE EVENT()
        OF EVENT:Active
            0{PROP:Active}=true
    END

Отвечал   Новиков Антон  24.05.200    anfront@chat.ru    ICQ #50995986


Окно программы - всегда сверху ?

Вопрос:
Как сделать окно программы всегда остaющимся поверх других окон (программ), даже если оно не активно ?

Ответ:
Универсальное решение:
Прототип:

MODULE('WIN_API')
   SetWindowPos(UNSIGNED, UNSIGNED, SIGNED, SIGNED, SIGNED, SIGNED, |        UNSIGNED),SIGNED,PASCAL
END

Вызов по условию:

IF Loc:byAlwayOnTop
   I # = SetWindowPos(<Имя окна>{PROP:Handle},0fffffh,0,0,0,0,3)
ELSE
   I# = SetWindowPos(<Имя окна>{PROP:Handle},0ffffeh,0,0,0,0,3)
END

Отвечал В. Синявский   Ноября 26, 1999      root@jrcn.donetsk.ua

Ответ 2:
Окно поверх всех остальных можно сделать API функцией
SetWindowPos(HWND, HWND, SIGNED, SIGNED, SIGNED, SIGNED,WORD),BOOL,PASCAL

Примерно так:
  err#=SetWindowPos(QuickWindow{ PROP:Handle },-1,0,0,0,0,BOR(2,1))
наоборот,
  err#=SetWindowPos(QuickWindow{ PROP:Handle },0fffeh,0,0,0,0,BOR(2,1))

Алексей Калинкин kalinkin@rmk.ru

 

Ответ 3:
Посмотри пример во вложении(http://rozalex.chat.ru/pub/Clarion/OnTop.zip), в Global Embeds делаешь описание функции и переменных,
AfterGlobalIncludes:
HANDLE                    EQUATE(UNSIGNED)
HWND                       EQUATE(HANDLE)
WORD                       EQUATE(SIGNED)

HWND_BOTTOM     EQUATE(1)
HWND_TOPMOST   EQUATE(0ffffh)

SWP_NOMOVE        EQUATE(0002h)
SWP_NOSIZE           EQUATE(0001h)

_________________________________
InsideTheGlobalMap:
MODULE('Windows.DLL')
     SetWindowPos(HWND, HWND, SIGNED, SIGNED, SIGNED, SIGNED,
WORD),BOOL,PASCAL
  END

________________________________

вызов делаешь из любого места:

!Делаем поверх всех окон

err#=SetWindowPos(Window{PROP:Handle},HWND_TOPMOST,0,0,0,0,SWP_NOSIZE+SWP_NO
MOVE)

!Убираем атрибут поверх всех

err#=SetWindowPos(Window{PROP:Handle},HWND_BOTTOM,0,0,0,0,SWP_NOSIZE+SWP_NOM
OVE)
Window{Prop:Active} = 1

Алексей Калинкин, kalinkin@rmk.ru


Возможно ли в Menu под пункты выбора выводить символьную строку.

Вопрос:
Возможно ли в Menu под пункты выбора выводить символьную строку , текст которой формируется и меняется в процесе работы?

Ответ:
Изменять текст в пунктах меню можно традиционно:
  <?Item>{PROP:Text} = 'Что-то другое'
  DO RefreshWindow
где Item - метка пункта меню, т.е. то, что в форматоре окна называется "Use Variable:"

Отвечал В.Синявский   Сентября 17, 1998      root@jrcn.donetsk.ua


Как управлять одним Clarion-приложением из второго

Вопрос:
Как управлять одним Clarion-приложением из второго. Например: по нажатию кнопки из формы, делать второе приложение, которое то же запущено - OnTop, т.е. что бы оно выползло на передний план. Если это воще возможно.

Ответ:
Можно сделать так:
hWin = FindWindow(...)

if IsIconic(hWin)
  ShowWindow(hWin, SW_RESTORE)
end

SetForegroundWindow(hWin)

В параметрах FindWindow надо указать класс и заголовок окна второй программы. Есть несколько способов узнать их, но это уже отдельный разговор... Если же класс и заголовок известны заранее, тогда еще легче.

Отвечал  YuriMar 28.06.2000


Как определить номер таба

Вопрос:
Как определить номер таба
Например: при изменении TABа мне нужно слать определенные месаги.

Ответ 1:
Так ловить события связанные с tab changing.
А что, слабо в паре подходящих embed поставить Message('...','Этот Embed'), скомпилить и запустить?
choice(?currenttab) возвращает №.
А вообще, неплохо покопаться с Examples на предмет, как сделан Wizard.

Отвечал D_Osipov

Ответ 2:
Есть два события на головной SHEET

EVENT:TabChanging
CHOICE(?Sheet) - возвращает с какой закладки уходят

EVENT:NewSelection
CHOICE(?Sheet) - возвращает на какую закладку пришли

Отвечал Andrew Myalin andrew@arsis.ru


Мониторинг запущенных приложений

Подскажите, как осуществить SUBJ средствами клариона?
Нужно отслеживать завершение некоторых вынь-приложений.

Ответы:

task.arj 7 028 17.01.00 14:18 Пример получения task-списка
Автор: Алексей Тимков.
И утилита для снятия задачи.

Это не то, что требуется?

FAQ-сервер, Download, Примочки

С уважением, Владимир Смелик, MCP vovs@bigfoot.com YahooID: VovShmel
[FAQ-сервер по Clarion`у: http://www.dvgu.ru/lemoi/clafaq/faqcgi.cgi? ]


На мой взгляд, перебор названий окон не самый лучший подход (названия могут
меняться).
Для Win95/98/2000 можно воспользоваться библиотекой ToolHelp
(CreateToolHelp32Snapshot, Process32First, Process32Next), под NT4 - сложнее, но могу прислать пример.

Павел Яковенко paolo@ncport.ru

Например :)
Библиотеку pdh.dll можно взять, например, из Windows2000

Program
Map
Module('pdh.dll')
PdhEnumObjectItems
(*CSTRING,*CSTRING,*CSTRING,*CSTRING,*ULONG,*CSTRING,*ULONG,ULONG,ULONG),LON
G,PASCAL,RAW,NAME('PdhEnumObjectItemsA')
end
end
PERF_DETAIL_WIZARD EQUATE(400)
ERROR_SUCCESS EQUATE(0)
pdhStatus LONG
dwCounterListSize ULONG(0)
dwInstanceListSize ULONG(0)

DataSource &CSTRING
MachineName &CSTRING
CounterList &CSTRING
InstanceList &CSTRING
ObjectName CSTRING('Process')
startpos long
i long
CODE
! call the function to determine the required buffer size for the data

pdhStatus =
PdhEnumObjectItems(DataSource,MachineName,ObjectName,CounterList,dwCounterLi
stSize,InstanceList,dwInstanceListSize,PERF_DETAIL_WIZARD,0)

if pdhStatus = ERROR_SUCCESS
! allocate the buffers and try the call again
CounterList &= NEW (CSTRING(dwCounterListSize))
InstanceList &= NEW (CSTRING(dwInstanceListSize))
pdhStatus =
PdhEnumObjectItems(DataSource,MachineName,ObjectName,CounterList,dwCounterLi
stSize,InstanceList,dwInstanceListSize,PERF_DETAIL_WIZARD,0)
if pdhStatus = ERROR_SUCCESS
startpos=1
LOOP i=1 TO dwInstanceListSize
if VAL(InstanceList[i])=0
message(InstanceList[startpos : i-1])
startpos = i+1.
END
end
end
DISPOSE(CounterList)
DISPOSE(InstanceList)

Павел Яковенко


Перехват закрытия окна

Как сделать шоб при нажатии на виндовз кнопочку "ЗАКРЫТЬ" (т.е. крестик или из системного меню CLOSE) -- перехватить закрытие? Именно как - я знаю, но какую "затычку" там вставить, шоб окошко не закрылось? То-есть попросту надо сделать:

a. User: CLOSE!
b. Program: Do you really wanna exit? [Yes] [No]
a. User: Hmmm... No!
b. Program: Ok, continue work...

Ответ:
Во вставке "Обработка событий в окне - CloseDown" поставь код:

if Message('Завершить работу?','Внимание!',ICON:Question, |
           BUTTON:YES+BUTTON:NO,BUTTON:NO) = BUTTON:NO
   Cycle

Олег А. Руденко

По моему нужно в CloseWindow а не в CloseDown...

Далюс Гужаускас  E-mail: tichij@iname.com


Отключение режима "AcceptALL"

Как бы избавится от сабжа в форме. Поскольку при нажатии на Ok, для всех полей генерируются события Event:Accepted и соответственно выполняется весь код, подвешенный в ембедах на них.

Ответ:
Убрать с кнопки атрибут REQ или прописать
Window{PROP:AcceptAll} = FALSE

aLEX Timkov  E-mail: athome@ukrpost.net // timkoff@siberlink.com


Как сделать оконо неподвижным ?

Ответ 1:
EVENT:Move

The user is moving a window with the IMM attribute. If a CYCLE statement is encountered in the code to process this event, EVENT:Moved is not generated and the action is aborted. This is the event on which you can prevent users
from moving a window. The system is modal during this event.

Вставь в эмбед к WindowEvents - EVENT:Move оператор CYCLE

С уважением, Илья Пащенко.

Ответ 2:
Убери заголовок, системное меню и кнопки. Короче когда нет синей полосы и системного меню, никуда ты окно не передвинешь.

С Уважением
Martin  martin@sochi.ru


Каким образом запретить запускать одно и то же MDI-окно несколько раз, а переходить к уже открытому?

Ответ:

IF ProcStarted=0 THEN
   ProcThread = START(Proc)
   ProcStarted= 1
ELSE
   POST(EVENT:GainFocus,,ProcThread )
END

С уважением, Олег. sh_group@chat.ru


Как закрыть все окна в MDI-приложении 

Вопрос:
 MDI программу. Открыто несколько потоков. В одном из потоков
> YBM> изменена конфигурационная информация. Это должно вызвать закрытие окон
> YBM> других потоков (всех, или по необходимости). Как мне их закрыть
(кроме
> YBM> того окна , где производились изменения).

Ответ:
На мой взгляд, все очень просто:

The maximum number of simultaneously available execution threads in a single
application is 64. The first execution thread in any program is the main
program code, which is always thread number one (1). Therefore, THREAD
always returns a value in the range of one (1) to sixty-four (64).

Таким образом, в точке, соответствующей нажатию кнопки, например, делаем
вставку:

loop i# = 2 to 64
  if(i# <> 0{prop:thread})
    post(event:closewindow, , i#)
  end
end

Удачи!  Sergei Artyushenkov.  asn@arsis.ru






Hosted by uCoz