Форум программистов, компьютерный форум, киберфорум
Наши страницы

PascalABC.NET

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 5, средняя оценка - 5.00
BaboshinSD
330 / 269 / 28
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
#1

Полезные коды для PascalABC.NET - PascalABC.NET

23.03.2013, 15:03. Просмотров 169038. Ответов 119

В этой теме размещаются полезные исходники программ, различные процедуры и функции, а так же готовые решения на часто задаваемые вопросы, написанные на PascalABC.NET.

Поддержать тему и добавить свои примеры, исходники и пр. может каждый, после того, как ознакомиться с правилами темы:
Правила темы!
  1. Запрещается добавлять коды программ никак не связанные с PascalABC.NET, для этих программ есть другие темы и разделы.
  2. Не рекомендуется добавлять слишком простые примеры, типа "Как добавить текст на кнопку?" и пр.
  3. Перед тем как выложить код, подумайте будет ли он кому-то интересен или полезен.
  4. Приветствуются сложные примеры или проекты, а так же программы с интересным принципом работы.
  5. Если программа использует сторонние ресурсы (изображения, библиотеки и пр.) обязательно прикрепляйте их во вложении
  6. Обязательно подробно комментируйте свой код, чтобы другим было проще разобраться в нём.
  7. Тема ведётся в формате Вопрос-Ответ, поэтому все сообщения оформляются в таком виде:
    В: Как что-то сделать?
    О:
    Делаем что-то
    Pascal
    1
    
    // Тут код
  8. Если вы хотите отредактировать свой код, можно обратиться к модераторам раздела или к ТС.


Путеводитель по теме:


Работа с формами:

Готовые решения:
Готовые решения на часто задаваемые вопросы.

Работа с графикой:
Исходники программ, работающих с графикой и графическими библиотеками (GraphABC, OpenGL и пр.).
Проектирование игр:
Инструкции, советы и пр.:
Инструкции, касающиеся работы с PascalABC.NET, советы для новичков и пр.
Работа со строками:
Базовые алгоритмы:
23
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2013, 15:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Полезные коды для PascalABC.NET (PascalABC.NET):

Модуль для PascalABC.NET - PascalABC.NET
Здравствуйте уважаемые форумчане, возник вопрос почему не работает модуль. Вот модуль unit Sockets; #reference 'System.dll' ...

В чем разница PascalABC.net и PascalABC - PascalABC.NET
Скажите в чем разница PascalABC.net И PascalABC. Помню когда-то давно программы работающие в PascalABC у меня не работали в .net

Процедура GetMem для PascalABC.NET - PascalABC.NET
Долго долго курил страницы форума, изучал динамические списки. Когда код для программы уже практически собрался в единое целое решил...

Исправить код для PascalABC.net - PascalABC.NET
как минимум, первое место которое ему не нравиться это как я обьявляю тип объект const size=10; type pvec=^vec; ...

Есть ли PascalABC.NET для Mac OS X? - PascalABC.NET
Есть ли PascalABC.NET для Mac OS X?

Создание своего модуля для PascalABC.net - PascalABC.NET
Здравствуйте уважаемые форумчане, подскажите как создать из файла Pas файл PCU. Чем и как его можно откомпилировать? Просто стоит задача...

119
BaboshinSD
330 / 269 / 28
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 15:03  [ТС] #2
В: Как двигать форму без границ?
О:
Двигаем форму без границ (FormBorderStyle.None)
Для начала делаем событие на нажатие кнопки мыши:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
procedure MainForm_MouseDown(sender: object; args: System.Windows.Forms.MouseEventArgs);
begin
  Down := True; {Зажали кнопку}
  
  // Запоминаем координаты формы
  X := MainForm.Left;
  Y := MainForm.Top;
  
  // Запоминаем координаты курсора
  cX := System.Windows.Forms.Cursor.Position.X;
  cY := System.Windows.Forms.Cursor.Position.Y;
end;
В нём будет переменная типа boolean, которая будет отвечать за "нажатие" кнопки (если нажата - True, если отпустили - False). Тут же запоминаем текущие координаты формы (X, Y) и текущие координаты курсора (cX, cY).

Далее пишем коротенькую процедуру, которая будет отвечать за "отпускание" кнопки:
Pascal
1
2
3
4
procedure MainForm_MouseUp(sender: object; args: System.Windows.Forms.MouseEventArgs);
begin
  Down := False; {Отпустили кнопку}
