Форум » FiveWin » Непонятки с Folderex » Ответить

Непонятки с Folderex

ZAlex: Начинающий пользователь FiveWin. Начинаю писать новую программу и столкнулся с трудностью использования Folderex. #include "FiveWin.ch" #include "xbrowse.ch" STATIC cPath, cPathDB, oFont, oFont2 FUNCTION Main() Local oMainWindow, oFld, oBrw, oBar Local n_Width:= 0, n_Height:=0 Private oBrwL, oTab cPath := cFilePath(GetModuleFileName( GetInstance() ) ) + "\" cPathDB := Lower(Alltrim(cPath)) + "DB\" // создать нужные каталоги если их не хватает IF DirChange( cPathDB ) > 0 MakeDir( cPathDB ) ELSE DirChange( cPath ) ENDIF SET CENTURY ON // дата полностью дд/мм/гггг set epoch to 1960 SET DATE TO BRITISH set(_SET_DATEFORMAT,"DD.MM.YYYY") SET DELETED ON //фильтрация для удаленных записей (не показываем помеченные на удаление) SET _3DLOOK ON // Database driver. RDDSETDEFAULT( "DBFCDX" ) REQUEST DBFCDX , DBFFPT REQUEST HB_CODEPAGE_RU866 // Russian Windows CP-866 REQUEST HB_CODEPAGE_RU1251 // Russian Windows CP-1251 // Set default language HB_CDPSelect( "RU1251" ) DefineOpen() SetGetColorFocus() oFont := TFont():New("Arial",0,-16,.F.,.F.,0,0,,.F.,.F.,.F.,204,0,0,0,,0) oFont2 := TFont():New("Arial",0,-14,.F.,.T.,0,0,,.F.,.F.,.F.,204,0,0,0,,0) DEFINE WINDOW oMainWindow FROM 5, 5 TO GetSysMetrics(1) - 35 , GetSysMetrics(0) - 5 PIXEL; TITLE "Главное окно -" DEFINE BUTTONBAR oBar OF oMainWindow 2010 SIZE 60, 60 n_Width:=oMainWindow:NWIDTH n_Height:=oMainWindow:NHEIGHT @ 45, 3 FOLDEREX oFld of oMainWindow SIZE n_Width - 21, n_Height - 137 PIXEL ADJUST; PROMPT "&Один", "&Два", "&Три", "&Четыре", "&Пять", "Шесть", "Выход"; ACTION( If( nOption == 7, oMainWindow:End(), ; MsgInfo( "Выбрано " + StrTran( ::aPrompts[ nOption ], "&", "" ) ) ) ); ON PAINT TAB PaintTab( Self, nOption ); ON CHANGE (ChangeDlg( oFld ), If( nOption == 7, If( MsgYesNo( "Завершить программу?","Ваш выбор:" ), ; oMainWindow:End(), ( ::SetOption( nOldOption ), ::Refresh() ) ), ) ); ON PAINT TEXT( If( nOption == ::nOption .and. nOption == 2, CLR_YELLOW, CLR_BLACK ) ) ; TOP OPTION 1 ALIGN AL_LEFT, AL_LEFT, AL_LEFT, AL_LEFT, AL_LEFT, AL_LEFT, AL_LEFT //; oFld:lTransparent := .T. oFld:nFolderHeight := 40 oFld:nSeparator := 0.1 oFld:bClrText := {| o, n | 128 } oFld:oFont := oFont oFld:nOption := 1 oFld:EnableTab( 1 ) // PAGE1( oFld) /// если раскоментарить происходит инициализация xBrowse //PAGE2( oFld) //PAGE3( oFld) SET MESSAGE OF oMainWindow TO " Тестовая " KEYBOARD CLOCK DATE 2010 ACTIVATE WINDOW oMainWindow; ON INIT oFld:Resize() //; oFont:End() oFont2:End() Return nil //--------------------------// Function ChangeDlg( oFld ) Local nDlg:=oFld:nOption Do Case Case nDlg = 1 MsgInfo(nDlg) PAGE1(oFld) /// почему не отрабатывает здесь Case nDlg = 2 MsgInfo(nDlg) Case nDlg = 3 MsgInfo(nDlg) Case nDlg = 4 MsgInfo(nDlg) Case nDlg = 5 MsgInfo(nDlg) Endcase Return nil FUNCTION PAGE1(oFld) Local oBrw, cAlias:='ATerm' @ 10,20 XBROWSE oBrw OF oFld:aDialogs[ 1 ] ; HEADER "Id_Kod", "nNom", "Наименование " ; COLUMNS "Id_Kod", "nNom", "cNaim" ; ALIAS 'ATerm' CELL LINES FOOTERS; // NOBORDER ON DBLCLICK RowEdit( oBrw:CurrentRow() ) FONT oFont2 ; oFld:aDialogs[ 1 ]:oClient = oBrw oBrw:nMarqueeStyle := MARQSTYLE_HIGHLWIN7 oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) ) oBrw:CreateFromCode() oBrw:SetFocus() oBrw:bLDblClick = { || ( oBrw:cAlias )->( RowEdit(oBrw:CurrentRow()) ) } // ordscope(1,nil) //ordscope(0,nil) Return nil /// корректировка текущей записи static function RowEdit( oRow ) Return nil FUNCTION PaintTab( o, nOption ) IF nOption == o:nOver .OR. nOption == o:nOption o:SetAlphaLevel( nOption, 255 ) ELSE o:SetAlphaLevel( nOption, 50 ) ENDIF RETURN o:SetFldColors( o, nOption ) // =======================================================-открываем базы // Function DefineOpen() Local aArq:={} If ! FILE( (cPathDB) + "Terminal.DBF" ) Aadd( aArq , { 'ID_KOD' , 'N' , 2 , 0 } ) Aadd( aArq , { 'NNom' , 'N' , 6, 0 } ) Aadd( aArq , { 'CNAIM' , 'C' , 40, 0 } ) Aadd( aArq , { 'cPrim' , 'M' , 10, 0 } ) DBCreate( (cPathDB) + "Terminal.DBF" , aArq ) Endif Use (cPathDB) + "Terminal.DBF" Alias ATerm CODEPAGE "RU866" new shared If ! File( (cPathDB) +'Terminal.cdx') fLock() Index on Str(ATerm->ID_KOD,2) + Str(ATerm->NNOM,6) tag ID_KOD to (cPathDB) +'Terminal.cdx' Unlock Endif Set Index to (cPathDB) + 'Terminal.cdx' ATerm->(ordsetfocus('ID_KOD')) Return Nil FiveWin 13.01 (спасибо ММК за ссылку) Harbour 3.2.0dev (r1409051124)

