Программирование под КПК на FreePascal | Что-то вроде FAQ для новичков



Реп: (25)
Касательно Free Pascal на форуме очень мало информации, а на нем можно писать полноценные приложения под КПК. По мере возможности буду пополнять данную тему новыми вопросами. Если кто-то имеет, что добавить в тему - не стесняйтесь.

Вопрос: Какую версию Free Pascal использовать?
Ответ: Мною используется версия fpc 2.2, собранная для arm-wince. Компилируем такой строкой:
fpc -Twince -Parm -XX -CX -Xs %file%


Вопрос: Как выглядит минимальная программа (типа "Hello, World!")?
Ответ:
uses Windows;
begin
MessageBox (0, 'Hello, World!', 'HELLO', 0);
end.

В откомпилированном виде занимает 29Кб.

Вопрос: Как узнать разрешение экрана на КПК?
Ответ: Я использую такую простую функцию:
function GetDisplaySize: TPoint;
begin
Result.X := GetSystemMetrics (SM_CXSCREEN);
Result.Y := GetSystemMetrics (SM_CYSCREEN);
end; {func GetDisplaySize}


Вопрос: Как избавиться от запуска дублей программы?
Ответ: Можно так:
Form := FindWindow (nil, WindowCaption);
if Form <> 0 then
begin
ShowWindow (Form, SW_SHOW);
SetForegroundWindow (Form);
ExitProcess (0);
end;

Где Form: HWND, а WindowCaption - заголовок окна Вашей программы. Если программа с таким заголовком уже запущена, то передаем ей фокус и завершаем свою работу.
Для большей надежности можно указать имя класса окна (первый параметр в FindWindow).



Реп: (0)
Arigato @ 14.01.08 21:11:12
Вопрос: Как выглядит минимальная программа (типа "Hello, World!")?
Ответ:
uses Windows;
begin
  MessageBox (0, 'Hello, World!', 'HELLO', 0);
end.


В откомпилированном виде занимает 29Кб.

Извини, но это не "Hello World" для КПК. Это просто демонстрация MessageBox....
"Hello World" ну минимум из создания и обработчика окна должен состоять....



Реп: (105)
-QwertY-, та ладно тебе!
в чем кардинальное отличие от printf ("Hello, world!\n"); ? :]
создание и управление окном это уже минимальное оконное приложение, imho



Реп: (0)
std.denis,
std.denis @ 15.01.08 11:21:04
создание и управление окном это уже минимальное оконное приложение, imho

не буду твою имху переубеждать, просто свои доводы приведу.

И так если это приложение HelloWorld, значит мы можем использовать приведённый в первом посте код для нахождения уже открытого окна, и не давать запускать приложение несколько раз!
и так поехали:
класс - Dialog
название окна - HELLO

А теперь представим что какая-то другая программа высветила такой-е мессаджбокс и именно из-за этого не может открыться программа Hello World.
Несыстыковачка получается, причём большая.
Разве не так?

PS кстати именно такое отличие и есть между виндовым и консольным hello world...
PPS я конечно всё утрирую, но именно так новичкам только и можно объяснить основы программинга. Опыт просто есть...



Реп: (25)
-QwertY-,
Хорошо, приведи свой вариант HelloWorlda :)
А проблема с нахождением окна может возникнуть и тогда, годна будет другая прога с тем же заголовком окна, что и у нас. Данный MessageBox прекрасно ищется по HELLO.



Реп: (0)
Arigato,
Не возникнет, так как имя класса во время его регистрации мы можем вписать любое придуманное, и вероятность повтора имени класса от другой не нашей проги приближается к нулю, если конечно не надуманно его делать похожим.
PS пример только на С++ могу дать...



Реп: (671)
от запуска вторых копий надо избавлятся используя мутекс.
кстати перед запуском программы и созданием окна может пройти весьма большое время и если юзер еще раз запустит прогу, окна не будет и ....

