Форум » GUI » TsBrowse в Минигуи (продолжение) » Ответить

TsBrowse в Минигуи (продолжение)

Vlad04: TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру [quote] DEFINE TBROWSE oBrw2 ; AT 60,450 ; ALIAS cAlias ; OF Form1 ; WIDTH 330 ; HEIGHT 340 ; FONT "Verdana" ; SIZE 9 ; ON DBLCLICK CopyRec(); ON GOTFOCUS fModelo_Hab(2) ; AUTOFILTER ; CELLED EDIT; VALUE nRec; GRID [/quote] Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Dr. Oldwarez: SergKis пишет: опр. типы колонок Типы колонок заранее известны, но порядок может быть разным и могут быть неиспользуемые колонки. Используемые Subject - текстовый Start Date, End Date - дата (амер.). Start Time, End Time - текстовый AMPM Location - текстовый Description - MEMO

SergKis: Dr. Oldwarez пишет Типы колонок заранее известны, но порядок может быть разным и могут быть неиспользуемые колонки Определите структуру для dbf заранее, если все известно, в коде выше уберите aLen, aTyp aHdr - даст заголовки-поля по колонкам aDim - даст данные по записям и колонкам подайте их в тсб или обработайте и запишите в dbf

SergKis: PS вместо t := CtoD(t) использовать можно t := hb_CtoD(t, "mm/dd/yyyy")


Dr. Oldwarez: SergKis пишет: Определите структуру для dbf заранее, если все известно, в коде выше уберите aLen, aTyp aHdr - даст заголовки-поля по колонкам aDim - даст данные по записям и колонкам подайте их в тсб или обработайте и запишите в dbf Вот так? [pre2]SET DATE AMERICAN aBuf := hb_ATokens( hb_memoread(GetFile({{'CSV-Datei','*.csv'}},'Wählen Sie eine CSV Import-Datei aus',; cDatenLW,.F.,.T.)), CRLF) aDim := {} aTyp := {"C","D","C","C","C","M"} aLen := {10,10,5,5,25,150} aHdr := {} FOR nI := 1 TO Len(aBuf) IF nI == 1 // header FOR EACH t IN hb_ATokens(aBuf[ nI ], ",") ; AAdd(aHdr, t) nSubject:=ASCAN(aHdr,'Subject') nStartDate:=ASCAN(aHdr,'Start Date') nStartTime:=ASCAN(aHdr,'Start Time') nEndTime:=ASCAN(aHdr,'End Time') nLocation:=ASCAN(aHdr,'Location') nDescription:=ASCAN(aHdr,'Description') NEXT ELSE aTmp := hb_ATokens(aBuf[ nI ], ",") NEXT AAdd(aDim, {aTmp[nSubject],CTOD(aTmp[nStartDate]),ft_Civ2Mil(aTmp[nStartTime]),ft_Civ2Mil(aTmp[nEndTime]),; aTmp[nLocation],aTmp[nDescription]}) ENDIF NEXT SET DATE GERMAN[/pre2]

SergKis: Dr. Oldwarez пишет Вот так? Нет. Разрушили соответствие колонок aHdr и aDim в aHdr t, т.е. все колонки с пустыми, а в aDim только нужные по мне проще сделать массивы в полном соответствии как в файле, потом выбрать нужные по структуре или aHdr привести через aTmp в соответствие с aDim, как на ELSE

Dr. Oldwarez: SergKis пишет: Нет. Разрушили соответствие колонок aHdr и aDim Спасибо за напоминание! Тогда будет массив aHdr - для считывания ВСЕХ полей и aHeaders - то, что идёт в заголовки TBrowse Спасибо за помощь. Извините, тут одна линейка памяти сдохла, осталось совсем мало. Завтра куплю новую и продолжу.

