Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с графикой в tmt pascal
Форум «Всё о Паскале» > Pascal, Object Pascal > 32 битные компиляторы
Арсений
Здравствуйте. У меня проблема:в графическом режиме происходит откровенно говоря чёрти что. При загрузке svga256.bgi нормально рисуется круг, при попытке вывести bmp(модуль взят с этого сайта) на дисплее какие то цветные точки, при установке графического режима функцией setsvgamode и попытке изобразить круг: сначала круг, затем точки. Для уточнения: у меня монитор wxga, карта nvidia geforce. Пожалуйста, укажите поблему и способ её устранения. Заранее благодарен.
Ozzя
Цитата
с графикой в tmt pascal


Цитата
При загрузке svga256.bgi

blink.gif

Зачем для ТМТ загружать драйвер svga256.bgi? blink.gif

SetSVGAMode(...); и ставишь нужный режим.

Вывод BMP для TMT

Программу приложи свою.
andriano
Цитата(Арсений @ 29.12.2007 2:30) *
Пожалуйста, укажите поблему и способ её устранения. Заранее благодарен.
Помочь тебе в решении проблемы - можем. А вот указать проблему тебе придется самостоятельно.
Опиши словами, что хочешь получить, что для этого делаешь, что получается, и чем то, что получается, отличается от того, что хочешь получить. Если не работает, как хочется, какой-то фрагмент кода - приведи его.
Арсений
За ссылку спасибо. При использовании прцедуры SetSVGAMode(...) появляются либо точки(я в предидущем сообщении об этом писал(пожалуйста, прочитайте повнимательнее)) или 'returne соde:0'. Для уточнения: вот программа вызывающая 2-ой глюк(см файл).
andriano
Ты пишешь о том, что при загрузке svga256.bgi у тебя рисуется круг. То, что круг рисуется, вроде бы, говорит о том, что режим инициализируется и работает. Но ТМТ с bgi-драйверами рабртать не может. Никак.
Так что дело не в том, что я что-то невнимательно читаю, а в том, что ты либо очень невнимательно экспериментируешь, либо очень невнимательно описываешь результаты своих экспериментов.
Другими словами, первое сообщение не заслуживает доверия. Поэтому я и просил более толково описать симптомы.

Далее, если ты используешь модуль, не входящий в комплект поставки, и у тебя при этом возникают ошибки, то веоятнее всего, ошибки следует искать именно в этом модуле, а не в компиляторе.

Опять же, так и осталось невыясненным, что за файл такой test.bmp. Не зная его свойств (по крайней мере, размеров и глуби ны цвета) ситуацию нельзя смоделировать.

Вообще-то графика в ТМТ работает через VESA, а я что-то не припоминаю, чтобы там были моды типа 1280х800.

У меня вот эта программа (откомпилированная под DOS):

program test;
uses graph;
var
w,h:word;
x,y:smallint;
begin
setsvgamode(1280,800,8,0);
for x := 0 to 799 do
putpixel(x,x,15);
end.
Выдает сообщение :
PMODE/W DOS Extender v1.33
Copyright © 1994-1997, Charles Scheffold and Thomas Pytel

Return code: 0
Execution time: 0.96 seconds
Press any key...

а вот эта:
program test;
uses graph;
var
w,h:word;
x,y:smallint;
begin
setsvgamode(1280,1024,8,0);
for x := 0 to 799 do
putpixel(x,x,15);
end.

рисует косую линию и несколько групп точек.

В первом варианте, очевидно, не поддерживается запрошенная видеомода, а во втором - все работает правильно за исключением того, что из программы не предусмотрен корректный выход. (группы точек - это неудачная попытка VideoBIOS вывести на экран текст с сообщением об окончании работы)
Гость
Andriano, по поводу драйвров ты не прав. А именно я вместо функции setsvgamode поставил загрузку драйвера. Всё пошло: задержав программу с помощью readln наконец то вывел bmp изображение. Остается один вопрос как подобрать разрешение в setsvgamode чтобы она нормально пахала? P.S. Добавляю файлы о которых шла речь.
Арсений
Извините, это я гостем вошел. ohmy.gif Файлы в наличии.
andriano
Цитата(Гость @ 29.12.2007 19:12) *
Andriano, по поводу драйвров ты не прав.
smile.gif
Цитата
А именно я вместо функции setsvgamode поставил загрузку драйвера. Всё пошло: задержав программу с помощью readln наконец то вывел bmp изображение.
А теперь убери куда нибудь эти "драйвера" так, чтобы к ним даже пути провешены не были, и запусти программу снова.
Что теперь?
И как это можно объяснить?
Цитата
Остается один вопрос как подобрать разрешение в setsvgamode чтобы она нормально пахала? P.S. Добавляю файлы о которых шла речь.
Очевидно, только одним путем: эти видеомоды должен поддерживать VideoBIOS.
Попытайся воспользоваться следующей процедурой, а также теми, на которые еще ссылается справка:
Цитата
Sets the system to graphics mode and clears the screen.

