Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Free Pascal, Pascal ABC и другие _ Проблема с графикой в tmt pascal

Автор: Арсений 29.12.2007 6:30

Здравствуйте. У меня проблема:в графическом режиме происходит откровенно говоря чёрти что. При загрузке svga256.bgi нормально рисуется круг, при попытке вывести bmp(модуль взят с этого сайта) на дисплее какие то цветные точки, при установке графического режима функцией setsvgamode и попытке изобразить круг: сначала круг, затем точки. Для уточнения: у меня монитор wxga, карта nvidia geforce. Пожалуйста, укажите поблему и способ её устранения. Заранее благодарен.

Автор: Ozzя 29.12.2007 12:45

Цитата
с графикой в tmt pascal


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

blink.gif

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

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

http://forum.sources.ru/index.php?showtopic=64755

Программу приложи свою.

Автор: andriano 29.12.2007 16:39

Цитата(Арсений @ 29.12.2007 2:30) *
Пожалуйста, укажите поблему и способ её устранения. Заранее благодарен.
Помочь тебе в решении проблемы - можем. А вот указать проблему тебе придется самостоятельно.
Опиши словами, что хочешь получить, что для этого делаешь, что получается, и чем то, что получается, отличается от того, что хочешь получить. Если не работает, как хочется, какой-то фрагмент кода - приведи его.

Автор: Арсений 29.12.2007 19:51

За ссылку спасибо. При использовании прцедуры SetSVGAMode(...) появляются либо точки(я в предидущем сообщении об этом писал(пожалуйста, прочитайте повнимательнее)) или 'returne соde:0'. Для уточнения: вот программа вызывающая 2-ой глюк(см файл).


Прикрепленные файлы
Прикрепленный файл  noname00.pas ( 280 байт ) Кол-во скачиваний: 440

Автор: andriano 29.12.2007 20:47

Ты пишешь о том, что при загрузке 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 вывести на экран текст с сообщением об окончании работы)

Автор: Гость 29.12.2007 23:12

Andriano, по поводу драйвров ты не прав. А именно я вместо функции setsvgamode поставил загрузку драйвера. Всё пошло: задержав программу с помощью readln наконец то вывел bmp изображение. Остается один вопрос как подобрать разрешение в setsvgamode чтобы она нормально пахала? P.S. Добавляю файлы о которых шла речь.

Автор: Арсений 29.12.2007 23:20

Извините, это я гостем вошел. ohmy.gif Файлы в наличии.


Прикрепленные файлы
Прикрепленный файл  проблемы.rar ( 9.58 килобайт ) Кол-во скачиваний: 331

Автор: andriano 30.12.2007 0:24

