| 
			| 
					
						| elja_1989 
								Гость
 | 
								|  | «  : 19-02-2008 17:36 »  |  | 
 
 Народ, помогите с поиском инфы или с моим просвещением... Задали курсач(1 курс), суть написать текстовый редактор, с реализацией системной части запаров особо нет, а вот с графикой и созданием меню я просто == 0 Скажите как сделать меню и панель со свитками.. Например File | Edit | BlaBla | BlaBla1 | В инете на русском не нашёл ничего, может и плохо искал, но старался   |  
						| 
								|  |  
								| « Последнее редактирование: 19-02-2008 17:47 от elja_1989 » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Finch 
								СпокойныйАдминистратор    Offline 
								Пол:    
								Пролетал мимо
								
								
								
								
								
							 | 
								|  | « Ответ #1 : 19-02-2008 19:02 »  |  | 
 
 elja_1989, На чем хоть пишем? Тема была перенесена с Unix C++. Если действительно в среде Linux. То можно ли использывать стороние библиотеки? Если да, то легче всего взять Qt и его использовать. Описание работы на английском можно найти на сайте разработчиков http://doc.trolltech.com/ . |  
						| 
								|  |  
								| « Последнее редактирование: 19-02-2008 19:10 от Finch » |  Записан | 
 
 Не будите спашяго дракона.              Джаффар (Коша) |  |  | 
	| 
			| 
					
						| Sands 
								Помогающий    Offline | 
								|  | « Ответ #2 : 19-02-2008 20:06 »  |  | 
 
 А если под ДОС,тогда прямой вывод в видеопамять очень даже рулит. Мы в свое время полностью скопировали вид редактора Turbo C со всеми его менюхами )) |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| elja_1989 
								Гость
 | 
								|  | « Ответ #3 : 20-02-2008 13:50 »  |  | 
 
 Пишу на Borland C++ & Application Frameworks 3.1 под DOS..Кста именно что-то похожее на Си с менюшками мне бы и хотелось, т.е. сверху панель с file edit ..., а снизу рабочая область... Писать надо именно в этой среде и под DOS.
 |  
						| 
								|  |  
								| « Последнее редактирование: 20-02-2008 13:53 от elja_1989 » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Джон 
								простоАдминистратор    Offline 
								Пол:    | 
								|  | « Ответ #4 : 20-02-2008 13:56 »  |  | 
 
 Насколько мне не изменяет память, у Борланда всегда в хелпе куча примеров была - практических. В тч и меню для текстового режима.
 зы Кстати, оболочка графическая или текстовая?
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома."Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
 "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
 "All science is either physics or stamp collecting." Ernest Rutherford
 "Wer will, findet Wege, wer nicht will, findet Gründe."
 |  |  | 
	| 
			| 
					
						| Sands 
								Помогающий    Offline | 
								|  | « Ответ #5 : 20-02-2008 14:08 »  |  | 
 
 elja_1989Ну тогда все очень просто.
 Для етого нужны:
 1) Желание поковыряться
 2) Знание про работу напрямую с видеобуфером в тестовом режиме(по идее если поискать по форуму, то тема такая уже была)
 3) Вспомогательная программа которая выведет по коду ASCII его символьное представление(пригодится когда будеш рамочки рисовать и все такое)
 4) Хорошо продуманное взаиможействие с клавиатурой и мышью(если таковая предусматривается)
 5) Много считать для того чтобы "подделка" не отличалась от "оригинала" в плане интерфейса ))
 
 Основное тут первые 2 пункта. Как только возникнут вопросы по поводу 2 - пиши, бум разбираться ))
 
 Джон, думаю если аналог Turbo С++ то все-таки текстовая
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| elja_1989 
								Гость
 | 
								|  | « Ответ #6 : 20-02-2008 16:26 »  |  | 
 
 А кстати насчет графического и текстового режимов, что лучше выбирать для текстового редактора, просто я хочу под конец работы попытаться подключить мышь.. Её можно реализовать и там и там? Ещё просьба, если можете скиньте сюда хоть какой пример кода выезжающего меню, типа жму че нить(например alt+f) и выезжает менюшка-свиток (без анимации конечно    ), а в ней разные строки типа File Save As.. ну и т.д. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #8 : 20-02-2008 17:24 »  |  | 
 
 вообще там есть в библиотеках  TurboVision =) копируете оттуда функции один в один - и вуаля =)
 В подавляющем большинстве вузов на 1-м курсе у студентов проблемы с ООП и, соответственно, использованием таких объектных библиотек, "дружелюбность" которых ниже, чем у Delphi. Это в моё время студенты младших курсов TV изучали просто ради интереса, вне программы. Теперь мне такие любознательные студенты попадаются исключительно редко   .elja_1989 , в рамках какого курса выдано задание? Нужно использовать структурное или объектно-ориентированное программирование? Каково знание языка C (или C++)? |  
						| 
								|  |  
								| « Последнее редактирование: 20-02-2008 17:26 от dimka » |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| elja_1989 
								Гость
 | 
								|  | « Ответ #9 : 20-02-2008 17:57 »  |  | 
 
 Я писал какой курс вначале(1 курс) В рамках структурного Borland C++ 3.1 можно юзать.. Учу язык 1 семестр, но успехи неплохие... Учусь быстро, трудолюбив и мне нравится     ! Я с графикой некогда не работал, ну не счетая моего хобби - 3dsmax, zbrush, vegas, photoshop и т.д., но к программухе это уж никак в данный момент прицепить нельзя! В объектном я бы наверное бы не парился над меню(моё предположение), а вот в досовской сишке... Просто понятия не имею, как к этому подойти... Ну вот за сегодня за вчера дорубил как с графикой работать хоть немного, с тексовым режимом хоть чуток разобрался, но не рублю как в разбираться в вещах аля 0xb800. И нехочется просто тупо сдирать откуда-то код, ахочется разобраться, дорубить и уже делать с пониманием. возникает вся таже просьба про меню... |  
						| 
								|  |  
								| « Последнее редактирование: 20-02-2008 18:10 от elja_1989 » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Finch 
								СпокойныйАдминистратор    Offline 
								Пол:    
								Пролетал мимо
								
								
								
								
								
							 | 
								|  | « Ответ #10 :  20-02-2008 18:07 »   |  | 
 
 elja_1989, Ты чуть чуть не правильно понял   . dimka , имел ввиду, какой именно предмет изучения, заставляет тебя писать такую программу. |  
						| 
								|  |  
								|  |  Записан | 
 
 Не будите спашяго дракона.              Джаффар (Коша) |  |  | 
	| 
			| 
					
						| elja_1989 
								Гость
 | 
								|  | « Ответ #11 : 20-02-2008 18:12 »  |  | 
 
 elja_1989, Ты чуть чуть не правильно понял   . dimka , имел ввиду, какой именно предмет изучения, заставляет тебя писать такую программу. В рамках курса ОАиЯП.. Основы алгоритмизации и языки программирования, простыми сломами - программирование   |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #12 : 20-02-2008 19:58 »  |  | 
 
 elja_1989, понятно. (Специальность, случаем, не 230105?) В объектном я бы наверное бы не парился над меню(моё предположение), а вот в досовской сишке... По секрету скажу, что эта "досовская сишка..." тоже объектно-ориентированная    Это значит, что под "объектным" ты понимаешь что-то не то. Задача с меню простая, и читать там особо нечего. Нужно лишь думать "в правильную сторону". 1) В начале важно понимать такую тебе неведомую штуку, как поток управления. Сколько я понимаю, ты планируешь 2 режима работы: основные действия программы; работа с меню. Переключение в режим меню происходит по нажатию кнопки (например, F10), выход из меню по нажатию другой кнопки (например, Esc). При обычном подходе к структурному программированию эти режимы не могут работать одновременно, поскольку меню является вызываемой функцией - пока эта функция не завершит работу, нельзя будет вернуться к исходной функции. Добавление мыши потребует обязательного использования специфической "событийной" архитектуры, которая позволит создать видимость одновременной работы как меню, так и других функций программы. Если интересно, можем её разобрать. Если нет - тогда забудь про мышь. В конце ты её не приделаешь, если не заложишь правильный фундамент с самого начала. 2) Отделить функцию отрисовки текущего состояния меню (какой пункт меню выделен) от функции управления меню (как передвигать выделение между пунктами меню в случае нажатия соответствующих кнопок). Функция управления вызывает функцию отрисовки после изменения состояния меню. 3) Поскольку обе функции требуют информации о пунктах меню, то потребуется разработать структуру данных, которая описывают пункты меню, и может быть передана в каждую из функций.. 4) Чтобы модуль обеспечения работы меню был удобно настраиваемым, полезно познакомиться с такой штукой, как указатели на функции, и научиться ими пользоваться. P.S. Тему в "Начинающим". |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| Sands 
								Помогающий    Offline | 
								|  | « Ответ #13 : 20-02-2008 20:07 »  |  | 
 
 Если мне не изменяет память, то у С++ должны быть функции типа writebyte/readbyte в которых указывается, адрес в/из которого надо звписать/прочитать данные. Подробнее посмотри в справке Borland C++ 3.10хb000 ето адрес начала видеопамяти в текстовом режиме. На каждый символ екрана отводится 2 байта данных: байт самго символа и байт атрибутов(таких как цвет символа, цвет фона и мерцание).
 Для того чтобы семулировать интерфейс Turbo C++ достаточно выставить первой строке атрибут фона в "белый", а строкам 2-80 поставить атрибут фона "синий". Изменять ети данные придется крайне редко, кроме тех случаев, когда некоторый участок будет перекрываться меню, и подсветки выделения текста (если она будет реализована)
 
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| elja_1989 
								Гость
 | 
								|  | « Ответ #14 : 20-02-2008 21:05 »  |  | 
 
 Мммм... Ну в общем я более менее начал дорубать, указатели на функции я знаю неплохо... Вроде всё потдается логике.. Теперь возникают новые вопросы: 1) Если переключение в меню организовать через ALT+*! То напримериспользуя  switch, что писать в case? али 'ALT+F' он поймет, что-то подсказывает что нет)
 2) Доступ к меню(к активной области скажем File) Осужествляется тупо по координатам? И "выделение на самом деле делается циклом, просто меняя цвет?
 3) Как сделать скролирование текста(по нажатию стрелок) и переместить отображение, как бы под панель с File Edit Search
 
 File  Edit  Search                   (1;80)
 
 с координаты(2;161 до 2;238 идёт текст) Как его в рамки загнать?
 
 4) Ещё, как я понял экран имеет всего 1 индекс из значений 25*80?
 5) Как передвигать с помщью индекса курсос мигающий, показывающий, где вводить текст...
 |  
						| 
								|  |  
								| « Последнее редактирование: 20-02-2008 21:08 от elja_1989 » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Sands 
								Помогающий    Offline | 
								|  | « Ответ #15 : 20-02-2008 21:28 »  |  | 
 
 1) Нет такое ему будет сделать трудновато, можно отслеживать нажатие на "F" И в етот момент проверять нажата ли клавиша "Alt" - делается ето с помощью считывания статусного байта по адресу 0:04192) В случае с использованием мышки правильно, однако не стоит забывать про перемещене по меню с помощью стрелок "вправо" "влево", для етого удобней хранить индекс активного пункта меню(имхо). Опять же если реализовывать возможность перехода между меню когда один из пунктов, то стоит так же знать открыт етот пункт или нет.
 3) А каким образом ты собираешся хранить весь набраный текст? И что обозначают индексы 2;161 2;238?
 4) В видеопямяти - да, он линейный, но на более высшем уровне он имеет 25 строк по 80 символов, а потому для удобства работы лучше все же использовать координаты X(позиция в строчке 0..79) Y(номер строки 0..24)
 5) По моему есть такая функция gotoxy(x,y) которая перемещает курсор в нужную позицию на екране (или за егопределами:-) ). Подробнее смотри Help.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #16 : 21-02-2008 12:36 »  |  | 
 
 Ну вы, блин, даёте. Во-первых, адрес B000 для монохромного режима, для цветного B800. Во-вторых, зачем эти адреса и вручную писать прямой вывод в видеопамять, когда можно использовать имеющиеся в данной среде функции conio.h, где есть позиционирование курсора (gotoxy), управление цветами (textcolor, backgroundcolor), работа с окнами (включая их скроллирование)? Все эти функции как раз обеспечивают прямой вывод в видеопамять (по умолчанию), либо используют BIOS - переключение осуществляется значением специальной глобальной переменной (если память не изменяет, она называется directVideo или как-то так). В-третьих, зачем статусный байт по адресу 0419 (и чтение 60-го порта)? Скорее, нужно уметь обрабатывать ASCII-коды нажатых клавиш (включая расширенные коды)? Не все сочетания клавишь можно будет охватить, но это и не главное в данной задаче. В-четвёртых, структура видеопамяти текстового режима представляет собой 2-хбайтовое слово на позицию. 1-й байт описвает ASCII-код отображаемого символа, 2-й байт содержит цветовые атрибуты. Хотя, может и в другом порядке - точно не помню. Цветовые атрибуты описываются как: BGGGHCCC. C - биты цвета символа (8 цветов), H - бит яркости цвета символов (расширение до 16 цветов), G - биты цвета фона (8 цветов), B - (в зависимости от настроек) бит мерцания символов (8 цветов сохраняется) /яркости цвета фона (расширение до 16 цветов). Если переключение в меню организовать через ALT+*! То напримериспользуя  switch, что писать в case? али 'ALT+F' он поймет, что-то подсказывает что нет) Нет, не поймёт. Нужно обрабатывать расширенный код данного сочетания клавиш. Коды можешь определить методом тыка - написать простую программку, которая читает все введённые символы и выводит на экран их коды (номера в таблице ASCII). Главное даже не это, главное: где  писать этот switch. В каком месте программы. Как его в рамки загнать? Рамки рисуются символами псевдографики. Смотри кодовую таблицу 866 расширения ASCII. |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #17 : 22-02-2008 14:00 »  |  | 
 
 Я тут буду выкладывать различные решения, но на другом языке, чтобы показать идею, а не написать готовый для курсовика код. Получение ASCII-кодов нажимаемых клавиш: KeyCode% = 0' Пока не нажата <Esc>
 WHILE KeyCode% <> 27
 KeyCodes$ = INKEY$
 
 IF LEN(KeyCodes$) > 0 THEN
 KeyCode% = ASC(LEFT$(KeyCodes$, 1))
 IF KeyCode% = 0 THEN
 ' Расширенный ASCII-код клавиши
 KeyCode% = ASC(MID$(KeyCodes$, 2, 1))
 PRINT 0, KeyCode%
 ELSE
 ' Обычный ASCII-код клавиши
 PRINT KeyCode%
 END IF
 END IF
 WEND
 END
 В частности, столь желаемый <Alt>+<I> таким способом поймать можно. |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #18 : 22-02-2008 16:09 »  |  | 
 
 Ну и собственно меню (только вертикальное, но с рамкой) для приложения с полноэкранными (не оконными) функциями может выглядеть примерно так: DECLARE FUNCTION GetKeyCode% ()DECLARE SUB Menu ()
 DECLARE SUB Main ()
 DECLARE SUB DrawMain ()
 DECLARE SUB NewOperation ()
 DECLARE SUB OpenOperation ()
 DECLARE SUB SaveOperation ()
 DECLARE SUB PrintOperation ()
 DECLARE SUB ExitOperation ()
 DECLARE SUB Stub (Name$)
 DECLARE FUNCTION VerticalMenu% (X%, Y%, ItemNames$())
 DECLARE SUB DrawVerticalMenu (StartX%, StartY%, ItemNames$(), CurrentItem%)
 
 OPTION BASE 1
 CALL Main
 END
 
 FUNCTION GetKeyCode%
 DO
 Keys$ = INKEY$
 LOOP UNTIL LEN(Keys$) <> 0
 KeyCode% = ASC(LEFT$(Keys$, 1))
 IF KeyCode% = 0 THEN
 GetKeyCode% = 255 * ASC(MID$(Keys$, 2, 1))
 ELSE
 GetKeyCode% = KeyCode%
 END IF
 END FUNCTION
 
 SUB Main
 DO
 CALL DrawMain
 SELECT CASE GetKeyCode%
 CASE 27
 EXIT SUB
 CASE 17340
 CALL Menu
 END SELECT
 LOOP
 END SUB
 
 SUB DrawMain
 CLS
 COLOR 7, 0
 LOCATE 12, 38
 PRINT "MAIN"
 LOCATE 25, 1
 PRINT "ESC=Exit  F10=Menu";
 END SUB
 
 SUB Menu
 DIM ItemNames$(5)
 ItemNames$(1) = "New"
 ItemNames$(2) = "Open"
 ItemNames$(3) = "Save"
 ItemNames$(4) = "Print"
 ItemNames$(5) = "Exit"
 SELECT CASE VerticalMenu%(10, 5, ItemNames$())
 CASE 1
 CALL NewOperation
 CASE 2
 CALL OpenOperation
 CASE 3
 CALL SaveOperation
 CASE 4
 CALL PrintOperation
 CASE 5
 CALL ExitOperation
 END SELECT
 END SUB
 
 FUNCTION VerticalMenu% (X%, Y%, ItemNames$())
 CurrentItem% = LBOUND(ItemNames$)
 DO
 CALL DrawVerticalMenu(X%, Y%, ItemNames$(), CurrentItem%)
 SELECT CASE GetKeyCode%
 CASE 13
 VerticalMenu% = CurrentItem%
 EXIT FUNCTION
 CASE 27
 VerticalMenu% = -1
 EXIT FUNCTION
 CASE 18360
 IF CurrentItem% > LBOUND(ItemNames$) THEN
 CurrentItem% = CurrentItem% - 1
 END IF
 CASE 20400
 IF CurrentItem% < UBOUND(ItemNames$) THEN
 CurrentItem% = CurrentItem% + 1
 END IF
 END SELECT
 LOOP
 END FUNCTION
 
 SUB DrawVerticalMenu (StartX%, StartY%, ItemNames$(), CurrentItem%)
 MaxLengthOfName% = 0
 FOR I% = LBOUND(ItemNames$) TO UBOUND(ItemNames$)
 LengthOfName% = LEN(ItemNames$(I%))
 IF MaxLengthOfName% < LengthOfName% THEN
 MaxLengthOfName% = LengthOfName%
 END IF
 NEXT I%
 Y% = StartY%
 COLOR 15, 0
 LOCATE Y%, StartX%
 PRINT CHR$(218);
 FOR X% = StartX% + 1 TO StartX% + MaxLengthOfName% + 2
 LOCATE Y%, X%
 PRINT CHR$(196);
 NEXT X%
 LOCATE Y%, StartX% + MaxLengthOfName% + 3
 PRINT CHR$(191);
 FOR I% = LBOUND(ItemNames$) TO UBOUND(ItemNames$)
 Y% = Y% + 1
 LOCATE Y%, StartX%
 PRINT CHR$(179);
 IF I% = CurrentItem% THEN
 COLOR 0, 3
 ELSE
 COLOR 0, 7
 END IF
 LOCATE Y%, StartX% + 1
 PRINT " ";
 LOCATE Y%, StartX% + 2
 PRINT ItemNames$(I%);
 LengthOfName% = LEN(ItemNames$(I%))
 FOR J% = LengthOfName% TO MaxLengthOfName% + 1
 X% = StartX% + J% + 2
 LOCATE Y%, X%
 PRINT " ";
 NEXT J%
 COLOR 15, 0
 LOCATE Y%, StartX% + MaxLengthOfName% + 3
 PRINT CHR$(179);
 NEXT I%
 Y% = Y% + 1
 LOCATE Y%, StartX%
 PRINT CHR$(192);
 FOR X% = StartX% + 1 TO StartX% + MaxLengthOfName% + 2
 LOCATE Y%, X%
 PRINT CHR$(196);
 NEXT X%
 LOCATE Y%, StartX% + MaxLengthOfName% + 3
 PRINT CHR$(217);
 COLOR 7, 0
 LOCATE 25, 1
 PRINT "ESC=Cancel  ENTER=Execute  ARROW UP,ARROW DOWN=Select";
 END SUB
 
 SUB ExitOperation
 CALL Stub("EXIT")
 END SUB
 
 SUB NewOperation
 CALL Stub("NEW")
 END SUB
 
 SUB OpenOperation
 CALL Stub("OPEN")
 END SUB
 
 SUB PrintOperation
 CALL Stub("PRINT")
 END SUB
 
 SUB SaveOperation
 CALL Stub("SAVE")
 END SUB
 
 SUB Stub (Name$)
 COLOR 7, 0
 CLS
 LOCATE 12, 40 - LEN(Name$) / 2
 PRINT Name$;
 LOCATE 25, 1
 PRINT "Press any key";
 DO
 LOOP UNTIL INKEY$ <> ""
 END SUB
 Тут ещё надо много чего доводить до кондиции, например, обрабатывать нештатные ситуации, когда меню не помещается на экране и т.д. |  
						| 
								|  |  
								| « Последнее редактирование: 22-02-2008 20:36 от dimka » |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| Sands 
								Помогающий    Offline | 
								|  | « Ответ #19 : 22-02-2008 18:15 »  |  | 
 
 dimka, Нащет памяти - каюсь не то написал, относительно Альта - согласен, что предложил не самое оптимальное решение( я просто не пробовал через ASCII делать, а когда появилась надобность обрабатывать Альт, то как раз еще свежими были зхнания про нужные адреса в памяти, да и код готовый был, потому его и использовал)
 А меню и все остальное рисовал напрямую... К счастью или к сожалению - трудно сказать...
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| elja_1989 
								Гость
 | 
								|  | « Ответ #20 : 22-02-2008 21:30 »  |  | 
 
 Мммм.. С меню вроде уже разберусь, а вот как организовать редактирование и выделение текста.. Каждую строку на которой каретка в данных момент, да или каждую хранить в отдельном буфере для строки? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Sands 
								Помогающий    Offline | 
								|  | « Ответ #21 : 22-02-2008 22:09 »  |  | 
 
 elja_1989,  хм... Вот представь себе что ты работал(а) С Word-ом. Какие там возможности для редактирования текста существуют? Ты сначала опиши чего тебе хочется, и как ты ето видиш, а потом жди помощи и конструктивной критики... |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| elja_1989 
								Гость
 | 
								|  | « Ответ #22 : 23-02-2008 22:39 »  |  | 
 
 //#include <graphics.h>#include <dos.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <conio.h>
 #include <alloc.h>
 
 void del(char**,int,int,int);
 
 void main()
 {clrscr();
 int i,j,k,x=1,y=1;
 char **ms;
 int n=25;
 ms=(char**)calloc(n,sizeof(char*));
 for(i=0;i<n;i++)
 { *(ms+i)=(char*)calloc(80,sizeof(char));
 *(ms+i)="kd adasdddddddddddddddddddd adada a dadadasd kldskl sklslk sdklsdlk ssdfsklsdf";
 puts(*(ms+i));
 }
 
 gotoxy(1,1);
 
 while(1)
 {
 switch(getch())
 {
 case 72:
 y--;
 if(y<1) y=1;
 gotoxy(x,y);
 break;
 
 case 80:
 y++;
 if(y>25) y=1;
 gotoxy(x,y);
 break;
 
 case 77:
 x++;
 if(x>80) {x=1;y++;}
 gotoxy(x,y);
 break;
 
 case 75:
 x--;
 if(x<1) {x=80; if(!(y<=1)) y--;}
 gotoxy(x,y);
 break;
 
 
 case 8:
 del(ms,x,y,n);
 break;
 
 
 }
 }
 }
 
 
 void del(char **ms,int x,int y,int n)
 {
 for(i=x-1;i<80;i++)
 *(*(ms+y-1)+i-1)=*(*(ms+y-1)+i);
 
 clrscr();
 
 for(i=0;i<n;i++)
 cputs(*(ms+i));
 
 gotoxy(--x,y);
 
 }
 Ну вот что-то тока что набросал тестовое, впадлу уже сегодня править что-то! Что-то тут работает, 1 строка кое как, но не суть.. мне то про подход спросить хотелось, учтите тока что всякие мелочевые ошибки я не отрабатывал(аля сдвиги куда не надо, перенос с другой строки..) Да и не в состояние провить, праздник всё таки был)) Жду критики короче.. правильный подход беру или нет.. Кстати упорно дрочился над выводом новым.. Какова-то не хотел работать принтф, работал тока цпринтф..  |  
						| 
								|  |  
								| « Последнее редактирование: 06-08-2008 16:34 от Алексей1153++ » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #23 : 24-02-2008 07:24 »  |  | 
 
 Обработка расширенных кодов неправильная. В таком виде кнопки движения курсора совпадают с буквами латинского алфавита. Какова-то не хотел работать принтф, работал тока цпринтф.. При подключении conio.h нужно использовать cprintf. Стандартные потоки ввода/вывода заменяются на прямую работу с видеопамятью. |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| elja_1989 
								Гость
 | 
								|  | « Ответ #24 : 24-02-2008 07:33 »  |  | 
 
 Ммм.. Так я и подозревал.. А как сделать, через порты(0х417) получается? Или есть ещё АЦКИЙ КОД этих.. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #25 : 24-02-2008 09:23 »  |  | 
 
 elja_1989, зачем тебе порты? Пример более правильной обработки расширенных кодов см. выше. |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| Sands 
								Помогающий    Offline | 
								|  | « Ответ #26 : 24-02-2008 11:07 »  |  | 
 
 elja_1989, Если тебе на вход будет приходить расширенный код, то он будет состоять как бы из 2 "символов", первый из которых 0, а второй -  какое-то значение.(именно ето написано в том примере кода от dimka) Соответственно для корректрой обработки расширенных кодов надо проверять значение считанного символа на 0.  |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| elja_1989 
								Гость
 | 
								|  | « Ответ #27 : 24-02-2008 12:50 »  |  | 
 
 То что у него там мне неочем не говорит, я никогда раньше не программил, я занимался 3д графикой.. Не могли бы вы показать как это сделать..
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #28 : 24-02-2008 13:45 »  |  | 
 
 То что у него там мне неочем не говорит, я никогда раньше не программил, я занимался 3д графикой..  Ну и что? Программист понимает почти любой (за исключением всяких извращений типа BrainFuck) алгоритмический язык программирования - даже незнакомый, так как все они основаны на едином принципе. Посмотри внимательно на код Quick Basic и подумай. Не могли бы вы показать как это сделать.. Там это и показано - там приведён рабочий код. Кроме того, уже на словах даны пояснения основного принципа. |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #29 : 24-02-2008 14:11 »  |  | 
 
 elja_1989, придется учить - готовую программу писать за тебя никто не будет. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	|  |