Declaration:
procedure SetGraphMode(Mode: Word);

Remarks:
Mode must be a valid mode for the current video adapter. This procedure supports all VESA VBE graphic modes (100h - FFFh), which are supported by video adapter.

Example:
SetGraphMode($101) // set SVGA 256-colored mode 640x480;
SetGraphMode($114) // set SVGA 64K-colored mode 800x600;

SetGraphMode($12A) // set SVGA 16M+A-colored mode 1024x768;

Keep in mind what your video card may not support all these modes. See GetVbeModesList and TotalVbeModes.

Например, так:
uses graph;
var
i : integer;
ModesList : ^array[0..0] of GraphModeType;
begin
writeln('TotalVbeModes:',TotalVbeModes);
getmem(ModesList,TotalVbeModes*sizeof(GraphModeType));
GetVbeModesList(ModesList^);
for i := 0 to TotalVbeModes-1 do
with ModesList^[i] do
writeln(i:2,' Mode:', VideoMode:3,' BPP:',BitsPerPixel:2,' Size: ', XResolution,' x ', YResolution);
freemem(ModesList,TotalVbeModes*sizeof(GraphModeType));
end.
Арсений
Почти ясно. Только изображение выводится лишь при режиме $101. Суди по переводу GetVbeModesList и TotalVbeModes выдают максимально возиожный режим, но при результете который они выдают, изображение не выводится. Подскажите, как определить режим с максимальным качеством. И еще проблема: когда прога сворачивается в окно, изображение пропадает, а сама прога зависает. Подскажите, пожалуйста, как решить даные проблемы.
andriano
Цитата(Арсений @ 29.12.2007 21:17) *

Почти ясно. Только изображение выводится лишь при режиме $101. Суди по переводу GetVbeModesList и TotalVbeModes выдают максимально возиожный режим, но при результете который они выдают, изображение не выводится.
Это не совсем так.
Теоретически весь список является доступным. Другое дело, что WinXP не позволяет делать DOS-программам все, что им захочется. Я вот сейчас поэкспериментировал и вогнал Windows в "синий экран".
Цитата
Подскажите, как определить режим с максимальным качеством.
Если ты будешь работать под "голым DOS", то можешь достаточно смело пользоваться любым из видеорежимов. WinXP, очевидно, их ограничивает. Опять же, если тебе удалось заставить что-то работать на одном компьютере, то совершенно неочевидно, что то же самое удастся сделать на компьютере с другой видеокартой.
Цитата
И еще проблема: когда прога сворачивается в окно, изображение пропадает, а сама прога зависает. Подскажите, пожалуйста, как решить даные проблемы.
Последнее - только запуская программу в "голом DOS". DOS программа может работать ТОЛЬКО в полноэкранном режиме. Ничего другого никем не гарантируется. WinXP обладает лишь частичной поддержкой DOS-программ, использующих графику.
Арсений
А есть какие нибудь эмуляторы для DOSовских программ в XP? Может ли программа видеть если её лишают полного экрана?
andriano
Что значит "лишают"?
В DOS это принципиально невозможно.
А под особенности Windows DOS никогда не подстраивался.
Windows же, как я уже говорил, поддерживает DOS лишь частично. А 64-разрядные версии Windows не поддерживают DOS вообще. Даже DOS32.
Есть, правда, такая программа как DOSbox, которая может обеспечить работу в Windows тех программ, которые сама Windows не поддерживает. Значит - можно. Но в Microsoft не хотят.
И работает ли она в Win64, я не знаю.
Но возникает вопрос: если хочешь, чтобы программа работала в Windows, зачем писать ее под DOS?