end;
Думаю тут всё понятно)

Последний шаг делаем событие по движению мыши:
Pascal
1
2
3
4
5
6
7
8
9
procedure MainForm_MouseMove(sender: object; args: System.Windows.Forms.MouseEventArgs);
begin
  if Down then {Если кнопка нажата}
  begin
  // Двигаем форму относительно курсора
    MainForm.Left := System.Windows.Forms.Cursor.Position.X - cX + X;
    MainForm.Top := System.Windows.Forms.Cursor.Position.Y - cY + Y;
  end;
end;
Тут тоже вроде всё ясно, единственная сложность с "движением относительно курсора", но тут легче понять чем объяснить.

Вот целый код:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
{$apptype windows}
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
uses
  System.Windows.Forms,
  System.Drawing;
 
var
  MainForm: System.Windows.Forms.Form;
  X, Y, cX, cY: integer;
  Down: boolean := False;
 
procedure MainForm_MouseDown(sender: object; args: System.Windows.Forms.MouseEventArgs);
begin
  Down := True; {Зажали кнопку}
  
  // Запоминаем координаты формы
  X := MainForm.Left;
  Y := MainForm.Top;
  
  // Запоминаем координаты курсора
  cX := System.Windows.Forms.Cursor.Position.X;
  cY := System.Windows.Forms.Cursor.Position.Y;
end;
 
procedure MainForm_MouseUp(sender: object; args: System.Windows.Forms.MouseEventArgs);
begin
  Down := False; {Отпустили кнопку}
end;
 
procedure MainForm_MouseMove(sender: object; args: System.Windows.Forms.MouseEventArgs);
begin
  if Down then {Если кнопка нажата}
  begin
  // Двигаем форму относительно курсора
    MainForm.Left := System.Windows.Forms.Cursor.Position.X - cX + X;
    MainForm.Top := System.Windows.Forms.Cursor.Position.Y - cY + Y;
  end;
end;
 
begin
  
  MainForm := new Form;
  MainForm.StartPosition := FormStartPosition.CenterScreen;
  MainForm.FormBorderStyle := FormBorderStyle.None;
  MainForm.MouseDown += MainForm_MouseDown;
  MainForm.MouseUp += MainForm_MouseUp;
  MainForm.MouseMove += MainForm_MouseMove;
  
  Application.Run(MainForm);
end.
2
BaboshinSD
330 / 269 / 28
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 15:03  [ТС] #3
В: Как сделать форму круглой, или любой другой формы?
О:
Делаем форму круглой (или любой другой формы)

Не по теме:

Форма формы . Извиняюсь за тавтологию)


Сначала рисуем фон нашей формы например круглый. Название: BackGround.png
Просмотров: 11705

Размер: 5.2 КбСохраняем в формате .png! Далее пишем такой код, думаю там и так всё понятно:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{$apptype windows}
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
 
uses
  System.Windows.Forms,
  System.Drawing;
  
var
  MainForm: Form;
  
begin
  MainForm := new Form;
  MainForm.StartPosition := FormStartPosition.CenterScreen;
  MainForm.FormBorderStyle := FormBorderStyle.None;
  MainForm.ClientSize := new System.Drawing.Size(200, 200); {Подгоняем под размер изображения}
  MainForm.BackColor := Color.HotPink; {Цвет фона задаём "левый", который больше нигде не будет использоваться}
  MainForm.TransparencyKey := Color.HotPink; {Делаем прозрачным наш "левый" цвет}
  MainForm.BackgroundImage := Image.FromFile('background.png');
  
  Application.EnableVisualStyles;
  
  Application.Run(MainForm);
end.
1
BaboshinSD
330 / 269 / 28
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 15:03  [ТС] #4
В: Можно ли сделать 3D игру на PascalABC.NET? Если да, то как?
О:
OpenGL и PascalABC.NET
Предоставляю вашему вниманию модуль OpenGL, написанный на PascalABC.NET. Если вы хотите сделать 3D игру и знаете как работать с OpenGL (не обязательно под Pascal т.к. они идентичны) можете смело приступать Итак выкладываю сам модуль: OpenGL.rar и ещё пару простеньких (относительно) 3D игрушек для примера (Eclipse.rar и Serious Slam.rar).
4
BaboshinSD
330 / 269 / 28
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 15:03  [ТС] #5
В: Как программно выключить компьютер?
О:
Выключение компьютера
Pascal
1
2
3
4
5
6
7
8
function FindDir(): string;
begin
  Result := System.IO.Directory.GetDirectoryRoot('\WINDOWS\System32\shutdown.exe');
