Мои вопросы по Free Pascal
| |
Andrey_M | Дата: Четверг, 03 Января 2013, 22:05 | Сообщение # 1 |
старожил
Сейчас нет на сайте
| Сюда я буду писать свои вопросы по Free Pascal
1. Можно ли реализовать проверку нажатия кнопки мыши? 2. Каким образом реализовать изменение строки до текущей, пример снизу: begin writeln('11111'); {Эту строку нужно изменить} writeln('11111'); writeln('11111'); {А эта строка - текущая} Readln; 3. Как реализовать самостоятельный поиск пути к графическому драйверу (не заставлять же юзера каждый раз его писать)?
Прошу не оффтопить и отвечать только по теме. end.
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
TimKruz | Дата: Четверг, 03 Января 2013, 22:45 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Я так понимаю, ты используешь FPC, который в режиме DOS? Цитата (Andrey_M) 1. Можно ли реализовать проверку нажатия кнопки мыши? Для этого нужно активировать мышь через её драйвер. Я как-то списывал из книги модуль управления мышью как в текстовом, так и графическом режиме (который не поддерживается Windows Vista/7/8, только если через DOSBOX эмулировать) MS-DOS, но он был для TurboPascal и может не работать с FreePascal, тем более, что у FreePascal графика выводится не в режиме MS-DOS, а в отдельном Windows-окне, значит и функции другие. В этом модуле, если вкратце, с помощью встроенных средств TurboPascal (но можно было бы с помощью встроенного ассемблера TASM) устанавливались значения нужных регистров, вызвалось прерывание 33h (это прерывание MS-DOS для работы с драйвером мыши), и считывался результат из тех же регистров. Короче, нужно почитать официальную документацию по FreePascal, если не хочешь юзать TurboPascal. Цитата (Andrey_M) 2. Каким образом реализовать изменение строки до текущей, пример снизу: Нужно сделать перевод курсора на две строки вверх, это делается процедурой (вроде бы GotoXY) одного из основных модулей (не помню какого).
Или можно описать массив-матрицу слов (word, 2 байта, т.к. на экране 1 байт под символ, 1 байт под атрибуты символа) с абсолютной адресацией (absolute <адрес в памяти>:<сдвиг>;), задав его адрес, соответствующий адресу буфера экрана текстового режима (там какое-то число, найдёшь в интернете, лень самому вспоминать). Теперь каждая ячейка этого массива будет соответствовать знакоместу на экране, и, следовательно, ты можешь менять их как захочешь. Правда, придётся писать свою процедуру (это несложно) write (может ещё read собственный понадобится), т.к. стандартные write/read тут не подходят. Цитата (Andrey_M) 3. Как реализовать самостоятельный поиск пути к графическому драйверу (не заставлять же юзера каждый раз его писать)? Можешь просто сканировать диск C:, начиная с корня. Просто кидаешь драйвер в папку с программой и предоставляешь юзеру архив. А в процедуре инициализации графики пишешь не полный путь к файлу. а только его имя (по-умолчанию путь равен пути до папки с программой) или относительный путь к нему (например, 'drivers/superdriver.drv', если драйвер расположен в папке drivers, которая в папке с программой). Если возникают с этим проблемы, то есть какая-то функция (не помню названия), возвращающая путь до программы - попробуй с её помощью получить полный путь к драйверу. Но это вряд ли понадобится.
Сообщение отредактировал TimKruz - Четверг, 03 Января 2013, 22:54 |
|
| |
Andrey_M | Дата: Пятница, 04 Января 2013, 10:53 | Сообщение # 3 |
старожил
Сейчас нет на сайте
| Ещё вопрос: можно ли (и каким образом) запустить через Pascal приложение ехе? То есть begin запустить программу('...'); Readln; end.
Или нельзя? Запускать можно средствами винды)))
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
karuy | Дата: Пятница, 04 Января 2013, 13:31 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Код function ShellExecuteA(hWnd: HWND; Operation, FileName, Parameters, Directory: PAnsiChar; ShowCmd: Integer): HINST; stdcall;
|
|
| |
Andrey_M | Дата: Пятница, 04 Января 2013, 19:26 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| Цитата (karuy) function ShellExecuteA(hWnd: HWND; Operation, FileName, Parameters, Directory: PAnsiChar; ShowCmd: Integer): HINST; stdcall; Хммм... а можешь поподробнее расписать, где что заменить в твоём коде (я не понял).
Что здесь писать?
Это разве не одно и тоже? Просто заставлять юзера писать сначала директорию, а потом назву... я не садист
Это свойство переменной ShowCmd?
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
karuy | Дата: Пятница, 04 Января 2013, 20:54 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| ShellExecute (hWnd: HWND; Operation: PChar; FileName: PChar; Parametrs: PChar; Directory: PChar; CmdShow: Integer): HINST; где: hWnd – Handle родительского окна, в который будут передаваться сообщения запускаемого приложения. Можно указывать Handle-ссылку окна вашего приложения. Operation – производимая операция. Open – открыть, print – напечатать, explore – открыть папку. По умолчанию open, если указать nil. FileName – имя файла или документа, интернет ссылка, e-mail адрес. Parametrs – параметры, передаваемые приложению в командной строке. Directory – каталог по умолчанию. CmdShow – стиль окна. Показывает, в каком состоянии будет отображаться окно при запуске. Вместо параметров Operation, Parametrs и Directory можно ставить nil. Они являются не обязательными параметрами для запуска. В случае успешного запуска возвращает Handle окна, в случае неудачи возвращает код ошибки меньше или равное 32. Список возможных ошибок можно прочитать в справке по этой команде.
|
|
| |
Andrey_M | Дата: Пятница, 04 Января 2013, 21:53 | Сообщение # 7 |
старожил
Сейчас нет на сайте
| Цитата (karuy) Handle родительского окна, в который будут передаваться сообщения запускаемого приложения. Можно указывать Handle-ссылку окна вашего приложения. Мне не нужно окно винды (и тем более родительское). Мне нужно открыть какое-то другое приложение (любое) средствами винды. Открыть также, как это я сделал бы двумя щелчками мыши. Мне не нужно передавать никакие сообщения приложения...
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
karuy | Дата: Пятница, 04 Января 2013, 22:15 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| Цитата (Andrey_M) Открыть также, как это я сделал бы двумя щелчками мыши. Мне не нужно передавать никакие сообщения приложения... Слишком много пробелов в знаниях, вектор я указал - копай.
|
|
| |
Andrey_M | Дата: Пятница, 04 Января 2013, 22:27 | Сообщение # 9 |
старожил
Сейчас нет на сайте
| Цитата (karuy) Слишком много пробелов в знаниях, вектор я указал - копай. Ты вроде отвечал в ещё одной моей теме про паскаль...или нет?
Короче, ещё кого-ниудь спрошу (или TimKruz придёт и спасёт меня ).
А насчёт длл как? Гуглить если, то выходят такие же, как моя, темы, а мне нужен ответ. Так как их создавать в паскале?
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
TimKruz | Дата: Суббота, 05 Января 2013, 00:46 | Сообщение # 10 |
старожил
Сейчас нет на сайте
| Цитата (Andrey_M) Мне не нужно окно винды (и тем более родительское). Мне нужно открыть какое-то другое приложение (любое) средствами винды. Открыть также, как это я сделал бы двумя щелчками мыши. Мне не нужно передавать никакие сообщения приложения... Ну так просто ставь nil и 0 в ненужных тебе аргументах процедуры, которую написал karuy. Например, вот так прекрасно работает (проверял в Delphi, но это WinAPI функция, должна работать везде) и запускает калькулятор: Код ShellExecute(0,nil,'C://Windows/System32/calc.exe',nil,nil,0); Т.е. я задал только полное имя программы. Но нужно подключить специальный модуль (в Delphi это ShellAPI) или описать импорт процедуры из библиотеки shell32.dll вручную (только называется там она ShellExecuteA или ShellExecuteW, подробнее читай справку по WinAPI, например, эту). Цитата (Andrey_M) А насчёт длл как? Гуглить если, то выходят такие же, как моя, темы, а мне нужен ответ. Так как их создавать в паскале? В Delphi они создаются легко (File > New > Other... > DLL Wizard). На Lazarus тоже (Файл > Создать... > Проект > Библиотека)... Потом просто пишешь код как в обычной программе/модуле, а затем с помощью специальной директивы экспортируешь нужные (чтобы программы, подключающие эту библиотеку, могли импортировать и использовать эти процедуры/функции). А вот про FPC не знаю...
Вообще, такое ощущение, что ты хочешь что-то грандиозное соорудить, не имея достаточных знаний... Сначала изучи всё по-отдельности, почитай книги, документацию по языку, поделай примерчиков, а потом, когда почувствуешь, что готов - сможешь написать свою программу... А так ты по каждому вопросу на форум бегать будешь... Цитата (Andrey_M) такие же, как моя, темы, а мне нужен ответ Ну так почитай те темы, в них наверняка кто-то что-то отвечал... Не может быть такого, чтобы проблема существовала давно, для неё имелось решение, о ней много раз спрашивали, но при этом никто не сообщил решения. Наверное, ты плохо искал.
Сообщение отредактировал TimKruz - Суббота, 05 Января 2013, 00:56 |
|
| |
Andrey_M | Дата: Суббота, 05 Января 2013, 16:19 | Сообщение # 11 |
старожил
Сейчас нет на сайте
| Цитата (TimKruz) Вообще, такое ощущение, что ты хочешь что-то грандиозное соорудить, не имея достаточных знаний... Сначала изучи всё по-отдельности, почитай книги, документацию по языку, поделай примерчиков, а потом, когда почувствуешь, что готов - сможешь написать свою программу... А так ты по каждому вопросу на форум бегать будешь... Я не могу изучать теорию слишком долго. После ста килограммов теории я забываю даже то, с чего начинается код проги. Я не хочу ничего грандиозного... Просто языки программирования создавались для создания программ.
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
TimKruz | Дата: Суббота, 05 Января 2013, 21:10 | Сообщение # 12 |
старожил
Сейчас нет на сайте
| Цитата (Andrey_M) Я не могу изучать теорию слишком долго. После ста килограммов теории я забываю даже то, с чего начинается код проги. Я не хочу ничего грандиозного... Просто языки программирования создавались для создания программ. Ну изучать нужно поэтапно, а не прыгать от одного к другому. Ты же не собираешься делать DLL, содержащую единственную процедуру write_hello, выводящую 'Hello world!'? Я так думаю, тебе пока рано изучать DLL. Разберись сначала с обычными программами, а потом к библиотекам перейдёшь...
|
|
| |
Andrey_M | Дата: Вторник, 22 Января 2013, 18:02 | Сообщение # 13 |
старожил
Сейчас нет на сайте
| И ещё вопрос (ответьте пожалуйста ): как сделать вывод символов псевдографики MS-DOS?
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
justfoler | Дата: Вторник, 22 Января 2013, 18:54 | Сообщение # 14 |
почетный гость
Сейчас нет на сайте
| Вручную выводить. Пишешь var k:integer; begin for k:=33 to 255 do writeln(k,' ',chr(k)); readln; end.
Смотришь на номер интересующего тебя символа и записываешь в своей программе как write(chr(k)); Проблема в том, что на компьютерах в разных регионах символы в таблице ascii имеют разный порядок
|
|
| |
GECK | Дата: Вторник, 22 Января 2013, 18:57 | Сообщение # 15 |
заслуженный участник
Сейчас нет на сайте
| Во фрипаскале же есть встроенный просмотрщик таблицы ascii.
Всё гениальное просто. И хреново работает.
|
|
| |
Andrey_M | Дата: Понедельник, 28 Января 2013, 13:11 | Сообщение # 16 |
старожил
Сейчас нет на сайте
| Цитата (GECK) Во фрипаскале же есть встроенный просмотрщик таблицы ascii. Цитата (justfoler) Вручную выводить. Пишешь var k:integer; begin for k:=33 to 255 do writeln(k,' ',chr(k)); readln; end. Спасибо, но мне нужно написать сами символы.
Цитата (justfoler) (chr(k)); СПАСИБО! Спас...Добавлено (28.01.2013, 13:11) --------------------------------------------- Вопрос появился у меня. Как вывести список файлов в директории (допустим, я знаю, что файлов 5 (пять), но мне нужно вывести в переменную f1 назву первого файла, в f2 - второго и т.д.. Файлы находятся в папке C:\folder)?
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
karuy | Дата: Понедельник, 28 Января 2013, 13:51 | Сообщение # 17 |
заслуженный участник
Сейчас нет на сайте
| Код program Project2; {$APPTYPE CONSOLE}
uses SysUtils;
var F: TSearchRec; Path: string; Attr: Integer; begin Path := 'C:\folder\*.*'; Attr := faReadOnly + faArchive;
FindFirst(Path, Attr, F);
if F.name <> '' then begin Writeln(F.name); while FindNext(F) = 0 do Writeln(F.name); end; FindClose(F); end. http://www.freepascal.org/docs-html/rtl/sysutils/findfirst.html
Сообщение отредактировал karuy - Понедельник, 28 Января 2013, 13:52 |
|
| |
Andrey_M | Дата: Понедельник, 28 Января 2013, 13:53 | Сообщение # 18 |
старожил
Сейчас нет на сайте
| karuy, вот почему ты выкладываешь код без комментариев и объяснений? Я почти нифига не понял.
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
karuy | Дата: Понедельник, 28 Января 2013, 14:09 | Сообщение # 19 |
заслуженный участник
Сейчас нет на сайте
| Код program Project2; {$APPTYPE CONSOLE}
uses SysUtils;
var F: TSearchRec; Path: string; Attr: Integer; begin {Искать все файлы в заданной директории} Path := 'C:\folder\*.*'; Attr := faReadOnly + faArchive;
FindFirst(Path, Attr, F); {Если хотя бы один файл найден, то продолжить поиск} if F.name <> '' then begin Writeln(F.name); {Печать имени найденного файла} while FindNext(F) = 0 do Writeln(F.name); end; FindClose(F); end.
|
|
| |
Andrey_M | Дата: Воскресенье, 21 Апреля 2013, 00:11 | Сообщение # 20 |
старожил
Сейчас нет на сайте
| karuy, спасибо. Так гораздо проще. Буду рыться))) Добавлено (21.04.2013, 00:11) --------------------------------------------- Где-то слышал, что через паскаль можно реализовать работу с TCP/IP. Подскажите инфу.
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
|