Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Драйвера для графического режима работы 
V
    Опции темы
Bobrina
Дата 23.2.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 26.1.2009
Где: Москва

Репутация: нет
Всего: нет



Учусь работать с графическим режимом TP7 (модуль Graph). Использую автоопределение видеодрайвера:
Код

    begin
    D:=Detect;
    InitGraph(D,R,'');
    Error:=GraphResult;
    If error<>0 then
       begin
       GraphErrorMsg(Error);
       WriteLn(Error);
       RedLn;
       end;

При запуске программы из каталога TP7 всё работает, иначе графический режим не вызывается.(Пишется ошибка -3 не найден графический драйвер)
Почитал про включение драйвера в тело программы,мало что понял,я просто незнаю откуда берется этот драйвер.
Подскажите пожалуйста.

Добавлено через 7 минут и 7 секунд
Вроде драйвер EgaVga.bgi. Как я понял надо его прогнать через прогу BinObj но проблема в том, что у мен яв TP7 её нету! Где её взять?
PM MAIL ICQ   Вверх
volvo877
Дата 23.2.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(Bobrina @  23.2.2009,  11:39 Найти цитируемый пост)
Где её взять? 
В аттаче...

А вообще тебе надо просто правильно прописать пути к BGI, или взять себе за привычку держать нужные тебе BGI и CHR-файлы и Graph.tpu (потому поймешь, почему) в папке с проектом...

Это сообщение отредактировал(а) volvo877 - 23.2.2009, 13:14

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  BINOBJ.zip 6,17 Kb
PM MAIL   Вверх
Virtuals
Дата 23.2.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: нет
Всего: 11



Bobrina, 
Цитата

 InitGraph (процедура)    (модуль Graph)
 ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Инициализирует графическую систему и переводит
видеокарту в графический режим.

 Объявление:
 Procedure InitGraph (Var GraphDriver : Integer; Var GraphMode : Integer;
                                                  PathToDriver : String);

 Режим:
Real, Protected

 Замечания:
Если значение параметра GraphDriver равно
Detect, то производится обращение к любым
определяемым пользователем подпрограммам
автоматического определения, а затем
вызывается функция DetectGraph. Если
графическое аппаратное обеспечение обнаружено,
то инициализируется соответствующий
графический драйвер, и включается графический
режим.

Если значение GraphDriver не равно нулю, то в
качестве номера драйвера принимается значение
параметра GraphDriver. Видеосистема переходит
в режим, определенный параметром GraphMode.
Если вы отменяете автоопределение, то вы
должны задать допустимый номер видеорежима для
выбранного драйвера.

Параметр PathToDriver определяет путь к
каталога, где находится нужный графический
драйвер. Если строка PathToDriver равна пустой
строке, то поиск файла драйвера производится в
текущем каталоге.

Обычно, InitGraph загружает графический
драйвер, рапределяя память для него через
обращение к GraphGetMem, а затем загружает
соответствующий *.BGI файл с диска. Как
вариант такой динамической схемы загрузки, вы
можете встроить файл драйвера (или несколько
файлов) непосредственно в исполняемый файл
вашей програмы.

Это можно сделать так:
 1. Преобразуйте  *.BGI  файл  в  *.OBJ  файл
    (используя  утилиты  BINOBJ  или  BGIOBJ)
 2. В тексте  программы  поместите  обращение
    к функции RegisterBGIDriver перед вызовом
    InitGraph для того, чтобы зарегистрировать
    графический драйвер.

Когда вы формируете вашу программу, вы должны
скомпоновать с ней *.OBJ файлы для
зарегистрированных драйверов. Вы можете также
загрузить BGI драйвер в кучу, а затем
зарегистрировать его вызвав функцию
RegisterBGIDriver.

Если в куче была распределена память для
графического драйвера с использованием
процедуры GraphGetMem, то при вызове процедуры
CloseGraph она будет освобождена.