end;
 
begin
  Exec(FindDir + 'WINDOWS\System32\shutdown.exe', '-f');
end.
6
BaboshinSD
330 / 269 / 28
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 15:03  [ТС] #6
В: Как добавить программу в автозапуск или удалить её от туда?
О:
Добавление и удаление программы в\из автозапуск(а)
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
uses
  Microsoft.Win32;
 
const
  ApplicationName = 'PABC.NET AutoRun'; {Имя программы в автозапуске}
 
begin
  // Добавляем программу в автозапуск
  var Reg := Registry.LocalMachine.CreateSubKey('Software\Microsoft\Windows\CurrentVersion\Run');
  Reg.SetValue(ApplicationName, GetEXEFileName);
  Reg.Close;
  
  // Удаляем программу из автозапуска
  var Reg := Registry.LocalMachine.CreateSubKey('Software\Microsoft\Windows\CurrentVersion\Run');
  Reg.DeleteValue(ApplicationName);
  Reg.Close;
end.
Что бы добавить\удалить программу в\из автозапуск(а) пользователь должен иметь права администратора.
2
BaboshinSD
330 / 269 / 28
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 15:03  [ТС] #7
В: Как воспроизвести музыкальный (.mp3) файл?
О:
Воспроизведение музыки в PascalABC.NET
Следующим кодом можно открывать различные музыкальные форматы (.wav, .mp3), но пробовал только .mp3 остальные не знаю.
Pascal
1
2
3
4
5
6
7
8
9
{$reference 'PresentationCore.dll'}
 