Ответов - 8

ММК: PAGE1(oFld) /// почему не отрабатывает здесь А отрабатывать оно должно при каких-либо изменениях на фолдере- так у Вас написано. ( ON CHANGE ... ) Поэтому если (к примеру) выбрать любую страницу, а потом опять вернуться к первой , которая у вас открывается при инициилизации, то бровс "прорисуется".

ZAlex: Добрый день. Я конечно-же переключал страницы, никаких изменений не происходило -- бровзер не прорисовывался. Если функцию PAGE1(oFld) изменить на: FUNCTION PAGE1(oFld) Local oBrw, cAlias:='ATerm' ,oWnd DEFINE WINDOW oWnd TITLE "Edit " + Alias() // MsgInfo("Page1") @ 10,20 XBROWSE oBrw OF oFld:aDialogs[1] ; HEADER "Id_Kod", "nNom", "Наименование " ; COLUMNS "Id_Kod", "nNom", "cNaim" ; ALIAS 'ATerm' CELL LINES FOOTERS; ON DBLCLICK RowEdit( oBrw:CurrentRow() ) FONT oFont2 // oFld:aDialogs[ 1 ]:oClient = oBrw oBrw:nMarqueeStyle := MARQSTYLE_HIGHLWIN7 oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) ) oBrw:CreateFromCode() oBrw:SetFocus() // oBrw:bLDblClick = { || ( oBrw:cAlias )->( RowEdit(oBrw:CurrentRow()) ) } oWnd:oClient = oBrw oFld:aDialogs[ 1 ]:oClient = oBrw oBrw:SetFocus() // MsgInfo("Page1-End") // ordscope(1,nil) //ordscope(0,nil) ACTIVATE WINDOW oWnd Return nil то бровсер прорисовывается, но появляется окошко. Может я некорректно формирую бровзер, или в фолдере его прорисовку не в ON CHANGE вставлять?