После вызова InitGraph, значение переменной
GraphDriver устанавливается к значению
текущего графического драйвера, а значение
GraphMode устанавливается к значению текущего
графического режима.

Если происходит ошибка, то в переменной
GraphDriver и в функции GraphResult будет
возвращена одна из следующих grXXXX констант:
grNotDetected, grFileNotFound,
grInvalidDriver, grNoLoadMem или
grInvalidMode.



в вложении бинобж, и библиотека с примером+ обж файл для 256 цветного режима, библиотеку править ручками, вырезая ненужные вам модули (Tpstring,TpCrt)
и функции ( Procedure SetRGBFull(RGB:RGBRecord);
 Procedure GetRGBFull(var RGB);
)

пользовать так
Код

uses Graph,gr256_3u;

var g      :GR256_3;

begin
  ModeG256:=0; //видеорежим //разрешение ;)

 G.Init;
.....
 G.Done;
end.



Добавлено через 11 минут и 3 секунды
volvo877, имхо bgi лучше таскать в exe, а про chr прав точно прав.

Это сообщение отредактировал(а) Virtuals - 23.2.2009, 13:19

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  012.zip 11,56 Kb
PM MAIL ICQ   Вверх
Bobrina
Дата 23.2.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 26.1.2009
Где: Москва

Репутация: нет
Всего: нет



Цитата

А вообще тебе надо просто правильно прописать пути к BGI

Прописал 
Код

begin
    D:=Detect;
    InitGraph(D,R,'c:\pascal\egavga.bgi');

Всё равно не работает если рядом нету драйвера.

Цитата

или взять себе за привычку держать нужные тебе BGI и CHR-файлы и Graph.tpu (потому поймешь, почему) в папке с проектом...

Я всё так и держу, просто надо чтобы программа работала без дополнительных файлов.
Спасибо за BinObj
Вопрос остался, как прописать именно мой EgaVga драйвер в программу?

Это сообщение отредактировал(а) Bobrina - 23.2.2009, 14:16
PM MAIL ICQ   Вверх
Virtuals
Дата 23.2.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: нет
Всего: 11



Bobrina, 
BINOBJ.EXE /?
разве не помогает?
Код

BINOBJ.EXE EGAVGA.BGI egavga egavgadrv

и приатачить egavga.obj с функцией egavgadrv (в атаче все хорошо видно)
PM MAIL ICQ   Вверх
Bobrina
Дата 23.2.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 26.1.2009
Где: Москва

Репутация: нет
Всего: нет



Код

Procedure TGraphApp.Init;external;
{$L Vga.obj}
var D,R,Error,k,driver:Integer;

    begin
    Driver:=InstallUserDriver('Vga',nil);
    if RegisterBGIDriver(@Vga)<0 then
       begin
       WriteLn('Error');
       halt
       end;
    InitGraph(Driver,R,'');
    Error:=GraphResult;
    If error<>0 then
       begin
       GraphErrorMsg(Error);
       WriteLn(Error);
       ReadLn;
       halt
       end;


Сделал Vga.obj
Ругается на @vga. Пишет что надо variable indetifier.

Это сообщение отредактировал(а) Bobrina - 23.2.2009, 14:34
PM MAIL ICQ   Вверх
volvo877
Дата 23.2.2009, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Зачем InstallUserDriver? Это что, твой собственный драйвер? Мне казалось ,что он Борландовский... И потом:

Код

Procedure egaVgаDrv; external; { <--- Я бы не рекомендовал тебе делать внешним МЕТОД }
{$L Vga.obj}
...
    if RegisterBGIDriver(@egaVgaDrv)<0 then ...


Добавлено через 6 минут и 25 секунд
Короче, вот тут читай: http://volvo71.narod.ru/faq_folder/bgiexe.htm
А то ты все по-своему перекраиваешь, в твоей мешанине не разберешься!

