Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
А что это было?
А что это было? :roll:
|
|
|
|
Добавлено: Вт окт 06, 2009 02:18 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Хищник писал(а): А чего говорить-то? Ну хоть что-то, я ведь не так уж часто пишу программы на 15 кило, может я там иду к какому-нибудь глобальному заблуждению? Хищник писал(а): Хорошая штука, можно дочистить интерфейс
А что там лишнего/не хватает?
[quote="Хищник"]А чего говорить-то?[/quote] Ну хоть что-то, я ведь не так уж часто пишу программы на 15 кило, может я там иду к какому-нибудь глобальному заблуждению? [quote="Хищник"]Хорошая штука, можно дочистить интерфейс[/quote]
А что там лишнего/не хватает?
|
|
|
|
Добавлено: Пт мар 28, 2008 23:36 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Главный критик с форума сбежал , а неглавным сказать и нечего.
Главный критик с форума сбежал :(, а неглавным сказать и нечего.
|
|
|
|
Добавлено: Пт мар 28, 2008 02:16 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
А чего говорить-то? Хорошая штука, можно дочистить интерфейс и уже готовый пример, как можно с минимумом поддержки ОС сделать приличный интерфейсик.
А чего говорить-то? Хорошая штука, можно дочистить интерфейс и уже готовый пример, как можно с минимумом поддержки ОС сделать приличный интерфейсик.
|
|
|
|
Добавлено: Чт мар 27, 2008 23:30 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
И что? Неужели никто ничего не скажет? Я так старался и хотелось бы хотя бы конструктивную критику/совет услышать, или еще что-нибудь...
И что? :? Неужели никто ничего не скажет? Я так старался и хотелось бы хотя бы конструктивную критику/совет услышать, или еще что-нибудь...
|
|
|
|
Добавлено: Чт мар 27, 2008 23:11 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Ну вот, и мой вариант, правда я немного отклонился от ТЗ... и немного задержался...
Вобщем вместо выполнения всех условий по ТЗ, захотелось мне вот сделать действительно маленький эксель и с простеньким GUI - еще бы не сделать интерфейс, когда под рукой такой замечательный инструмент, как Quark-Forth http://www.msyst.ru/quarkexe.zip Код не самый-пупер промышленный, скорее даже немного сумбурный и местами не самый эффективный, но он работает, и, кажется, без глюков
Что же получилосЬ в итоге?
Что есть:
Трехмерная таблица 26*38*3: каждая ячейка может одновременно хранить обычное 4-х байтовое число, флоат, и строку('побочный' эффект необходимости одновременно хранить формулу в строке и выводить результат этой формулы), соответствующий тип можно просмотреть кнопками F1-F4 (числа, флоат, строка, NULL - т.е. пустая ячейка, но при этом все данные она продолжает хранить), ввести новое значение можно кнопками F5-F7(продублировано на мышке: ЛКМ, ПКМ, колесо) очистить ячейку по кнопке F8;
Строки можно раскрашивать - по умолчанию используется символ Alt+166, но можно выбрать и любой другой;
Формула в строке вычисляется в случае, если первый символ '=', формат записи - обычный для форта, сначала указываем номер строки, затем через пробел букву столбца, и на стеке будет число из этой ячейки;
Есть две простые формулы
\ +( 0 a 2 b )+ \ Сложить все числа в ячейках 0a,1a,2a,0b,1b,2b
\ *( 0 a 2 b )* \ Перемножить все числа в ячейках 0a,1a,2a,0b,1b,2b
Сохранение и загрузка таблицы - F11,F12;
Есть хелп.
Чего нет:
Обработки ошибок в формуле;
Контроля повторности вычисления формул;
Возможности зацикливания ссылок в ячейках;
Возможно еще что-то пропустил.
Для тех кто в 'танке' напоминаю: код для Кварк-Форта http://www.msyst.ru/quarkexe.zip запускаем и печатаем " file-name.txt" L или в ком строке quark.exe file-name.txt.
Код: \ Problem K, или небольшой такой 'пухленький' кварк-форт-эксель \ Автор: VoidVolker \ Дата: 22.03.2008 \ # Различные настриваемые параметры интерфейса 0xAA7755 VALUE цвет_таблицы BLACK VALUE цвет_фона WHITE VALUE цвет_выделения 0xEEEEEE VALUE цвет_текста
0x88FF88 VALUE цвет_чисел 0xFFFF88 VALUE цвет_флоатов 0xFF88FF VALUE цвет_строк 0x88FFFF VALUE цвет_ячейки
166 VALUE simbol-colorer \ Символ указывающий
35 VALUE table-x \ Позиция основной таблицы 105 VALUE table-y
5 26 MIN 1 MAX VALUE COLS \ Число столбиков 10 38 MIN 1 MAX VALUE ROWS \ Число строк 130 VALUE CELLA \ Длина ячейки 20 VALUE CELLB \ Высота ячейки
35 VALUE ROWS-NAMEA \ Длина стобца с номерами строк
\ # Status-box \ (Надо бы его к основной таблице приклеить) 0 VALUE sbox-x 40 VALUE sbox-y 85 8 * VALUE sbox-a 20 VALUE sbox-b 64 VALUE sbox-data-x
64 VALUE STRING-SIZE \ Размер строк
\ ##### K: begin \ Различные переменные table-x VALUE cell-x \ Координата X текущей ячейки table-y VALUE cell-y \ Координата Y текущей ячейки QUAN cell' \ Адрес текущей ячейки
QUAN col-buf \ Буфер цвета для текста
table-x VALUE last-cell-x table-y VALUE last-cell-y CELLA 2 - VALUE last-cell-a CELLB 2 - VALUE last-cell-b
" abcdefghijklmnopqrstuvwxyz" VALUE "az
\ ### 1.0 Разное : GOTOCONSOLE 0 0 GOTOXY ; \ # 1.1 Tools : 2DUP OVER OVER ; : -- CREATE OVER , + DOES> @ + ; : MOUSEX MOUSE-X @ ; : MOUSEY MOUSE-Y @ ; : 'SWAP \ ( a: X a1: Y -- a: Y a1: X ) OVER @ OVER @ >R SWAP ! R> SWAP ! ; : 'NOOP ['] NOOP ; \ # 1.2 Графические примитивы : FBOX \ x y a b цвет SWAP 0 DO 3 PICK 3 PICK I + 3 PICK 3 PICK HLINE LOOP DROP DROP DROP DROP ; : BOX \ x y a b цвет 4 PICK 4 PICK 4 PICK 3 PICK HLINE 4 PICK 4 PICK 3 PICK 3 PICK VLINE 4 PICK 4 PICK 1- 3 PICK + 4 PICK 3 PICK HLINE >R 3 XCHG 1- SWAP + SWAP ROT R> VLINE ;
\ # 1.3 Текст : boxed-textxy \ ( x y -- x1 y1 ) >R 5 + R> 3 + ; : box-textxy \ ( x y -- ) boxed-textxy TEXTXY ;
\ # 1.4 Графические примитивы отдельно взятой ячейки : last-inside-box \ ( -- x1 y1 a1 b1 ) Внутренний прямоугольник предыдущей активированной ячейки last-cell-x 1+ last-cell-y 1+ last-cell-a last-cell-b ; : hlight \ Подсвечивает ячейку cell-x 1+ cell-y 1+ CELLA 2 - CELLB 2 - цвет_выделения BOX ; : un-hlight \ Отменяет подсветку last-inside-box цвет_фона BOX ; : clear-cell \ Очищает ячейку на экране last-inside-box цвет_фона FBOX ; : cell-textxy \ Печатает текст в текущей ячейке cell-x cell-y box-textxy ;
\ ### 2.0 Раскраска : mem-col GETCOLOR TO col-buf ; : prev-col col-buf SETCOLOR ; : num-color mem-col цвет_чисел SETCOLOR ; : float-color mem-col цвет_флоатов SETCOLOR ; : string-color mem-col цвет_строк SETCOLOR ; : cell-name-color mem-col цвет_ячейки SETCOLOR ;
\ # 2.1 Цветные строки : sbgr>num \ ( str -- n ) Конверитрует стpоковое пpедставление числа в 16-pичном виде в число; берется 6 первых символов >R 0 6 0 DO R@ C@ DUP 48 57 WITHIN \ Число? IF 48 - \ Код числа >> число ELSE DUP 65 70 WITHIN \ Буква? IF 55 - ELSE 0 THEN \ Код буквы >> число THEN 5 I - 4 * LSHIFT + \ Установка разряда R> 1+ >R LOOP RDROP ;
QUAN cprint-colbuf : sprev-color cprint-colbuf SETCOLOR ; : sset-color \ ( s -- s+7 ) GETCOLOR TO cprint-colbuf DUP sbgr>num SETCOLOR 7 + ;
CREATE colored1 ' sset-color , CREATE colored2 ' sprev-color , : CPRINT \ ( str -- ) \ Печатает строку с учетом цвета "подстрок", цвет подстроки указывается после символа ¦ и подстрока BEGIN \ ограничивается этим-же символом, например: " [ ¦FF3333 F5¦ Int= " CPRINT подстрока F5 будет цветом FF3333 DUP C@ DUP WHILE \ a char DUP DUP 166 = SWAP simbol-colorer = OR \ Символ ¦ ? IF DROP 1+ colored1 @ EXECUTE colored1 colored2 'SWAP ELSE EMIT 1+ THEN REPEAT DROP DROP ;
\ ### 3.0 Структура ячеек и таблицы : for-cells ROWS 0 DO COLS 0 DO IJ #>' calculated? OFF LOOP LOOP ;
0 1 CELLS -- #cell 1 CELLS -- calculated? \ Для избегания повторного вычисления ячейки (в данный момент не используется) 1 CELLS -- class 1 CELLS -- number 1 FLOATS -- fnumber STRING-SIZE -- string VALUE cell-size
QUAN table-size QUAN table[]
: #>' cell-size * table[] + ; : '># #cell @ ;
: CREATE-TABLE COLS ROWS * cell-size * TO table-size HERE TO table[] table-size ALLOT 0 table[] table-size CFILL ROWS 0 DO COLS 0 DO IJ DUP #>' #cell ! LOOP LOOP ;
CREATE-TABLE
\ # 3.1 Классы содержимого ячеек : class-number. \ 'cell -- number @ num-color . prev-col ; : class-fnumber. \ 'cell -- fnumber F@ float-color F. prev-col ; : class-string. \ 'cell -- string string-color CPRINT prev-col ;
0 VALUE class-null ' class-number. VALUE class-number ' class-fnumber. VALUE class-fnumber ' class-string. VALUE class-string
: print \ cell' -- DUP class @ DUP IF clear-cell OPAQUE ON EXECUTE OPAQUE OFF ELSE DROP DROP THEN ; : cell-print cell-textxy cell' print hlight ;
\ # 3.2 Изменение класса ячейки : set-class-number cell' class-number SWAP class ! ; : set-class-fnumber cell' class-fnumber SWAP class ! ; : set-class-string cell' class-string SWAP class ! ; : set-class-null cell' class-null SWAP class ! ;
\ # 3.3 Вычисление формул \ Вероятно потребуется переопределять слова работающие с арифметикой VECT CELLACTION \ Этот вектор вызывается "ячейкой" и получает в качестве аргумента адрес этой ячейки и возвращает \ VECT CALCULATE \ Этот вектор отвечает за обработку непосредственно формулы в строковом виде; вероятно EVALUATE будет достаточно и он не понадобится : number@ \ 'cell -- D number @ ; : fumber@ \ 'cell -- F@ number F@ ; : formula? \ 'cell -- ? string C@ 61 = \ char = ;
: calculate \ 'cell -- cell_D DUP >R formula? IF \ DUP calculated? @ NOT \ IF \ DUP calculated? ON R@ string 1 + EVALUATE \ CALCULATE \ Если формула правильная, то на стеке должен быть результат - его надо сохранить в ячейку (надо бы добавить проверку глубины стека для определения правильности и 'чистоплотности' формулы) R@ number ! R@ set-class-number \ THEN \ ELSE THEN R> number @ \ CELLACTION <-- это что и зачем тут делает? ;
: col-work SWAP COLS * + #>' calculate ; VECT COL-ACTION \ #row #col -- : a 0 COL-ACTION ; : b 1 COL-ACTION ; : c 2 COL-ACTION ; : d 3 COL-ACTION ; : e 4 COL-ACTION ; : f 5 COL-ACTION ; : g 6 COL-ACTION ; : h 7 COL-ACTION ; : i 8 COL-ACTION ; : j 9 COL-ACTION ; : k 10 COL-ACTION ; : l 11 COL-ACTION ; : m 12 COL-ACTION ; : n 13 COL-ACTION ; : o 14 COL-ACTION ; : p 15 COL-ACTION ; : q 16 COL-ACTION ; : r 17 COL-ACTION ; : s 18 COL-ACTION ; : t 19 COL-ACTION ; : u 20 COL-ACTION ; : v 21 COL-ACTION ; : w 22 COL-ACTION ; : x 23 COL-ACTION ; : y 24 COL-ACTION ; : z 25 COL-ACTION ;
\ # 3.4 Вычисление функций (небольшой пример) QUAN 'vect QUAN #execs QUAN 'xt : dalay-execute -1 +TO #execs #execs NOT IF 'xt 'vect ! THEN ;
: DEXEC \ xt 'vect D -- \ 'Задержанный' вызов вектора, т.е. будет пропущено D вызовов, затем в вектор 'vect будет записан xt TO #execs 1+ TO 'vect TO 'xt ['] dalay-execute 'vect ! ;
QUAN actbuf QUAN row1 QUAN col1 QUAN row2 QUAN col2 VECT cells-act : FOR( \ xt -- ['] cells-act 1 DEXEC FROM COL-ACTION TO actbuf 'NOOP TO COL-ACTION ; : )FOR \ row1 col1 row2 col2 -- 2 1 4 2 actbuf TO COL-ACTION TO col2 TO row2 TO col1 TO row1 col1 row1 COLS * + row2 row1 1- DO col2 col1 1- DO OVER #>' calculate cells-act >R 1+ R> LOOP >R COLS + col2 col1 - - 1- R> LOOP ;
: +( \ -- D ['] + FOR( ; : )+ )FOR ;
: *( \ -- D ['] * FOR( ; : )* )FOR ;
\ Примеры использования: \ +( 0 a 2 b )+ \ Сложить все числа в ячейках 0a,1a,2a,0b,1b,2b \ *( 0 a 2 b )* \ Перемножить все числа в ячейках 0a,1a,2a,0b,1b,2b
\ ### 4.0 Интерфейс \ # 4.1 Дополнительные элементы VARIABLE col-name-buf : col-name \ n -- str "az + C@ col-name-buf ! col-name-buf ; : BL. WHERETEXTXY >R 8 + R> TEXTXY ; : STATUS-BOX. OPAQUE ON sbox-x 1+ sbox-y 1+ sbox-a 2 - sbox-b 2 - цвет_фона FBOX \ Очищение sbox-x sbox-y sbox-a sbox-b цвет_таблицы BOX \ Рамка sbox-x 1+ sbox-y 1+ sbox-b + 1- sbox-a 2 - sbox-b 2 - цвет_фона FBOX sbox-x sbox-y sbox-b + 1- sbox-a sbox-b цвет_таблицы BOX \ Рамка для строки sbox-x sbox-y box-textxy " Status: " PRINT \ Текст WHERETEXTXY sbox-data-x sbox-x + sbox-y box-textxy " [ ¦FF3333 F5¦ Int= " CPRINT cell' class-number. " ] [ ¦FF3333 F6¦ Float= " CPRINT cell' class-fnumber. " ] [ cell: " PRINT cell-name-color cell-y table-y - CELLB / . cell-x table-x - CELLA / col-name PRINT BL. prev-col " ] " PRINT sbox-x sbox-y sbox-b + 1- box-textxy " [ ¦FF3333 F7¦ Str= " CPRINT cell' class-string. BL. " ]" PRINT TEXTXY OPAQUE OFF ;
\ # 4.2 Отрисовка таблицы : rows-names. ROWS 0 DO table-x ROWS-NAMEA - \ x table-y I CELLB * + \ y 2DUP box-textxy ROWS-NAMEA CELLB цвет_таблицы BOX I . LOOP ; : cols-names. COLS 0 DO table-x I CELLA * + \ x table-y CELLB - \ y 2DUP box-textxy CELLA CELLB цвет_таблицы BOX I col-name PRINT LOOP ; : "#\N". table-x ROWS-NAMEA - table-y CELLB - 2DUP box-textxy " #\N" PRINT ROWS-NAMEA CELLB цвет_таблицы BOX ;
: TABLE. \ Отрисовка таблицы OPAQUE ON "#\N". rows-names. cols-names. ROWS 0 DO COLS 0 DO table-x I CELLA * + table-y J CELLB * + 2DUP box-textxy CELLA CELLB цвет_таблицы BOX IJ #>' print \ Отрисовывает содержимое ячеек LOOP LOOP OPAQUE OFF ;
\ # 4.3 Отрисовка всего интерфейса целиком : that-cell \ Устанавливает номер текущей ячейки в соответствующую переменную cell-x table-x - CELLA / cell-y table-y - CELLB / COLS * + #>' TO cell' ;
: DRAW-GUI 0 0 2048 2048 цвет_фона FBOX цвет_текста SETCOLOR TABLE. that-cell cell-print hlight STATUS-BOX. ;
\ ### 5.0 Перемещение активной ячейки : last-col-pos table-x COLS 1- CELLA * + ; : last-row-pos table-y ROWS 1- CELLB * + ;
\ # 5.1 Отрисовка активной ячейки : this \ Активирует ячейку под курсором MOUSEX table-x MAX table-x - CELLA / CELLA * \ Координата ячейки по горизонтали table-x + last-col-pos MIN TO cell-x MOUSEY table-y MAX table-y - CELLB / CELLB * \ Координата ячейки по вертикали table-y + last-row-pos MIN TO cell-y ;
\ # 5.2 Перемещение курсором : activate \ Активирует ячейку that-cell un-hlight cell-y TO last-cell-y cell-x TO last-cell-x hlight STATUS-BOX. ;
\ ### 6.0 Ввод/вывод данных : clear-inputbuf 0 INPUTBUF 258 CFILL ; \ # 6.1 Ячейки : cell-input \ Ввод обычного числа GOTOCONSOLE " Input number" PRINT activate set-class-number cell' number INPUT DRAW-GUI ; : cell-finput \ Ввод флоат числа GOTOCONSOLE " Input float" PRINT activate set-class-fnumber cell' fnumber FINPUT DRAW-GUI ; : cell-sinput \ Ввод строки GOTOCONSOLE " Input string" PRINT activate set-class-string clear-inputbuf INPUTDIALOG IF INPUTBUF cell' string STRING-SIZE CMOVE set-class-string clear-inputbuf cell' calculate DRAW-GUI THEN ; : cell-zeroize \ Обнуление ячейки activate set-class-null 0 cell' number 1 CELLS CFILL 0 cell' fnumber 1 FLOATS CFILL 0 cell' string STRING-SIZE CFILL clear-cell DRAW-GUI ;
: input-mouse this cell-input ; : finput-mouse this cell-finput ; : sinput-mouse this cell-sinput ;
: cell-set-class-number activate clear-cell set-class-number cell-print ; : cell-set-class-fnumber activate clear-cell set-class-fnumber cell-print ; : cell-set-class-string activate clear-cell set-class-string cell-print ; : cell-set-class-null activate clear-cell set-class-null cell-print ;
\ # 6.2 Файловые операции VARIABLE num>file-buf : .FILE \ D -- file: D \ Печатает число со стека в файл HF-OUT как бинарные данные num>file-buf ! HF-OUT num>file-buf 1 CELLS WRITEFILE DROP ; : FILE. \ file: D -- D \ Читает из файла HF-OUT число как бинарные данные на стек HF-OUT num>file-buf 1 CELLS READFILE num>file-buf @ ; : file-name-print " '" PRINT INPUTBUF PRINT " '" PRINT ;
0x51465446 VALUE file-type \ Quark Forth Table File : SAVE-TABLE GOTOCONSOLE " Save table - enter file-name" PRINT clear-inputbuf INPUTDIALOG IF DRAW-GUI INPUTBUF NEWFILE TO HF-OUT \ " test.txt" NEWFILE TO HF-OUT file-type .FILE \ По-хорошему бы это все надо в один массив сделать цвет_таблицы .FILE цвет_фона .FILE цвет_выделения .FILE цвет_текста .FILE table-x .FILE table-y .FILE COLS .FILE ROWS .FILE CELLA .FILE CELLB .FILE ROWS-NAMEA .FILE sbox-x .FILE sbox-y .FILE sbox-a .FILE sbox-b .FILE sbox-data-x .FILE STRING-SIZE .FILE cell-x .FILE cell-y .FILE cell' .FILE col-buf .FILE last-cell-x .FILE last-cell-y .FILE last-cell-a .FILE last-cell-b .FILE HF-OUT table[] table-size WRITEFILE HF-OUT CLOSE DRAW-GUI GOTOCONSOLE file-name-print " ¦00FF00 saved...¦" CPRINT THEN ; : LOAD-TABLE GOTOCONSOLE " Load table - enter file-name" PRINT clear-inputbuf INPUTDIALOG IF DRAW-GUI INPUTBUF OPEN TO HF-OUT \ " test.txt" OPEN TO HF-OUT FILE. file-type = IF FILE. TO цвет_таблицы FILE. TO цвет_фона FILE. TO цвет_выделения FILE. TO цвет_текста FILE. TO table-x FILE. TO table-y FILE. TO COLS FILE. TO ROWS FILE. TO CELLA FILE. TO CELLB FILE. TO ROWS-NAMEA FILE. TO sbox-x FILE. TO sbox-y FILE. TO sbox-a FILE. TO sbox-b FILE. TO sbox-data-x FILE. TO STRING-SIZE FILE. TO cell-x FILE. TO cell-y FILE. TO cell' FILE. TO col-buf FILE. TO last-cell-x FILE. TO last-cell-y FILE. TO last-cell-a FILE. TO last-cell-b CREATE-TABLE HF-OUT table[] table-size READFILE DRAW-GUI GOTOCONSOLE file-name-print " ¦00FF00 loaded...¦" CPRINT ELSE GOTOCONSOLE file-name-print " ¦0000EE not Quark Forth Table File!¦" CPRINT THEN THEN HF-OUT CLOSE ;
\ ### 7.0 Перемещения \ # 7.1 Перемещение текущей ячейки : act-cell-left last-cell-x CELLA - table-x MAX TO cell-x last-cell-y TO cell-y activate ; : act-cell-right last-cell-x CELLA + last-col-pos MIN TO cell-x last-cell-y TO cell-y activate ; : act-cell-up last-cell-x TO cell-x last-cell-y CELLB - table-y MAX TO cell-y activate ; : act-cell-down last-cell-x TO cell-x last-cell-y CELLB + last-row-pos MIN TO cell-y activate ;
\ # 7.2 Перемещение таблицы \ TODO: Необходимо "сместить" только отрисовку содержимого ячеек, имена столбиков и номера строк
\ ### 8.0 Хоткеи ' act-cell-left TO K_LEFT ' act-cell-right TO K_RIGHT ' act-cell-up TO K_UP ' act-cell-down TO K_DOWN
' cell-set-class-number TO K_F1 ' cell-set-class-fnumber TO K_F2 ' cell-set-class-string TO K_F3 ' cell-set-class-null TO K_F4
' cell-input TO K_F5 ' cell-finput TO K_F6 ' cell-sinput TO K_F7 ' cell-zeroize TO K_F8
' BYE TO K_F9 ' DRAW-GUI TO K_HOME ' SAVE-TABLE TO K_F11 ' LOAD-TABLE TO K_F12
' input-mouse TO <MOUSE_LEFT> ' finput-mouse TO <MOUSE_WHEEL> ' sinput-mouse TO <MOUSE_RIGHT>
\ # 8.1 Помощь : cell-pos-print \ row col -- SWAP >R CELLA * table-x + R> CELLB * table-y + box-textxy CPRINT ;
: help FROM COL-ACTION ['] cell-pos-print TO COL-ACTION " [ ¦DD5544 F1¦:" 0 a " ¦4455DD show number¦ ]" 0 b " [ ¦DD5544 F2¦:" 1 a " ¦4455DD show float¦ ]" 1 b " [ ¦DD5544 F3¦:" 2 a " ¦4455DD show string¦ ]" 2 b " [ ¦DD5544 F4¦:" 3 a " ¦4455DD show null¦ ]" 3 b " [ ¦DD5544 F5¦:" 4 a " ¦4455DD input number¦ ]" 4 b " [ ¦DD5544 F6¦:" 5 a " ¦4455DD input float¦ ]" 5 b " [ ¦DD5544 F7¦:" 0 c " ¦4455DD input string¦ ]" 0 d " [ ¦DD5544 F8¦:" 1 c " ¦4455DD zeroize¦ ]" 1 d " [ ¦DD5544 F9¦:" 2 c " ¦4455DD exit program¦ ]" 2 d " [ ¦DD5544 HOME¦:" 3 c " ¦4455DD redraw gui¦ ]" 3 d " [ ¦DD5544 F11¦:" 4 c " ¦4455DD save table¦ ]" 4 d " [ ¦DD5544 F12¦:" 5 c " ¦4455DD load table¦ ]" 5 d " ¦FFFFFF type¦ ¦FFAA22 ?¦ ¦FFFFFF or¦ ¦FFAA22 help¦" 6 a " ¦55DD44 HOME¦ - hide" 7 a TO COL-ACTION hlight ; : ? help ; \ ### 9.0 Выполнение программы \ ' DRAW-GUI TO OK
\ ' number@ TO CELLACTION ' col-work TO COL-ACTION DRAW-GUI help
P.S. Если необходимо - могу урезать до самого минимума и привести в полное соответсвие с ТЗ, вот только неизвестно когда будет на это время.
Ну вот, и мой вариант, правда я немного отклонился от ТЗ... и немного задержался... :shuffle;
Вобщем вместо выполнения всех условий по ТЗ, захотелось мне вот сделать действительно маленький эксель и с простеньким GUI - еще бы не сделать интерфейс, когда под рукой такой замечательный инструмент, как [b]Quark-Forth[/b] [url]http://www.msyst.ru/quarkexe.zip[/url] 8) Код не самый-пупер промышленный, скорее даже немного сумбурный и местами не самый эффективный, но он работает, и, кажется, без глюков :shuffle;
Что же получилосЬ в итоге?
Что есть:
Трехмерная таблица 26*38*3: каждая ячейка может одновременно хранить обычное 4-х байтовое число, флоат, и строку('побочный' эффект необходимости одновременно хранить формулу в строке и выводить результат этой формулы), соответствующий тип можно просмотреть кнопками F1-F4 (числа, флоат, строка, NULL - т.е. пустая ячейка, но при этом все данные она продолжает хранить), ввести новое значение можно кнопками F5-F7(продублировано на мышке: ЛКМ, ПКМ, колесо) очистить ячейку по кнопке F8;
Строки можно раскрашивать - по умолчанию используется символ Alt+166, но можно выбрать и любой другой;
Формула в строке вычисляется в случае, если первый символ '=', формат записи - обычный для форта, сначала указываем номер строки, затем через пробел букву столбца, и на стеке будет число из этой ячейки;
Есть две простые формулы
\ +( 0 a 2 b )+ \ Сложить все числа в ячейках 0a,1a,2a,0b,1b,2b
\ *( 0 a 2 b )* \ Перемножить все числа в ячейках 0a,1a,2a,0b,1b,2b
Сохранение и загрузка таблицы - F11,F12;
Есть хелп.
Чего нет:
Обработки ошибок в формуле;
Контроля повторности вычисления формул;
Возможности зацикливания ссылок в ячейках;
Возможно еще что-то пропустил.
Для тех кто в 'танке' напоминаю: код для Кварк-Форта [url]http://www.msyst.ru/quarkexe.zip[/url] запускаем и печатаем [b]" file-name.txt" L[/b] или в ком строке [b]quark.exe file-name.txt[/b].
[code]\ Problem K, или небольшой такой 'пухленький' кварк-форт-эксель \ Автор: VoidVolker \ Дата: 22.03.2008 \ # Различные настриваемые параметры интерфейса 0xAA7755 VALUE цвет_таблицы BLACK VALUE цвет_фона WHITE VALUE цвет_выделения 0xEEEEEE VALUE цвет_текста
0x88FF88 VALUE цвет_чисел 0xFFFF88 VALUE цвет_флоатов 0xFF88FF VALUE цвет_строк 0x88FFFF VALUE цвет_ячейки
166 VALUE simbol-colorer \ Символ указывающий
35 VALUE table-x \ Позиция основной таблицы 105 VALUE table-y
5 26 MIN 1 MAX VALUE COLS \ Число столбиков 10 38 MIN 1 MAX VALUE ROWS \ Число строк 130 VALUE CELLA \ Длина ячейки 20 VALUE CELLB \ Высота ячейки
35 VALUE ROWS-NAMEA \ Длина стобца с номерами строк
\ # Status-box \ (Надо бы его к основной таблице приклеить) 0 VALUE sbox-x 40 VALUE sbox-y 85 8 * VALUE sbox-a 20 VALUE sbox-b 64 VALUE sbox-data-x
64 VALUE STRING-SIZE \ Размер строк
\ ##### K: begin \ Различные переменные table-x VALUE cell-x \ Координата X текущей ячейки table-y VALUE cell-y \ Координата Y текущей ячейки QUAN cell' \ Адрес текущей ячейки
QUAN col-buf \ Буфер цвета для текста
table-x VALUE last-cell-x table-y VALUE last-cell-y CELLA 2 - VALUE last-cell-a CELLB 2 - VALUE last-cell-b
" abcdefghijklmnopqrstuvwxyz" VALUE "az
\ ### 1.0 Разное : GOTOCONSOLE 0 0 GOTOXY ; \ # 1.1 Tools : 2DUP OVER OVER ; : -- CREATE OVER , + DOES> @ + ; : MOUSEX MOUSE-X @ ; : MOUSEY MOUSE-Y @ ; : 'SWAP \ ( a: X a1: Y -- a: Y a1: X ) OVER @ OVER @ >R SWAP ! R> SWAP ! ; : 'NOOP ['] NOOP ; \ # 1.2 Графические примитивы : FBOX \ x y a b цвет SWAP 0 DO 3 PICK 3 PICK I + 3 PICK 3 PICK HLINE LOOP DROP DROP DROP DROP ; : BOX \ x y a b цвет 4 PICK 4 PICK 4 PICK 3 PICK HLINE 4 PICK 4 PICK 3 PICK 3 PICK VLINE 4 PICK 4 PICK 1- 3 PICK + 4 PICK 3 PICK HLINE >R 3 XCHG 1- SWAP + SWAP ROT R> VLINE ;
\ # 1.3 Текст : boxed-textxy \ ( x y -- x1 y1 ) >R 5 + R> 3 + ; : box-textxy \ ( x y -- ) boxed-textxy TEXTXY ;
\ # 1.4 Графические примитивы отдельно взятой ячейки : last-inside-box \ ( -- x1 y1 a1 b1 ) Внутренний прямоугольник предыдущей активированной ячейки last-cell-x 1+ last-cell-y 1+ last-cell-a last-cell-b ; : hlight \ Подсвечивает ячейку cell-x 1+ cell-y 1+ CELLA 2 - CELLB 2 - цвет_выделения BOX ; : un-hlight \ Отменяет подсветку last-inside-box цвет_фона BOX ; : clear-cell \ Очищает ячейку на экране last-inside-box цвет_фона FBOX ; : cell-textxy \ Печатает текст в текущей ячейке cell-x cell-y box-textxy ;
\ ### 2.0 Раскраска : mem-col GETCOLOR TO col-buf ; : prev-col col-buf SETCOLOR ; : num-color mem-col цвет_чисел SETCOLOR ; : float-color mem-col цвет_флоатов SETCOLOR ; : string-color mem-col цвет_строк SETCOLOR ; : cell-name-color mem-col цвет_ячейки SETCOLOR ;
\ # 2.1 Цветные строки : sbgr>num \ ( str -- n ) Конверитрует стpоковое пpедставление числа в 16-pичном виде в число; берется 6 первых символов >R 0 6 0 DO R@ C@ DUP 48 57 WITHIN \ Число? IF 48 - \ Код числа >> число ELSE DUP 65 70 WITHIN \ Буква? IF 55 - ELSE 0 THEN \ Код буквы >> число THEN 5 I - 4 * LSHIFT + \ Установка разряда R> 1+ >R LOOP RDROP ;
QUAN cprint-colbuf : sprev-color cprint-colbuf SETCOLOR ; : sset-color \ ( s -- s+7 ) GETCOLOR TO cprint-colbuf DUP sbgr>num SETCOLOR 7 + ;
CREATE colored1 ' sset-color , CREATE colored2 ' sprev-color , : CPRINT \ ( str -- ) \ Печатает строку с учетом цвета "подстрок", цвет подстроки указывается после символа ¦ и подстрока BEGIN \ ограничивается этим-же символом, например: " [ ¦FF3333 F5¦ Int= " CPRINT подстрока F5 будет цветом FF3333 DUP C@ DUP WHILE \ a char DUP DUP 166 = SWAP simbol-colorer = OR \ Символ ¦ ? IF DROP 1+ colored1 @ EXECUTE colored1 colored2 'SWAP ELSE EMIT 1+ THEN REPEAT DROP DROP ;
\ ### 3.0 Структура ячеек и таблицы : for-cells ROWS 0 DO COLS 0 DO IJ #>' calculated? OFF LOOP LOOP ;
0 1 CELLS -- #cell 1 CELLS -- calculated? \ Для избегания повторного вычисления ячейки (в данный момент не используется) 1 CELLS -- class 1 CELLS -- number 1 FLOATS -- fnumber STRING-SIZE -- string VALUE cell-size
QUAN table-size QUAN table[]
: #>' cell-size * table[] + ; : '># #cell @ ;
: CREATE-TABLE COLS ROWS * cell-size * TO table-size HERE TO table[] table-size ALLOT 0 table[] table-size CFILL ROWS 0 DO COLS 0 DO IJ DUP #>' #cell ! LOOP LOOP ;
CREATE-TABLE
\ # 3.1 Классы содержимого ячеек : class-number. \ 'cell -- number @ num-color . prev-col ; : class-fnumber. \ 'cell -- fnumber F@ float-color F. prev-col ; : class-string. \ 'cell -- string string-color CPRINT prev-col ;
0 VALUE class-null ' class-number. VALUE class-number ' class-fnumber. VALUE class-fnumber ' class-string. VALUE class-string
: print \ cell' -- DUP class @ DUP IF clear-cell OPAQUE ON EXECUTE OPAQUE OFF ELSE DROP DROP THEN ; : cell-print cell-textxy cell' print hlight ;
\ # 3.2 Изменение класса ячейки : set-class-number cell' class-number SWAP class ! ; : set-class-fnumber cell' class-fnumber SWAP class ! ; : set-class-string cell' class-string SWAP class ! ; : set-class-null cell' class-null SWAP class ! ;
\ # 3.3 Вычисление формул \ Вероятно потребуется переопределять слова работающие с арифметикой VECT CELLACTION \ Этот вектор вызывается "ячейкой" и получает в качестве аргумента адрес этой ячейки и возвращает \ VECT CALCULATE \ Этот вектор отвечает за обработку непосредственно формулы в строковом виде; вероятно EVALUATE будет достаточно и он не понадобится : number@ \ 'cell -- D number @ ; : fumber@ \ 'cell -- F@ number F@ ; : formula? \ 'cell -- ? string C@ 61 = \ char = ;
: calculate \ 'cell -- cell_D DUP >R formula? IF \ DUP calculated? @ NOT \ IF \ DUP calculated? ON R@ string 1 + EVALUATE \ CALCULATE \ Если формула правильная, то на стеке должен быть результат - его надо сохранить в ячейку (надо бы добавить проверку глубины стека для определения правильности и 'чистоплотности' формулы) R@ number ! R@ set-class-number \ THEN \ ELSE THEN R> number @ \ CELLACTION <-- это что и зачем тут делает? ;
: col-work SWAP COLS * + #>' calculate ; VECT COL-ACTION \ #row #col -- : a 0 COL-ACTION ; : b 1 COL-ACTION ; : c 2 COL-ACTION ; : d 3 COL-ACTION ; : e 4 COL-ACTION ; : f 5 COL-ACTION ; : g 6 COL-ACTION ; : h 7 COL-ACTION ; : i 8 COL-ACTION ; : j 9 COL-ACTION ; : k 10 COL-ACTION ; : l 11 COL-ACTION ; : m 12 COL-ACTION ; : n 13 COL-ACTION ; : o 14 COL-ACTION ; : p 15 COL-ACTION ; : q 16 COL-ACTION ; : r 17 COL-ACTION ; : s 18 COL-ACTION ; : t 19 COL-ACTION ; : u 20 COL-ACTION ; : v 21 COL-ACTION ; : w 22 COL-ACTION ; : x 23 COL-ACTION ; : y 24 COL-ACTION ; : z 25 COL-ACTION ;
\ # 3.4 Вычисление функций (небольшой пример) QUAN 'vect QUAN #execs QUAN 'xt : dalay-execute -1 +TO #execs #execs NOT IF 'xt 'vect ! THEN ;
: DEXEC \ xt 'vect D -- \ 'Задержанный' вызов вектора, т.е. будет пропущено D вызовов, затем в вектор 'vect будет записан xt TO #execs 1+ TO 'vect TO 'xt ['] dalay-execute 'vect ! ;
QUAN actbuf QUAN row1 QUAN col1 QUAN row2 QUAN col2 VECT cells-act : FOR( \ xt -- ['] cells-act 1 DEXEC FROM COL-ACTION TO actbuf 'NOOP TO COL-ACTION ; : )FOR \ row1 col1 row2 col2 -- 2 1 4 2 actbuf TO COL-ACTION TO col2 TO row2 TO col1 TO row1 col1 row1 COLS * + row2 row1 1- DO col2 col1 1- DO OVER #>' calculate cells-act >R 1+ R> LOOP >R COLS + col2 col1 - - 1- R> LOOP ;
: +( \ -- D ['] + FOR( ; : )+ )FOR ;
: *( \ -- D ['] * FOR( ; : )* )FOR ;
\ Примеры использования: \ +( 0 a 2 b )+ \ Сложить все числа в ячейках 0a,1a,2a,0b,1b,2b \ *( 0 a 2 b )* \ Перемножить все числа в ячейках 0a,1a,2a,0b,1b,2b
\ ### 4.0 Интерфейс \ # 4.1 Дополнительные элементы VARIABLE col-name-buf : col-name \ n -- str "az + C@ col-name-buf ! col-name-buf ; : BL. WHERETEXTXY >R 8 + R> TEXTXY ; : STATUS-BOX. OPAQUE ON sbox-x 1+ sbox-y 1+ sbox-a 2 - sbox-b 2 - цвет_фона FBOX \ Очищение sbox-x sbox-y sbox-a sbox-b цвет_таблицы BOX \ Рамка sbox-x 1+ sbox-y 1+ sbox-b + 1- sbox-a 2 - sbox-b 2 - цвет_фона FBOX sbox-x sbox-y sbox-b + 1- sbox-a sbox-b цвет_таблицы BOX \ Рамка для строки sbox-x sbox-y box-textxy " Status: " PRINT \ Текст WHERETEXTXY sbox-data-x sbox-x + sbox-y box-textxy " [ ¦FF3333 F5¦ Int= " CPRINT cell' class-number. " ] [ ¦FF3333 F6¦ Float= " CPRINT cell' class-fnumber. " ] [ cell: " PRINT cell-name-color cell-y table-y - CELLB / . cell-x table-x - CELLA / col-name PRINT BL. prev-col " ] " PRINT sbox-x sbox-y sbox-b + 1- box-textxy " [ ¦FF3333 F7¦ Str= " CPRINT cell' class-string. BL. " ]" PRINT TEXTXY OPAQUE OFF ;
\ # 4.2 Отрисовка таблицы : rows-names. ROWS 0 DO table-x ROWS-NAMEA - \ x table-y I CELLB * + \ y 2DUP box-textxy ROWS-NAMEA CELLB цвет_таблицы BOX I . LOOP ; : cols-names. COLS 0 DO table-x I CELLA * + \ x table-y CELLB - \ y 2DUP box-textxy CELLA CELLB цвет_таблицы BOX I col-name PRINT LOOP ; : "#\N". table-x ROWS-NAMEA - table-y CELLB - 2DUP box-textxy " #\N" PRINT ROWS-NAMEA CELLB цвет_таблицы BOX ;
: TABLE. \ Отрисовка таблицы OPAQUE ON "#\N". rows-names. cols-names. ROWS 0 DO COLS 0 DO table-x I CELLA * + table-y J CELLB * + 2DUP box-textxy CELLA CELLB цвет_таблицы BOX IJ #>' print \ Отрисовывает содержимое ячеек LOOP LOOP OPAQUE OFF ;
\ # 4.3 Отрисовка всего интерфейса целиком : that-cell \ Устанавливает номер текущей ячейки в соответствующую переменную cell-x table-x - CELLA / cell-y table-y - CELLB / COLS * + #>' TO cell' ;
: DRAW-GUI 0 0 2048 2048 цвет_фона FBOX цвет_текста SETCOLOR TABLE. that-cell cell-print hlight STATUS-BOX. ;
\ ### 5.0 Перемещение активной ячейки : last-col-pos table-x COLS 1- CELLA * + ; : last-row-pos table-y ROWS 1- CELLB * + ;
\ # 5.1 Отрисовка активной ячейки : this \ Активирует ячейку под курсором MOUSEX table-x MAX table-x - CELLA / CELLA * \ Координата ячейки по горизонтали table-x + last-col-pos MIN TO cell-x MOUSEY table-y MAX table-y - CELLB / CELLB * \ Координата ячейки по вертикали table-y + last-row-pos MIN TO cell-y ;
\ # 5.2 Перемещение курсором : activate \ Активирует ячейку that-cell un-hlight cell-y TO last-cell-y cell-x TO last-cell-x hlight STATUS-BOX. ;
\ ### 6.0 Ввод/вывод данных : clear-inputbuf 0 INPUTBUF 258 CFILL ; \ # 6.1 Ячейки : cell-input \ Ввод обычного числа GOTOCONSOLE " Input number" PRINT activate set-class-number cell' number INPUT DRAW-GUI ; : cell-finput \ Ввод флоат числа GOTOCONSOLE " Input float" PRINT activate set-class-fnumber cell' fnumber FINPUT DRAW-GUI ; : cell-sinput \ Ввод строки GOTOCONSOLE " Input string" PRINT activate set-class-string clear-inputbuf INPUTDIALOG IF INPUTBUF cell' string STRING-SIZE CMOVE set-class-string clear-inputbuf cell' calculate DRAW-GUI THEN ; : cell-zeroize \ Обнуление ячейки activate set-class-null 0 cell' number 1 CELLS CFILL 0 cell' fnumber 1 FLOATS CFILL 0 cell' string STRING-SIZE CFILL clear-cell DRAW-GUI ;
: input-mouse this cell-input ; : finput-mouse this cell-finput ; : sinput-mouse this cell-sinput ;
: cell-set-class-number activate clear-cell set-class-number cell-print ; : cell-set-class-fnumber activate clear-cell set-class-fnumber cell-print ; : cell-set-class-string activate clear-cell set-class-string cell-print ; : cell-set-class-null activate clear-cell set-class-null cell-print ;
\ # 6.2 Файловые операции VARIABLE num>file-buf : .FILE \ D -- file: D \ Печатает число со стека в файл HF-OUT как бинарные данные num>file-buf ! HF-OUT num>file-buf 1 CELLS WRITEFILE DROP ; : FILE. \ file: D -- D \ Читает из файла HF-OUT число как бинарные данные на стек HF-OUT num>file-buf 1 CELLS READFILE num>file-buf @ ; : file-name-print " '" PRINT INPUTBUF PRINT " '" PRINT ;
0x51465446 VALUE file-type \ Quark Forth Table File : SAVE-TABLE GOTOCONSOLE " Save table - enter file-name" PRINT clear-inputbuf INPUTDIALOG IF DRAW-GUI INPUTBUF NEWFILE TO HF-OUT \ " test.txt" NEWFILE TO HF-OUT file-type .FILE \ По-хорошему бы это все надо в один массив сделать цвет_таблицы .FILE цвет_фона .FILE цвет_выделения .FILE цвет_текста .FILE table-x .FILE table-y .FILE COLS .FILE ROWS .FILE CELLA .FILE CELLB .FILE ROWS-NAMEA .FILE sbox-x .FILE sbox-y .FILE sbox-a .FILE sbox-b .FILE sbox-data-x .FILE STRING-SIZE .FILE cell-x .FILE cell-y .FILE cell' .FILE col-buf .FILE last-cell-x .FILE last-cell-y .FILE last-cell-a .FILE last-cell-b .FILE HF-OUT table[] table-size WRITEFILE HF-OUT CLOSE DRAW-GUI GOTOCONSOLE file-name-print " ¦00FF00 saved...¦" CPRINT THEN ; : LOAD-TABLE GOTOCONSOLE " Load table - enter file-name" PRINT clear-inputbuf INPUTDIALOG IF DRAW-GUI INPUTBUF OPEN TO HF-OUT \ " test.txt" OPEN TO HF-OUT FILE. file-type = IF FILE. TO цвет_таблицы FILE. TO цвет_фона FILE. TO цвет_выделения FILE. TO цвет_текста FILE. TO table-x FILE. TO table-y FILE. TO COLS FILE. TO ROWS FILE. TO CELLA FILE. TO CELLB FILE. TO ROWS-NAMEA FILE. TO sbox-x FILE. TO sbox-y FILE. TO sbox-a FILE. TO sbox-b FILE. TO sbox-data-x FILE. TO STRING-SIZE FILE. TO cell-x FILE. TO cell-y FILE. TO cell' FILE. TO col-buf FILE. TO last-cell-x FILE. TO last-cell-y FILE. TO last-cell-a FILE. TO last-cell-b CREATE-TABLE HF-OUT table[] table-size READFILE DRAW-GUI GOTOCONSOLE file-name-print " ¦00FF00 loaded...¦" CPRINT ELSE GOTOCONSOLE file-name-print " ¦0000EE not Quark Forth Table File!¦" CPRINT THEN THEN HF-OUT CLOSE ;
\ ### 7.0 Перемещения \ # 7.1 Перемещение текущей ячейки : act-cell-left last-cell-x CELLA - table-x MAX TO cell-x last-cell-y TO cell-y activate ; : act-cell-right last-cell-x CELLA + last-col-pos MIN TO cell-x last-cell-y TO cell-y activate ; : act-cell-up last-cell-x TO cell-x last-cell-y CELLB - table-y MAX TO cell-y activate ; : act-cell-down last-cell-x TO cell-x last-cell-y CELLB + last-row-pos MIN TO cell-y activate ;
\ # 7.2 Перемещение таблицы \ TODO: Необходимо "сместить" только отрисовку содержимого ячеек, имена столбиков и номера строк
\ ### 8.0 Хоткеи ' act-cell-left TO K_LEFT ' act-cell-right TO K_RIGHT ' act-cell-up TO K_UP ' act-cell-down TO K_DOWN
' cell-set-class-number TO K_F1 ' cell-set-class-fnumber TO K_F2 ' cell-set-class-string TO K_F3 ' cell-set-class-null TO K_F4
' cell-input TO K_F5 ' cell-finput TO K_F6 ' cell-sinput TO K_F7 ' cell-zeroize TO K_F8
' BYE TO K_F9 ' DRAW-GUI TO K_HOME ' SAVE-TABLE TO K_F11 ' LOAD-TABLE TO K_F12
' input-mouse TO <MOUSE_LEFT> ' finput-mouse TO <MOUSE_WHEEL> ' sinput-mouse TO <MOUSE_RIGHT>
\ # 8.1 Помощь : cell-pos-print \ row col -- SWAP >R CELLA * table-x + R> CELLB * table-y + box-textxy CPRINT ;
: help FROM COL-ACTION ['] cell-pos-print TO COL-ACTION " [ ¦DD5544 F1¦:" 0 a " ¦4455DD show number¦ ]" 0 b " [ ¦DD5544 F2¦:" 1 a " ¦4455DD show float¦ ]" 1 b " [ ¦DD5544 F3¦:" 2 a " ¦4455DD show string¦ ]" 2 b " [ ¦DD5544 F4¦:" 3 a " ¦4455DD show null¦ ]" 3 b " [ ¦DD5544 F5¦:" 4 a " ¦4455DD input number¦ ]" 4 b " [ ¦DD5544 F6¦:" 5 a " ¦4455DD input float¦ ]" 5 b " [ ¦DD5544 F7¦:" 0 c " ¦4455DD input string¦ ]" 0 d " [ ¦DD5544 F8¦:" 1 c " ¦4455DD zeroize¦ ]" 1 d " [ ¦DD5544 F9¦:" 2 c " ¦4455DD exit program¦ ]" 2 d " [ ¦DD5544 HOME¦:" 3 c " ¦4455DD redraw gui¦ ]" 3 d " [ ¦DD5544 F11¦:" 4 c " ¦4455DD save table¦ ]" 4 d " [ ¦DD5544 F12¦:" 5 c " ¦4455DD load table¦ ]" 5 d " ¦FFFFFF type¦ ¦FFAA22 ?¦ ¦FFFFFF or¦ ¦FFAA22 help¦" 6 a " ¦55DD44 HOME¦ - hide" 7 a TO COL-ACTION hlight ; : ? help ; \ ### 9.0 Выполнение программы \ ' DRAW-GUI TO OK
\ ' number@ TO CELLACTION ' col-work TO COL-ACTION DRAW-GUI help[/code]
P.S. Если необходимо - могу урезать до самого минимума и привести в полное соответсвие с ТЗ, вот только неизвестно когда будет на это время.
|
|
|
|
Добавлено: Сб мар 22, 2008 21:35 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
|
|
|
Добавлено: Пн фев 25, 2008 14:26 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
|
|
|
Добавлено: Пт фев 22, 2008 14:24 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Ой забыл совсем что я тоже участвую Надо Хищника подергать на счет обработки строк, введенных с консоли в кварке.
Ой забыл совсем что я тоже участвую :( Надо Хищника подергать на счет обработки строк, введенных с консоли в кварке.
|
|
|
|
Добавлено: Пт фев 22, 2008 10:24 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
|
|
|
Добавлено: Пт фев 22, 2008 00:22 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Вот еще ссылка в топик.
http://www.complang.tuwien.ac.at/forth/programs/spreadsheet.zip
|
|
|
|
Добавлено: Пн фев 11, 2008 14:29 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Как один из вариантов, можно сделать мини ексель
в качестве плугина к фару и опубликовать в кранилище Far plugin.
Как один из вариантов, можно сделать мини ексель
в качестве плугина к фару и опубликовать в кранилище Far plugin.
|
|
|
|
Добавлено: Пн фев 11, 2008 08:16 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Хищник, абсолютно согласен, что для дизайна программы роли не играет, в инфиксе или постфиксе задаются формулы в ячейка.
Преобразование из скобочного инфикса в постфикс — отдельностоящая задача. На входе строка, на выходе строка; плюс доступ к информации об унарных и бинарных операциях (обозначение, приоритет).
А в качестве начальной точки я даже написал без Eval, а просто вывод формулы из ячейки без изменений. В репозитории devel/~pinka/samples/2007/spreadsheet/
[b]Хищник[/b], абсолютно согласен, что для дизайна программы роли не играет, в инфиксе или постфиксе задаются формулы в ячейка.
Преобразование из скобочного инфикса в постфикс — отдельностоящая задача. На входе строка, на выходе строка; плюс доступ к информации об унарных и бинарных операциях (обозначение, приоритет).
А в качестве начальной точки я даже написал без Eval, а просто вывод формулы из ячейки без изменений. В репозитории devel/~pinka/samples/2007/spreadsheet/
|
|
|
|
Добавлено: Пт фев 08, 2008 23:08 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
profiT писал(а): Хм, не знаю. Думаю, можно. Вот только кода это больше займёт -- для EVALUATE-обработки надо писать преобразовалку в постфикс.
Да нет, я имел в виду написать функциональность электронной таблицы, а для упрощения работы с ячейками хранить там не 2 + 2, а 2 2 +. Это уже за пределами ТЗ, но тем и интересно - ведь не ставится задача получить совместимость с xls? А вот посмотреть на объем кода для постфиксных ячеек, а потом добавить разбор выражений и сравнить, сколько добавилось кода, а сколько - функциональности. Полагаю, что "много" и "мало", соответственно
[quote="profiT"]Хм, не знаю. Думаю, можно. Вот только кода это больше займёт -- для EVALUATE-обработки надо писать преобразовалку в постфикс. [/quote]
Да нет, я имел в виду написать функциональность электронной таблицы, а для упрощения работы с ячейками хранить там не 2 + 2, а 2 2 +. Это уже за пределами ТЗ, но тем и интересно - ведь не ставится задача получить совместимость с xls? А вот посмотреть на объем кода для постфиксных ячеек, а потом добавить разбор выражений и сравнить, сколько добавилось кода, а сколько - функциональности. Полагаю, что "много" и "мало", соответственно :)
|
|
|
|
Добавлено: Пт фев 08, 2008 21:34 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Хищник писал(а): А если в качестве промежуточной точки написать вот это вот самое, но работающее с постфиксной записью?
/me так и делает - на кварке.
[quote="Хищник"]А если в качестве промежуточной точки написать вот это вот самое, но работающее с постфиксной записью?[/quote]
/me так и делает - на кварке.
|
|
|
|
Добавлено: Пт фев 08, 2008 12:55 |
|
|
|
|