Вопрос: Как узнать разрешение экрана на КПК?
Ответ: Я использую такую простую функцию:

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



Реп: (0)
GreateVK,
ну тут поиск окна может идти именно для вывода его на передний план, а так согласен - только мутекс...



Реп: (105)
в зависимости от задачи, можно так же пользовать Event и File Mapping object



Реп: (25)
Как мне отредактировать свое же сообщение? Не хочу, что бы вопросы были разбросаны по всей теме, лучше оформить в виде шапки.

И так, добавляю следующие (пока что не много, потом будет еще):

Вопрос: Какие преимущества дает программирование на FreePascal под КПК?
Ответ: 1. Самое значимое преимущество: компилятор FreePascal (fpc) является бесплатным, с его помощью можно компилировать и коммерческие приложения.
2. Писать и компилировать программы можно как в Windows, так и в Linux.
3. При помощи FreePascal можно пересобрать написанные для ПК на Pascal Или Delphi приложения под КПК.
4. Язык Pascal признается более наглядным для записи алгоритмов, чем, скажем, язык C++.

Вопрос: Некорректно работают стандартные Паскалевские строки типа String. В чем может быть проблема?
Ответ: Начнем с того, что API-функции Windows использую строки с завершающим нулем, а не Паскалевские. Кроме того в Windows Mobile используется юникод (т.е. 2-х байтовое кодирование символов).
Желательно в программах вместо типа string использовать тип widestring, а при обращении к API-функциям делать преобразование типа к PWideChar, рапример:
var Str: widechar;
. . .
MessageBox (0, PWideChar (Str), 'Test', 0);

Если программа уже написана и везде используется тип string, то можно не заменять его на widestring, а сделать двойное преобразование типов, например:
var Str: string;
. . .
MessageBox (0, PWideChar (widestring (Str)), 'Test', 0);


Вопрос: Как узнать путь к папке с запущенной программой?
Ответ: Используйте следующую функцию:
function ExePath: widestring;
var Str: widestring;
I: Integer;
begin
Str := ParamStr (0);
for I := Length (Str) downto 1 do
if Str[I] = '\' then
begin
Str := Copy (Str, 1, I);
Break;
end; {if}
Result := Str;
end; {func ExePath}

Она вернет путь к папке с программой. Путь завершается символом "\".

Вопрос: Как узнать, сколько оперативной памяти в компьютере?
Ответ: Для этого необходимо выполнить следующий код:
var MS: TMemoryStatus;
. . .
MS.dwLength := SizeOf (TMemoryStatus);
GlobalMemoryStatus (MS);

Теперь в записи MS читаем следующие поля:
MS.dwTotalPhys - всего физической памяти;
MS.dwAvailPhys - количество свободной памяти.
Данные даются в байтах. Для перевода значений в Кб делим их на 1024. Если нужны Мб - еще раз делим на 1024.

Сообщение отредактировал Arigato - 16.01.08, 18:14



Реп: (671)
4. Язык Pascal признается более наглядным для записи алгоритмов, чем, скажем, язык C++.

это очень спорно.
посмотрите например на приведение типов.

3. При помощи FreePascal можно пересобрать написанные для ПК на Pascal Или Delphi приложения под КПК.

не думаю что все.

Как мне отредактировать свое же сообщение? Не хочу, что бы вопросы были разбросаны по всей теме, лучше оформить в виде шапки.

кнопка "edit" есть.



Реп: (0)
GreateVK,
GreateVK @ 16.01.08 19:56:05
QUOTE
Как мне отредактировать свое же сообщение? Не хочу, что бы вопросы были разбросаны по всей теме, лучше оформить в виде шапки.


кнопка "edit" есть.

Кнопки EDIT нету.... Появится когда будет он другом 4PDA а не пользователем. Пусть ещё информативных сообщений напишет пока.