Еще раз рекомендую поделиться, ради чего это все затевается. А то пока разговор получается очень абстрактным.
Арсений
"лишают"- имеется в виду сбой когда программа сворачивается в окно(нажато Alt+Enter, Windows). Проблема в том, что программа зависает и не может вывести изображение, отреагировать на Enter. P.S под DOS программа пишется потому, что под windows free только fpc, а он глючныйи и ему нужны дрова.
andriano
Цитата(Арсений @ 30.12.2007 17:44) *

"лишают"- имеется в виду сбой когда программа сворачивается в окно(нажато Alt+Enter, Windows). Проблема в том, что программа зависает и не может вывести изображение, отреагировать на Enter.
С точки зрения Микрософт (т.е. разработчика как DOS, так и Windows) так и должно быть.
Т.е. это не баг, а фича.
Цитата
P.S под DOS программа пишется потому, что под windows free только fpc, а он глючныйи и ему нужны дрова.
Неправда. Свободный еще, минимум, TurboDelphi. Если нужно писать программу, работающую в Windows, думаю, наилучший вариант.
Арсений
Кроче говоря, если программа вернулась в полный экран, то как восстановить изображение? P.S. Turbo delphi не free, turbo pascal for windows- он free, но требует дров, модулей(для мыши).
andriano
Цитата(Арсений @ 30.12.2007 20:33) *

Кроче говоря, если программа вернулась в полный экран, то как восстановить изображение?
Не понял вопроса. ТОЛЬКО полноэкраный режим и является единственным нормальным режимом работы DOS-приложения.
Цитата
P.S. Turbo delphi не free, turbo pascal for windows- он free, но требует дров, модулей(для мыши).
Тебе недостаточно, что Turbo Delphi бесплатна и при этом допускает коммерческое использование?
Арсений
Цитата
Не понял вопроса. ТОЛЬКО полноэкраный режим и является единственным нормальным режимом работы DOS-приложения.

Ситуация: юзер нажал клаву Windows, программа свернулась на панель задачь, юзер снова щелкает по программе на панели задач, соответственно программа разворачивается. Так ЧТО должна сделать программа, чтобы вернуть изображение, которое было до нажатия?
О Turbo Delphi наконец всё узнал. Да она бесплатная. Хороший вариант, токо надо разобираться с дравами и юнитами.
andriano
Цитата(Арсений @ 31.12.2007 3:01) *
Так ЧТО должна сделать программа, чтобы вернуть изображение, которое было до нажатия?
Программа ДОЛЖНА использовать тот видеорежим, который поддерживается Windows для DOS-программ. Текстовый - поддерживается точно. Графика 320х200 - вроде бы тоже. Большее не проверял.

Собственно, вопрос изначально некорректно сформулирован. Сама программа не может сделать НИЧЕГО. Вопрос лишь в том, какой из видеорежимов Windows умеет восстанавливать, а какой - нет.
Арсений
Всё. Большое всем спасибо за помощь. Я разобрался.
closegraph;
SetGraphMode($101);
Этот код восстанавливает графический режим.
andriano
Этот код не восстанавливает режим, а устанавливает заново.
Разница примерно как между ремонтом и покупкой нового.
SKVOZNJAK
Цитата(Арсений @ 30.12.2007 14:44) *

P.S под DOS программа пишется потому, что под windows free только fpc, а он глючныйи и ему нужны дрова.

А кроме fpc больше ничего и не надо smile.gif Из дров к нему надо скачать лишь библиотеку SDL и SDL.DLL Один небольшой архивчик и файлик. Чтобы не глючило, выбирай стабильные версии. За всё это получаешь возможности: использовать 8,16,32(24) битный видеорежим как в окне так и на полном экране с различным разрешением, можно и с нестандартным, забить на изучение winapi - в sdl и так почти всё что надо уже есть, кроссплатформенность написанных программ.
Арсений
Цитата
Этот код не восстанавливает режим, а устанавливает заново.
Разница примерно как между ремонтом и покупкой нового.

Но работает(можно восстановить изображение из памяти).
Цитата
выбирай стабильные версии

Подскажите, какие конкретно, чтобы не пришлось воевать в аглицких настройках из-за несуществующей ошибки.
andriano
Цитата(Арсений @ 2.01.2008 15:08) *

Но работает(можно восстановить изображение из памяти).
Повторяю: если вместо ремонта неисправного телевизора купить новый - тоже будет работать.
А вот по поводу восстановления изображения - это исключительно ручкам, т.к. SetVodeoMode($101) устанавливает видеорежим со СТИРАНИЕМ видеопамяти.
Арсений
Ну другого то способа нету... no1.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.