begin
  var Player := new System.Windows.Media.MediaPlayer; {Присваиваем переменной "Player" новый экземпляр MediaPlayer'а}
  Player.Open( new System.Uri('Имя_файла.mp3', System.UriKind.Relative)); {Задаём путь до файла*}
  Player.Play(); {Воспроизводим файл}
  
  System.Windows.Forms.Application.Run();
end.
* Примечание: если вы используйте относительный путь к файлу то используйте этот код, если абсолютный то замените
Pascal
1
System.UriKind.Relative
на
Pascal
1
System.UriKind.Absolute
Если не знаете какой путь используете пишите
Pascal
1
System.UriKind.RelativeOrAbsolute
P.S. Пути к файлам.
3
BaboshinSD
330 / 269 / 28
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 15:03  [ТС] #8
В: Как нарисовать кота, с помощью PascalABC.NET?
О:
Рисуем кота на PascalABC.NET, с помощью GraphABC

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
uses
  GraphABC;
 
begin
  // Тело
  Line(220, 100, 200, 380);
  Line(420, 100, 440, 380);
  Line(200, 380, 440, 380);
  Arc(320, 290, 140, 120, 60);
  
  // Уши
  Line(220, 100, 250, 170);
  Line(420, 100, 390, 170);
  
  // Глаза
  Circle(290, 220, 30);
  Circle(350, 220, 30);
  
  SetBrushColor(Color.Black);
  Circle(310, 220, 5);
  Circle(330, 220, 5);
  
  // Нос
  SetBrushColor(Color.Pink);
  Circle(320, 240, 10);
  
  // Рот
  Line(320, 250, 320, 290);
  Arc(320, 230, 60, -130, -50);
  
  // Усы
  Line(239, 270, 310, 245);
  Line(239, 280, 310, 245);
  Line(239, 290, 310, 245);
  
  Line(329, 245, 400, 270);
  Line(329, 245, 400, 280);
  Line(329, 245, 400, 290);
  
  // Лапы
  Arc(250, 390, 30, 160, 20);
  Arc(390, 390, 30, 160, 20);
  
  Line(240, 380, 240, 370);
  Line(250, 380, 250, 370);
  Line(260, 380, 260, 370);
  
  Line(380, 380, 380, 370);
  Line(390, 380, 390, 370);
  Line(400, 380, 400, 370);
end.
образец
Полезные коды для PascalABC.NET

1
BaboshinSD
330 / 269 / 28
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 15:03  [ТС] #9
В: Как установить свою иконку приложения?
О:
Делаем свою иконку приложения
Создадим простенькую программку и сохраним её:
Pascal
1
2
3
4
begin
  WriteLn('Hello World!');
  ReadLn();
end.
Потом создаём\скачиваем иконку и кидаем её в файл с программой. Далее создаём файл hwres.rc и пишем в него такую строчку:
Код
MAINICON ICON "hwicon.ico" {Вместо "hwicon"  имя вашей иконки}
сохраняем его.

Затем открываем командную строку (Пуск - Выполнить - cmd - Ок) и пишем туда:
Код
cd C:\PABCWork.NET\HelloWorld {Вместо "C:\PABCWork.NET\HelloWorld" путь к папке с вашей программой}
Жмём Enter. Потом пишем:
Код
"Z:\Дистрибутивы\PascalABC.NET\rc" hwres.rc {Вместо "Z:\Дистрибутивы\PascalABC.NET" путь к папке где установлен PascalABC.NET}
Жмём Enter. Если всё сделали правильно, в папке с программой появится файл hwres.res. Теперь немного изменим нашу программу, а именно:
Pascal
1
2
3
4
5
6
{$mainresource hwres.res}
 
begin
  WriteLn('Hello World!');
  ReadLn();
end.
Компилируем и вуаля, у EXE-шника наша иконка вместо стандартной!
11
BaboshinSD
330 / 269 / 28
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 15:03  [ТС] #10
В: Как/зачем объявлять переменную в заголовке цикла for?
О:
Объявление параметра цикла for в заголовке цикла

Многие новички, да и более опытные программисты перешедшие с Turbo/Free Pascal'я часто задают вопрос: как работает такая конструкция и зачем она нужна?
Pascal
1
2
for var i := 1 to n do
...
Объявление переменной в заголовке цикла это одна из фичей PascaABC.NET. Объявлять переменную можно 2-мя способами. 1-ый способ с ручным определением типа переменной:
Pascal
1
2
for i: integer := 1 to n do
...
Например:
Pascal
1
2
3
4
begin
  for i: integer := 1 to 10 do
    WriteLn(i);
end.
2-ой способ с автоопределением типа:
Pascal
1
2
for var i := 1 to 10 do
...
Например:
Pascal
1
2
3
4
begin
  for var i := 1 to 10 do
    WriteLn(i);
end.
Т.к. в цикле for разрешается использовать только целочисленные типы, 1-ый способ отпадает за ненадобностью. Чем же хорошо такое объявление? Основное его достоинство в том, что не выделяется память под глобальную переменную, а несколько переменных в разных циклах будут использовать общую память. Да и визуально такой код выглядит лучше Замечу, что переменную с одним именем можно использовать в разных циклах. Например такой код не вызовет ошибку:
Pascal
1
2
3
4
5
6
7
begin
  for var i := 1 to 10 do
    WriteLn(i);
  
  for var i := 1 to 10 do
    Write(i, ' ');
end.
Так же эту переменную нельзя использовать вне цикла, такой код вызовет ошибку:
Pascal
1
2
3
4
5
6
begin
  for var i := 1 to 10 do
    WriteLn(i);
  
  WriteLn(i); // Эта строка не входит в цикл
end.
1
BaboshinSD
330 / 269 / 28
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 15:03  [ТС] #11
В: Как сделать скриншот экрана?
О:
Делаем скриншот экрана

Вот таким небольшим кодом можно сделать скриншот экрана:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
 
uses
  System.Windows.Forms,
  System.Drawing;
 
var
  Bm: Bitmap;
  Gr: Graphics;
  
begin
  Bm := new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); // Создаём новый Bitmap
  Gr := Graphics.FromImage(Bm); // Создаём новую поверхность для рисования
  Gr.CopyFromScreen(0, 0, 0, 0, Bm.Size); // Копируем в неё изображения с экрана
  Bm.Save('C:\Screen.jpg', System.Drawing.Imaging.ImageFormat.Jpeg); // Сохраняем в формате .jpg 
end.
3
Новичок
Модератор
1411 / 874 / 209
Регистрация: 17.07.2012
Сообщений: 4,542
Записей в блоге: 1
Завершенные тесты: 3
23.03.2013, 22:39 #12
BaboshinSD,тема действительно полезная.Я например в PascalABC.NET не пишу,изучаю чистый Паскаль без наворотов но хотелось бы и PascalABC.NET знать.