Это сообщение отредактировал(а) volvo877 - 23.2.2009, 14:41
PM MAIL   Вверх
Bobrina
Дата 23.2.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 26.1.2009
Где: Москва

Репутация: нет
Всего: нет



Код

Procedure TGraphApp.Init;
{$L Vga.obj}
var D,R,Error,k:Integer;

    begin
    if RegisterBGIDriver(@EgaVgaDrv)<0 then
       begin
       WriteLn('Error');
       halt
       end;
    InitGraph(D,R,'');

Я сделал .obj вот так c:\pascal\BINOBJ egavga.bgi vga egavgadrv. 
Опять ругается на @EgaVgaDrv
PM MAIL ICQ   Вверх
volvo877
Дата 23.2.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Я тебе написал, что Procedure TGraphApp.Init; - это МЕТОД... Чего ты с ним делать хочешь? Тебе надо описать ПРОЦЕДУРУ. Простую внешнюю процедуру... И все. Если ты сделал OBJ точно так, как написал, то:

Код

Procedure egavgadrv; external;
{$L Vga.obj}

var D,R,Error,k:Integer;
    begin
    if RegisterBGIDriver(@EgaVgaDrv)<0 then
       begin
       WriteLn('Error');
       halt
       end;
...

Обязано работать... Не работает - меняй дистрибутив. Точка. Телепаты - на других форумах.
PM MAIL   Вверх
Bobrina
Дата 23.2.2009, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 26.1.2009
Где: Москва

Репутация: нет
Всего: нет



Спасибо большое за помощь! Всё заработало!
Код

Uses Graph,CRT;
var ActiveObj:Integer;

{$L Vga.obj} Procedure EgaVgaDrv;external;

Procedure TGraphApp.Init;

var D,M,Error,k:Integer;

    begin
    if RegisterBGIDriver(@EgaVgaDrv)<0 then
       begin
       WriteLn('Error',GraphErrorMsg(GraphResult));
       halt(100)
       end;
    D:=Vga;
    M:=VgaHi;
    InitGraph(D,M,'');


Просто я не понимал  
Код

{$L Vga.obj} Procedure EgaVgaDrv;external;

вот этого момента. Как раз начинаю изучать внешние процедуры. Всем ещё раз большое спасибо! С праздником вас!


PM MAIL ICQ   Вверх
ФедосеевПавел
Дата 23.2.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 2
Всего: 10



Bobrina, 
Цитата(Bobrina @  23.2.2009,  14:43 Найти цитируемый пост)
КодincludeSyntax('delphi');Procedure TGraphApp.Init;{$L Vga.obj}var D,R,Error,k:Integer;    begin    if RegisterBGIDriver(@EgaVgaDrv)<0 then       begin       WriteLn('Error');       halt       end;    InitGraph(D,R,'');


Вы забываете описать процедуру из obj-файла.
{$L Vga.obj}  - это вставить бинарный код внутрь создаваемого exe-шника. Нужно добавить описание функции из Vga.obj
Код

procedure EgaVga; external;


Если есть желение, посмотрите в примерах к TP (BGILink.pas). Или в моих приаттаченных (на базе тех же BGILink.pas).

Для моего примера, поместите в папку c ним файлы egavga.bgi, bin2obj.exe, запустите bgi2obj.bat и откомпилируйте test.pas. Все должно работать.

И ещё совет на дорожку... Если возникает ошибка в большом проекте, выделите глючную процедуру и создайте маленькую тестовую программку с ней. И там отлаживайте. Да и к вопросу на форуме легче приложить тестовую программу целиком.

-----------------------
Прошу прощения за "своевременность". Пока искал примеры все "само-собой рассосалось".

Это сообщение отредактировал(а) ФедосеевПавел - 23.2.2009, 15:31

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Video.zip 3,91 Kb
PM   Вверх
Bobrina
Дата 23.2.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 26.1.2009
Где: Москва

Репутация: нет
Всего: нет



Спасибо!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.