Цитата(Гость @ 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.

Автор: Арсений 30.12.2007 1:17

Почти ясно. Только изображение выводится лишь при режиме $101. Суди по переводу GetVbeModesList и TotalVbeModes выдают максимально возиожный режим, но при результете который они выдают, изображение не выводится. Подскажите, как определить режим с максимальным качеством. И еще проблема: когда прога сворачивается в окно, изображение пропадает, а сама прога зависает. Подскажите, пожалуйста, как решить даные проблемы.

Автор: andriano 30.12.2007 1:44

Цитата(Арсений @ 29.12.2007 21:17) *

Почти ясно. Только изображение выводится лишь при режиме $101. Суди по переводу GetVbeModesList и TotalVbeModes выдают максимально возиожный режим, но при результете который они выдают, изображение не выводится.
Это не совсем так.
Теоретически весь список является доступным. Другое дело, что WinXP не позволяет делать DOS-программам все, что им захочется. Я вот сейчас поэкспериментировал и вогнал Windows в "синий экран".
Цитата
Подскажите, как определить режим с максимальным качеством.
Если ты будешь работать под "голым DOS", то можешь достаточно смело пользоваться любым из видеорежимов. WinXP, очевидно, их ограничивает. Опять же, если тебе удалось заставить что-то работать на одном компьютере, то совершенно неочевидно, что то же самое удастся сделать на компьютере с другой видеокартой.
Цитата
И еще проблема: когда прога сворачивается в окно, изображение пропадает, а сама прога зависает. Подскажите, пожалуйста, как решить даные проблемы.
Последнее - только запуская программу в "голом DOS". DOS программа может работать ТОЛЬКО в полноэкранном режиме. Ничего другого никем не гарантируется. WinXP обладает лишь частичной поддержкой DOS-программ, использующих графику.

Автор: Арсений 30.12.2007 1:55

А есть какие нибудь эмуляторы для DOSовских программ в XP? Может ли программа видеть если её лишают полного экрана?

Автор: andriano 30.12.2007 2:06

Что значит "лишают"?
В DOS это принципиально невозможно.
А под особенности Windows DOS никогда не подстраивался.
Windows же, как я уже говорил, поддерживает DOS лишь частично. А 64-разрядные версии Windows не поддерживают DOS вообще. Даже DOS32.
Есть, правда, такая программа как DOSbox, которая может обеспечить работу в Windows тех программ, которые сама Windows не поддерживает. Значит - можно. Но в Microsoft не хотят.
И работает ли она в Win64, я не знаю.
Но возникает вопрос: если хочешь, чтобы программа работала в Windows, зачем писать ее под DOS?

Еще раз рекомендую поделиться, ради чего это все затевается. А то пока разговор получается очень абстрактным.

Автор: Арсений 30.12.2007 21:44

"лишают"- имеется в виду сбой когда программа сворачивается в окно(нажато Alt+Enter, Windows). Проблема в том, что программа зависает и не может вывести изображение, отреагировать на Enter. P.S под DOS программа пишется потому, что под windows free только fpc, а он глючныйи и ему нужны дрова.

Автор: andriano 30.12.2007 22:04

Цитата(Арсений @ 30.12.2007 17:44) *

"лишают"- имеется в виду сбой когда программа сворачивается в окно(нажато Alt+Enter, Windows). Проблема в том, что программа зависает и не может вывести изображение, отреагировать на Enter.
С точки зрения Микрософт (т.е. разработчика как DOS, так и Windows) так и должно быть.
Т.е. это не баг, а фича.
Цитата
P.S под DOS программа пишется потому, что под windows free только fpc, а он глючныйи и ему нужны дрова.
Неправда. Свободный еще, минимум, TurboDelphi. Если нужно писать программу, работающую в Windows, думаю, наилучший вариант.

Автор: Арсений 31.12.2007 0:33

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

Автор: andriano 31.12.2007 0:48

Цитата(Арсений @ 30.12.2007 20:33) *

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

Автор: Арсений 31.12.2007 7:01

Цитата
Не понял вопроса. ТОЛЬКО полноэкраный режим и является единственным нормальным режимом работы DOS-приложения.

Ситуация: юзер нажал клаву Windows, программа свернулась на панель задачь, юзер снова щелкает по программе на панели задач, соответственно программа разворачивается. Так ЧТО должна сделать программа, чтобы вернуть изображение, которое было до нажатия?
О Turbo Delphi наконец всё узнал. Да она бесплатная. Хороший вариант, токо надо разобираться с дравами и юнитами.

Автор: andriano 31.12.2007 17:20

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

Собственно, вопрос изначально некорректно сформулирован. Сама программа не может сделать НИЧЕГО. Вопрос лишь в том, какой из видеорежимов Windows умеет восстанавливать, а какой - нет.

Автор: Арсений 31.12.2007 19:58

Всё. Большое всем спасибо за помощь. Я разобрался.
closegraph;
SetGraphMode($101);
Этот код восстанавливает графический режим.

Автор: andriano 31.12.2007 21:47

Этот код не восстанавливает режим, а устанавливает заново.
Разница примерно как между ремонтом и покупкой нового.

Автор: SKVOZNJAK 2.01.2008 18:30

Цитата(Арсений @ 30.12.2007 14:44) *

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

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

Автор: Арсений 2.01.2008 19:08

Цитата
Этот код не восстанавливает режим, а устанавливает заново.
Разница примерно как между ремонтом и покупкой нового.

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

Подскажите, какие конкретно, чтобы не пришлось воевать в аглицких настройках из-за несуществующей ошибки.

Автор: andriano 2.01.2008 21:29

Цитата(Арсений @ 2.01.2008 15:08) *

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

Автор: Арсений 2.01.2008 22:32

Ну другого то способа нету... no1.gif