В:Как создать приложение с окном(пустым)?
О:
приложение с окном
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{$apptype windows}
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
uses System.Windows.Forms;
var myForm:Form;
begin
  myForm:=new Form; //В переменную myForm записываем экземпляр новой формы
  myForm.Text:='Программа с формой'; //Определяем заголовок окна
  myForm.Width:=600; //Устанавливаем ширину
  myForm.Height:=350; //Устанавливаем высоту
  myForm.Left:=95; //Расстояние от начала экрана до левой границы формы
  myForm.Top:=150;
  Application.Run(myForm);
end.
4
BaboshinSD
330 / 269 / 28
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 22:45  [ТС] #13
Андрей_Новичок, если нужно просто пустое окно можно короче записать:
Pascal
1
2
3
4
5
6
type
  MyForm = System.Windows.Forms.Form;
 
begin
  System.Windows.Forms.Application.Run(new MyForm);
end.
2
BaboshinSD
330 / 269 / 28
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
24.03.2013, 15:55  [ТС] #14
В:покажите программу с кнопкой и обработчиком нажатия кнопки,самым простым, например, чтобы менялся текст заголовка окна.
О: вот, основные строчки закомментировал:
Кнопка и обработчик нажатия кнопки
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{$apptype windows}
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
 
uses
  System.Windows.Forms,
  System.Drawing;
  
var
  MainForm: System.Windows.Forms.Form;
  B1: System.Windows.Forms.Button;
 
procedure B1_Click(Sender: Object; Args: System.EventArgs);
begin
  MainForm.Text := 'Вы нажали кнопку!';
end;
  
begin
  B1 := new Button; {Создаём кнопку}
  B1.Location := new System.Drawing.Point(100, 110); {Позиция кнопки на форме}
  B1.Text := 'Кнопка'; {Текст кнопки}
  B1.Click += B1_Click; {Процедура, выполняющаясь по нажатию}
 
  MainForm := new Form;
  MainForm.Text := 'Нажмите кнопку';
  
  MainForm.Controls.Add(B1); {Добавляем кнопку на форму}
  
  Application.EnableVisualStyles; {Подключаем визуальные стили}
  
  Application.Run(MainForm);
end.
7
Ragnazar
36 / 36 / 4
Регистрация: 09.03.2013
Сообщений: 114
Записей в блоге: 2
12.04.2013, 17:50 #15
Попробовал код на mp3 Полезные коды для PascalABC.NET
не работает (Ошибка при чтении сборки 'C:\Windows\Microsoft.NET\assembly\GAC_32\PresentationCore\v4.0_4.0.0.0__31bf3856ad364e35\PresentationCore.dll')

Вот этот работает
В: Как проигрывать звук в PascalABC.NET?
О:
Media soundPlayer

Pascal
1
2
3
4
5
begin
var Player := new System.Media.soundPlayer('Ваш файл.wav'); //Создаем плеер и привязываем файл
player.Play;//Включаем плеер
player.Stop; //Останавливает плеер
end.
Другие способности плеера
Pascal
1
2
3
4
player.IsLoadCompleted //True если файл загружен успешно
player.LoadCompleted //Событие вызываемое при успешной или неуспешной загрузке файла
player.SoundLocation //Путь к файлу
player.PlayLooping //Зацикливает плеер
2
12.04.2013, 17:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2013, 17:50
Привет! Вот еще темы с ответами:

Надо найти библиотеку для PascalABC NET - PascalABC.NET
Всем привет. Вот сейчас пишу движок для PascalABC NET. Для графики взял OpenGL. Теперь начал делать обработчик событий нажатий клавиш и тут...

Написать программу из задачника среды PascalABC.NET для задания integer8: - PascalABC.NET
Написать программу из задачника среды PascalABC.NET для задания integer8: Потрудитесь выложить задание должным образом оформленное, и с...

Установится ли PascalABC.NET на систему, где установлен только .NET 4.6.1? - PascalABC.NET
Привет всем. Вопрос, собственно, озвучен выше. Конкретнее: есть компьютер со свежеустановленной Win10 x64, на которой присутствует...

Переделайте "Старт ракеты" для PascalABC.net - PascalABC.NET
uses graph,crt; procedure raketa(x,y,c:integer); begin setcolor(c); line(x,y,x-10,y+10); line(x,y,x+10,y+10); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.