ММК: ZAlex пишет: Я конечно-же переключал страницы, никаких изменений не происходило -- бровзер не прорисовывался. Если функцию PAGE1(oFld) изменить на: Ваш пример работает без всяких изменений, НО сначало нажимает "два" или любую другую закладку, а потом "один". Появится окошко бровса и , естественно пустое , т.к. база пустая. ZAlex пишет: Может я некорректно формирую бровзер, или в фолдере его прорисовку не в ON CHANGE вставлять? Да с Вами просто невозможно не согласиться :) Все закладки желательно формировать сразу. В процессе работы их останется только менять. Т.е. последовательность следующая - Окно(диалог) , фолдер, заполнение страниц... Например : Tit:=" П Р И Г О Т О В Л Е Н И Е С М Е С И " DEFINE DIALOG oDg TITLE Tit FROM 1,1 TO 37.5,98 ; FONT oFon1 transparent @ 0.1, 0.1 FOLDER oFld ; PROMPTS " Смеси "," Состав " ; SIZE 385, 275 PIXEL FONT oFon1 COLOR CLR_1,CLR_3 //263 oFld:aEnable={.T.,.T. } Selec NS Go top @ 1,1 XBROWSE oBrw SIZE 367,260 PIXEL OF oFld:aDialogs[1] ALIAS "NS"; FOOTERS FASTEDIT LINES CELL ; ON CHANGE ( VOku(NS->KOD,"Sm"),oBs:MakeTotals(),oBs:RefreshFooters(),oBs:Refresh(),oFld:aDialogs[2]:Refresh()) oBrw:nHeaderLines := 2 ADD oCol TO oBrw DATA NS->KOD HEADER "код " SIZE 75 CARGO "NS->KOD" oCol:AddResource( "In1" ) oCol:AddResource( "In2" ) oCol:nHeadBmpNo := 2 oCol:oHeaderFont := oFon3 oCol:oDataFont := oFon3 oCol:bLClickHeader = {|nMRow,nMCol,nFlags,Self|Mumu(oBrw,1,Self,4,"NS")} ADD oCol TO oBrw DATA OemToAnsi(NS->NAME) HEADER "Наименование" SIZE 425 CARGO "NS->NAME" oCol:oHeaderFont := oFon3 oCol:nHeadStrAlign := AL_CENTER .................................. Select Sm ORDSCOPE(0,NS->KOD) ORDSCOPE(1,NS->KOD) Go top @ 1,1 XBROWSE oBs SIZE 367,260 PIXEL OF oFld:aDialogs[2] ALIAS "Sm"; FOOTERS FASTEDIT LINES CELL //ON CHANGE Fresh(Al->kod) oBs:nHeaderLines := 2 ADD oCol TO oBs DATA Sm->KODSM HEADER "код" SIZE 50 CARGO "Sm->KOD" oCol:oDataFont := oFon3 oCol:AddResource( "In1" ) oCol:AddResource( "In2" ) oCol:nHeadBmpNo := 2 oCol:bLClickHeader = {|nMRow,nMCol,nFlags,Self|Mumu(oBs,1,Self,2,"Sm")} ADD oCol TO oBs DATA Sm->NAME HEADER "наименование" SIZE 200 CARGO "Sm->NAme" ADD oCol TO oBs DATA Sm->Ves HEADER "Вес" SIZE 60 CARGO "SM->VES" oCol:oDataFont := oFon3 oCol:nHeadStrAlign := AL_CENTER oCol:lTotal := .t. oCol:nTotal := 0 // if we already know the total, we can assign the total value. oCol:oFooterFont := oFon1 и т.д. А ON CHANGE позволит реагировать на всякие изменения уже в процессе работы

ZAlex: Спасибо за разъяснение ММК пишет: Все закладки желательно формировать сразу. В процессе работы их останется только менять. Т.е. последовательность следующая - Окно(диалог) , фолдер, заполнение страниц... Я так и предполагал, но у меня одна база(так сложилось) . Алгоритм был такой: nFilter:=1 Select ATerm ordscope(0,Str(nFilter,2)) ordscope(1,Str(nFilter,2)) @ 10,20 XBROWSE oBrw OF oFld:aDialogs[1] HEADER "Id_Kod", "nNom", "Наименование " COLUMNS "Id_Kod", "nNom", "cNaim" ; ALIAS 'ATerm' .... . . . nFilter:=2 ordscope(0,Str(nFilter,2)) ordscope(1,Str(nFilter,2)) @ 10,20 XBROWSE oBrw OF oFld:aDialogs[2] HEADER "Id_Kod", "nNom", "Наименование " COLUMNS "Id_Kod", "nNom", "cNaim" ; ALIAS 'ATerm' .... и т.д. после прорисовки бровзера и переключения вкладок был активным последний ordscope во всех закладках. Поэтому начал пробовать другой вариант. Значит в моем случае, по первому варианту после заполнения страниц необходимо их переформировывать с новым ordscope при переключении страницы?

ММК: ZAlex пишет: Значит в моем случае, по первому варианту после заполнения страниц необходимо их переформировывать с новым ordscope при переключении страницы? Если речь идет о какой-то конкретной задаче , а не просто примерчике тогда надо посмотреть на все чуток иначе. Зачем семь закладок? Семь фильтров? Филтр произвольный или их всего шесть? Это к тому, что возможно и фолдер здесь лишний... А сделать почти все можно ....

ZAlex: Да, фильтров всего шесть. Надо посмотреть на это по другому. Спасибо, буду думать. Действительно, зачем здесь фолдер.

ММК: ZAlex пишет: Спасибо, буду думать. Действительно, зачем здесь фолдер. Получилось?

ZAlex: Да, все получилось, сейчас экпериментирую с оформлением.



полная версия страницы