SergKis: Dr. Oldwarez пишет Тогда будет массив aHdr - для считывания ВСЕХ полей и aHeaders - то, что идёт в заголовки TBrowse Определение заголовка лучше вынести за цикл[pre2] aBuf := hb_ATokens( hb_memoread(GetFile({{'CSV-Datei','*.csv'}},'Wählen Sie eine CSV Import-Datei aus',; cDatenLW,.F.,.T.)), CRLF) aFld := {"Subject", "StartDate", "StartTime", "EndTime", "Location", "Descript"} aTyp := {"C","D","C","C","C","M"} aLen := {10, 10, 5, 5, 25, 10} aDec := {0, 0, 0, 0, 0, 0} aDim := {} ; aHdr := {} FOR EACH t IN hb_ATokens(aBuf[ 1 ], ",") ; AAdd(aHdr, t) NEXT nSubject:=ASCAN(aHdr,'Subject') nStartDate:=ASCAN(aHdr,'Start Date') nStartTime:=ASCAN(aHdr,'Start Time') nEndTime:=ASCAN(aHdr,'End Time') nLocation:=ASCAN(aHdr,'Location') nDescription:=ASCAN(aHdr,'Description') aHead := {aHdr[nSubject],CTOD(aHdr[nStartDate]),ft_Civ2Mil(aHdr[nStartTime]),ft_Civ2Mil(aHdr[nEndTime]),; aHdr[nLocation],aHdr[nDescription]} FOR nI := 2 TO Len(aBuf) aTmp := hb_ATokens(aBuf[ nI ], ",") AAdd(aDim, {aTmp[nSubject],CTOD(aTmp[nStartDate]),ft_Civ2Mil(aTmp[nStartTime]),ft_Civ2Mil(aTmp[nEndTime]),; aTmp[nLocation],aTmp[nDescription]}) NEXT [/pre2]

Dr. Oldwarez: SergKis пишет: Нет. Разрушили соответствие колонок aHdr и aDim в aHdr t, т.е. все колонки с пустыми, а в aDim только нужные по мне проще сделать массивы в полном соответствии как в файле, потом выбрать нужные по структуре или aHdr привести через aTmp в соответствие с aDim, как на ELSE И вот, СРАБОТАЛО!!! [pre2]aBuf := hb_ATokens( hb_memoread(GetFile({{'CSV-Datei','*.csv'}},'Выберите файл CSV для импорта',; cDataDir,.F.,.T.)), CRLF) aDim := {} aTyp := {"C","D","C","C","C","M"} aLen := {80,80,40,40,200,400} aHdr := {} aHeaders:={"Subject","Start Date", "Start Time","End Time","Location","Description"} FOR nI := 1 TO Len(aBuf) IF nI == 1 // header FOR EACH t IN hb_ATokens(aBuf[ nI ], ",") ; AAdd(aHdr, t) nSubject:=ASCAN(aHdr,'Subject') nStartDate:=ASCAN(aHdr,'Start Date') nStartTime:=ASCAN(aHdr,'Start Time') nEndTime:=ASCAN(aHdr,'End Time') nLocation:=ASCAN(aHdr,'Location') nDescription:=ASCAN(aHdr,'Description') NEXT ELSE aTmp := hb_ATokens(aBuf[ nI ], ",") IF LEN(aTmp)>3 AADD(aDim,{; aTmp[nSubject],; hb_CTOD(aTmp[nStartDate],'MM/DD/YYYY'),; LEFT(FT_CIV2MIL(aTmp[nStartTime]),2)+":"+RIGHT(FT_CIV2MIL(aTmp[nStartTime]),2),; LEFT(FT_CIV2MIL(aTmp[nEndTime]),2)+":"+RIGHT(FT_CIV2MIL(aTmp[nEndTime]),2),; IIF(nLocation<=LEN(aTmp),aTmp[nLocation],""),; IIF(nDescription<=LEN(aTmp),aTmp[nDescription],"")}) ENDIF ENDIF NEXT [/pre2] Дальше там ещё должны быть преобразования с первым полем, раскалывающие его на два поля и контроль дубликатов по полям StartDate и StartTime. Для всего этого хорошо бы конвертацию во временную таблицу - мне с таблицами веселее, чем с массивами. Перед каждым открытием эта таблица должна, естественно, очищаться ZAP.

SergKis: Dr. Oldwarez пишет Для всего этого хорошо бы конвертацию во временную таблицу Делайте в таблицу (из моего примера)[pre2] REQUEST HB_MEMIO aStru := {} FOR EACH cFld, cTyp, nLen, nDec IN aFld, aTyp, aLen, aDec ; AAdd(aStru, {cFld, cTyp, nLen, nDec}) NEXT cDbf := "mem:Test" // или ".\Test" dbDrop(cDbf, cDbf, "DBFCDX") dbCreate( cDbf, aStru, , .T., "TMP", , "RU1251" ) FOR EACH aTmp IN aDim APPEND BLANK FOR nI := 1 TO FCount() FieldPut(nI, aTmp[ nI ] ) // aFld := {"Subject", "StartDate", "StartTime", "EndTime", "Location", "Descript"} NEXT NEXT USE [/pre2]

SergKis: PS добавить NEXT Browse() USE dbDrop(cDbf, cDbf, "DBFCDX") // для mem:

Andrey: У юзера падает программа на ТСБ. Видно мышкой так давит, что успевает несколько кликов сделать. У меня так не получается. Вот такая примерно ошибка: [pre2] Called from (b)CREATEBROWSETABLE(807) in module: Source\Tbrw_table.prg Called from TSBROWSE:LDBLCLICK(9200) in module: h_tbrowse.prg Called from TSBROWSE:HANDLEEVENT(9588) in module: h_tbrowse.prg Called from EVENTS(96) in module: h_events.prg Called from DOEVENTS(0) [/pre2] Можно как то блокировать запись, чтобы повторно не срабатывала мышка ? На ВСЕХ кнопках сделал блокировку, у юзера перестало падать по кнопкам. Это наверное из той же серии, комп медленный, а юзер мышку давит до последнего !

Петр: Andrey пишет: Это наверное из той же серии Серия называется "Извините, а вы точно ..."

alex_II: Попробовал использовать следующую конструкцию на основе информации из файла-справки: DEFINE TBROWSE Br_sch AT h_tlbar,0 ALIAS 'sch' WIDTH w_br HEIGHT h_br BOLD CELLED ... ADD COLUMN TO Br_sch HEADER 'Вид' SIZE w_vid ; // 3 DATA ComboWBlock(Br_sch,'kod_vid',3,{aItem,aData}) ; ALIGN DT_CENTER, DT_CENTER ; EDITABLE ... Получаю: данные в колонке не отображаются и при попытке редактирования возникает ошибка: Error MGERROR/0 GETBOX: Initial Value or Field must be specified. Program terminated. Called from MSGMINIGUIERROR(100) in module: h_error.prg Called from _DEFINEGETBOX(95) in module: h_getbox.prg Called from TGETBOX:NEW(109) in module: TGetBox.prg Called from TSBROWSE:EDIT(5637) in module: h_tbrowse.prg Called from TSBROWSE:KEYDOWN(8661) in module: h_tbrowse.prg Called from TSBROWSE:HANDLEEVENT(9555) in module: h_tbrowse.prg Called from EVENTS(96) in module: h_events.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1516) in module: h_windows.prg Called from DATA_SCH(225) in module: Source\data_sch.prg ... Однако если написать: DEFINE TBROWSE Br_sch AT h_tlbar,0 ALIAS 'sch' WIDTH w_br HEIGHT h_br BOLD CELLED ... ADD COLUMN TO Br_sch HEADER 'Вид' SIZE w_vid ; // 3 DATA nil ; ALIGN DT_CENTER, DT_CENTER ; EDITABLE ... Br_sch:SetData(3,ComboWBlock(Br_sch,'kod_vid',3,{aItem,aData})) ... Все прекрасно работает.

SergKis: alex_II пишет Получаю: данные в колонке не отображаются и при попытке редактирования возникает ошибка: Вам надо добавить уточнение для колонки COMBO или COMBOBOX (попадаете на GETBOX) ADD COLUMN TO Br_sch HEADER 'Вид' SIZE w_vid ; // 3 DATA ComboWBlock(Br_sch,'kod_vid',3,{aItem,aData}) ; COMBOBOX ; ALIGN DT_CENTER, DT_CENTER ; EDITABLE

alex_II: Спасибо за помощь

alex_II: Есть ли возможность изменить состояние чекбокса в TBROWSE клавишей Enter? Пользователям удобнее работать на клавиатуре. Может кто уже решил эту проблему.

SergKis: Есть ли возможность изменить состояние чекбокса в TBROWSE клавишей Enter? oBrw:lCheckBoxAllReturn := .T.

alex_II: Спасибо

alex_II: Неудобно редактировать COMBOBOX. Тут ситуация обратная CHECKBOX'у При работе с COMBOBOX мышью для, подтверждения выбора необходимо нажать Enter. Нельзя ли для этого использовать двойное нажатие ЛКМ. Редактирование через клавиатуру устраивает.

SergKis: alex_II пишет Неудобно редактировать COMBOBOX. Не только это, но стрелки вверх\вниз сменят позицию значения (SET NAVIGATION EXTENDED как правило стоит) и пользователь по привычке сделает и не заметит, а значение сменит, что было не видел ... Использую только на формах не на тсб, откл. TABSTOP, только мышкой можно менять. На тсб исп. вариант такого же тсб, см. пример Tsb_ListBox (много данных) или динамическое ContextMenu используйте. Примеры есть на эту тему или Андрея спросите их у него много



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