Реп: (671)
Кнопки EDIT нету.... Появится когда будет он другом 4PDA а не пользователем. Пусть ещё информативных сообщений напишет пока.

странно...
почему редактировать нельзя то?

Arigato, ссылки размести то!.
думаю в моей коллекции FreePascal пригодится. :-Р



Реп: (25)
GreateVK @ 16.01.08 18:56:05
это очень спорно.
посмотрите например на приведение типов.

Тем ни мение с точки зрения демонстрации алгоритма синтаксис Паскаля лучше, т.к. в нем меньше неоднозначных конструкций. Почти вся классическая литература по программированию пишется с алгоритмами на Паскале-подобном языке.
GreateVK @ 16.01.08 18:56:05
не думаю что все.

Ну тут и с другими языками могут возникнуть проблемы с переносом. В любом случае придется править код.
GreateVK @ 16.01.08 19:28:31
Arigato, ссылки размести то!.
думаю в моей коллекции FreePascal пригодится.

Следующий вопрос :)

Вопрос: А где можно достать компилятор FreePascal?
Ответ: Компилятор является бесплатным и свободно качается с официального сайта разработчиков: http://www.freepascal.org/
На сайте можно скачать собранные пакеты для той или иной ОС. Но можно скачать и исходники (сам компилятор написан на FreePascal) и собрать его самостоятельно.



Реп: (64)
GreateVK,16.01.08 19:56:05
3. При помощи FreePascal можно пересобрать написанные для ПК на Pascal Или Delphi приложения под КПК.

не думаю что все.

далеко не все,плюс проблеммы с VCL...
Arigato за классное предложение собрать своими руками- похоже ты не собирал,ибо такое чудо гермафродитизма собирается крайне коряво
Самое значимое преимущество: компилятор FreePascal (fpc) является бесплатным, с его помощью можно компилировать и коммерческие приложения.

и компилировали мы свеже:censored:й код на бесплатном компиляторе :lol:

на самом деле преимущество только одно-некоторые не знают С



Реп: (25)
tz-lom @ 17.01.08 22:22:19
Arigato за классное предложение собрать своими руками- похоже ты не собирал,ибо такое чудо гермафродитизма собирается крайне коряво

Не увидел существенных проблем во время сборки.
tz-lom @ 17.01.08 22:22:19
на самом деле преимущество только одно-некоторые не знают С

Приведи ссылку на бесплатный компилятор C++ для КПК, работающий под Linux.
Считаю, что спорить, какой язык круче - это детский сад. Каждый выбирает то, что ему по тем или иным причинам подходит лучше. Мне знание Си ни как не мешало отдать предпочтение языку Паскаль.

Следующая партия вопросов:

Вопрос: При помощи какой команды можно аварийно завершить программу (вроде die в php)?
Ответ: Если нужно прекратить выполнение программы, можно использовать следующую команду:
ExitProcess (0);

В качестве параметра передается код завершения (0 соответствует штатному завершению программы, можно передать и любое другое число, характеризующее код ошибки).
Если перед завершением программы необходимо выдать сообщение об ошибке, проще написать специальную процедуру. Например:
procedure Die (Mes: widestring);
begin
MessageBox (0, PWideChar (Mes), 'Fatal Error', MB_OK or MB_ICONHAND or MB_SYSTEMMODAL or MB_TOPMOST);
ExitProcess (1);
end; {proc Die}


Вопрос: Как замерить время выполнения какого-либо куска программы?
Ответ: Есть функция GetTickCount, которая возвращает число миллисекунд, прошедших с момента последней перезагрузки Windows.
Для замера времени можно поступить так:
var T0: Integer;
. . .
T0 := GetTickCount;
. . . // Кусок программы, время выполнения которого нужно определить
MessageBox (0, PWideChar (IntToStr (GetTickCount - T0)), 'Time', 0);


Вопрос: Как воспроизвести стандартные звуки Windows?
Ответ: Для этого есть специальная процедура:
MessageBeep (Type);

Значение параметра Type определяет, какой из звуков будет воспроизведен. Возможны следующие значения:
MB_ICONERROR - звук ошибки;
MB_OK - стандартный звук.
Для проигрывания стандартного звука можно так же воспользоваться процедурой Beep.

Вопрос: Как воспроизвести WAV-файл?
Ответ: Для этого нужно определить функцию PlaySound следующим образом:
const SND_SYNC = $0000;
SND_ASYNC = $0001;
SND_NODEFAULT = $0002;
SND_LOOP = $0008;
SND_NOSTOP = $0010;

function PlaySound (pszSound: PWideChar; hmod: HMODULE; fdwSound: DWORD): BOOL; external 'coredll' name 'PlaySoundW';

Для начала воспроизведения звука нужно вызвать PlaySound, передав в качестве первого параметра имя WAV-файла (необходимо указывать полный путь), в качестве второго - 0 и в качестве третьего - флаг воспроизведения звука. В качестве флага могут выступать константы:
SND_SYNC - синхронное воспроизведение, программа прерывает свою работу на время проигрывания звука;
SND_ASYNC - асинхронное воспроизведение, программа продолжает работать во время проигрывания звука;
SND_LOOP or SND_ASYNC - воспроизведение постоянно повторяется;
SND_NODEFAULT - добавляется к описанным выше константам операцией or и служит для того, что бы в случае отсутствия указанного WAV-файла не воспроизводился стандартный звук Windows;
SND_NOSTOP - так же добавляется при помощи or и нужна для того, что бы не прерывать текущее воспроизведение, т.е. если в данный момент уже играет какой-либо звук, вызов PlaySound с таким флагом не приведет к остановки играющего звука и запуску нового.
Пример:
PlaySound ('Windows\Alarm1.wav', 0, SND_ASYNC);

Будет проигран указанный звук. Если данного файла нет, то будет воспроизведен стандартный звук.
Для того, что бы остановить воспроизведение повторяющегося звука, нужно сделать такой вызов:
PlaySound (nil, 0, SND_ASYNC);



Реп: (0)
киньте ссылку на паскаль для кпк пожайста сегодня нужно



Реп: (58)
Автору респект!



Реп: (671)
Приведи ссылку на бесплатный компилятор C++ для КПК, работающий под Linux.

*оригинальная компиляция GCC
*улучшенный CEGCC (http://cegcc.sourceforge.net/)

В качестве параметра передается код завершения (0 соответствует штатному завершению программы, можно передать и любое другое число, характеризующее код ошибки).
Если перед завершением программы необходимо выдать сообщение об ошибке, проще написать специальную процедуру. Например:

а обычная комманда не работает? (exit или halt?)
и это корректно в FreePascalе сразу завершать процесс?

на самом деле преимущество только одно-некоторые не знают С

Считаю, что спорить, какой язык круче - это детский сад. Каждый выбирает то, что ему по тем или иным причинам подходит лучше. Мне знание Си ни как не мешало отдать предпочтение языку Паскаль.

давайте не будем спорить.
Arigato делает хорошее дело, давайте не будем захламлять этот тред оффтопиком!



Реп: (114)
У фрипаскаля есть IDE. Называется Lazarus.
Прикрепленное изображение

При компилляции даже самой простой проги написанной с помощью винапи размер файла получается 56кб.
Во всех экзешниках присутствует рантайм, который занимается выделением памяти, преобразованием строк из анси в юникод итд. Так что, похоже размер экзешника уменьшить на много не удастся.
Вот пример практически наипростейшего проекта(диалог с 2-мя кнопками):

Прикрепленные файлы

Прикрепленный файлtest1.rar ( 93.84 КБ )


Сообщение отредактировал Klev_ - 18.01.08, 21:33


Полная версия   Текстовая версия

Помощь   Правила

Сейчас: 29.03.24, 13:40