https://wiki.freepascal.org/api.php?action=feedcontributions&user=Useroflazarus&feedformat=atom
Free Pascal wiki - User contributions [en]
2024-03-29T09:57:15Z
User contributions
MediaWiki 1.35.6
https://wiki.freepascal.org/index.php?title=Roadmap/ru&diff=132962
Roadmap/ru
2020-02-23T09:08:36Z
<p>Useroflazarus: /* Статус диалогов в интерфейсе LCL для каждой платформы */</p>
<hr />
<div>{{Roadmap}}<br />
<br />
Этот документ дает представление о текущем состоянии различных частей '''Lazarus''', а также помогает новым участникам найти подходящее для себя направление, в котором они могут помочь. Здесь также отображаются имена людей, реализующих некоторые части для целевых платформ.<br />
<br />
__TOC__<br />
<br />
{{Template:Development Status/ru}}<br />
<br />
==Общее состояние наборов виджетов==<br />
<br />
{{Template:Widgetset Roadmap}}<br />
<br />
==Текущее состояние различных частей Lazarus==<br />
<br />
<br />
{| class="wikitable sortable"<br />
! Unit !! Item !! Состояние !! Target !! Навыки !! Ответственный !! Комментарии<br />
|---- class="working"<br />
|[[IDE]]||TCollection Editor||Работает||0.9.x||FCL, RTTI, IDE||-||A generic TCollection editor for the various TCollections in the LCL/FCL.<br />
|---- class="working"<br />
|[[IDE]]||TActionList||Работает||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[IDE]]||Doc Editor||Работает||-||fpdoc||-||The doc editor will be an integrated fpDoc editor similar to fpde. It will be a process of its own, so that it can show help for dialogs as well. It should also be able to write help for packages.<br />
|---- class="working"<br />
|[[IDE]]||Export LFM as xml||Работает||-||-||-||Load and save LFM files to XML.<br />
|---- class="partial"<br />
|[[IDE]]||[[Icon Editor Roadmap]]||в процессе||после 1.0||-||-||A simple icon editor with the ability to create lrs files. It will be a good example and can help newbies to create icons for their components.<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Borderspacing||Работает||0.9.x||-||-||for aligned controls<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Drag&Drop||Работает||||-||-||<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to Darwin Power PC, macOS||Работает||0.9.x||-||-||depends on FPC 1.9.5<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to macOS 86||Работает||-||-||-||depends on FPC 2.1.1<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TSplitter||Работает||0.9.x||easy||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TFindDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TReplaceDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TControl.Font||в процессе||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TTabControl||в процессе||0.9.x||-||-||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||Docking (= комбинация форм)||частично работает, в процессе||после 1.0||глубокое знание LCL и интерфейсов||Mattias||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Frames (= forms as children)||Работает||0.9.28||глубокое знание LCL||Mattias, Paul||-<br />
|---- class="working"<br />
|[[IDE]]||Visual Form Inheritence||Работает||после 1.0||IDE||Mattias||Properties are not yet propagated to open descendants<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||MDI - Multiple Documents Interfaces Putting fo ...||в процессе||1.2||глубокое знание LCL и интерфейсов||[[User:Zeljan|Zeljan]]||An MDI LCL emulator for widgetsets which does not support MDI, also native implementation of MDI for qt and win32/64. Currently only qt has full MDI support, others are in progress.<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Palette support||не реализовано||-||-||-||Required to correctly show colors on a 256 colors display<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TCoolBar||частично работает, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TControlBar||скелетная реализация для предотвращения ошибок в преобразовании из Delphi, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TMaskEdit||Работает||-||-||[[User:Bart|Bart]]||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||TDirectoryTreeView||не реализовано||-||-||-||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Constrain maximization to specific area||не реализовано||-||winapi, gtk||-||When maximizing a window, the left, top, width and height can all be constrained to a specific rectangular area on the screen/desktop. After this is done, constrain the source editor and maybe other windows<br />
|---- class="working"<br />
|Components||TIcon||Работает||0.9.26||-||Marc||-<br />
|---- class="working"<br />
|Components||CUPS Package||Работает||0.9.x||easy||-||<br />
|---- class="working"<br />
|}<br />
<br />
==Статус возможностей в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|Accelerator Keys<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не применимо<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|Caret<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[Clipboard]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|Cursors<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|Drag & Drop<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[Drop files event]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|MDI Support<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Printing<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Regions<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="working"|Работает<br />
|----<br />
|TCustomControl descendents<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|Unicode Support<br />
|class="working"|Работает||class="not"|Невозможно реализовать||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[BidiMode]]<br />
|class="working"|Работает||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Application||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTimer/ru|TTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TApplication.QueueAsyncCall||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|TThread.Synchronize||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|PostMessage||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class=""unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|PostThreadMessage||class="working"|Работает||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="unknown"|Не известно||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="unknown"|Не известно||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус Graphics в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|TBitmap/TPixmap/TIcon/etc||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TBrush||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TFont||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TPen||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|ExtTextOut||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|}<br />
<br />
==Статус встроенных элементов управления в интерфейсе LCL для каждой платформы==<br />
Встроенные элементы управления являются потомками TWinControl, которые не происходят от TCustomControl.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBitBtn/ru|TBitBtn]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TButton/ru|TButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCalendar/ru|TCalendar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TCheckBox/ru|TCheckBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCheckGroup/ru|TCheckGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TCheckListBox/ru|TCheckListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TComboBox/ru|TComboBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TEdit/ru|TEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TForm/ru|TForm]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TGroupBox/ru|TGroupBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TIdleTimer/ru|TIdleTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TImageList/ru|TImageList]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает|| class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TListBox/ru|TListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TListView/ru|TListView]]||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TMainMenu/ru|TMainMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TMemo/ru|TMemo]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TMenuItem/ru|TMenuItem]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TPageControl/ru|TPageControl]] and [[TTabSheet/ru|TTabSheet]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPairSplitter/ru|TPairSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPanel/ru|TPanel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPopupMenu/ru|TPopupMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TProgressBar/ru|TProgressBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TRadioButton/ru|TRadioButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TRadioGroup/ru|TRadioGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TScrollBar/ru|TScrollBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TScrollBox/ru|TScrollBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TSpinEdit/ru|TSpinEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TSplitter/ru|TSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TStaticText/ru|TStaticText]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TStatusBar/ru|TStatusBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TToggleBox/ru|TToggleBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TTrackbar/ru|TTrackbar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTrayIcon/ru|TTrayIcon]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус диалогов в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|LCLIntf.MessageBox||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано для Android<br />
|----<br />
|Application.MessageBox, MessageDlg, LCLIntf.PromptUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано для Android<br />
|----<br />
|LCLIntf.AskUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TColorDialog/ru|TColorDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TFontDialog/ru|TFontDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TOpenDialog/ru|TOpenDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPrinterSetupDialog/ru|TPrinterSetupDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TSaveDialog/ru|TSaveDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TCustomControl в интерфейсе LCL для каждой платформы==<br />
Обратите внимание, что будучи потомком TCustomControl не гарантирует, что элемент управления не имеет реализации widgetset. TArrow имеет его, хотя он имеет хорошую реализацию по умолчанию. TNotebook будет полностью реализована в LCL.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TArrow/ru|TArrow]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TNotebook/ru|TNoteBook]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TUpDown/ru|TUpDown]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TStringGrid/ru|TStringGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TDrawGrid/ru|TDrawGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TToolBar/ru|TToolBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TTreeView/ru|TTreeView]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TValueListEditor/ru|TValueListEditor]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TGraphicControl в интерфейсе LCL для каждой платформы==<br />
'''Примечание:''' Они предназначены для заворачивания в LCL компоненты, а '''не''' для конкретных самостоятельных функций GUI инструментария.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBevel/ru|TBevel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TLabel/ru|TLabel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано для Android<br />
|----<br />
|[[TShape/ru|TShape]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TSpeedButton/ru|TSpeedButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPaintBox/ru|TPaintBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TImage/ru|TImage]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|}<br />
<br />
==Статус LazDeviceAPIs на каждом widgetset==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! customdrawn-android<br />
|----<br />
|Accelerometer||class="working"|Работает<br />
|----<br />
|Messaging (SMS, MMS and E-Mail)||class="partial"|Реализовано SMS<br />
|----<br />
|PositionInfo||class="working"|Работает<br />
|}<br />
<br />
{{Navbar Lazarus Release Notes}}<br />
<br />
==Смотри также==<br />
<br />
*[[LCL Internals]]<br />
*[[TAChart Roadmap]]<br />
<br />
[[Category:Lazarus/ru]]<br />
[[Category:Roadmaps/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Roadmap/ru&diff=132961
Roadmap/ru
2020-02-23T09:07:37Z
<p>Useroflazarus: /* Статус встроенных элементов управления в интерфейсе LCL для каждой платформы */</p>
<hr />
<div>{{Roadmap}}<br />
<br />
Этот документ дает представление о текущем состоянии различных частей '''Lazarus''', а также помогает новым участникам найти подходящее для себя направление, в котором они могут помочь. Здесь также отображаются имена людей, реализующих некоторые части для целевых платформ.<br />
<br />
__TOC__<br />
<br />
{{Template:Development Status/ru}}<br />
<br />
==Общее состояние наборов виджетов==<br />
<br />
{{Template:Widgetset Roadmap}}<br />
<br />
==Текущее состояние различных частей Lazarus==<br />
<br />
<br />
{| class="wikitable sortable"<br />
! Unit !! Item !! Состояние !! Target !! Навыки !! Ответственный !! Комментарии<br />
|---- class="working"<br />
|[[IDE]]||TCollection Editor||Работает||0.9.x||FCL, RTTI, IDE||-||A generic TCollection editor for the various TCollections in the LCL/FCL.<br />
|---- class="working"<br />
|[[IDE]]||TActionList||Работает||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[IDE]]||Doc Editor||Работает||-||fpdoc||-||The doc editor will be an integrated fpDoc editor similar to fpde. It will be a process of its own, so that it can show help for dialogs as well. It should also be able to write help for packages.<br />
|---- class="working"<br />
|[[IDE]]||Export LFM as xml||Работает||-||-||-||Load and save LFM files to XML.<br />
|---- class="partial"<br />
|[[IDE]]||[[Icon Editor Roadmap]]||в процессе||после 1.0||-||-||A simple icon editor with the ability to create lrs files. It will be a good example and can help newbies to create icons for their components.<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Borderspacing||Работает||0.9.x||-||-||for aligned controls<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Drag&Drop||Работает||||-||-||<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to Darwin Power PC, macOS||Работает||0.9.x||-||-||depends on FPC 1.9.5<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to macOS 86||Работает||-||-||-||depends on FPC 2.1.1<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TSplitter||Работает||0.9.x||easy||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TFindDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TReplaceDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TControl.Font||в процессе||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TTabControl||в процессе||0.9.x||-||-||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||Docking (= комбинация форм)||частично работает, в процессе||после 1.0||глубокое знание LCL и интерфейсов||Mattias||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Frames (= forms as children)||Работает||0.9.28||глубокое знание LCL||Mattias, Paul||-<br />
|---- class="working"<br />
|[[IDE]]||Visual Form Inheritence||Работает||после 1.0||IDE||Mattias||Properties are not yet propagated to open descendants<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||MDI - Multiple Documents Interfaces Putting fo ...||в процессе||1.2||глубокое знание LCL и интерфейсов||[[User:Zeljan|Zeljan]]||An MDI LCL emulator for widgetsets which does not support MDI, also native implementation of MDI for qt and win32/64. Currently only qt has full MDI support, others are in progress.<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Palette support||не реализовано||-||-||-||Required to correctly show colors on a 256 colors display<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TCoolBar||частично работает, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TControlBar||скелетная реализация для предотвращения ошибок в преобразовании из Delphi, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TMaskEdit||Работает||-||-||[[User:Bart|Bart]]||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||TDirectoryTreeView||не реализовано||-||-||-||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Constrain maximization to specific area||не реализовано||-||winapi, gtk||-||When maximizing a window, the left, top, width and height can all be constrained to a specific rectangular area on the screen/desktop. After this is done, constrain the source editor and maybe other windows<br />
|---- class="working"<br />
|Components||TIcon||Работает||0.9.26||-||Marc||-<br />
|---- class="working"<br />
|Components||CUPS Package||Работает||0.9.x||easy||-||<br />
|---- class="working"<br />
|}<br />
<br />
==Статус возможностей в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|Accelerator Keys<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не применимо<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|Caret<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[Clipboard]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|Cursors<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|Drag & Drop<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[Drop files event]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|MDI Support<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Printing<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Regions<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="working"|Работает<br />
|----<br />
|TCustomControl descendents<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|Unicode Support<br />
|class="working"|Работает||class="not"|Невозможно реализовать||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[BidiMode]]<br />
|class="working"|Работает||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Application||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTimer/ru|TTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TApplication.QueueAsyncCall||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|TThread.Synchronize||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|PostMessage||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class=""unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|PostThreadMessage||class="working"|Работает||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="unknown"|Не известно||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="unknown"|Не известно||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус Graphics в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|TBitmap/TPixmap/TIcon/etc||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TBrush||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TFont||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TPen||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|ExtTextOut||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|}<br />
<br />
==Статус встроенных элементов управления в интерфейсе LCL для каждой платформы==<br />
Встроенные элементы управления являются потомками TWinControl, которые не происходят от TCustomControl.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBitBtn/ru|TBitBtn]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TButton/ru|TButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCalendar/ru|TCalendar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TCheckBox/ru|TCheckBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCheckGroup/ru|TCheckGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TCheckListBox/ru|TCheckListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TComboBox/ru|TComboBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TEdit/ru|TEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TForm/ru|TForm]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TGroupBox/ru|TGroupBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TIdleTimer/ru|TIdleTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TImageList/ru|TImageList]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает|| class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TListBox/ru|TListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TListView/ru|TListView]]||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TMainMenu/ru|TMainMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TMemo/ru|TMemo]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TMenuItem/ru|TMenuItem]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TPageControl/ru|TPageControl]] and [[TTabSheet/ru|TTabSheet]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPairSplitter/ru|TPairSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPanel/ru|TPanel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPopupMenu/ru|TPopupMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TProgressBar/ru|TProgressBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TRadioButton/ru|TRadioButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TRadioGroup/ru|TRadioGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TScrollBar/ru|TScrollBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TScrollBox/ru|TScrollBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TSpinEdit/ru|TSpinEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TSplitter/ru|TSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TStaticText/ru|TStaticText]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TStatusBar/ru|TStatusBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TToggleBox/ru|TToggleBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TTrackbar/ru|TTrackbar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTrayIcon/ru|TTrayIcon]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус диалогов в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|LCLIntf.MessageBox||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="partial"|Реализовано для Android<br />
|----<br />
|Application.MessageBox, MessageDlg, LCLIntf.PromptUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="partial"|Реализовано для Android<br />
|----<br />
|LCLIntf.AskUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|[[TColorDialog/ru|TColorDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TFontDialog/ru|TFontDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TOpenDialog/ru|TOpenDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPrinterSetupDialog/ru|TPrinterSetupDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TSaveDialog/ru|TSaveDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TCustomControl в интерфейсе LCL для каждой платформы==<br />
Обратите внимание, что будучи потомком TCustomControl не гарантирует, что элемент управления не имеет реализации widgetset. TArrow имеет его, хотя он имеет хорошую реализацию по умолчанию. TNotebook будет полностью реализована в LCL.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TArrow/ru|TArrow]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TNotebook/ru|TNoteBook]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TUpDown/ru|TUpDown]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TStringGrid/ru|TStringGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TDrawGrid/ru|TDrawGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TToolBar/ru|TToolBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TTreeView/ru|TTreeView]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TValueListEditor/ru|TValueListEditor]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TGraphicControl в интерфейсе LCL для каждой платформы==<br />
'''Примечание:''' Они предназначены для заворачивания в LCL компоненты, а '''не''' для конкретных самостоятельных функций GUI инструментария.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBevel/ru|TBevel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TLabel/ru|TLabel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано для Android<br />
|----<br />
|[[TShape/ru|TShape]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TSpeedButton/ru|TSpeedButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPaintBox/ru|TPaintBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TImage/ru|TImage]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|}<br />
<br />
==Статус LazDeviceAPIs на каждом widgetset==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! customdrawn-android<br />
|----<br />
|Accelerometer||class="working"|Работает<br />
|----<br />
|Messaging (SMS, MMS and E-Mail)||class="partial"|Реализовано SMS<br />
|----<br />
|PositionInfo||class="working"|Работает<br />
|}<br />
<br />
{{Navbar Lazarus Release Notes}}<br />
<br />
==Смотри также==<br />
<br />
*[[LCL Internals]]<br />
*[[TAChart Roadmap]]<br />
<br />
[[Category:Lazarus/ru]]<br />
[[Category:Roadmaps/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Roadmap/ru&diff=132960
Roadmap/ru
2020-02-23T09:04:36Z
<p>Useroflazarus: /* Статус возможностей в интерфейсе LCL для каждой платформы */</p>
<hr />
<div>{{Roadmap}}<br />
<br />
Этот документ дает представление о текущем состоянии различных частей '''Lazarus''', а также помогает новым участникам найти подходящее для себя направление, в котором они могут помочь. Здесь также отображаются имена людей, реализующих некоторые части для целевых платформ.<br />
<br />
__TOC__<br />
<br />
{{Template:Development Status/ru}}<br />
<br />
==Общее состояние наборов виджетов==<br />
<br />
{{Template:Widgetset Roadmap}}<br />
<br />
==Текущее состояние различных частей Lazarus==<br />
<br />
<br />
{| class="wikitable sortable"<br />
! Unit !! Item !! Состояние !! Target !! Навыки !! Ответственный !! Комментарии<br />
|---- class="working"<br />
|[[IDE]]||TCollection Editor||Работает||0.9.x||FCL, RTTI, IDE||-||A generic TCollection editor for the various TCollections in the LCL/FCL.<br />
|---- class="working"<br />
|[[IDE]]||TActionList||Работает||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[IDE]]||Doc Editor||Работает||-||fpdoc||-||The doc editor will be an integrated fpDoc editor similar to fpde. It will be a process of its own, so that it can show help for dialogs as well. It should also be able to write help for packages.<br />
|---- class="working"<br />
|[[IDE]]||Export LFM as xml||Работает||-||-||-||Load and save LFM files to XML.<br />
|---- class="partial"<br />
|[[IDE]]||[[Icon Editor Roadmap]]||в процессе||после 1.0||-||-||A simple icon editor with the ability to create lrs files. It will be a good example and can help newbies to create icons for their components.<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Borderspacing||Работает||0.9.x||-||-||for aligned controls<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Drag&Drop||Работает||||-||-||<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to Darwin Power PC, macOS||Работает||0.9.x||-||-||depends on FPC 1.9.5<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to macOS 86||Работает||-||-||-||depends on FPC 2.1.1<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TSplitter||Работает||0.9.x||easy||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TFindDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TReplaceDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TControl.Font||в процессе||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TTabControl||в процессе||0.9.x||-||-||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||Docking (= комбинация форм)||частично работает, в процессе||после 1.0||глубокое знание LCL и интерфейсов||Mattias||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Frames (= forms as children)||Работает||0.9.28||глубокое знание LCL||Mattias, Paul||-<br />
|---- class="working"<br />
|[[IDE]]||Visual Form Inheritence||Работает||после 1.0||IDE||Mattias||Properties are not yet propagated to open descendants<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||MDI - Multiple Documents Interfaces Putting fo ...||в процессе||1.2||глубокое знание LCL и интерфейсов||[[User:Zeljan|Zeljan]]||An MDI LCL emulator for widgetsets which does not support MDI, also native implementation of MDI for qt and win32/64. Currently only qt has full MDI support, others are in progress.<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Palette support||не реализовано||-||-||-||Required to correctly show colors on a 256 colors display<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TCoolBar||частично работает, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TControlBar||скелетная реализация для предотвращения ошибок в преобразовании из Delphi, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TMaskEdit||Работает||-||-||[[User:Bart|Bart]]||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||TDirectoryTreeView||не реализовано||-||-||-||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Constrain maximization to specific area||не реализовано||-||winapi, gtk||-||When maximizing a window, the left, top, width and height can all be constrained to a specific rectangular area on the screen/desktop. After this is done, constrain the source editor and maybe other windows<br />
|---- class="working"<br />
|Components||TIcon||Работает||0.9.26||-||Marc||-<br />
|---- class="working"<br />
|Components||CUPS Package||Работает||0.9.x||easy||-||<br />
|---- class="working"<br />
|}<br />
<br />
==Статус возможностей в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|Accelerator Keys<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не применимо<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|Caret<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[Clipboard]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|Cursors<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|Drag & Drop<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[Drop files event]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|MDI Support<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Printing<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Regions<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="working"|Работает<br />
|----<br />
|TCustomControl descendents<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|Unicode Support<br />
|class="working"|Работает||class="not"|Невозможно реализовать||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[BidiMode]]<br />
|class="working"|Работает||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Application||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTimer/ru|TTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TApplication.QueueAsyncCall||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|TThread.Synchronize||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|PostMessage||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class=""unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|PostThreadMessage||class="working"|Работает||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="unknown"|Не известно||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="unknown"|Не известно||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус Graphics в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|TBitmap/TPixmap/TIcon/etc||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TBrush||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TFont||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TPen||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|ExtTextOut||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|}<br />
<br />
==Статус встроенных элементов управления в интерфейсе LCL для каждой платформы==<br />
Встроенные элементы управления являются потомками TWinControl, которые не происходят от TCustomControl.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBitBtn/ru|TBitBtn]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TButton/ru|TButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCalendar/ru|TCalendar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TCheckBox/ru|TCheckBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCheckGroup/ru|TCheckGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TCheckListBox/ru|TCheckListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TComboBox/ru|TComboBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TEdit/ru|TEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TForm/ru|TForm]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TGroupBox/ru|TGroupBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TIdleTimer/ru|TIdleTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TImageList/ru|TImageList]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает|| class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TListBox/ru|TListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TListView/ru|TListView]]||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TMainMenu/ru|TMainMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TMemo/ru|TMemo]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TMenuItem/ru|TMenuItem]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TPageControl/ru|TPageControl]] and [[TTabSheet/ru|TTabSheet]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPairSplitter/ru|TPairSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TPanel/ru|TPanel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPopupMenu/ru|TPopupMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TProgressBar/ru|TProgressBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TRadioButton/ru|TRadioButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TRadioGroup/ru|TRadioGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TScrollBar/ru|TScrollBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|----<br />
|[[TScrollBox/ru|TScrollBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TSpinEdit/ru|TSpinEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TSplitter/ru|TSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TStaticText/ru|TStaticText]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TStatusBar/ru|TStatusBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TToggleBox/ru|TToggleBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TTrackbar/ru|TTrackbar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTrayIcon/ru|TTrayIcon]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус диалогов в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|LCLIntf.MessageBox||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="partial"|Реализовано для Android<br />
|----<br />
|Application.MessageBox, MessageDlg, LCLIntf.PromptUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="partial"|Реализовано для Android<br />
|----<br />
|LCLIntf.AskUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|[[TColorDialog/ru|TColorDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TFontDialog/ru|TFontDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TOpenDialog/ru|TOpenDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPrinterSetupDialog/ru|TPrinterSetupDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TSaveDialog/ru|TSaveDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TCustomControl в интерфейсе LCL для каждой платформы==<br />
Обратите внимание, что будучи потомком TCustomControl не гарантирует, что элемент управления не имеет реализации widgetset. TArrow имеет его, хотя он имеет хорошую реализацию по умолчанию. TNotebook будет полностью реализована в LCL.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TArrow/ru|TArrow]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TNotebook/ru|TNoteBook]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TUpDown/ru|TUpDown]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TStringGrid/ru|TStringGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TDrawGrid/ru|TDrawGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TToolBar/ru|TToolBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TTreeView/ru|TTreeView]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TValueListEditor/ru|TValueListEditor]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TGraphicControl в интерфейсе LCL для каждой платформы==<br />
'''Примечание:''' Они предназначены для заворачивания в LCL компоненты, а '''не''' для конкретных самостоятельных функций GUI инструментария.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBevel/ru|TBevel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TLabel/ru|TLabel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано для Android<br />
|----<br />
|[[TShape/ru|TShape]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TSpeedButton/ru|TSpeedButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPaintBox/ru|TPaintBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TImage/ru|TImage]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|}<br />
<br />
==Статус LazDeviceAPIs на каждом widgetset==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! customdrawn-android<br />
|----<br />
|Accelerometer||class="working"|Работает<br />
|----<br />
|Messaging (SMS, MMS and E-Mail)||class="partial"|Реализовано SMS<br />
|----<br />
|PositionInfo||class="working"|Работает<br />
|}<br />
<br />
{{Navbar Lazarus Release Notes}}<br />
<br />
==Смотри также==<br />
<br />
*[[LCL Internals]]<br />
*[[TAChart Roadmap]]<br />
<br />
[[Category:Lazarus/ru]]<br />
[[Category:Roadmaps/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Installing_Lazarus/ru&diff=130211
Installing Lazarus/ru
2020-01-01T07:59:06Z
<p>Useroflazarus: /* Установка компилятора Free Pascal */</p>
<hr />
<div>{{Installing Lazarus}}<br />
<br />
== Обзор ==<br />
<br />
Ознакомится с более подробной инструкцией по сборке можно [http://www.stack.nl/~marcov/buildfaq.pdf здесь].<br />
<br />
Для загрузки исполняемых файлов Lazarus смотрите [http://wiki.lazarus.freepascal.org/Getting_Lazarus/ru#Загрузка_и_установка_релизной_версии_Lazarus Загрузка и установка релизной версии Lazarus]<br />
<br />
Для тех, кто просто хочет установить Lazarus и начать использовать его для написания программ, наиболее простым способом является загрузка и установка последней стабильной версии исполняемых файлов (таких, как rpm-пакеты для Linux, установочные exe-файлы для Windows или dmg-пакеты для Mac OS X). Вы можете прочитать об этом в разделах "Исполняемые файлы FPC" для Linux и Windows или в первых параграфах в разделах установки Lazarus в средах Linux или Windows; оставшуюся часть информации можно спокойно пропустить.<br />
<br />
<br />
<br />
Для тех, кто хочет принимать участие в разработке компилятора, IDE или использовать актуальные инструменты, необходима установка из исходных файлов.<br />
<br />
Lazarus состоит из двух основных частей:<br />
* LCL - Lazarus Component Library, библиотека компонентов Lazarus<br />
* IDE - RAD, среда быстрой разработки<br />
<br />
В свою очередь они зависят от:<br />
* FPC - компилятор Free Pascal<br />
* FCL - Free Pascal Component library, библиотека компонентов компилятора FPC, содержащая большое количество невизуальных компонентов, используемых в Lazarus<br />
<br />
=== Системные требования Lazarus ===<br />
<br />
# компилятор Free Pascal, пакеты и исходные файлы. (*важно*: той же версии/даты сборки)<br />
# поддерживаемый набор виджетов<br />
#:;Win32: может быть использован внутренний набор Win32 API или набор виджетов Qt.<br />
#:;Linux/xxxBSD: GTK+ 2.x or Qt : Most Linux distributions and *BSDs already install the GTK+ 2.x libraries. You can also find them at http://www.gtk.org. <br>Qt is also supported with all distributions (auto installed if you prefer KDE). <br> <br />
#:;Mac OS X: You need the Apple developer tools. See Installing under Mac OS X below. Qt can be used too.<br />
<br />
FAQ - Frequently Asked Questions (часто задаваемые вопросы) доступны по ссылке http://www.lazarus.freepascal.org . Некоторые вопросы можно найти в файле 'FAQ'.<br />
<br />
Qt widget set is supported on Linux 32/64,Win32/64,Mac OS X, Haiku and embedded linux (qtopia) platforms.<br><br />
Более подробно узнать про установку можно по ссылке http://wiki.lazarus.freepascal.org/index.php/Qt_Interface <br><br />
<br />
В следующих разделах описывается как можно получить компилятор Free Pascal и как правильно установить Lazarus.<br />
<br />
== Краткое руководство ==<br />
<br />
Хотя остальная часть этой страницы содержит много ценной информации, многим пользователям может понадобиться не более, чем следующие «краткие руководства» - возможно?<br />
<br />
==== Linux ====<br />
<br />
* См. [[Installing Lazarus on Linux]]<br />
<br />
==== Mac OSX ====<br />
<br />
* См. [[Installing_Lazarus_on_MacOS_X/ru|Установка Lazarus на MacOS X]]<br />
<br />
==== Windows ====<br />
<br />
Безусловно, самый простой и распространенный способ установки Lazarus на Windows - это перейти на [https://sourceforge.net/projects/lazarus/files/ сайт загрузки Lazarus] SourceForge, выбрать подходящий комбинированный пакет FPC/Lazarus, скачать и установить.<br />
<br />
== Установка компилятора Free Pascal ==<br />
<br />
Существует подробная инструкция, как устанавливать и собирать компилятор Free Pascal, доступная по ссылке http://www.stack.nl/~marcov/buildfaq.pdf - для некоторых пользователей она может быть слишком подробной, но при этом в ней дана исчерпывающая информация.<br />
<br />
Для Lazarus 1.8 требуется fpc (Free Pascal) версии 3.0.4 или выше, а также необходимо, чтобы библиотеки fpc (исполняемые файлы) и исходные файлы fpc были одинаковых версий.<br />
<br />
=== Установка Free Pascal в Linux ===<br />
<br />
==== Исполняемые файлы FPC ====<br />
<br />
Последнюю стабильную версию Free Pascal 3.0.4 можно получить на сайте Free Pascal (перейдите по ссылке http://www.freepascal.org/download.var и далее выберите зеркало) или на сайте SourceForge (http://sourceforge.net/projects/lazarus). <br />
<br />
В разделе загрузок Lazarus (http://www.lazarus.freepascal.org ) можно получить RPM- или DEB-пакеты компилятора Free Pascal (компилятор для Linux). Если вам не нужны RPM или debian дистрибутивы, вы можете загрузить и установить tar-архивы с http://www.freepascal.org. Если вы хотите самостоятельно скомпилировать исполняемые файлы, смотрите в разделе BSD.<br />
<br />
Инструкции: <br />
<br />
{{Warning| если вы '''не используете RPM- или debian-пакеты''' (даже если вы планируете использовать другие) лучшим вариантом будет получение актуальной стабильной версии fpc (на данный момент 3.0.4) и установка Lazarus из исходных файлов.}}<br><br />
<br />
Запустите Linux и войдите в систему под '''root''''ом.<br />
<br />
Загрузите актуальные версии файлов с https://sourceforge.net/projects/lazarus/files/.<br />
Например:<br />
:* fpc-3.0.4-1.i686.rpm<br />
:* fpc-src-3.0.4-1.i686.rpm<br />
:* lazarus-2.0.6-1.i686.rpm<br />
и установите их с помощью команды:<br />
:* rpm -Uvh *.rpm<br />
<br />
Пользователям системы Debian рекомендуется использовать deb-пакеты, но можно использовать и другие (внимание: они не создают fpc.cfg), например установить tar-архивы.<br />
<br />
==== Исходные файлы FPC ====<br />
Исходные файлы FPC хранятся в репозитории Subversion (SVN), в котором отслеживаются все изменения.<br />
Если у вас уже есть исходные файлы, пожалуйста, посмотрите инструкции по их установке в разделе [[#Installing Free Pascal from source under Linux/BSD]].<br />
<br />
===== Загрузка ежедневных исходных файлов из ветки разработки =====<br />
Вы можете загрузить ежедневно обновляемые исходные файлы в форме упакованных ночных сборок из репозитория SVN: они обновляются ежедневно и отображают состояние исходных файлов. Они не протестированы, могут не работать или даже привести к нарушению работы вашей системы. Файлы сохранены на сайте, который содержит архив SVN. Версия FPC может варьироваться.<br />
Расположены по адресу: [http://www.hu.freepascal.org/lazarus/]<br />
<br />
===== Обновление исходных файлов с помощью SVN =====<br />
В качестве альтернативы ежедневным zip-файлам исходников SVN, репозиторий SVN сделан доступным для всех с доступом только для чтения. Это означает, что вы можете получить прямой доступ к коду, и у вас будут действительно доступные исходники на последний момент. Это также метод, который требует меньшей полосы пропускания после первой загрузки (извлечение в SVN lingo).<br />
<br />
===== Получение исходных файлов =====<br />
Как это можно сделать?<br />
Для начала вам необходим установленный клиент для SVN. Используйте менеджер установки и установите утилиту, например, TortoiseSVN для Windows или смотрите подробней на сайте [http://subversion.tigris.org/].<br />
<br />
Использование командной строки SVN: измените текущую директорию (cd) на родительскую директорию, которая используется для работы, например, чтобы получить полные исходные файлы из репозитория в поддиректорию fpc домашней директории и напишите<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn checkout http://svn.freepascal.org/svn/fpc/trunk fpc<br />
</syntaxhighlight><br />
<br />
Для обновления исходных файлов, загруженных с помощью команды, указанной выше<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn update fpc<br />
</syntaxhighlight><br />
<br />
===== Получение отдельных веток =====<br />
Если текущая версия транка находится в состоянии быстрого изменения и не подходит для большого использования, если вы не хотите работать с самим компилятором, вы можете остаться на версии, которая обновлена с исправлениями.<br />
Чтобы сделать это, вы должны найти стабильную ветку, которую вы хотите отслеживать, вместо девелоперской '''trunk''' версии по умолчанию.<br />
Пример ниже показывает, как вы можете отслеживать версию fixes_2_6; конечно замените [номер версии] по мере необходимости в зависимости от того, какие ветки вы хотите отслеживать.<br />
<br />
Этот пример хранит исправления в другой папке в вашем домашнем каталоге - не имеет смысла помещать две версии исходного кода в один каталог ...<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn checkout http://svn.freepascal.org/svn/fpc/branches/fixes_2_6 fpc_fixes_2_6<br />
</syntaxhighlight><br />
Обычное обновление:<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn update fpc_fixes_2_6<br />
</syntaxhighlight><br />
<br />
===== Документация =====<br />
Исходные файлы документации расположены в отдельном репозитории с именем fpcdocs, поэтому для их получения необходима следующая команда<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn checkout http://svn.freepascal.org/svn/fpcdocs/trunk fpcdocs<br />
</syntaxhighlight><br />
<br />
Если вы хотите больше узнать о subversion, прочитайте эту отличную [http://svnbook.red-bean.com/ книгу по Subversion], которая также бесплатно доступна в разных форматах.<br />
<br />
Более подробную информацию смотрите на [http://www.freepascal.org/develop.var сайте Free Pascal].<br />
<br />
=== Установка Free Pascal в Windows ===<br />
<br />
==== Исполняемые файлы FPC для Windows ====<br />
<br />
Самым простым способом получения установочных файлов Free Pascal является загрузка текущей стабильной версии исполняемых файлов Lazarus для Windows из репозитория SourceForge [http://sourceforge.net/projects/lazarus/files/] - эти файлы содержат текущие стабильные версии компилятора и необходимых библиотек Free Pascal, а также среду разработки Lazarus.<br />
<br />
Если вы хотите установить из исходных файлов читайте дальше!<br />
<br />
Вы можете загрузить zip-архив с fpc в разделе загрузок Free Pascal (перейдите по ссылке http://www.freepascal.org/download.var и далее выберите зеркало). <br />
Установка из исходных файлов -- смотрите следующий раздел, чтобы узнать как это сделать -- не для новичков, так как для этого вам необходим изначально установленный компилятор.<br />
<br />
==== Исходные файлы FPC для Windows ====<br />
<<<< Смотрите выше в разделе [[#FPC Sources|Исходные файлы FPC]] для Linux, где описано использование SVN >>>><br />
<br />
Наиболее простым способом получить исходные файлы Free Pascal является использование SVN; смотрите следующий раздел для более подробной информации. Также вы можете загрузить установочный пакет целиком -- смотрите на сайте http://www.freepascal.org/develop.var ежедневные сборки ветки 3.0.x.<br />
<br />
Исходные файлы FPC для Windows с помощью SVN<br />
<br />
Вам необходим установленный SVN-клиент, например [http://tortoisesvn.tigris.org/ TortoiseSVN], для выполнения дальнейших шагов. Точные команды отличаются для разных SVN-клиентов; приведенные ниже команды должны использоваться для SVN-клиента, который можно скачать здесь.<br />
<br />
Для начала создайте директорию, в которую вы хотите поместить исходные файлы. С этим может справиться любой пользователь. Создайте директорию для fpc (например C:\Source), после чего чего выполните следующую команду в командной строке:<br />
<syntaxhighlight lang="bash">C:\Source> svn co http://svn.freepascal.org/svn/fpc/trunk fpc</syntaxhighlight><br />
Совет: для загрузки/обновления файлов с последними изменениями вы просто можете выполнить<br />
<syntaxhighlight lang="dos"><br />
C:\> cd Source\FPC<br />
C:\Source\FPC> svn up<br />
</syntaxhighlight><br />
<br />
Смотрите: http://www.freepascal.org/down/i386/win32.var . Загрузите FPC одним большим файлом, распакуйте его и запустите install.exe. <br />
<br />
Добавьте путь к директории fpc в переменную среды:<br />
<br />
* Win98: отредактируйте autoexec.bat и добавьте строку: PATH=%PATH%;C:\pp\bin\bin\win32<br />
* WinXP/2k: Мой компьютер (правая кнопка мыши по ярлыку) -> Свойства -> Дополнительно (вкладка) -> Переменные среды -> Системные переменные -> Изменить "PATH", добавить здесь "C:\pp\bin\bin\win32".<br />
<br />
После этого перезагрузите windows.<br />
<br />
После установки исполняемых файлов FPC вы можете собирать исходные файлы FPC из subversion. <br />
<br />
Советы: <br />
* Для Windows 7 (и выше) требуются повышенные права пользователя для работы в командной строке. Щелкните правой кнопкой мыши по ярлыку "Командная строка" в меню Пуск и выберите "Запустить от имени Администратора".<br />
* YOUR-PREFIX полностью зависит от места установки FPC. При составлении данной статьи исполняемые файлы по умолчанию располагаются в директории "C:\FPC" и помещаются в "C:\FPC\3.0.4". В системе Linux сценарии "make install" были скорректированы для создания новой поддиректории ЕСЛИ версия FPC изменилась с момента последней сборки. В сценариях для Windows это не сделано. Поэтому, если вы знаете, что имя поддиректории, например 3.1.1, то вы можете указать это. Однако, по причине частой смены версий, рекомендуется просто выбрать и сохранить один PREFIX вне зависимости от версий FPC. Хорошим значением для prefix является C:\FPC, но вы также должны убедиться, что директория C:\FPC\bin\i386-win32\ добавлена в переменную среды PATH (смотрите выше, как прописать путь и изменить версию исполняемых файлов на только что скомпилированные).<br />
Инструкции:<br />
* В командной строке перейдите к расположенным исходным файлам FPC, например напишите "cd c:\Developer\FPC"<br />
* Для сборки FPC напишите "make all"<br />
* Для перезаписи существующих файлов FPC напишите "make install PREFIX=YOUR-PREFIX"<br />
* Для установки исходных файлов напишите "make install sourceinstall PREFIX=YOUR-PREFIX"<br />
<br />
==== Компиляция/установка FPC и Lazarus из исходных файлов с помощью SVN (Win32) ====<br />
<br />
14 Dec 2017 версия FPC '''3.0.4''' или '''trunk''' - версия Lazarus '''1.9.x'''<br />
<br />
===== Шаг #1: Создать каталоги и скачать исходные файлы =====<br />
Создайте следующие каталоги:<br />
c:\freepascal\<br />
c:\freepascal\binutils\<br />
c:\freepascal\binutils\i386-win32\<br />
c:\freepascal\fpc\<br />
c:\freepascal\fpc\3.0.4\<br />
c:\freepascal\laz\<br />
или для fpc из trunk:<br />
c:\freepascal\<br />
c:\freepascal\binutils\<br />
c:\freepascal\binutils\i386-win32\<br />
c:\freepascal\fpc\<br />
c:\freepascal\fpc\trunk\<br />
c:\freepascal\laz\<br />
<br />
Вам понадобится последняя ''стабильная'' версия компилятора для сборки новой версии компилятора.<br />
Скачайте файл ppc386 (сам компилятор) с FTP (по ссылке ниже) и распакуйте его в c:\freepascal\binutils\<br />
ftp://ftp.freepascal.org/pub/fpc/dist/3.0.4/bootstrap/i386-win32-ppc386.zip<br />
<br />
После установки [http://tortoisesvn.tigris.org/ TortoiseSVN] скачайте исходные файлы из SVN используя URL-адрес для каждого каталога:<br />
Dir: c:\freepascal\binutils\i386-win32\<br />
URL: http://svn.freepascal.org/svn/fpcbuild/branches/fixes_3_0/install/binw32<br />
или для fpc из trunk:<br />
Dir: c:\freepascal\binutils\i386-win32\<br />
URL: http://svn.freepascal.org/svn/fpcbuild/trunk/install/binw32<br />
<br />
<br />
<br />
Dir: c:\freepascal\fpc\3.0.4<br />
URL: http://svn.freepascal.org/svn/fpc/branches/fixes_3_0/<br />
или для fpc из trunk:<br />
Dir: c:\freepascal\fpc\trunk<br />
URL: http://svn.freepascal.org/svn/fpc/trunk/<br />
<br />
<br />
<br />
Dir: c:\freepascal\laz<br />
URL: http://svn.freepascal.org/svn/lazarus/trunk<br />
<br />
===== Шаг #2: Создать BAT-файл для компиляции FPC =====<br />
После того, как всё скачалось, нам необходимо создать BAT-файл для компиляции исходных файлов FPC.<br />
Создайте новый файл c:\freepascal\makefpc.bat и скопируйте в него следующий сценарий:<br />
<br />
<syntaxhighlight lang="dos"><br />
@echo on<br />
set myroot=c:\freepascal<br />
set myFPC=%myroot%\fpc\3.0.4<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myFPC%<br />
rd /s /q %myfpc%\examples<br />
svn cleanup . --remove-unversioned --remove-ignored<br />
make distclean all install INSTALL_PREFIX=%myFPC% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
cd /d %myFPC%\bin\i386-win32<br />
fpcmkcfg -d basepath=%myFPC% -o .\fpc.cfg <br />
copy fpc.exe %mybinutils%\i386-win32<br />
</syntaxhighlight><br />
или для fpc из trunk:<br />
<syntaxhighlight lang="dos"><br />
@echo on<br />
set myroot=c:\freepascal<br />
set myFPC=%myroot%\fpc\trunk<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myFPC%<br />
rd /s /q %myfpc%\examples<br />
svn cleanup . --remove-unversioned --remove-ignored<br />
make distclean all install INSTALL_PREFIX=%myFPC% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
cd /d %myFPC%\bin\i386-win32<br />
del fpc.cfg<br />
fpcmkcfg -d basepath=%myFPC% -o .\fpc.cfg <br />
copy fpc.exe %mybinutils%\i386-win32<br />
</syntaxhighlight><br />
<br />
Для компиляции кросс-платформенных программ в режиме x86_64 добавьте следующие строки после первой команды make:<br />
<syntaxhighlight lang="dos"><br />
make all OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=%myFPC% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
make crossinstall OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=%myFPC% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
</syntaxhighlight><br />
<br />
При использовании данных сценариев скомпилированные файлы компилятора и необходимые директории для корректной его работы будут созданы непосредственно в корневой директории, куда были загружены исходные файлы. В некоторых случаях это не удобно, например, если необходимо ''перенести'' всю директорию с компилятором на другой компьютер или просто сделать несколько директорий разных версий (или ревизий) компилятора и при необходимости пользоваться каждой из них путем выбора нужного пути в свойствах проекта. Для этого необходимо модифицировать сценарий. Ниже представлен пример сценария для создания полностью автономной директории с компилятором и необходимыми файлами (для универсальности добавлены инструкции, позволяющие собрать компилятор версий '''x86''' и '''x64'''):<br />
<br />
<syntaxhighlight lang="dos"><br />
@echo on<br />
set myroot=c:\freepascal<br />
<br />
set instdir=%myroot%\fpc\3.0.5<br />
<br />
set myFPC=%myroot%\fpc\3.0.4<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myFPC%<br />
rd /s /q %myfpc%\examples<br />
svn cleanup . --remove-unversioned --remove-ignored<br />
make distclean all install INSTALL_PREFIX=%instdir% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
make all OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=%instdir% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
make crossinstall OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=%instdir% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
cd /d %instdir%\bin\i386-win32<br />
fpcmkcfg -d basepath=%instdir% -o .\fpc.cfg<br />
copy fpc.exe %mybinutils%\i386-win32<br />
<br />
xcopy %myFPC%\rtl %instdir%\source\rtl /H /Y /C /R /S /I<br />
xcopy %myFPC%\packages %instdir%\source\packages /H /Y /C /R /S /I<br />
</syntaxhighlight><br />
<br />
В данном случае дополнительная переменная '''instdir''' задает новую директорию для компилятора. Последние 2 команды предназначены для копирования содержимого директорий '''rtl''' и '''packages''' в новую директорию компилятора.<br />
<br />
Совет: при переносе в другое место полученной директории для корректной работы компилятора необходимо отредактировать файл '''fpc.cfg'''.<br />
<br />
===== Шаг #3: Собрать и установить FPC =====<br />
С помощью командной строки (cmd.exe) перейдите в директорию c:\freepascal и выполните сценарий, который мы только что написали: <br />
<br />
<syntaxhighlight lang="dos"><br />
cd /d c:\freepascal<br />
makefpc.bat<br />
</syntaxhighlight><br />
<br />
===== Шаг #4: Создать BAT-файл для компиляции Lazarus =====<br />
Если Lazarus компилируется впервые, создайте новый файл c:\freepascal\makelaz.bat и скопируйте в него следующий сценарий:<br />
<br />
<syntaxhighlight lang="dos"><br />
set myroot=c:\freepascal<br />
set myFPC=%myroot%\fpc\3.0.4<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myroot%\laz<br />
make clean all OPT="-glw2 -Xg"<br />
</syntaxhighlight><br />
или для fpc из trunk:<br />
<syntaxhighlight lang="dos"><br />
set myroot=c:\freepascal<br />
set myFPC=%myroot%\fpc\trunk<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myroot%\laz<br />
make clean all OPT="-glw2 -Xg"<br />
</syntaxhighlight><br />
<br />
<br />
Подсказка: данный BAT-файл необходимо использовать только для первой компиляции. В дальнейшем вы можете собирать Lazarus используя команду меню Tools > Build Lazarus.<br />
<br />
===== Шаг #5: Собрать Lazarus =====<br />
С помощью командной строки перейдите в директорию c:\freepascal и выполните сценарий: makelaz.bat<br />
<br />
<br />
Готово!<br />
<br />
=== Установка Free Pascal в FreeBSD/auto ===<br />
<br />
Последняя коллекция портов для FreeBSD имеет версию 3.0.4 и находится в ports/lang/fpc. Но они разбросаны по более чем 96 пакетам (!) и исходный код может быть получен из /usr/ports/distfiles/freepascal.<br />
<br />
Данная команда может быть выполнена с правами администратора (из-под root'а).<br />
<br />
<syntaxhighlight lang="bash">[]# cd /usr/ports/lang/fpc && make install && make clean</syntaxhighlight><br />
<br />
Другая возможность заключается в использовании portinstall.<br />
<br />
<syntaxhighlight lang="bash">[]# portinstall fpc</syntaxhighlight><br />
<br />
Как только fpc установлен, вы можете проверить его работоспособность просто выполнив команду<br />
<br />
<syntaxhighlight lang="bash">[]$ fpc</syntaxhighlight><br />
<br />
=== Установка Free Pascal из исходных файлов в Linux/BSD ===<br />
<br />
Для эффективности вам нужно<br />
<br />
Если у вас есть файл со всеми исходниками FPC или обоих (FPC и Lazarus):<br />
# напр., для fpc (последний снапшот на момент правки статьи) предпочтителен экспорт с [ftp://ftp.freepascal.org/fpc/snapshot/v33/ ftp] (без SVN/dirs).<br />
# снапшот исходника Lazarus.<br />
* начальный компилятор, последняя версия релиза (fpc 3.0.4 на момент правки статьи) является единственной гарантированной версией. Вы можете скачать загрузочный компилятор или использовать систему управления пакетами/программного обеспечения вашего дистрибутива, чтобы установить его<br />
<br />
Процесс сборки FPC:<br />
* Получить необходимые файлы (начиная с компилятора), исходный файл FPC или исходный svn-каталог<br />
* При использовании исходных файлов FPC: extract/de-tgz в рабочий каталог<br />
* Сборка: войдите в work/fpc/ и запустите<br />
<syntaxhighlight lang="bash"><br />
# можно использовать: <br />
export MAKE=`which make` ; echo $MAKE <br />
$MAKE all OPT='-gl' PP=/path/to/startingcompiler-name-ppc386<br />
# $MAKE применяется в linux и gmake в BSD <br />
# /path/to/ может быть пропущен, когда ppc386 прописан в путях поиска<br />
</syntaxhighlight><br />
<br />
* Установка fpc. Снова [заходим] в work/fpc, запускаем<br />
<syntaxhighlight lang="bash"><br />
$MAKE install PP=compiler/ppc386 PREFIX=$THEPREFIX<br />
#заменяем PP=compiler/ppc386 на соответствующий компилятор, если это не Intel x86<br />
#THEPREFIX= обычно это /usr/local или просто /usr (но, например, на NetBSD для портов это /usr/pkg)<br />
</syntaxhighlight><br />
<br />
* Создаем симлинк:<br />
<syntaxhighlight lang="bash"><br />
ln -s $THEPREFIX/lib/fpc/3.0.0/ppc386 $THEPREFIX/bin/ppc386<br />
</syntaxhighlight><br />
<br />
* Устанавливаем исходники:<br />
<syntaxhighlight lang="bash"><br />
$MAKE install sourceinstall PREFIX=$THEPREFIX<br />
</syntaxhighlight><br />
* Создаем симлинк к исходникам по умолчанию для Lazarus:<br />
<syntaxhighlight lang=bash><br />
ln -sf $THEPREFIX/share/src/3.0.0/fpc /usr/share/fpcsrc<br />
</syntaxhighlight><br />
<br />
* Настраиваем файл конфигурации fpc.cfg:<br />
<syntaxhighlight lang="bash">$THEPREFIX/lib/fpc/3.0.0/samplecfg $THEPREFIX/lib/fpc/3.0.0 $ETCDIR</syntaxhighlight><br />
<br />
* При желании можете проверить, выдает ли ppc386 -i (или какой-либо другой компилятор, используемый вашей архитектурой) [какую-либо] информацию, иначе будет предупреждение о том, что пользователю необходимо добавить $PREFIX/bin в его текущий путь. Попробуйте скомпилировать программу с -viwn и посмотрите, не выдаст ли это ошибку.<br />
<br />
Примечание:<br />
* Если вам нужны списки пакетов fpcmake, вам нужно сгенерировать или предоставить их самостоятельно ([с помощью] порта или в дополнительном архиве) в любом случае, выполнить фиктивную установку в /tmp/pack и определить файлы, установленные с <syntaxhighlight lang="bash">find . >ll</syntaxhighlight><br />
<br />
* $THEPREFIX и $ETCDIR должен [иметь возможность] быть настраиваемым пользователем. В противном случае локальная установка невозможна.<br />
<br />
* BSDHIER=1 для всех команд make действуют соглашения об иерархии BSD.<br />
<br />
=== Установка Free Pascal в Mac OS X ===<br />
<br />
См [[Installing Lazarus on MacOS X|Установка Lazarus на MacOS X]]<br />
<br />
==Установка Lazarus==<br />
<br />
===Установка Lazarus в Linux===<br />
<br />
==== Ubuntu / Debian ====<br />
<br />
Рекомендуется использовать установщик обновлений [[fpcup|fpcUP]] для начинающих пользователей Lazarus, который устанавливает FPC и Lazarus за один раз в единую структуру подкаталогов (~/development).<br />
<br />
----<br />
([[User:Zoltanleo|Прим.перев.]]: а еще лучше использовать форк этой утилиты [[fpcupdeluxe]] от [https://github.com/LongDirtyAnimAlf LongDirtyAnimAlf], последний релиз которой всегда можно скачать [https://github.com/LongDirtyAnimAlf/fpcupdeluxe/releases здесь])<br />
----<br />
<br />
Чтобы получить текущую рабочую установку Lazarus, загрузите файлы .deb для Free Pascal и Lazarus из репозитория SourceForge. Вот как: [[Lazarus release version for Ubuntu|Получение Lazarus из нашего репозитория Ubuntu]].<br />
<br />
Обратите внимание, что установка из исходных кодов Ubuntu по умолчанию не приведет к установке Free Pascal Source Libraries - используйте метод выше.<br />
<br />
{{Note|по крайней мере в Linux Ubuntu команда для запуска Lazarus из консоли - [[startlazarus]]. Иначе, если вы установили его из пакета Debian, у вас должен быть пункт меню Lazarus в разделе Application/Programming(«Приложение/Программирование»). <br />
(Проблема: существует неоднозначность с программой, также называемой "lazarus" из пакета "tct", доступного для Ubuntu).}}<br />
<br />
<br />
===== Простой способ сборки из deb-пакетов =====<br />
<br />
Самый простой способ получить текущую рабочую установку Lazarus - это загрузить свои собственные пакеты .deb, следуя инструкциям отсюда: [[How to setup a FPC and Lazarus Ubuntu repository|Как настроить хранилище FPC и Lazarus Ubuntu]]<br />
<br />
===== Установка с использованием rpms =====<br />
<br />
Следующим самым простым способом установки является установка RPM-пакетов для Free Pascal и Lazarus из репозитория SourceForge.<br />
<br />
Вам необходимо загрузить выбранные версии следующих компонентов:<br />
* компилятор (например, fpc-3.0.4-1.i686.rpm)<br />
* исходный код библиотеки pascal (например, fpc-src-3.0.4-1.i686.rpm)<br />
* Lazarus (например, lazarus-1.8.4-0.i686.rpm).<br />
<br />
Удалите старые пакеты:<br />
<syntaxhighlight lang="bash"><br />
rpm -ev lazarus<br />
rpm -ev fpc<br />
rpm -ev fpc-src<br />
</syntaxhighlight><br />
Установите новые пакеты:<br />
<syntaxhighlight lang="bash"><br />
rpm -ivh fpc-*<br />
rpm -ivh lazarus-*<br />
</syntaxhighlight><br />
<br />
=====Установка на Raspbian Wheezy=====<br />
<br />
Raspbian - это специальная версия Debian для компьютера Raspberry Pi размером с кредитную карту. См. [[Lazarus on Raspberry Pi]] для получения детальной информации.<br />
<br />
====Установка на Mandriva====<br />
<br />
===== Lazarus 0.9.30 на Mandriva 2010. =====<br />
<br />
Установите как указано ниже, однако при компиляции программы вы можете получить два сообщения об ошибках, сообщающих, что вам не хватает pixbuf 2.0 и lgtk-x11-2.0. Чтобы исправить это, установите libdgk_pixbuf2.0_0-devel и libgtk + 2.0_0-devel из установщика программного обеспечения.<br />
<br />
====Установка на Slackware====<br />
===== Установка Lazarus на Slackware 13.0 =====<br />
Нет реальной разницы от версий slackware 12.2 или 12.0, поэтому описанная ниже процедура должна работать точно так же.<br />
<br />
===== Установка Lazarus 0.9.30 для пользователей Slackware 12.0 =====<br />
Это работало в Slackware-12.0 на компьютере Pentium-3:<br />
<br />
* Free Pascal Compiler (FPC) устанавливается в режиме SUPERUSER <br />
* Lazarus устанавливается в режиме USER<br />
* Компилятор FPC будет перекомпилирован<br />
* Исходный код IDE Lazarus загружается с сервера SVN. <br />
<br />
-- Загружаем "fpc-2.4.2.i386-linux.tar" в папку пользователя и устанавливаем его. Переходим в эту папку и вводим: <br />
<syntaxhighlight lang="bash"><br />
bash-3.1$ tar -xvf fpc-2.4.2.i386-linux.tar<br />
bash-3.1$ su <br />
bash-3.1$ password:xxxxxx<br />
bash-3.1# sh install.sh<br />
...<br />
(используем ответы по умолчанию для следующих 6 вопросов: нажимаем "Enter" 6 раз)<br />
...<br />
bash-3.1# exit<br />
bash-3.2$ fpc<br />
free pascal compiler version 2.4.2 [] for i386 <br />
Copyright (c) 2010 ...<br />
...<br />
...<br />
</syntaxhighlight><br />
Вы установили компилятор. Возможно, вы захотите перекомпилировать его или нет, но в любом случае вам нужно будет загрузить исходный код в соответствии с требованиями IDE lazarus.<br />
<br />
-- загружаем "fpc-2.4.2.source.tar.gz" во временную папку. Если вы не хотите перекомпилировать исходный код, просто пропустите этот раздел. Если вы хотите запустить свою собственную скомпилированную версию FPC, просто введите:<br />
<syntaxhighlight lang="bash"><br />
bash-3.1$ tar -xvzf fpc-2.4.2.source.tar.gz<br />
bash-3.1$ cd fpc-2.4.2<br />
bash-3.1$ make clean all<br />
bash-3.1$ su<br />
bash-3.1$ password: xxxxxxxx<br />
bash-3.1# make install<br />
bash-3.1# exit<br />
bash-3.1$ fpc<br />
free pascal compiler version 2.4.2 [...] for i386 <br />
Copyright (c) 2010 ...<br />
...<br />
...<br />
</syntaxhighlight><br />
Теперь у вас есть собственная скомпилированная версия. <br />
<br />
-- Редактор Lazarus IDE должен видеть исходный код FPC. Даже если вы не хотите перекомпилировать FPC, вам нужен его исходный код. Однако для экономии места я сохраняю только чистую (не скомпилированную) копию исходного кода. Я снова начинаю с файла "fpc-2.4.2.source.tar.gz" и копирую его в папку /usr/local/src/FPC:<br />
<syntaxhighlight lang="bash"><br />
bash-3.1$ su<br />
bash-3.1$ password: xxxxxxxx<br />
bash-3.1# cp fpc-2.4.2.source.tar.gz /usr/local/src/<br />
bash-3.1# cd /usr/local/src/<br />
bash-3.1# tar -xvzf fpc-2.4.2.source.tar.gz<br />
bash-3.1# rm fpc-2.4.2.source.tar.gz<br />
bash-3.1# exit<br />
</syntaxhighlight><br />
Номер версии включен в название папки "fpc-2.4.2". Таким образом, я могу сохранить многие версии исходного кода компилятора и в конечном итоге переключаться между ними.<br />
<br />
-- The lazarus IDE is kept in my USER "~/lazarus" folder and always compiled in USER mode. I usually download the "lazarus-0.9.30-0.tar.gz" file, but here we can also get the latest development version from the SVN server:<br />
<syntaxhighlight lang="bash">bash-3.1$ svn co http://svn.freepascal.org/svn/lazarus/trunk lazarus</syntaxhighlight><br />
This is for the first time you load it. Next time you will only need to type:<br />
<syntaxhighlight lang="bash">bash-3.1$ svn update</syntaxhighlight><br />
If you do not have SVN installed on your computer, here is how to get it quickly:<br />
<br />
--Download the two files: "subversion-1.4.6.tar.gz" and "subversion-deps-1.4.5.tar.gz" (or later versions). Type:<br />
<syntaxhighlight lang="bash"><br />
bash-3.1$ tar -xvzf subversion-1.4.6.tar.gz<br />
bash-3.1$ tar -xvzf subversion-deps-1.4.6.tar.gz<br />
bash-3.1$ cd subversion-1.4.6<br />
bash-3.1$ ./configure<br />
bash-3.1$ make<br />
bash-3.1$ su<br />
bash-3.1$ password:xxxxxx<br />
bash-3.1# make install<br />
bash-3.1$ exit<br />
</syntaxhighlight><br />
<br />
-- At this point you have the folder "~/lazarus" containing the source code. You should compile it very simply:<br />
bash-3.1$ make clean all<br />
After a few minutes, the compiler stops:<br />
<syntaxhighlight lang="bash"><br />
...<br />
...<br />
Linking ../Lazbuild<br />
987 linescompiled ...<br />
make [2] leaving ...<br />
make [1] leaving ...<br />
bash-3.1$<br />
</syntaxhighlight><br />
<br />
-- Just type:<br />
<syntaxhighlight lang="bash">bash-3.1$ ./lazarus</syntaxhighlight><br />
WOW! You get a message: "Free Pascal sources not found". Just follow the instructions and indicate your Free Pascal Compiler source directory in the panel: "Environment->Options->Files". As explained earlier, on my computer this should point to "/usr/local/src/fpc-2.4.2". Note that when you change this folder, you should click on "Environment / Rescan_FPC_source_directory".<br />
<br />
Voila!<br />
<br />
====Установка на openSUSE====<br />
<br />
===== Установка Lazarus 0.9.30 для пользователей openSUSE 11.1 =====<br />
<br />
Free Pascal Compiler requires:<br><br />
- Gnu binutils (gnu as, gnu ld, gnu make)<br />
These utils can be installed by:<br />
<syntaxhighlight lang="bash">zypper in -t pattern devel_basis</syntaxhighlight><br />
<br />
Lazarus also requires these components:<br />
1) glib2 devel<br />
2) gtk2 devel<br />
<br />
'''Important''': The lazarus rpm requires the gtk 2 version, not the version 1.2.<br />
<br />
These libraries can be installed by:<br />
<syntaxhighlight lang="bash">zypper -n install gtk2 glib2</syntaxhighlight><br />
<br />
Download these binary files (RPM)<br />
:* fpc-2.4.2-0.i686.rpm (yes i686 and not i386)<br />
:* fpc-src-2.4.2-0.i686.rpm<br />
:* lazarus-0.9.30-0.i686.rpm<br />
<br />
install them opening a terminal session (mouse's right button -> Menu: Open in terminal)<br />
<syntaxhighlight lang="bash"><br />
rpm -Uvh fpc-2.4.2-0.i686.rpm<br />
rpm -Uvh fpc-src-2.4.2-0.i686.rpm<br />
rpm -Uvh lazarus-0.9.30-0.i686.rpm<br />
</syntaxhighlight><br />
<br />
====Установка Lazarus 1.0.8 на Fedora Core 18====<br />
<br />
After a fresh install of Fedora Core 18 '''yum''' is installed, but fails with an error messages.<br />
*Open '''Software''', check for new software and update all packages.<br />
*Reboot.<br />
*Install packages '''gtk2-devel''', '''fpc''' and '''subversion'''. Fedora Core 18 already has fpc 2.6.2. <br />
*Open a Terminal and do<br />
svn co svn+ssh://svn.freepascal.org/FPC/svn/lazarus/tags/lazarus_1_0_8 lazarus<br />
cd lazarus<br />
make bigide<br />
./lazarus<br />
<br />
==== Установка Lazarus на Scientific Linux ====<br />
<br />
Scientific Linux is an RPM-based distribution focussing on science and research. See [[Scientific Linux]] for details. <br />
<br />
==== Установка из исходных файлов ====<br />
<br />
If you prefer to install from source and compile the files yourself, follow these instructions. Because the whole lazarus stuff is installed into one directory, uninstall is very easy and you don't need to be root to install lazarus. You can get tgz files for fpc, fpcsrc and lazarus from the downloads section or you can download it directly via svn.<br />
<br />
Here is an example of installing 0.9.28 to Ubuntu 6.06. If you understand Linux commands and bash script, you can get what steps are needed. Just copy the script (change the version number when new version has been released), paste it into a text editor, and save it as something like "install_lazarus.sh". Give it execute permission, and run it in <br />
a console.<br />
{{Note|In this example, fpc is installed in /opt. So when prompted ''''Install prefix'''', enter '/opt/fpc'. }}<br />
<br />
<syntaxhighlight lang="bash"><br />
#!/bin/sh<br />
<br />
#installing required packages<br />
sudo apt-get install build-essential<br />
sudo apt-get install libgtk2.0-dev<br />
sudo apt-get install libgdk-pixbuf-dev<br />
<br />
#installing Free Pascal source<br />
cd /opt<br />
sudo wget http://nchc.dl.sourceforge.net/lazarus/fpc-src-2.4.2.source.tgz<br />
sudo tar -xvf fpc-src-2.4.2.source.tgz<br />
sudo mv fpc fpcsrc<br />
<br />
#installing Free Pascal<br />
sudo mkdir fpc<br />
cd fpc<br />
sudo wget http://nchc.dl.sourceforge.net/lazarus/fpc-2.4.2.i686-linux.tar<br />
sudo tar -xvf fpc-2.4.2.i686-linux.tar<br />
echo "Enter '/opt/fpc' when prompted 'Install prefix'"<br />
sudo sh install.sh<br />
<br />
#adding fpc path to the PATH<br />
echo "#FPC PATH" >> ~/.bash_profile<br />
echo "if [ -d /opt/fpc/bin ] ; then" >> ~/.bash_profile <br />
echo PATH=/opt/fpc/bin:"${PATH}" >> ~/.bash_profile<br />
echo "fi" >> ~/.bash_profile<br />
<br />
#installing Lazarus<br />
cd ../<br />
sudo wget http://nchc.dl.sourceforge.net/lazarus/lazarus-0.9.30-0.tar.gz<br />
# sudo wget https://downloads.sourceforge.net/project/lazarus/Lazarus%20Zip%20_%20GZip/Lazarus%201.8.0RC5/lazarus-1.8.0-RC5.tar.gz<br />
sudo tar -zxvf lazarus-0.9.30-0.tar.gz<br />
PATH=/opt/fpc/bin:"${PATH}"<br />
sudo chmod -R 777 lazarus<br />
cd lazarus<br />
make clean all<br />
./lazarus<br />
</syntaxhighlight><br />
<br />
{{Note|You have to manually set fpc-src path in the Environmental Options.}}<br />
<br />
===== Загрузка исходных файлов Lazarus =====<br />
<br />
Both the Lazarus and FPC source code reside in SVN/subversion repositories. SVN provides an easy way to update your sources by only downloading the changes. This is the recommended way and saves you a lot of time. A connection to the internet is needed for this, but you don't need to be root. <br />
<br />
Please note these instructions are for subversion, but there is also a Git mirror repository of Free Pascal Compiler and Lazarus: see [[git mirrors|Git mirror]]. You can also use git directly with the subversion server using git-svn link: see [[Lazarus git-svn|Lazarus git-svn]].<br />
<br />
Lazarus does not need any special permissions, neither during installation nor at runtime.<br />
<br />
<font color="red">If you decide to use TortoiseSVN, remember to check "command line client tools" during its installation if you want Lazarus to show the SVN revision number in the About dialog.</font><br />
<br />
;Now getting the sources:<br />
<br />
<syntaxhighlight lang="bash"> svn checkout http://svn.freepascal.org/svn/lazarus/trunk/ lazarus</syntaxhighlight><br />
(replace the last lazarus with any other dir where you want to place your sources)<br />
<br />
On subsequent occasions, to update simply type<br />
<br />
<syntaxhighlight lang="bash"> svn update lazarus</syntaxhighlight><br />
<br />
For more information on Subversion, see:<br />
http://subversion.tigris.org/<br />
<br />
===== Компиляция и запуск =====<br />
<br />
Whether you checkout from cvs or svn, the next step is: <br />
<br />
;compile lazarus:<br />
<syntaxhighlight lang="bash"><br />
cd lazarus<br />
make (gmake on BSD)<br />
</syntaxhighlight><br />
<br />
If fpc is installed correctly, the compilation should work without problems. If not, see FAQ.<br />
<br />
;Start lazarus<br />
<syntaxhighlight lang="bash"> ./lazarus</syntaxhighlight><br />
<br />
The IDE should start. If you started lazarus in a terminal, you can see some notes about missing settings. This is normal at first start. The IDE automatically tries to find out where the Free Pascal compiler and its sources are installed by searching in the most common directories.<br />
<br />
;Check the paths:<br />
: Use the IDE menu to go to<br />
:: Environment -> Environment Options -> Files<br />
<br />
The 'FPC Source directory' should point to your fpc source directory. This directory normally ends with /fpc/ or /fpcsrc/ (e.g. /usr/src/fpcsrc or /home/username/freepascal/fpc) and contains directories like 'compiler', 'docs', 'fcl', 'rtl' and 'packages'.<br />
<br />
See here for the documentation about this dialog: [[IDE_Window:_Environment_Options|IDE Options]].<br />
<br />
;Hint:<br />
To update lazarus you can use<br />
<syntaxhighlight lang="bash"> svn update lazarus</syntaxhighlight><br />
then for either update pathway:<br />
<syntaxhighlight lang="bash"> make clean all (gmake on BSD)</syntaxhighlight><br />
This will rebuild lazarus and create an IDE without lazarus packages. To link your installed packages do '''after''' the above:<br />
<syntaxhighlight lang="bash"> ./lazbuild --build-ide=</syntaxhighlight><br />
<br />
You may have to append other options if for example you use a custom config directory (ie. add --pcp="C:\Documents and Settings\<USER>\Local Settings\Application Data\lazarus-tests"). See [[lazbuild]].<br />
<br />
==== Установка Lazarus в Debian GNU/Linux ====<br />
<br />
There are preliminary Debian packages for lazarus available for download. They are not the latest versions, however. Make sure you read /usr/share/doc/lazarus/README.Debian carefully before you start using it. Feedback is needed and appreciated; please send your comments to Carlos Laviola <claviola@debian.org>.<br />
<br />
Note that for a fully working Lazarus install, no older or incompatible versions of, for example, the fpc source or fpc compiler must be installed. Remove them by typing<br />
<br />
<syntaxhighlight lang="bash">dpkg -r <package name></syntaxhighlight><br />
<br />
without .deb extension. And then install the newest versions as described.<br />
<br />
=== Установка Lazarus в Windows ===<br />
<br />
Текущие стабильные версии исполняемых файлов Lazarus для Windows устанавливаются очень легко и могут работать 'из коробки'. <br />
<br />
Исключение составляют Win98 и ME, для которых необходимо указывать специальный флаг при компиляции. Смотрите [[#Installing_from_source_2|Установка из исходных файлов]].<br />
<br />
==== Установка портативной версии Lazarus на USB-диск ====<br />
<br />
It is even possible to install the whole Lazarus/FPC package on a portable USB drive (capacity at least 256 MB), for use in environments where you are not allowed to install software on your Windows workstation or where you haven't got administrator privileges. You do have to be a little careful about adjusting the paths in the compiler and environment options and the fpc.cfg file. It may also be necessary to keep the directory for test compilation on your portable drive. <br />
<br />
<< Q:DOES ANYONE KNOW HOW TO SET UP RELATIVE PATHS IN THESE TAGS AND FILES, SO THAT THE ADDRESSING WORKS WHEN YOU MOVE THE USB DEVICE TO ANOTHER MACHINE WHERE IT HAS A DIFFERENT DRIVE LETTER? <br />
<br />
A: This is what I do. It's relatively convoluted, but it's the best solution I've found. I have a "bin" directory on my USB drive, where I have several scripts and utilities installed. Inside that directory is a batch file called "setenv.bat" which sets an environment variable called THUMBDRIVE. It is set by using this command in the batch file:<br />
<syntaxhighlight lang="dos">set THUMBDRIVE=%CD:~0,2%</syntaxhighlight><br />
This is used in setenv.bat to set some paths to other things I have installed on the USB drive. I also have a link in the root directory of the thumb drive with this property:<br />
<syntaxhighlight lang="dos">%SystemRoot%\system32\cmd.exe /k bin\setenv</syntaxhighlight><br />
so that when I click on that link when the thumb drive folder is diplayed after inserting it, it will open a command prompt at the thumb drive with the environment variables set from setenv.bat.<br />
<br />
Also inside the bin directory is [http://sed.sf.net sed] (the actual binary is one I obtained from the mingw distribution). So I created another batch file called fixlaz.bat which takes one argument, the drive letter which is currently in the Lazarus/fpc settings files that you want to change (note that this is the previous drive letter the last time you ran fixlaz.bat, not the current one of your USB drive which fixlaz.bat already knows). You will need to create this batch file to fit where you installed Lazarus in the root directory structure of the drive if you didn't install it directly in the root folder, and then repeat these lines also for the editoroptions.xml and fpc.cfg files (fpc.cfg is the the fpc bin directory, which might be buried deep in the lazarus folder):<br />
<syntaxhighlight lang="dos"><br />
copy %THUMBDRIVE%\lazarus\environmentoptions.xml %THUMBDRIVE%\lazarus\environmentoptions.bak<br />
sed -e 's/%1/%THUMBDRIVE%/g' %THUMBDRIVE%\lazarus\environmentoptions.bak > %THUMBDRIVE%\lazarus\environmentoptions.xml<br />
</syntaxhighlight><br />
<br />
So to use it, I would type at the command prompt of the USB drive:<br />
<syntaxhighlight lang="dos">fixlaz G:</syntaxhighlight><br />
if "G:" was the previous drive letter used the last time I ran it. This will then scan the file(s) and replace "G:" with the current drive letter of the USB drive, which is in the %THUMBDRIVE% environment variable (after running setenv.bat). Note that you could write it to save the current drive letter in a separate file, so that you wouldn't have to remember it yourself the next time. But this works well enough for me right now.<br />
>><br />
<br />
The binary package is available for Linux and Windows from<br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Download the latest release (currently Lazarus-0.9.30-0-win32.exe) and launch the application. You will be taken through a typical Windows installation, in which the FPC compiler and source libraries are installed within the same directory structure as Lazarus, and the IDE should launch and operate without significant problems, provided you have uninstalled(!!!) any previous version of Lazarus and/or FPC (often found in the C:\pp directory).<br />
<br />
You can also use a Lazarus Snapshot. For download locations see [[Lazarus Snapshots Downloads]].<br />
<br />
Tip:<br />
It's perhaps a good idea to reboot your Windows after you installed Lazarus and before you try to install additional lazarus components as zeoslib fore example.<br />
<br />
==== Установка из исходных файлов ====<br />
If you prefer to install from sources, then follow these instructions.<br />
<br />
Please note these instructions are for SubVersion, but there is also a Git mirror repository of Free Pascal Compiler and Lazarus. See [[git mirrors|Git mirror]] for details. You can also use git directly with SubVersion server using git-svn link. See [[Lazarus git-svn|Lazarus git-svn]] for details.<br />
<br />
Open a command prompt window. Start->Run...>CMD or choose MS-DOS icon. You will use this window to enter the commands below<br />
<br />
You have to download the lazarus source from one of the [[Lazarus Snapshots Downloads|snapshots servers]].<br />
Then unzip it to c:\lazarus for example [below called $(LazarusDir)].<br />
<br />
Or you use SVN (example for text mode SVN; adapt to GUI tools such as TortoiseSVN if you want to):<br />
<syntaxhighlight lang="bash"><br />
mkdir c:\lazarus<br />
cd /d c:\lazarus<br />
svn checkout http://svn.freepascal.org/svn/lazarus/trunk/ c:\lazarus<br />
</syntaxhighlight><br />
<br />
You have to install at least the latests stable FPC version (e.g. FPC 2.6.4, but an FPC 3.1.1 snapshot is also possible). <br />
<br />
<br />
Type (replace $(LazarusDir) with the path you have unzipped/checked out Lazarus; replace <br />
<syntaxhighlight lang="dos"><br />
cd /d $(LazarusDir)<br />
rem Of course change the first path variable to<br />
rem the path of your FPC compiler<br />
set path=c:\freepascal\bin\i386-win32;$(LazarusDir)<br />
make<br />
</syntaxhighlight><br />
<br />
*Win9x: use make OPT="-dWIN9XPLATFORM" (Lazarus trunk (and upcoming 1.4)) otherwise the lazarus.exe will not be able to run on this platform.<br />
<br />
If this works, you can type: lazarus.exe. <br />
<br />
You can compile examples also:<br />
<br />
<syntaxhighlight lang="dos"><br />
cd /d $(LazarusDir)\examples<br />
make<br />
</syntaxhighlight><br />
<br />
<s>If you extracted lazarus to another drive, eg.: d:\lazarus, tt can happen that you need the gnu make utility to make it. If you have it, you can take its path to set path=...;<gmakepath> but it is simpler not to choose drive d:\</s><br />
<br />
==== Установка из исходных файлов с использованием стабильной версии ====<br />
An alternative version of the instructions above.<br />
<br />
1> First of all install the latest stable Lazarus to obtain a good starting FPC, for example in C:\lazarus_1_4<br />
<br />
2> Now use TortoiseSVN to checkout http://svn.freepascal.org/svn/lazarus/trunk/ into c:\lazarus<br />
<br />
3> Make the following C:\lazarus\build.bat file:<br />
<br />
Replace $(LazarusDir) with your Lazarus did and make sure the FPC version number matches<br />
<syntaxhighlight lang="dos"><br />
SET PATH=$(LazarusDir)\fpc\2.6.4\bin\i386-win32\<br />
make bigide<br />
</syntaxhighlight><br />
<br />
Now create a shortcut in your desktop to start Lazarus and put the following command to start Lazarus which will make sure that it separates the config files from the stable and the SVN versions:<br />
<br />
<syntaxhighlight lang="dos">$(LazarusDir)\startlazarus.exe --pcp=$(LazarusDir)\configdir </syntaxhighlight><br />
<br />
Always start Lazarus from this shortcut, never directly from the executable. At the first time you start Lazarus configure you FPC dir, FPC sources dir and Lazarus dir.<br />
<br />
==== Сборка Lazarus в Win98 и WinME ====<br />
<br />
Так как среда разработки Lazarus по умолчанию вызывает функцию "CreateToolhelp32Snapshot", которая отсутствует на платформе Win9x, IDE не запустится в Win9x "из коробки".<br />
<br />
Для того, чтобы сделать это запустите пересборку IDE Lazarus с ключом "-dWIN9XPLATFORM".<br />
<br />
=== Установка Lazarus в FreeBSD ===<br />
Следующие инструкции относятся только для версии FreeBSD 9 и выше.<br />
<br />
====via Ports tree====<br />
The latest version of Lazarus available in the FreeBSD port tree, is v 1.6.4 We can use that to install Lazarus.<br />
<br />
<syntaxhighlight lang="bash">[]# cd /usr/ports/editors/lazarus && make install clean clean-depends</syntaxhighlight><br />
<br />
If you start Lazarus IDE and you get a messages about missing source files, then go to '''Environment - Environment Options - Files Tab: FPC source library''' and enter the directory of the FPC source files. It can be obtained from /usr/ports/distfiles/freepascal<br />
<br />
====via pkgng====<br />
<syntaxhighlight lang="bash">[]# pkg install editors/lazarus</syntaxhighlight><br />
<br />
At this point Lazarus might complain about missing source files. If you don't have them:-<br />
<br />
mkdir /usr/ports/distfiles<br />
mkdir /usr/ports/distfiles/freepscal<br />
cd /usr/ports/distfiles/freepascal<br />
wget http://distcache.freebsd.org/ports-distfiles/freepascal/fpc-3.0.2.source.tar.gz<br />
tar xvfz fpc-3.0.2.source.tar.gz<br />
<br />
Change the 3.0.2 to whatever version of fpc you have installed. Then go to '''Environment - Environment Options - Files Tab: FPC source library''' and enter<br />
<br />
/usr/ports/distfiles/freepascal/fpc-3.0.2<br />
<br />
If when you try to compile something you get this error<br />
<br />
Error: resource compiler "fpcres" not found, switching to external mode<br />
<br />
Then you can install fpcres like this<br />
<br />
<syntaxhighlight lang="bash">[]# pkg install lang/fpc-utils</syntaxhighlight><br />
<br />
====via Lazarus repository====<br />
This option will often be used if you want to follow Lazarus Trunk, a Fixes branch, or some other release (eg: compiling from a source tarball).<br />
* Use the SubVersion or Git repositories to checkout a copy of the source code you want, or unpack a downloaded source archive into a suitable location<br />
* The readme.txt file in Lazarus directory mentions 'make clean all'. This works if you are using Linux. Under FreeBSD 9.1 I had to replace 'make' with 'gmake'.<br />
<br />
cd /patch/to/lazarus_source<br />
gmake clean all<br />
<br />
=== Установка Lazarus в PC-BSD 1.0rc1+ ===<br />
<br />
You can install Lazarus on PB-BSD by simply downloading the Lazarus PBI from [http://www.pbidir.com/ PBI Dir]<br />
<br />
Note that you must install glib* port from /usr/port/devel/glib* or glib packages by pkg_add -r glib12 glib20.<br />
I will fix this in new PBI releases.<br />
<br />
'''[other OpenBSD/NetBSD/DragonFlyBSD goes here]'''<br />
<br />
=== Установка Lazarus в Mac OS X ===<br />
<br />
See [[Installing Lazarus on MacOS X]].<br />
<br />
=== Установка Lazarus в Haiku ===<br />
<br />
Lazarus requires Qt under Haiku. Qt is not installed by default under Haiku. You need to install package available from this site : http://qt-haiku.ru/<br />
<br />
Currently, there is no binary package to install Lazarus.<br />
<br />
You will have to compile Lazarus from sources.<br />
<br />
Detailed instructions to build Lazarus under Haiku are available here : [[Installing Lazarus on Haiku]]<br />
<br />
=Установка нескольких версий Lazarus=<br />
Please see [[Multiple Lazarus]] for details on having more than one Lazarus version installed on one system. We cover issues that can arise due to multiple Lazarus installs here, because they can also happen when installing over a previous version.<br />
<br />
=Устранение проблем=<br />
These hints should (hopefully) be applicable across platforms; please adjust paths etc. according to your platform. Also, problems and solutions might be mentioned in the [[Lazarus_Faq]]. <br />
<br />
== Isolating the component ==<br />
There may be multiple problems when installing Free Pascal and Lazarus.<br />
If you have problems with starting Lazarus or compiling with it, first make sure your underlying FPC installation works, e.g. by trying to compile a simple example program.<br />
<br />
== Расположение установленных компонентов ==<br />
On Linux/Unix/OSX, package/distribution provided installations will often install FPC in /bin or /usr/bin, with the libraries in /lib or /usr/lib, and probably the configuration in /etc/fpc.cfg<br />
Source (Subversion) downloads often install in /usr/local/bin (libraries in /usr/local/lib).<br />
<br />
== Отсутствие или повреждение файла fpc.cfg ==<br />
Файл fpc.cfg является файлом настроек FPC. В системе Windows его можно найти в директории с исполняемыми файлами компилятора fpc. On Unix/Linux/OSX, it is first searched in /etc/fpc.cfg, then<br />
Only some problems that often occur are covered. Please see the Free Pascal User's guide, e.g. chapter Compiler usage/configuration file for more details, including the search order for fpc.cfg<br />
<br />
Если его нет, FPC не скомпилирует вашу программу должным образом.<br />
<br />
=== Автоматическое создание fpc.cfg ===<br />
Вы можете попытаться создать fpc.cfg с помощью специальной утилиты:<br />
<br />
<syntaxhighlight lang="dos"><br />
rem Измените путь к директории с исполняемыми файлами FPC<br />
cd /d C:\freepascal\fpc\2.4.5\bin\i386-win32<br />
rem Создание fpc.cfg; basepath - это "корневая" директория fpc<br />
fpcmkcfg -d basepath=C:\freepascal\fpc\2.4.5 -o .\fpc.cfg<br />
</syntaxhighlight><br />
{{Note|earlier instructions had \bin\i386-win32 appended to the basepath. This is not needed since at least FPC 2.4.4.}}<br />
<br />
=== Ручное создание fpc.cfg ===<br />
If the above doesn't work for you, you can copy/paste the code below to a new file named fpc.cfg to your fpc executable directory (or ~/.fpc.cfg or other location). Modify the paths so they match your situation.<br />
<br />
$FPCVERSION is used to automatically determine the version of FPC being used for the compile. Using this variable allows this single fpc.cfg to be used with multiple fpc versions that have the same path structure making it easier to maintain multiple FPC installs.<br />
<br />
<pre><br />
#<br />
# Config file generated by fpcmkcfg on 24/12/2010 - 18:17:42<br />
# Example fpc.cfg for Free Pascal Compiler<br />
#<br />
<br />
# ----------------------<br />
# Defines (preprocessor)<br />
# ----------------------<br />
<br />
#<br />
# nested #IFNDEF, #IFDEF, #ENDIF, #ELSE, #DEFINE, #UNDEF are allowed<br />
#<br />
# -d is the same as #DEFINE<br />
# -u is the same as #UNDEF<br />
#<br />
<br />
#<br />
# Some examples (for switches see below, and the -? helppages)<br />
#<br />
# Try compiling with the -dRELEASE or -dDEBUG on the commandline<br />
#<br />
<br />
# For a release compile with optimizes and strip debuginfo<br />
#IFDEF RELEASE<br />
-O2<br />
-Xs<br />
#WRITE Compiling Release Version<br />
#ENDIF<br />
<br />
# For a debug version compile with debuginfo and all codegeneration checks on<br />
#IFDEF DEBUG<br />
-glh<br />
-Crtoi<br />
#WRITE Compiling Debug Version<br />
#ENDIF<br />
<br />
# ----------------<br />
# Parsing switches<br />
# ----------------<br />
<br />
# Pascal language mode<br />
# -Mfpc free pascal dialect (default)<br />
# -Mobjfpc switch some Delphi 2 extensions on<br />
# -Mdelphi tries to be Delphi compatible<br />
# -Mtp tries to be TP/BP 7.0 compatible<br />
# -Mgpc tries to be gpc compatible<br />
# -Mmacpas tries to be compatible to the macintosh pascal dialects<br />
#<br />
# Turn on Object Pascal extensions by default<br />
#-Mobjfpc<br />
<br />
# Assembler reader mode<br />
# -Rdefault use default assembler<br />
# -Ratt read AT&T style assembler<br />
# -Rintel read Intel style assembler<br />
#<br />
# All assembler blocks are AT&T styled by default<br />
#-Ratt<br />
<br />
# Semantic checking<br />
# -S2 same as -Mobjfpc<br />
# -Sc supports operators like C (*=,+=,/= and -=)<br />
# -Sa include assertion code.<br />
# -Sd same as -Mdelphi<br />
# -Se<x> compiler stops after the <x> errors (default is 1)<br />
# -Sg allow LABEL and GOTO<br />
# -Sh Use ansistrings<br />
# -Si support C++ styled INLINE<br />
# -SI<x> set interface style to <x><br />
# -SIcomCOM compatible interface (default)<br />
# -SIcorbaCORBA compatible interface<br />
# -Sm support macros like C (global)<br />
# -So same as -Mtp<br />
# -Sp same as -Mgpc<br />
# -Ss constructor name must be init (destructor must be done)<br />
#<br />
# Allow goto, inline, C-operators, C-vars<br />
-Sgic<br />
<br />
# ---------------<br />
# Code generation<br />
# ---------------<br />
<br />
# Uncomment the next line if you always want static/dynamic units by default<br />
# (can be overruled with -CD, -CS at the commandline)<br />
#-CS<br />
#-CD<br />
<br />
# Set the default heapsize to 8Mb<br />
#-Ch8000000<br />
<br />
# Set default codegeneration checks (iocheck, overflow, range, stack)<br />
#-Ci<br />
#-Co<br />
#-Cr<br />
#-Ct<br />
<br />
# Optimizer switches for i386 compiler<br />
# -Os generate smaller code<br />
# -O1 level 1 optimizations (quick optimizations)<br />
# -O2 level 2 optimizations (-O1 + slower optimizations)<br />
# -O3 level 3 optimizations (same as -O2u)<br />
# -Oa=N set alignment to N<br />
# -OoX switch on optimalization X. <br />
# -OoNOX switch off optimalization X.<br />
# X is one of REGVAR UNCERTAIN STACKFRAME PEEPHOLE ASMCSE LOOPUNROLL<br />
# -OpCPU set target processor.<br />
# CPU is one of 386, PENTIUM, PENTIUM2, PENTIUM3, PENTIUM4, PENTIUMM <br />
<br />
<br />
# -----------------------<br />
# Set Filenames and Paths<br />
# -----------------------<br />
<br />
# Both slashes and backslashes are allowed in paths<br />
<br />
# path to the messagefile, not necessary anymore but can be used to override<br />
# the default language<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errore.msg<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errorn.msg<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errores.msg<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errord.msg<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errorr.msg<br />
<br />
#IFDEF FPCAPACHE_1_13<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/httpd13/<br />
#ELSE<br />
#IFDEF FPCAPACHE_2_0<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/httpd20<br />
#ELSE<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/httpd22<br />
#ENDIF<br />
#ENDIF<br />
<br />
# searchpath for units and other system dependent things<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/*<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/rtl<br />
<br />
# path to the gcclib<br />
<br />
<br />
# searchpath for libraries<br />
#-FlC:\freepascal\fpc\$FPCVERSION/lib<br />
#-Fl/lib;/usr/lib<br />
<br />
# searchpath for tools<br />
-FDC:\freepascal\fpc\$FPCVERSION/bin/$FPCTARGET<br />
<br />
#IFNDEF CPUI386<br />
#IFNDEF CPUAMD64<br />
#DEFINE NEEDCROSSBINUTILS<br />
#ENDIF<br />
#ENDIF<br />
<br />
#IFNDEF Win32<br />
#DEFINE NEEDCROSSBINUTILS<br />
#ENDIF<br />
<br />
# binutils prefix for cross compiling<br />
#IFDEF FPC_CROSSCOMPILING<br />
#IFDEF NEEDCROSSBINUTILS<br />
-XP$FPCTARGET-<br />
#ENDIF<br />
#ENDIF<br />
<br />
<br />
# -------------<br />
# Linking<br />
# -------------<br />
<br />
# generate always debugging information for GDB (slows down the compiling<br />
# process)<br />
# -gc generate checks for pointers<br />
# -gd use dbx<br />
# -gg use gsym<br />
# -gh use heap trace unit (for memory leak debugging)<br />
# -gl use line info unit to show more info for backtraces<br />
# -gv generates programs tracable with valgrind<br />
# -gw generate dwarf debugging info<br />
#<br />
# Enable debuginfo and use the line info unit by default<br />
#-gl<br />
<br />
# always pass an option to the linker<br />
#-k-s<br />
<br />
# Always strip debuginfo from the executable<br />
-Xs<br />
<br />
<br />
# -------------<br />
# Miscellaneous<br />
# -------------<br />
<br />
# Write always a nice FPC logo ;)<br />
-l<br />
<br />
# Verbosity<br />
# e : Show errors (default) d : Show debug info<br />
# w : Show warnings u : Show unit info<br />
# n : Show notes t : Show tried/used files<br />
# h : Show hints m : Show defined macros<br />
# i : Show general info p : Show compiled procedures<br />
# l : Show linenumbers c : Show conditionals<br />
# a : Show everything 0 : Show nothing (except errors)<br />
# b : Show all procedure r : Rhide/GCC compatibility mode<br />
# declarations if an error x : Executable info (Win32 only)<br />
# occurs<br />
#<br />
# Display Info, Warnings, Notes and Hints<br />
-viwn<br />
# If you don't want so much verbosity use<br />
#-vw<br />
</pre><br />
<br />
=== Testing and batch file/shortcut usage ===<br />
You can also explicitly specify a fpc.cfg to use:<bash>fpc -n -@/path/to/fpc.cfg</bash>. Handy for testing, creating shortcuts/shell scripts, having multiple FPC installations etc.<br />
<br />
If that does not work, you can try to create fpc.cfg manually: copy over an existing fpc.cfg from a working installation and change the paths.<br />
<br />
== Mixing FPC versions ==<br />
If your FPC cannot find its sources/ppu files while fpc.cfg has the right paths, another cause could be that the fpc executable is a different version than the (link to) ppc<architecture> compiler.<br />
<br />
When compiling with fpc, fpc starts e.g ppc386 to compile for x86 targets. Please make sure fpc and ppc<architecture> are compiled by the same version/sourced from the same package.<br />
<br />
== Lazarus can't find sources ==<br />
There may be a message saying Lazarus can't find the sources; if so, go to the menu at the top and select Environment -> Environment options and insert the name of the directory where you expect to find your lazarus files (eg ~/FreePascal/lazarus), your compiler (e.g. /usr/local/bin/ppc386), the Free Pascal source directory (e.g. /usr/local/lib/fpc/$version/fpc or a directory in your own space e.g. ~/FreePascal/fpc). Then close the dialog and start programming.<br />
<br />
== Пути к файлам в настройках Lazarus и проекта ==<br />
Учтите, что вы можете установить пути (для компилятора, модулей FPC и т.д.) в общих настройках параметров. Параметры, которые вы укажете в ''Параметрах проекта'', могут переопределять параметры, используемые для каждого проекта.<br />
Если вы испытываете проблемы, связанные с путями в данном проекте, но не в других проектах, вам необходимо проверить, не ошиблись ли вы в переопределении параметров в общих настройках.<br />
<br />
=Установка старых версий=<br />
Смотрите [[Installation hints for old versions]]<br />
<br />
<br />
[[Category:Russian (unfinished translation)]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Roadmap/ru&diff=128392
Roadmap/ru
2019-11-10T18:12:17Z
<p>Useroflazarus: /* Статус элементов управления на основе TCustomControl в интерфейсе LCL для каждой платформы */</p>
<hr />
<div>{{Roadmap}}<br />
<br />
Этот документ дает представление о текущем состоянии различных частей '''Lazarus''', а также помогает новым участникам найти подходящее для себя направление, в котором они могут помочь. Здесь также отображаются имена людей, реализующих некоторые части для целевых платформ.<br />
<br />
__TOC__<br />
<br />
{{Template:Development Status/ru}}<br />
<br />
==Общее состояние наборов виджетов==<br />
<br />
{{Template:Widgetset Roadmap}}<br />
<br />
==Текущее состояние различных частей Lazarus==<br />
<br />
<br />
{| class="wikitable sortable"<br />
! Unit !! Item !! Состояние !! Target !! Навыки !! Ответственный !! Комментарии<br />
|---- class="working"<br />
|[[IDE]]||TCollection Editor||Работает||0.9.x||FCL, RTTI, IDE||-||A generic TCollection editor for the various TCollections in the LCL/FCL.<br />
|---- class="working"<br />
|[[IDE]]||TActionList||Работает||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[IDE]]||Doc Editor||Работает||-||fpdoc||-||The doc editor will be an integrated fpDoc editor similar to fpde. It will be a process of its own, so that it can show help for dialogs as well. It should also be able to write help for packages.<br />
|---- class="working"<br />
|[[IDE]]||Export LFM as xml||Работает||-||-||-||Load and save LFM files to XML.<br />
|---- class="partial"<br />
|[[IDE]]||[[Icon Editor Roadmap]]||в процессе||после 1.0||-||-||A simple icon editor with the ability to create lrs files. It will be a good example and can help newbies to create icons for their components.<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Borderspacing||Работает||0.9.x||-||-||for aligned controls<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Drag&Drop||Работает||||-||-||<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to Darwin Power PC, Mac OS X||Работает||0.9.x||-||-||depends on FPC 1.9.5<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to Mac OS X x86||Работает||-||-||-||depends on FPC 2.1.1<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TSplitter||Работает||0.9.x||easy||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TFindDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TReplaceDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TControl.Font||в процессе||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TTabControl||в процессе||0.9.x||-||-||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||Docking (= комбинация форм)||частично работает, в процессе||после 1.0||глубокое знание LCL и интерфейсов||Mattias||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Frames (= forms as children)||Работает||0.9.28||глубокое знание LCL||Mattias, Paul||-<br />
|---- class="working"<br />
|[[IDE]]||Visual Form Inheritence||Работает||после 1.0||IDE||Mattias||Properties are not yet propagated to open descendants<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||MDI - Multiple Documents Interfaces Putting fo ...||в процессе||1.2||глубокое знание LCL и интерфейсов||[[User:Zeljan|Zeljan]]||An MDI LCL emulator for widgetsets which does not support MDI, also native implementation of MDI for qt and win32/64. Currently only qt has full MDI support, others are in progress.<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Palette support||не реализовано||-||-||-||Required to correctly show colors on a 256 colors display<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TCoolBar||частично работает, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TControlBar||скелетная реализация для предотвращения ошибок в преобразовании из Delphi, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TMaskEdit||Работает||-||-||[[User:Bart|Bart]]||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||TDirectoryTreeView||не реализовано||-||-||-||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Constrain maximization to specific area||не реализовано||-||winapi, gtk||-||When maximizing a window, the left, top, width and height can all be constrained to a specific rectangular area on the screen/desktop. After this is done, constrain the source editor and maybe other windows<br />
|---- class="working"<br />
|Components||TIcon||Работает||0.9.26||-||Marc||-<br />
|---- class="working"<br />
|Components||CUPS Package||Работает||0.9.x||easy||-||<br />
|---- class="working"<br />
|}<br />
<br />
==Статус возможностей в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|Accelerator Keys<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не применимо<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Caret<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[Clipboard]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|Cursors<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|Drag & Drop<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[Drop files event]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|MDI Support<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Printing<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Regions<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="working"|Работает<br />
|----<br />
|TCustomControl descendents<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|Unicode Support<br />
|class="working"|Работает||class="not"|Невозможно реализовать||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[BidiMode]]<br />
|class="working"|Работает||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Application||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTimer/ru|TTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TApplication.QueueAsyncCall||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|TThread.Synchronize||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|PostMessage||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class=""unknown"|Не известно<br />
|class="working"|Работает||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|PostThreadMessage||class="working"|Работает||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="unknown"|Не известно||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="unknown"|Не известно||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус Graphics в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|TBitmap/TPixmap/TIcon/etc||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TBrush||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TFont||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TPen||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|ExtTextOut||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|}<br />
<br />
==Статус встроенных элементов управления в интерфейсе LCL для каждой платформы==<br />
Встроенные элементы управления являются потомками TWinControl, которые не происходят от TCustomControl.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBitBtn/ru|TBitBtn]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TButton/ru|TButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCalendar/ru|TCalendar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TCheckBox/ru|TCheckBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCheckGroup/ru|TCheckGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TCheckListBox/ru|TCheckListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TComboBox/ru|TComboBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TEdit/ru|TEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TForm/ru|TForm]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TGroupBox/ru|TGroupBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TIdleTimer/ru|TIdleTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TImageList/ru|TImageList]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает|| class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TListBox/ru|TListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TListView/ru|TListView]]||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TMainMenu/ru|TMainMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TMemo/ru|TMemo]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TMenuItem/ru|TMenuItem]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TPageControl/ru|TPageControl]] and [[TTabSheet/ru|TTabSheet]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPairSplitter/ru|TPairSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TPanel/ru|TPanel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPopupMenu/ru|TPopupMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TProgressBar/ru|TProgressBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TRadioButton/ru|TRadioButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TRadioGroup/ru|TRadioGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TScrollBar/ru|TScrollBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|----<br />
|[[TScrollBox/ru|TScrollBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TSpinEdit/ru|TSpinEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TSplitter/ru|TSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TStaticText/ru|TStaticText]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TStatusBar/ru|TStatusBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TToggleBox/ru|TToggleBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TTrackbar/ru|TTrackbar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTrayIcon/ru|TTrayIcon]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус диалогов в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|LCLIntf.MessageBox||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="partial"|Реализовано для Android<br />
|----<br />
|Application.MessageBox, MessageDlg, LCLIntf.PromptUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="partial"|Реализовано для Android<br />
|----<br />
|LCLIntf.AskUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|[[TColorDialog/ru|TColorDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TFontDialog/ru|TFontDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TOpenDialog/ru|TOpenDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPrinterSetupDialog/ru|TPrinterSetupDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TSaveDialog/ru|TSaveDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TCustomControl в интерфейсе LCL для каждой платформы==<br />
Обратите внимание, что будучи потомком TCustomControl не гарантирует, что элемент управления не имеет реализации widgetset. TArrow имеет его, хотя он имеет хорошую реализацию по умолчанию. TNotebook будет полностью реализована в LCL.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TArrow/ru|TArrow]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TNotebook/ru|TNoteBook]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TUpDown/ru|TUpDown]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TStringGrid/ru|TStringGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TDrawGrid/ru|TDrawGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TToolBar/ru|TToolBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TTreeView/ru|TTreeView]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TValueListEditor/ru|TValueListEditor]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TGraphicControl в интерфейсе LCL для каждой платформы==<br />
'''Примечание:''' Они предназначены для заворачивания в LCL компоненты, а '''не''' для конкретных самостоятельных функций GUI инструментария.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBevel/ru|TBevel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TLabel/ru|TLabel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано для Android<br />
|----<br />
|[[TShape/ru|TShape]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TSpeedButton/ru|TSpeedButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPaintBox/ru|TPaintBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TImage/ru|TImage]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|}<br />
<br />
==Статус LazDeviceAPIs на каждом widgetset==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! customdrawn-android<br />
|----<br />
|Accelerometer||class="working"|Работает<br />
|----<br />
|Messaging (SMS, MMS and E-Mail)||class="partial"|Реализовано SMS<br />
|----<br />
|PositionInfo||class="working"|Работает<br />
|}<br />
<br />
{{Navbar Lazarus Release Notes}}<br />
<br />
==Смотри также==<br />
<br />
*[[LCL Internals]]<br />
*[[TAChart Roadmap]]<br />
<br />
[[Category:Lazarus/ru]]<br />
[[Category:Roadmaps/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Dialog_Examples/ru&diff=128378
Dialog Examples/ru
2019-11-10T09:07:58Z
<p>Useroflazarus: /* Несколько полезных диалогов */</p>
<hr />
<div>{{Dialog Examples}}<br />
<br />
= Несколько полезных диалогов=<br />
Вот некоторые полезные диалоги, которых нет в [[Component Palette/ru|палитре компонентов]]:<br />
<br />
* <syntaxhighlight lang="pascal" inline>procedure ShowMessage (const Msg: string);</syntaxhighlight><br />
* <syntaxhighlight lang="pascal" inline>function MessageBox (Text, Caption : PChar; Flags: Word): Integer;</syntaxhighlight><br />
* <syntaxhighlight lang="pascal" inline>function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;</syntaxhighlight><br />
* <syntaxhighlight lang="pascal" inline>function InputBox (const ACaption, APrompt, ADefault: string); string;</syntaxhighlight><br />
* <syntaxhighlight lang="pascal" inline>function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;</syntaxhighlight><br />
* <syntaxhighlight lang="pascal" inline>function PasswordBox(const ACaption, APrompt : String) : String;</syntaxhighlight><br />
<br />
Каждый из этих компонентов приводит к отображению небольшого всплывающего окна, которое содержит некоторую информацию и требует ответа пользователя: либо нажатия кнопки, либо ввода текста, либо и то и другое. Программист практически не контролирует формат, размер или положение этих всплывающих окон, но может влиять на их текстовое содержимое.<br />
<br />
Причина, по которой часто существует несколько очень похожих альтернатив, заключается в том, что разные методы могут вызывать компонент и получать данные обратно из процедуры или функции.<br />
Эти диалоги могут быть «платформозависимыми», то есть они могут отображаться по-разному. Например, строки, которые полностью отображаются в Windows XP, могут быть усечены в Windows 7.<br />
<br />
==Диалоги сообщений==<br />
Диалоги сообщений отображают сообщение и ждут реакции [пользователя в виде] нажатия клавиши или щелчка мыши.<br />
<br />
===ShowMessage===<br />
<syntaxhighlight lang="pascal"><br />
procedure ShowMessage(const Msg: string);</syntaxhighlight><br />
{ Определено в Dialogs.pp }<br />
<br />
Простейшее диалоговое окно сообщения: принимает в качестве параметра простую строку, отображает ее в стереотипном поле и ожидает события щелчка мышью или клавиши ввода, прежде чем вернуться к вызывающей [[Routine/ru|подпрограмме]] или [[Program/ru|программе]]. <br />
<br />
Это модальный вызов процедуры, то есть окно отображается, получает фокус и не оставляет фокус, пока не будет нажата кнопка ОК или не выбрано что-либо иное.<br />
<br />
Пример:<br />
<br />
<syntaxhighlight lang="pascal">program LazMessage;<br />
uses <br />
Dialogs;<br />
begin<br />
ShowMessage('Это сообщение от Lazarus');<br />
end.</syntaxhighlight><br />
<br />
У вас есть возможность создавать многострочные сообщения, используя следующие разделители строк, все они будут работать:<br />
*sLineBreak<br />
*LineEnding<br />
*или код символьный код: #13#10<br />
<br />
'''Пример из нескольких строк:'''<br />
<br />
<syntaxhighlight lang="pascal">program LazMessage;<br />
uses <br />
Dialogs;<br />
begin<br />
ShowMessage('Это - многострочное' + sLineBreak + 'сообщение!' );<br />
end.</syntaxhighlight><br />
<br />
===MessageBox===<br />
<syntaxhighlight lang="pascal">{ Определено в Forms.pp как часть TApplication; следовательно, должно вызываться как Application.Messagebox() <br />
или с использованием конструкции 'with Application do ...'}<br />
<br />
function Application.MessageBox(Text, Caption: PChar; Flags: LongInt): Integer;</syntaxhighlight><br />
<br />
Параметры включают<br />
<br />
* Text: строка, которая отображается как приглашение или инструкция в поле;<br />
* Caption: строка заголовка в верхней части окна сообщения;<br />
* Flags: longint - целое число, построенное путем сложения различных констант, для определения содержимого и поведения блока, например, MB_ABORTRETRYIGNORE + MR_ICONQUESTION заставит приложение отображать значок запроса (?) в поле с тремя кнопками: ABORT RETRY IGNORE.<br />
<br />
Функция возвращает целочисленное значение, соответствующее нажатой кнопке; его значение может быть определено с помощью констант[IDOK..IDHELP]<br />
Она может быть вызвана как вызов процедуры (то есть как оператор 'MessageBox()', а не как вызов функции 'Variable:= MessageBox()' - см. Пример ниже)<br />
<br />
Пример:<br />
<br />
<syntaxhighlight lang="pascal">uses <br />
Forms, Dialogs, LCLType;<br />
<br />
procedure DisplayMessageBox;<br />
var <br />
Reply, BoxStyle: Integer;<br />
begin<br />
BoxStyle := MB_ICONQUESTION + MB_YESNO;<br />
Reply := Application.MessageBox('Press either button', 'MessageBoxDemo', BoxStyle);<br />
if Reply = IDYES then Application.MessageBox('Yes ', 'Reply',MB_ICONINFORMATION)<br />
else Application.MessageBox('No ', 'Reply', MB_ICONHAND);<br />
end;</syntaxhighlight><br />
<br />
Обратите внимание, что в этом примере строки 'Yes' и 'No' были дополнены пробелами; в противном случае поле не будет достаточно широким, чтобы правильно отображать заголовок<br />
<br />
[[image:MessageBoxDemo.png|bottom]] <br />
[[image:ReplyYes.png|bottom]]<br />
<br />
===MessageDLG===<br />
<br />
<syntaxhighlight lang="pascal">function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;<br />
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;</syntaxhighlight><br />
<br />
Две версии этой функции, то есть первый параметр 'Caption' является необязательным; если пропущено, заголовок отсутствует в поле<br />
<br />
Это наиболее полный и продуманный диалог сообщений, который позволяет программисту значительно контролировать внешний вид диалогового окна.<br />
Параметры, определяющие тип поля и его значка, являются типами, а не целочисленными константами, и кнопки можно указывать в виде набора в квадратных скобках, например [mbRetry, mbIgnore, mbAbort, mbCancel].<br />
Параметр HelpCtx в настоящее время не реализован и должен быть установлен в ноль.<br />
Возвращаемое значение из функции - это идентификатор нажатой кнопки, выраженный в виде целого числа (см. определения ниже, [mrNone..mrAll]).<br />
<br />
Пример:<br />
<br />
<syntaxhighlight lang="pascal">uses <br />
Forms, Dialogs, LCLType, Controls;<br />
<br />
procedure TryMessageDlg;<br />
begin<br />
if MessageDlg('Question', 'Do you wish to Execute?', mtConfirmation, [mbYes, mbNo, mbIgnore],0) = mrYes<br />
then { выполнить оставшуюся часть программы };<br />
end;</syntaxhighlight><br />
<br />
[[image:Question.png|bottom]]<br />
<br />
=== QuestionDlg ===<br />
Диалог вопросов позволяет изменять заголовки кнопок и устанавливать кнопки по умолчанию и отмены.<br />
<br />
Пример:<br />
<syntaxhighlight lang="pascal"><br />
case QuestionDlg ('Caption','Message',mtCustom,[mrYes,'Positive', mrNo, 'Negative', 'IsDefault'],'') of<br />
mrYes: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[mrOK,'That is right'],'');<br />
mrNo: QuestionDlg ('Caption','Oh, you mean „No“',mtCustom,[mrOK,'Exactly'],'');<br />
mrCancel: QuestionDlg ('Caption','You canceled the dialog with ESC or close button.',mtCustom,[mrOK,'Exactly'],'');<br />
end; <br />
</syntaxhighlight><br />
<br />
[[image:QuestionDlg.png|bottom]] <br />
<br />
{{Note|Если пользователь отменяет диалог, и кнопка 'IsCancel' не определена, возвращается mrCancel! Если вы хотите перенаправить ESC/закрыть на определенную кнопку, используйте параметр 'IsCancel' сразу после кнопки отмены}}<br />
{{Note|Использование букв местного алфавита в типе UnicodeString в качестве заголовков кнопок может привести к ошибкам (замечено в V1.6.4).}}<br />
<br />
Расширенные примеры для кнопок (из файла promptdialog.inc)<br />
<syntaxhighlight lang="pascal"><br />
[mrOk,mrCancel,'Cancel now',mrIgnore,300,'Do it','IsDefault']<br />
</syntaxhighlight><br />
Это приведет к отображению 4 кнопок:<br />
* 'Ok' возвращает mrOk<br />
* 'Cancel now' возвращает mrCancel<br />
* 'Ignore' возвращает mrIgnore<br />
* 'Do it' возвращает 300. Это будет кнопка по умолчанию (в фокусе)<br />
<br />
Обычно кнопки в диалогах Lazarus имеют значки. Для предотвращения отображения значков можно использовать нестандартизированные значения для результатов сообщения. В настоящее время наибольшее стандартизированное значение равно 11. Например:<br />
<br />
<syntaxhighlight lang="pascal"><br />
case QuestionDlg ('Caption','Message',mtCustom,[20,'Positive', 21, 'Negative',22,'I do not know','IsCancel'],'') of<br />
20: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[20,'That is right'],'');<br />
21: QuestionDlg ('Caption','Oh, you mean „No“',mtCustom,[21,'Exactly'],'');<br />
22: QuestionDlg ('Caption','So, please find out!',mtCustom,[22,'Maybe'],'');<br />
end;<br />
</syntaxhighlight><br />
<br />
Для облегчения работы можно определить константы. Например:<br />
<syntaxhighlight lang="pascal"><br />
const<br />
mrNoneNI= 20;<br />
mrOkNI= mrNoneNI+1;<br />
mrCancelNI= mrNoneNI+2;<br />
mrAbortNI= mrNoneNI+3;<br />
mrRetryNI= mrNoneNI+4;<br />
mrIgnoreNI= mrNoneNI+5;<br />
mrYesNI= mrNoneNI+6;<br />
mrNoNI= mrNoneNI+7;<br />
mrAllNI= mrNoneNI+8;<br />
mrYesToAllNI= mrNoneNI+10;<br />
mrCloseNI= mrNoneNI+11;<br />
mrLastNI= mrCloseNI; <br />
begin<br />
case QuestionDlg ('Caption','Message',mtCustom,[mrYesNI,'Positive', mrNoNI, 'Negative',mrCancelNI,'I do not know','IsCancel'],'') of<br />
mrYesNI: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[mrYesNI,'That is right'],'');<br />
mrNoNI: QuestionDlg ('Caption','Oh, you mean „No“',mtCustom,[mrNoNI,'Exactly'],'');<br />
mrCancelNI: QuestionDlg ('Caption','So, please find out!',mtCustom,[mrCancelNI,'Maybe'],'');<br />
end; //case<br />
end;<br />
</syntaxhighlight><br />
[[File:QuestionDlgNoButIcons.png|bottom]]<br />
<br />
== Диалоги ввода текста ==<br />
<br />
===InputBox===<br />
Диалоги ввода текста: отображение сообщения и ожидание ввода текста пользователем<br />
<br />
<syntaxhighlight lang="pascal">function InputBox(const ACaption, APrompt, ADefault: String): String;</syntaxhighlight><br />
<br />
Отображает поле с определенным заголовком и приглашением, и ожидает ввода пользователя в текстовом поле. По умолчанию строка может быть отображена в текстовом поле. Введенная пользователем строка или строка по умолчанию возвращается как результат функции.<br />
<br />
Пример:<br />
<br />
<syntaxhighlight lang="pascal">uses <br />
Forms, LCLType, Dialogs, Controls;<br />
<br />
procedure TryInputBox;<br />
var <br />
UserString: string;<br />
begin<br />
UserString := InputBox('Get some text input','Please type in some information', 'Some sample text');<br />
ShowMessage(UserString)<br />
end;</syntaxhighlight><br />
<br />
===InputQuery===<br />
<syntaxhighlight lang="pascal">function InputQuery(const ACaption, APrompt : String; MaskInput : Boolean; var Value : String) : Boolean;<br />
function InputQuery(const ACaption, APrompt : String; var Value : String) : Boolean;</syntaxhighlight><br />
<br />
Две версии этой функции, которая отображает подсказку и ожидает ввода пользователем текстовых данных; первый включает в себя логический параметр MaskInput, который определяет, маскируется ли пользовательский ввод звездочками в поле ввода текста (например, при вводе пароля), а второй пропускает это свойство. Текст, введенный пользователем, возвращается в переменном параметре 'Value'(Значение); результатом функции является логическое значение, которое возвращает TRUE, если была нажата кнопка OK, или FALSE, если окно было закрыто любым другим механизмом (например, нажатием на значок 'Close'(Закрыть) в верхней строке заголовка). Пропуск параметра MaskInput эквивалентен установке его в значение FALSE.<br />
<br />
Пример:<br />
<br />
<syntaxhighlight lang="pascal">uses <br />
Forms, LCLType, Dialogs, Controls;<br />
<br />
procedure TryInputQuery;<br />
var <br />
QueryResult: Boolean;<br />
UserString: string;<br />
begin<br />
if InputQuery('Question', 'Type in some data', TRUE, UserString)<br />
then ShowMessage(UserString)<br />
else <br />
begin<br />
InputQuery('Don''t be silly', 'Please try again', UserString);<br />
ShowMessage(UserString);<br />
end<br />
end;</syntaxhighlight><br />
<br />
[[image:MessageDlgQuestion.png|bottom]] <br />
[[image:DontBeSillly.png|bottom]] <br />
<br />
===PasswordBox===<br />
<syntaxhighlight lang="pascal">Function PasswordBox(const ACaption, APrompt : String) : String;</syntaxhighlight><br />
<br />
Ведет себя очень похоже на функцию InputQuery с MaskInput = TRUE; разница в том, что введенный пароль возвращается как результат функции (как в InputBox).<br />
<br />
==Константы и типы, используемые в диалогах сообщений==<br />
<br />
Несколько констант и типов, относящихся к использованию с диалоговыми окнами, предварительно определены в библиотеке LCL:<br />
<br />
целочисленные константы для определения типов кнопок и иконки для отображения в MessageBox<br />
<br />
<syntaxhighlight lang="pascal"><br />
const { Defined in LCLType.pp }<br />
<br />
MB_OK = $00000000;<br />
MB_OKCANCEL = $00000001;<br />
MB_ABORTRETRYIGNORE = $00000002;<br />
MB_YESNOCANCEL = $00000003;<br />
MB_YESNO = $00000004;<br />
MB_RETRYCANCEL = $00000005;<br />
<br />
<br />
MB_ICONHAND = $00000010;<br />
MB_ICONQUESTION = $00000020;<br />
MB_ICONEXCLAMATION = $00000030;<br />
MB_ICONASTERICK = $00000040;<br />
MB_ICONWARNING = MB_ICONEXCLAMATION;<br />
MB_ICONERROR = MB_ICONHAND;<br />
MB_ICONINFORMATION = MB_ICONASTERICK;</syntaxhighlight><br />
<br />
целочисленные константы, определяющие возвращаемое значение из MessageBox в зависимости от того, какая кнопка была нажата<br />
<br />
<syntaxhighlight lang="pascal"><br />
IDOK = 1; ID_OK = IDOK;<br />
IDCANCEL = 2; ID_CANCEL = IDCANCEL;<br />
IDABORT = 3; ID_ABORT = IDABORT;<br />
IDRETRY = 4; ID_RETRY = IDRETRY;<br />
IDIGNORE = 5; ID_IGNORE = IDIGNORE;<br />
IDYES = 6; ID_YES = IDYES;<br />
IDNO = 7; ID_NO = IDNO;<br />
IDCLOSE = 8; ID_CLOSE = IDCLOSE;<br />
IDHELP = 9; ID_HELP = IDHELP;</syntaxhighlight><br />
<br />
определяет, будет ли первая, вторая или третья кнопка по умолчанию<br />
<br />
<syntaxhighlight lang="pascal"><br />
MB_DEFBUTTON1 = $00000000;<br />
MB_DEFBUTTON2 = $00000100;<br />
MB_DEFBUTTON3 = $00000200;<br />
MB_DEFBUTTON4 = $00000300;</syntaxhighlight><br />
<br />
Параметр Flags MessageBox создается путем добавления константы кнопки [MB_OK..MB_RETRYCANCEL], необязательной константы значка [MB_ICONHAND..MB_ICONINFORMATION] и необязательной постоянной кнопки по умолчанию [MB_DEFBUTTON1..MB_DEFBUTTON3]<br />
<br />
Типы для использования в MessageDlg, для которого требуются параметры AType TMsgDlgType и AButtons of TMSgDlgButtons<br />
<syntaxhighlight lang="pascal"><br />
{ Defined in Dialogs.pp }<br />
type<br />
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,<br />
mtCustom);<br />
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,<br />
mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);<br />
TMsgDlgButtons = set of TMsgDlgBtn;<br />
<br />
<br />
const<br />
mbYesNoCancel = [mbYes, mbNo, mbCancel];<br />
mbOKCancel = [mbOK, mbCancel];<br />
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];<br />
<br />
<br />
MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (<br />
bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,<br />
bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose<br />
);<br />
<br />
<br />
BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (<br />
mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,<br />
mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll<br />
);<br />
<br />
<br />
{ Defined in Controls.pp }<br />
const<br />
mrNone = 0;<br />
mrOK = mrNone + 1;<br />
mrCancel = mrNone + 2;<br />
mrAbort = mrNone + 3;<br />
mrRetry = mrNone + 4;<br />
mrIgnore = mrNone + 5;<br />
mrYes = mrNone + 6;<br />
mrNo = mrNone + 7;<br />
mrAll = mrNone + 8;<br />
mrNoToAll = mrNone + 9;<br />
mrYesToAll = mrNone + 10;<br />
mrLast = mrYesToAll;</syntaxhighlight></div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Repeat/ru&diff=126402
Repeat/ru
2019-08-13T16:57:31Z
<p>Useroflazarus: </p>
<hr />
<div>{{Repeat}}<br />
<br />
Является [[Keyword/ru|ключевым словом]], которое используется в управляющей конструкции аналогично циклу '[[While/ru|while]] [[Do/ru|do]]'.<br />
<br />
==Синтаксис==<br />
<br />
<syntaxhighlight lang="pascal"><br />
repeat<br />
<блок операторов><br />
until <условие>;<br />
</syntaxhighlight><br />
<br />
<блок операторов>: одиночный оператор на языке [[Pascal/ru|Pascal]] или блок операторов, заключенный в [[Begin/ru|<syntaxhighlight lang="pascal" enclose="none">begin</syntaxhighlight>]]-[[End/ru|<syntaxhighlight lang="pascal" enclose="none">end</syntaxhighlight>]].<br />
<br />
<условие>: [[expression/ru|выражение]], значение которого является типом boolean.<br />
<br />
==Пример==<br />
<br />
<syntaxhighlight lang="pascal"><br />
x := 1;<br />
repeat<br />
DoSomethingHere(x);<br />
x := x + 1;<br />
until x = 10;<br />
</syntaxhighlight><br />
<br />
<br />
{{Keywords/ru}}</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Until/ru&diff=126364
Until/ru
2019-08-11T08:29:47Z
<p>Useroflazarus: </p>
<hr />
<div><br />
{{until}}<br />
<br><br />
Является [[Keyword/ru|ключевым словом]], которое используется в управляющей конструкции аналогично циклу '[[While/ru|while]] [[Do/ru|do]]'.<br />
<br />
Синтаксис:<br />
<br />
'''repeat'''<br />
''' <блок операторов>'''<br />
'''until <условие>;'''<br />
<br />
<блок операторов>: одиночный оператор на языке pascal или блок операторов, заключенный в ''begin-end''.<br />
<br />
<условие>: выражение, значение которого является типом boolean.<br />
<br />
Пример:<br />
<br />
'''x := 1;'''<br />
'''repeat'''<br />
'''begin'''<br />
''' DoSomethingHere(x);'''<br />
''' x := x + 1;'''<br />
'''end;'''<br />
'''until x = 10;'''<br />
<br />
<br />
{{Keywords/ru}}</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Keyword/ru&diff=126363
Keyword/ru
2019-08-11T08:29:24Z
<p>Useroflazarus: </p>
<hr />
<div>{{Keyword}}<br />
<br />
Ключевое слово - это слово со специальным значением и функцией в языке программирования (см. [[Reserved words/ru|зарезервированные слова]]). <br />
<br />
[[Lazarus_Faq/ru|Lazarus]] обычно отображает ключевые слова в исходных файлах на языке Pascal '''жирным''' начертанием символов. Для изменения используйте команды [Параметры IDE|Редактор|Цвета].<br />
<br />
Некоторые очень распространенные слова Free Pascal, такие как [[Read/ru|read]] или [[Write/ru|write]], на самом деле являются именами функций, но не ключевыми словами.<br />
<br />
[[Category:Glossary/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Round/ru&diff=126345
Round/ru
2019-08-10T07:06:06Z
<p>Useroflazarus: </p>
<hr />
<div>{{Round}}<br />
<br />
[[System unit/ru|Модуль System]], входящий в состав [[RTL/ru|RTL]], содержит функцию '''Round''', которая округляет значение типа [[Real/ru|real]] до значения типа [[Integer/ru|integer]].<br />
Её входным параметром является выражение вещественного типа, и '''Round''' возвращает значение типа [[Longint/ru|longint]], округленное до ближайшего целого числа. Если входное значение находится точно посередине между двух целых чисел - N.5 - то используется "банковское округление", в результате которого значение округляется до ближайшего четного числа.<br />
<br />
== Объявление ==<br />
<syntaxhighlight lang="pascal"><br />
function Round(X: Real): Longint;<br />
</syntaxhighlight><br />
<br />
== Пример использования ==<br />
<syntaxhighlight lang="pascal"><br />
begin<br />
WriteLn( Round(8.7) );<br />
WriteLn( Round(8.3) );<br />
// примеры "банковского округления" - .5 округляется до ближайшего четного числа<br />
WriteLn( Round(2.5) );<br />
WriteLn( Round(3.5) );<br />
end.<br />
</syntaxhighlight><br />
<br />
=== Вывод ===<br />
9<br/><br />
8<br/><br />
2<br/><br />
4<br/><br />
<br />
== См. также ==<br />
* [[Int/ru|Int]]<br />
* [[Trunc/ru|Trunc]]<br />
* [[Div/ru|Div]]<br />
<br />
[[Category:Pascal/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Delphi_compatible_LCG_Random&diff=125969
Delphi compatible LCG Random
2019-07-25T03:53:18Z
<p>Useroflazarus: </p>
<hr />
<div>=== Delphi compatible random numbers ===<br />
Many Freepascal programmers also maintain sourcecode in Delphi.<br><br />
Even if you have moved to Freepascal from Delphi you may have data that relies on Delphi's Random.<br><br />
Here are cross-platform functions that generate Delphi-identical pseudo-random numbers given the same RandSeed:<br />
<syntaxhighlight lang=pascal><br />
unit lcg_random;<br />
// Delphi compatible LCG random number generator routines for Freepascal.<br />
// (c)2017, Thaddy de Koning. Use as you like<br />
// Algorithm, Delphi multiplier and increment taken from:<br />
// https://en.wikipedia.org/wiki/Linear_congruential_generator<br />
// The default Delphi RandomSeed is determined as zero.<br />
{$ifdef fpc}{$mode objfpc}{$endif}<br />
<br />
interface<br />
<br />
function LCGRandom: extended; overload;inline;<br />
function LCGRandom(const range:longint):longint;overload;inline;<br />
<br />
implementation<br />
<br />
function IM:cardinal;inline;<br />
begin<br />
RandSeed := RandSeed * 134775813 + 1;<br />
Result := RandSeed;<br />
end;<br />
<br />
function LCGRandom: extended; overload;inline;<br />
begin<br />
Result := IM * 2.32830643653870e-10;<br />
end;<br />
<br />
function LCGRandom(const range:longint):longint;overload;inline;<br />
begin<br />
Result := IM * range shr 32;<br />
end;<br />
<br />
end.</syntaxhighlight><br />
<br><br />
A small demo<br />
<syntaxhighlight lang=pascal><br />
program lcgdemo;<br />
// Compile and run in both Delphi and FPC and compare the output.<br />
// It is exactly the same<br />
{$ifdef fpc}{$mode objfpc}<br />
{$Macro on}{$define random := LCGRandom}<br />
{$endif}<br />
{$ifdef mswindows}{$apptype console}{$endif}<br />
uses lcg_random;<br />
<br />
var i:integer;<br />
begin<br />
RandSeed := 999; // default delphi randseed is zero<br />
for i := 1 to 20 do<br />
begin<br />
write(Random(100):4); // Delphi: Random FPC:LCGRandom. See macro<br />
if i mod 5 = 0 then writeln;<br />
end;<br />
<br />
RandSeed := 999; // default delphi randseed is zero<br />
for i := 1 to 20 do<br />
begin<br />
write(Random:4:8,' ');// Delphi: Random FPC:LCGRandom<br />
if i mod 5 = 0 then writeln;<br />
end;<br />
Readln;<br />
end.</syntaxhighlight><br />
=== See also ===<br />
#[https://en.wikipedia.org/wiki/Linear_congruential_generator LCG on wikipedia]<br />
#[[Generating Random Numbers]]<br />
<br />
== See also ==<br />
* [http://en.wikipedia.org/wiki/Linear_congruential_generator Wikipedia article on the linear congruential generator algorithm]<br />
<br />
[[Category:Statistical algorithms]]<br />
[[Category:Modelling and Simulation]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Generating_Random_Numbers&diff=125968
Generating Random Numbers
2019-07-24T18:45:04Z
<p>Useroflazarus: </p>
<hr />
<div>{{Generating Random Numbers}}<br />
<br />
[[File:fpc source logo.png|right]]<br />
<br />
'''Random numbers''' are important resources for scientific applications, education, game development and visualization. They play a key role in numeric simulation.<br />
<br />
Algorithm-generated random numbers are pseudo-random numbers. They belong to a (large) set of repeating numbers, whose sequence is impossible or at least difficult to predict. Unlike Delphi, that uses a linear congruential generator.(See [[Delphi compatible LCG Random]]), Free Pascal uses a MersenneTwister algorithm for its standard <code>[[doc:rtl/system/random.html|random]]</code> function as defined in [[RTL]]. Before its first use, FPC's random number generator has to be initialized with a single call of the <code>[[doc:rtl/system/randomize.html|randomize]]</code> function, which sets the seed of the generator. Preferably this is done in the launch phase of the program.<br />
<br />
Alternatively, on Unix- and Linux-based systems, the virtual devices <code>[[Dev random|/dev/random]]</code> and <code>/dev/urandom</code> are available. They generate (pseudo) random numbers based on hardware.<br />
<br />
A third option is to use random numbers from external sources, either from specialised hardware devices or from public sources, e.g. based on radioactive decay data.<br />
<br />
== Uniform Distribution ==<br />
<br />
The continuous uniform distribution (also referred to as rectangular distribution) represents a family of symmetric probability distributions. Here, for each member of the family all intervals of the same length on the distribution's support are equally probable.<br />
<br />
The standard [[RTL]] function <code>[[doc:rtl/system/random.html|random]]</code> generates random numbers that fulfill a uniform distribution. If called without parameter <code>random</code> delivers a floating point pseudorandom number in the interval [0, 1), i.e. 0 <= result < 1. if <code>random</code> is called with a longint argument L it delivers a longint random in the interval [0, L).<br />
<br />
A further set of uniformly distributed random number generators is presented in <code>[[Marsaglia's pseudo random number generators|Marsaglia's pseudo random number generators.]]</code><br><br><br />
Uniformly distributed random numbers are not useful for every application. In order to create random numbers of other distributions special algorithms are necessary:<br />
<br />
== Normal (Gaussian) Distribution ==<br />
<br />
One of the more common algorithms to produce normally distributed random numbers from uniformly distributed random numbers is the [http://en.wikipedia.org/wiki/Box–Muller_transform Box-Müller approach]. The following function calculates Gaussian-distributed random numbers:<br />
<br />
<syntaxhighlight lang=pascal><br />
function rnorm (mean, sd: real): real;<br />
{Calculates Gaussian random numbers according to the Box-Müller approach}<br />
var<br />
u1, u2: real;<br />
begin<br />
u1 := random;<br />
u2 := random;<br />
rnorm := mean * abs(1 + sqrt(-2 * (ln(u1))) * cos(2 * pi * u2) * sd);<br />
end;<br />
</syntaxhighlight><br />
<br />
The same algorithm is used by the [[doc:rtl/math/randg.html|randg]] randg function from the [[RTL]] [[doc:rtl/math/index.html|math]] unit:<br />
<br />
<syntaxhighlight lang=pascal><br />
function randg(mean,stddev: float): float;<br />
</syntaxhighlight><br />
<br />
== Exponential Distribution ==<br />
<br />
An exponential distribution occurs frequently in real-world problems. A classical example is the distribution of waiting times between independent Poisson-random events, e.g. the radioactive decay of nuclei [Press et al. 1989].<br />
<br />
The following function delivers a single real random number out of an exponential distribution. ''Rate'' is the inverse of the mean, and the constant ''RESOLUTION'' determines the granularity of generated random numbers.<br />
<br />
<syntaxhighlight lang=pascal><br />
function randomExp(a, rate: real): real;<br />
const<br />
RESOLUTION = 1000;<br />
var<br />
unif: real;<br />
begin<br />
if rate = 0 then<br />
randomExp := NaN<br />
else<br />
begin<br />
repeat<br />
unif := random(RESOLUTION) / RESOLUTION;<br />
until unif <> 0;<br />
randomExp := a - rate * ln(unif);<br />
end;<br />
end;<br />
</syntaxhighlight><br />
<br />
== Gamma Distribution ==<br />
<br />
The gamma distribution is a two-parameter family of continuous random distributions. It is a generalization of both the exponential distribution and the Erlang distribution. Possible applications of the gamma distribution include modelling and simulation of waiting lines, or queues, and actuarial science.<br />
<br />
The following function delivers a single real random number out of a gamma distribution. The shape of the distribution is defined by the parameters ''a'', ''b'' and ''c''. The function makes use of the function '''randomExp''' as defined above.<br />
<br />
<syntaxhighlight lang=pascal><br />
function randomGamma(a, b, c: real): real;<br />
const<br />
RESOLUTION = 1000;<br />
T = 4.5;<br />
D = 1 + ln(T);<br />
var<br />
unif: real;<br />
A2, B2, C2, Q, p, y: real;<br />
p1, p2, v, w, z: real;<br />
found: boolean;<br />
begin<br />
A2 := 1 / sqrt(2 * c - 1);<br />
B2 := c - ln(4);<br />
Q := c + 1 / A2;<br />
C2 := 1 + c / exp(1);<br />
found := False;<br />
if c < 1 then<br />
begin<br />
repeat<br />
repeat<br />
unif := random(RESOLUTION) / RESOLUTION;<br />
until unif > 0;<br />
p := C2 * unif;<br />
if p > 1 then<br />
begin<br />
repeat<br />
unif := random(RESOLUTION) / RESOLUTION;<br />
until unif > 0;<br />
y := -ln((C2 - p) / c);<br />
if unif <= power(y, c - 1) then<br />
begin<br />
randomGamma := a + b * y;<br />
found := True;<br />
end;<br />
end<br />
else<br />
begin<br />
y := power(p, 1 / c);<br />
if unif <= exp(-y) then<br />
begin<br />
randomGamma := a + b * y;<br />
found := True;<br />
end;<br />
end;<br />
until found;<br />
end<br />
else if c = 1 then<br />
{ Gamma distribution becomes exponential distribution, if c = 1 }<br />
begin<br />
randomGamma := randomExp(a, b);<br />
end<br />
else<br />
begin<br />
repeat<br />
repeat<br />
p1 := random(RESOLUTION) / RESOLUTION;<br />
until p1 > 0;<br />
repeat<br />
p2 := random(RESOLUTION) / RESOLUTION;<br />
until p2 > 0;<br />
v := A2 * ln(p1 / (1 - p1));<br />
y := c * exp(v);<br />
z := p1 * p1 * p2;<br />
w := B2 + Q * v - y;<br />
if (w + D - T * z >= 0) or (w >= ln(z)) then<br />
begin<br />
randomGamma := a + b * y;<br />
found := True;<br />
end;<br />
until found;<br />
end;<br />
end; <br />
</syntaxhighlight><br />
<br />
== Erlang Distribution ==<br />
<br />
The Erlang distribution is a two parameter family of continuous probability distributions. It is a generalization of the exponential distribution and a special case of the gamma distribution, where ''c'' is an integer. The Erlang distribution has been first described by Agner Krarup Erlang in order to model the time interval between telephone calls. It is used for queuing theory and for simulating waiting lines.<br />
<br />
<syntaxhighlight lang=pascal><br />
function randomErlang(mean: real; k: integer): real;<br />
const<br />
RESOLUTION = 1000;<br />
var<br />
i: integer;<br />
unif, prod: real;<br />
begin<br />
if (mean <= 0) or (k < 1) then<br />
randomErlang := NaN<br />
else<br />
begin<br />
prod := 1;<br />
for i := 1 to k do<br />
begin<br />
repeat<br />
unif := random(RESOLUTION) / RESOLUTION;<br />
until unif <> 0;<br />
prod := prod * unif;<br />
end;<br />
randomErlang := -mean * ln(prod);<br />
end;<br />
end;<br />
</syntaxhighlight><br />
<br />
== Poisson Distribution ==<br />
The Poisson distribution applies to integer values. It represents the probability of ''k'' successes, when the probability of a success in each trial is small and the rate of occurrence (the mean value) is constant.<br />
<br />
<syntaxhighlight lang=pascal><br />
function randomPoisson(mean: integer): integer;<br />
{ Generator for Poisson distribution (Donald Knuth's algorithm) }<br />
const<br />
RESOLUTION = 1000;<br />
var<br />
k: integer;<br />
b, l: real;<br />
begin<br />
assert(mean > 0, 'mean < 1');<br />
k := 0;<br />
b := 1;<br />
l := exp(-mean);<br />
while b > l do<br />
begin<br />
k := k + 1;<br />
b := b * random(RESOLUTION) / RESOLUTION;<br />
end;<br />
randomPoisson := k - 1;<br />
end;<br />
</syntaxhighlight><br />
<br />
== t Distribution ==<br />
The t distribution (also referred to a Student's t distribution, since it was published by William Sealy Gosset in 1908 under the pseudonym ''Student'') is a continuous probability distribution. Its shape is defined by one parameter, the degrees of freedom (''df''). In statistics, many estimators are t distributed. Therefore, Student's t-distribution plays a major role in a number of widely used statistical analyses, including Student's t-test for assessing the statistical significance of the difference between two sample means, the construction of confidence intervals for the difference between two population means, and in linear regression analysis. The t-distribution also arises in Bayesian analysis of data from a normal family.<br />
<br />
The following algorithm depends on the [[RTL]] function <code>[[doc:rtl/system/random.html|random]]</code> and on the '''[[#Chi Squared Distribution|randomChisq]]''' function<br />
<syntaxhighlight lang=pascal><br />
function randomT(df: integer): real;<br />
{ Generator for Student's t distribution }<br />
begin<br />
if df < 1 then <br />
randomT := NaN<br />
else begin<br />
randomT := randg(0, 1) / sqrt(randomChisq(df) / df);<br />
end;<br />
end;<br />
</syntaxhighlight><br />
<br />
== Chi Squared Distribution ==<br />
The chi squared distribution is a continuous distribution of random numbers with ''df'' degrees of freedom. It is the distribution of a sum of the squares of ''df'' independent standard normal random variables. The chi squared distribution has numerous applications in inferential statistics, e.g. in estimating variances and for chi-squared tests. It is a special [[#Gamma Distribution|gamma distribution]] with ''c'' = ''df''/ 2 and ''b'' = 2. Therefore the following function depends on the function '''randomGamma'''.<br />
<br />
<syntaxhighlight lang=pascal><br />
function randomChisq(df: integer): real;<br />
begin<br />
if df < 1 then <br />
randomChisq := NaN<br />
else<br />
randomChisq := randomGamma(0, 2, 0.5 * df);<br />
end;<br />
</syntaxhighlight><br />
<br />
== F Distribution ==<br />
The F distribution, also referred to as Fisher-Snedecor distribution, is a continuous probability distribution. It is used for F Test and ANOVA. It has two degrees of freedom that serve as shape parameters ''v'' and ''w'' and that are positive integers. The following function '''randomF''' makes use of '''randomChisq'''.<br />
<br />
<syntaxhighlight lang=pascal><br />
function randomF(v, w: integer): real;<br />
begin<br />
if (v < 1) or (w < 1) then<br />
randomF := NaN<br />
else<br />
randomF := randomChisq(v) / v / (randomChisq(w) / w);<br />
end;<br />
</syntaxhighlight><br />
<br />
== See also ==<br />
* [[Dev random]]<br />
* [[Functions for descriptive statistics]]<br />
* [[Marsaglia's pseudo random number generators]]<br />
* [[A simple implementation of the Mersenne twister]]<br />
* [[Delphi compatible LCG Random]]<br />
<br />
==References==<br />
#[http://projecteuclid.org/DPubS/Repository/1.0/Disseminate?view=body&id=pdf_1&handle=euclid.aoms/1177706645 G. E. P. Box and Mervin E. Muller, ''A Note on the Generation of Random Normal Deviates'', The Annals of Mathematical Statistics (1958), Vol. 29, No. 2 pp. 610&ndash;611]<br />
#Dietrich, J. W. (2002). [http://openlibrary.org/books/OL24586469M/Der_Hypophysen-Schilddrüsen-Regelkreis Der Hypophysen-Schilddrüsen-Regelkreis]. Berlin, Germany: Logos-Verlag Berlin. ISBN 978-3-89722-850-4. OCLC 50451543.<br />
#Press, W. H., B. P. Flannery, S. A. Teukolsky, W. T. Vetterling (1989). [http://openlibrary.org/works/OL16807779W/ Numerical Recipes in Pascal]. The Art of Scientific Computing, Cambridge University Press, ISBN 0-521-37516-9.<br />
#Richard Saucier, [http://ftp.arl.mil/random/random.pdf Computer Generation of Statistical Distributions], ARL-TR-2168, US Army Research Laboratory, Aberdeen Proving Ground, MD, 21005-5068, March 2000.<br />
#R.U. Seydel, Generating Random Numbers with Specified Distributions. In: Tools for Computational Finance, Universitext, [http://dx.doi.org/10.1007/978-1-4471-2993-6_2 DOI 10.1007/978-1-4471-2993-6_2], © Springer-Verlag London Limited 2012<br />
#Christian Walck, Hand-book on STATISTICAL DISTRIBUTIONS for experimentalists, Internal Report SUF–PFY/96–01, University of Stockholm 2007<br />
<br></div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Generating_Random_Numbers/ru&diff=125967
Generating Random Numbers/ru
2019-07-24T18:43:46Z
<p>Useroflazarus: </p>
<hr />
<div>{{Generating Random Numbers}}<br />
<br />
[[File:fpc source logo.png|right]]<br />
<br />
'''Случайные числа''' являются важными ресурсами для научных приложений, образования, разработки игр и визуализации. Они играют ключевую роль в численном моделировании.<br />
<br />
Генерируемые алгоритмом случайные числа являются псевдослучайными числами. Они принадлежат (большому) набору повторяющихся чисел, последовательность которых невозможно или, по крайней мере, трудно предсказать. В отличие от Delphi, в котором используется линейный конгруэнтный генератор (см. [[Delphi compatible LCG Random]]), Free Pascal использует алгоритм MersenneTwister для своей стандартной <code>[[doc:rtl/system/random.html|random]]</code> функции, определенной в [[RTL]]. Перед первым использованием генератор случайных чисел FPC должен быть проинициализирован единичным вызовом функции <code>[[doc:rtl/system/randomize.html|randomize]]</code>, которая устанавливает начальное число генератора. Предпочтительнее это делать на этапе запуска программы.<br />
<br />
Кроме того, в системах на основе Unix и Linux доступны виртуальные устройства <code>[[Dev random|/dev/random]]</code> и <code>/dev/urandom</code>. Они генерируют (псевдо) случайные числа на основе оборудования.<br />
<br />
Третий вариант - использовать случайные числа из внешних источников, либо из специализированных аппаратных устройств, либо из общедоступных источников, например. на основе данных радиоактивного распада.<br />
<br />
== Равномерное распределение ==<br />
Непрерывное равномерное распределение (также называемое прямоугольным распределением) представляет собой семейство симметричных вероятностных распределений. Здесь для каждого члена семьи все интервалы одинаковой длины в поддержке распределения одинаково вероятны.<br />
<br />
Стандартная функция [[RTL]] <code>[[doc:rtl/system/random.html|random]]</code> генерирует случайные числа с равномерным распределением. При вызове без параметра <code>random</code> выдает псевдослучайное число с плавающей запятой в интервале [0, 1), т.е. 0 <= result < 1. Если <code>random</code> вызывается с аргументом <tt>longint L</tt>, возвращается случайное значение longint в интервале [0, L).<br />
<br />
Дополнительный набор равномерно распределенных генераторов случайных чисел представлен в <code>[[Marsaglia's pseudo random number generators|генераторах псевдослучайных чисел Марсальи.]]</code><br><br><br />
Равномерно распределенные случайные числа полезны не для каждого приложения. Для создания случайных чисел других распределений необходимы специальные алгоритмы.<br />
<br />
== Нормальное (гауссово) распределение ==<br />
<br />
Одним из наиболее распространенных алгоритмов получения нормально распределенных случайных чисел из равномерно распределенных случайных чисел является [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%91%D0%BE%D0%BA%D1%81%D0%B0_%E2%80%94_%D0%9C%D1%8E%D0%BB%D0%BB%D0%B5%D1%80%D0%B0 преобразование Бокса-Мюллера]. Следующая функция вычисляет распределенные по Гауссу случайные числа:<br />
<br />
<syntaxhighlight lang=pascal><br />
function rnorm (mean, sd: real): real;<br />
{Вычисляет гауссовы случайные числа в соответствии с преобразованием Бокса-Мюллера}<br />
var<br />
u1, u2: real;<br />
begin<br />
u1 := random;<br />
u2 := random;<br />
rnorm := mean * abs(1 + sqrt(-2 * (ln(u1))) * cos(2 * pi * u2) * sd);<br />
end;<br />
</syntaxhighlight><br />
<br />
Тот же алгоритм используется функцией randg [[doc:rtl/math/randg.html|randg]] из модуля [[RTL]] [[doc:rtl/math/index.html|math]]:<br />
<br />
<syntaxhighlight lang=pascal><br />
function randg(mean,stddev: float): float;<br />
</syntaxhighlight><br />
<br />
== Exponential Distribution ==<br />
<br />
An exponential distribution occurs frequently in real-world problems. A classical example is the distribution of waiting times between independent Poisson-random events, e.g. the radioactive decay of nuclei [Press et al. 1989].<br />
<br />
The following function delivers a single real random number out of an exponential distribution. ''Rate'' is the inverse of the mean, and the constant ''RESOLUTION'' determines the granularity of generated random numbers.<br />
<br />
<syntaxhighlight lang=pascal><br />
function randomExp(a, rate: real): real;<br />
const<br />
RESOLUTION = 1000;<br />
var<br />
unif: real;<br />
begin<br />
if rate = 0 then<br />
randomExp := NaN<br />
else<br />
begin<br />
repeat<br />
unif := random(RESOLUTION) / RESOLUTION;<br />
until unif <> 0;<br />
randomExp := a - rate * ln(unif);<br />
end;<br />
end;<br />
</syntaxhighlight><br />
<br />
== Gamma Distribution ==<br />
<br />
The gamma distribution is a two-parameter family of continuous random distributions. It is a generalization of both the exponential distribution and the Erlang distribution. Possible applications of the gamma distribution include modelling and simulation of waiting lines, or queues, and actuarial science.<br />
<br />
The following function delivers a single real random number out of a gamma distribution. The shape of the distribution is defined by the parameters ''a'', ''b'' and ''c''. The function makes use of the function '''randomExp''' as defined above.<br />
<br />
<syntaxhighlight lang=pascal><br />
function randomGamma(a, b, c: real): real;<br />
const<br />
RESOLUTION = 1000;<br />
T = 4.5;<br />
D = 1 + ln(T);<br />
var<br />
unif: real;<br />
A2, B2, C2, Q, p, y: real;<br />
p1, p2, v, w, z: real;<br />
found: boolean;<br />
begin<br />
A2 := 1 / sqrt(2 * c - 1);<br />
B2 := c - ln(4);<br />
Q := c + 1 / A2;<br />
C2 := 1 + c / exp(1);<br />
found := False;<br />
if c < 1 then<br />
begin<br />
repeat<br />
repeat<br />
unif := random(RESOLUTION) / RESOLUTION;<br />
until unif > 0;<br />
p := C2 * unif;<br />
if p > 1 then<br />
begin<br />
repeat<br />
unif := random(RESOLUTION) / RESOLUTION;<br />
until unif > 0;<br />
y := -ln((C2 - p) / c);<br />
if unif <= power(y, c - 1) then<br />
begin<br />
randomGamma := a + b * y;<br />
found := True;<br />
end;<br />
end<br />
else<br />
begin<br />
y := power(p, 1 / c);<br />
if unif <= exp(-y) then<br />
begin<br />
randomGamma := a + b * y;<br />
found := True;<br />
end;<br />
end;<br />
until found;<br />
end<br />
else if c = 1 then<br />
{ Gamma distribution becomes exponential distribution, if c = 1 }<br />
begin<br />
randomGamma := randomExp(a, b);<br />
end<br />
else<br />
begin<br />
repeat<br />
repeat<br />
p1 := random(RESOLUTION) / RESOLUTION;<br />
until p1 > 0;<br />
repeat<br />
p2 := random(RESOLUTION) / RESOLUTION;<br />
until p2 > 0;<br />
v := A2 * ln(p1 / (1 - p1));<br />
y := c * exp(v);<br />
z := p1 * p1 * p2;<br />
w := B2 + Q * v - y;<br />
if (w + D - T * z >= 0) or (w >= ln(z)) then<br />
begin<br />
randomGamma := a + b * y;<br />
found := True;<br />
end;<br />
until found;<br />
end;<br />
end; <br />
</syntaxhighlight><br />
<br />
== Erlang Distribution ==<br />
<br />
The Erlang distribution is a two parameter family of continuous probability distributions. It is a generalization of the exponential distribution and a special case of the gamma distribution, where ''c'' is an integer. The Erlang distribution has been first described by Agner Krarup Erlang in order to model the time interval between telephone calls. It is used for queuing theory and for simulating waiting lines.<br />
<br />
<syntaxhighlight lang=pascal><br />
function randomErlang(mean: real; k: integer): real;<br />
const<br />
RESOLUTION = 1000;<br />
var<br />
i: integer;<br />
unif, prod: real;<br />
begin<br />
if (mean <= 0) or (k < 1) then<br />
randomErlang := NaN<br />
else<br />
begin<br />
prod := 1;<br />
for i := 1 to k do<br />
begin<br />
repeat<br />
unif := random(RESOLUTION) / RESOLUTION;<br />
until unif <> 0;<br />
prod := prod * unif;<br />
end;<br />
randomErlang := -mean * ln(prod);<br />
end;<br />
end;<br />
</syntaxhighlight><br />
<br />
== Poisson Distribution ==<br />
The Poisson distribution applies to integer values. It represents the probability of ''k'' successes, when the probability of a success in each trial is small and the rate of occurrence (the mean value) is constant.<br />
<br />
<syntaxhighlight lang=pascal><br />
function randomPoisson(mean: integer): integer;<br />
{ Generator for Poisson distribution (Donald Knuth's algorithm) }<br />
const<br />
RESOLUTION = 1000;<br />
var<br />
k: integer;<br />
b, l: real;<br />
begin<br />
assert(mean > 0, 'mean < 1');<br />
k := 0;<br />
b := 1;<br />
l := exp(-mean);<br />
while b > l do<br />
begin<br />
k := k + 1;<br />
b := b * random(RESOLUTION) / RESOLUTION;<br />
end;<br />
randomPoisson := k - 1;<br />
end;<br />
</syntaxhighlight><br />
<br />
== t Distribution ==<br />
The t distribution (also referred to a Student's t distribution, since it was published by William Sealy Gosset in 1908 under the pseudonym ''Student'') is a continuous probability distribution. Its shape is defined by one parameter, the degrees of freedom (''df''). In statistics, many estimators are t distributed. Therefore, Student's t-distribution plays a major role in a number of widely used statistical analyses, including Student's t-test for assessing the statistical significance of the difference between two sample means, the construction of confidence intervals for the difference between two population means, and in linear regression analysis. The t-distribution also arises in Bayesian analysis of data from a normal family.<br />
<br />
The following algorithm depends on the [[RTL]] function <code>[[doc:rtl/system/random.html|random]]</code> and on the '''[[#Chi Squared Distribution|randomChisq]]''' function<br />
<syntaxhighlight lang=pascal><br />
function randomT(df: integer): real;<br />
{ Generator for Student's t distribution }<br />
begin<br />
if df < 1 then <br />
randomT := NaN<br />
else begin<br />
randomT := randg(0, 1) / sqrt(randomChisq(df) / df);<br />
end;<br />
end;<br />
</syntaxhighlight><br />
<br />
== Chi Squared Distribution ==<br />
The chi squared distribution is a continuous distribution of random numbers with ''df'' degrees of freedom. It is the distribution of a sum of the squares of ''df'' independent standard normal random variables. The chi squared distribution has numerous applications in inferential statistics, e.g. in estimating variances and for chi-squared tests. It is a special [[#Gamma Distribution|gamma distribution]] with ''c'' = ''df''/ 2 and ''b'' = 2. Therefore the following function depends on the function '''randomGamma'''.<br />
<br />
<syntaxhighlight lang=pascal><br />
function randomChisq(df: integer): real;<br />
begin<br />
if df < 1 then <br />
randomChisq := NaN<br />
else<br />
randomChisq := randomGamma(0, 2, 0.5 * df);<br />
end;<br />
</syntaxhighlight><br />
<br />
== F Distribution ==<br />
The F distribution, also referred to as Fisher-Snedecor distribution, is a continuous probability distribution. It is used for F Test and ANOVA. It has two degrees of freedom that serve as shape parameters ''v'' and ''w'' and that are positive integers. The following function '''randomF''' makes use of '''randomChisq'''.<br />
<br />
<syntaxhighlight lang=pascal><br />
function randomF(v, w: integer): real;<br />
begin<br />
if (v < 1) or (w < 1) then<br />
randomF := NaN<br />
else<br />
randomF := randomChisq(v) / v / (randomChisq(w) / w);<br />
end;<br />
</syntaxhighlight><br />
<br />
== See also ==<br />
* [[Dev random]]<br />
* [[Functions for descriptive statistics]]<br />
* [[Marsaglia's pseudo random number generators]]<br />
* [[A simple implementation of the Mersenne twister]]<br />
* [[Delphi compatible LCG Random]]<br />
<br />
==References==<br />
#[http://projecteuclid.org/DPubS/Repository/1.0/Disseminate?view=body&id=pdf_1&handle=euclid.aoms/1177706645 G. E. P. Box and Mervin E. Muller, ''A Note on the Generation of Random Normal Deviates'', The Annals of Mathematical Statistics (1958), Vol. 29, No. 2 pp. 610&ndash;611]<br />
#Dietrich, J. W. (2002). [http://openlibrary.org/books/OL24586469M/Der_Hypophysen-Schilddrüsen-Regelkreis Der Hypophysen-Schilddrüsen-Regelkreis]. Berlin, Germany: Logos-Verlag Berlin. ISBN 978-3-89722-850-4. OCLC 50451543.<br />
#Press, W. H., B. P. Flannery, S. A. Teukolsky, W. T. Vetterling (1989). [http://openlibrary.org/works/OL16807779W/ Numerical Recipes in Pascal]. The Art of Scientific Computing, Cambridge University Press, ISBN 0-521-37516-9.<br />
#Richard Saucier, [http://ftp.arl.mil/random/random.pdf Computer Generation of Statistical Distributions], ARL-TR-2168, US Army Research Laboratory, Aberdeen Proving Ground, MD, 21005-5068, March 2000.<br />
#R.U. Seydel, Generating Random Numbers with Specified Distributions. In: Tools for Computational Finance, Universitext, [http://dx.doi.org/10.1007/978-1-4471-2993-6_2 DOI 10.1007/978-1-4471-2993-6_2], © Springer-Verlag London Limited 2012<br />
#Christian Walck, Hand-book on STATISTICAL DISTRIBUTIONS for experimentalists, Internal Report SUF–PFY/96–01, University of Stockholm 2007<br />
<br></div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=LazAutoUpdater/ru&diff=125355
LazAutoUpdater/ru
2019-06-28T02:59:19Z
<p>Useroflazarus: </p>
<hr />
<div>{{MenuTranslate| page=LazAutoUpdater}}<br />
<br />
==Lazarus Auto-Updater==<br />
<br />
__TOC__<br />
<br />
===Резюме===<br />
*LazAutoUpdate - это визуальный раскрывающийся компонент для IDE Lazarus / FPC, который делает обновление приложения из онлайн-источника более простым и интеллектуальным.<br />
*При создании приложения для распространения, написание процесса обновления для пользователей может быть проблематичным, однако пользователи ценят это средство (если оно не навязано им!), и поддержка проще, если вы знаете, что пользователь всегда имеет самую актуальную версию вашего приложения. LazAutoUpdate предназначен для хорошей интеграции с системой контроля версий SourceForge или GitHub, обеспечивая беспроблемную работу для вас и ваших пользователей.<br />
*LazAutoUpdate загружает через фоновый поток, чтобы пользователь мог продолжать использовать ваше приложение без перерыва<br />
**Это означает, например, что ваше приложение может «проверять наличие обновлений» при запуске без "зависаний".<br />
*Компонент предназначен для разработчиков Lazarus для Windows и Linux, которые размещают свои проекты в SourceForge или GitHub.<br />
*Вставьте компонент, установите пару свойств (имя вашего проекта SourceForge или некоторые свойства GitHub) и вызовите один простой метод:<br />
**'''LazAutoUpdate.AutoUpdate'''<br />
*Вы (разработчик) имеете достаточный контроль над поведением компонента, и он достаточно прост в использовании.<br />
*Конечные пользователи видят процесс обновления простым и прозрачным<br />
*Протестировано и разработано в Windows 10 64/32-битной и Linux 64/32-битной<br />
<br><br />
[[File:lauobjinsp1.jpg|botton]] [[File:lauobjinsp2.jpg|bottom]]<br />
<br><br />
----<br />
<br />
===Загрузка===<br />
*Установщик пакета LazAutoUpdate (Windows) или zip (Linux) можно загрузить с [http://sourceforge.net/projects/lazautoupdate/ сайта проекта SourceForge]<br />
*OnlinePackageManager Lazarus также содержит LazAutoUpdate<br />
<br><br />
----<br />
<br />
===Установка===<br />
* Загрузите установочный файл Windows или zip-файл linuxbinaries<br />
* Windows: установить, Linux: распаковать в запасную папку<br />
* Используйте UpdatePack для создания и распространения ваших файлов обновлений.<br />
* Используйте компонент LazAutoUpdate, чтобы добавить функциональность обновления в ваши Lazarus'овские приложения.<br />
**'''Вам нужно будет распространять updatehm<os>(.exe) вместе с вашим приложением, чтобы LazAutoUpdate работал правильно'''<br />
**'''Не забудьте устанавливать номера VersionInfo в опциях вашего проекта Lazarus'''<br />
<br><br />
----<br />
<br />
===Пример приложения===<br />
*В загруженном пакете находится проект «TestApp»<br />
*Скомпилируйте и запустите TestApp (не забудьте скомпилировать + скопировать соответствующее средство обновления консоли (updatehm_xxx) в исполняемую папку)<br />
**Это должно обновить себя "из коробки"<br />
*Проверьте исходный код TestApp, чтобы получить представление о том, как использовать LazAutoUpdate в полной мере<br />
<br><br />
----<br />
<br />
===Интернационализация(локализация)===<br />
*i8n: LazAutoUpdate имеет папку 'locale' со всеми файлами .po, необходимыми для перевода. Базовый язык английский<br />
<br><br />
----<br />
<br />
===Использование===<br />
*Установите номер версии для вашего приложения в Project(Проект)/Options(Настройки)/Versioninfo(Информация о версии)<br />
*Перетащите компонент в основную форму вашего приложения<br />
*Задайте для свойства SFProjectName имя проекта на SourceForge (тот же текст, который отображается в URL-адресе страницы вашего проекта).<br />
*или .. Установите свойства GitHub:<br />
**GitHubProjectname: Имя пользователя или Организация<br />
**GitHubRepositoryName: Ваш project(проект)/repository(хранилище)<br />
**GitHubBranchOrTag: 'master' для root или имя ветки GitHub '''или''' имя тэга<br />
*В обоих случаях укажите в UpdatesFolder расположение ваших файлов обновлений (вы можете оставить его пустым)<br />
*Используйте UpdatePack для загрузки вашего приложения в Интернет (SourceForge, GitHub и т.д.) <br />
*'''Затем позвольте компоненту позаботиться о деталях. Просто используйте его (возможно, как пункт меню справки «Проверка обновлений»)'''<br />
<syntaxhighlight lang=pascal><br />
LazAutoUpdate1.AutoUpdate;<br />
</syntaxhighlight><br />
*Вы не хотите, чтобы пользователь закрывал ваше приложение в середине обновления? Используйте этот код в обработчике Form.CloseQuery:<br />
<syntaxhighlight lang=pascal><br />
If LazAutoUpdate1.DownloadInProgress Then<br />
Begin<br />
CanClose := False;<br />
ShowMessage('Пожалуйста, подождите. Загрузка все еще продолжается.');<br />
End;<br />
</syntaxhighlight><br />
*После обновления ваше приложение может автоматически показывать «Что нового». Поместите эту строку в событие OnShow вашей формы:<br />
<syntaxhighlight lang=pascal><br />
LazAutoUpdate1.ShowWhatsNewIfAvailable;<br />
</syntaxhighlight><br />
*Это дает вам «каркасность»(бареюон-основу) кода обновления для вашего приложения. Как видите, все довольно просто и автоматизировано.<br />
====Больший контроль====<br />
*Вы хотите, чтобы ваше приложение проверяло наличие обновлений при запуске? В этом случае, в вашем обработчике form.activate:<br />
<syntaxhighlight lang=pascal><br />
If LazAutoUpdate1.NewVersionAvailable Then<br />
MessageDlg(Application.Title, 'Новая версия ' + Application.Title +<br />
' - доступна.' + LineEnding +<br />
'Нажмите «Проверить наличие новой версии» в меню «Справка», чтобы обновиться.', mtConfirmation,<br />
[mbOK], 0);<br />
</syntaxhighlight><br />
*Если вы не используете метод автоматического обновления, вы можете контролировать процесс обновления поэтапно с помощью функций:<br />
<syntaxhighlight lang=pascal><br />
If LazAutoUpdate1.NewVersionAvailable then ..... else ...<br />
</syntaxhighlight><br />
<syntaxhighlight lang=pascal><br />
If LazAutoUpdate1.DownloadNewVersion then ..... else ...<br />
</syntaxhighlight><br />
<syntaxhighlight lang=pascal><br />
If LazAutoUpdate1.UpdateToNewVersion then ..... else ...<br />
</syntaxhighlight><br />
<br />
====Отладка====<br />
*Если вы установите<br />
<syntaxhighlight lang=pascal><br />
LazAutoUpdate1.DebugMode:=TRUE;<br />
</syntaxhighlight><br />
тогда вы можете использовать встроенный метод OnDebugEvent для отслеживания активности:<br />
<syntaxhighlight lang=pascal><br />
procedure TForm1.LazAutoUpdate1DebugEvent(Sender: TObject; lauMethodName,lauMessage: string);<br />
begin<br />
// используется TEventLog<br />
Logger.Info('('+lauMethodName+') - ' + lauMessage);<br />
end;<br />
</syntaxhighlight><br />
Также возникают события: OnDownloaded и OnNewVersionAvailable, а также свойство LastError с информацией, которую вы можете использовать для отладки.<br />
<br><br />
----<br />
<br />
===Поддержка===<br />
*LazAutoUpdate поддерживается через форум Lazarus [http://forum.lazarus.freepascal.org/index.php/topic,25444.0.html здесь].<br />
<br><br />
----<br />
<br />
===Лицензия===<br />
*LazaAutoUpdate: LGPLv2 (так же, как компоненты Lazarus)<br />
*Update Pack: GPLv2<br />
<br><br />
----<br />
<br />
===Развертывание вашего приложения с помощью LazAutoUpdate===<br />
*Используйте UpdatePack для управления процессом.<br />
**UpdatePack - это приложение с графическим интерфейсом, которое делает файлы обновления точными и быстрыми и даже предоставляет вам соответствующий код LazAutoUpdate для вашего приложения.<br />
**Оно использует 'profiles'(профили), которые позволяют вам развертывать будущие обновления, просто обновляя номер версии и нажимая «Создать пакет обновления».<br />
**Пользователям вашего приложения всегда будет полезна последняя версия программного обеспечения.<br />
*При тестировании помните, что ваше тестовое приложение должно иметь меньший номер версии, чем ваше приложение 'для обновления', хранящееся в сети :)<br />
*Если вы хотите создать (или добавить) обновление zip самостоятельно, оно должно содержать, как минимум, приложение '''и''' текстовый файл «whatsnew.txt»(что нового?).<br />
<br><br />
[[File:updatepack1.jpg|bottom]] [[File:updatepack2.jpg|bottom]]<br />
----<br />
<br />
===Использование [свойств] auOtherSourceFilename и auOtherSourceURL===<br />
*Когда для ProjectType установлено значение auOther, LazAutoUpdate будет использовать эти свойства для всех методов. Смотрите пример приложения в архиве SVN.<br />
<br><br />
----<br />
<br />
===LazAutoUpdate [в виде приложения] в системном трее===<br />
*Пример можно найти в папке /trayicon исходника.<br />
*Когда он запускается, он находится в области панели задач и молча проверяет наличие обновлений по расписанию (настраивается разработчиком и пользователем)<br />
**Если он находит новую версию, появляется всплывающее уведомление для обновления:<br />
***Если приложение не запущено, обновление выполняется в фоновом режиме<br />
***Если приложение работает, оно закрывает его, а затем выполняет обновление. [Затем] приложение перезапускается.<br />
*Updater в системном трее имеет контекстное меню:<br />
**''Configure'' (Настройка):<br />
***Пользователь может редактировать расписание - у каждого приложения есть 'profile'(профиль)<br />
**''Runs at startup'' (Автозапуск после старта ОС (для Windows)):<br />
***Приложение молча запускается в системный трей при каждой загрузке Windows<br />
*Приложение в системном трее (lautraynotify) автоматически выбирает точки входа из приложений, использующих LazAutoupdate, поэтому его не нужно настраивать - его просто устанавливают один раз и забывают.<br />
*График [обновления] гибкий, от одного раза в день до одного раза в месяц<br />
**UpdatePack заботится о создании файла конфигурации systray для вашего приложения. По умолчанию проверка [осуществляется] каждый понедельник в 9 утра.<br />
*Приложение systray работает как в Windows, так и в Linux - все, что вам нужно сделать, это привести его в действие.<br />
<br><br />
----<br />
<br />
===Создание универсального онлайн-установщика/программы обновления===<br />
*После того, как компонент LazAutoUpdate был добавлен в форму, его можно использовать для нескольких обновлений, загрузок и т.д. (См. '/testinstaller' в исходном коде пакета)<br />
*Для универсального установщика/программы обновления вам необходимо установить:<br />
**VersionsINIFilename<br />
**ZipFilename<br />
**AppFileWithPath<br />
**AppVersion<br />
*Динамически устанавливая эти свойства (возможно, через меню), вы можете разрешить пользователю обновлять несколько приложений, размещенных на сайте проекта SourceForge/GitHub (или на любом сайте, использующем параметры auOther - см. выше).<br />
<br />
*Вот пример кода для использования LazAutoUpdate для загрузки и запуска приложения.<br />
*Заархивированные файлы для приложения (включая 'whatsnew.txt') и файл 'mywizzyapp.ini' находятся в подкаталоге /updates проекта SourceForge 'mywizzy'.<br />
*Исполняемый файл 'updatehm(ostype)(.exe)' находится в том же каталоге, что и ваше приложение для обновления<br />
** ostype=[win32|win64|linux32|linux64]<br />
** Windows ext=(.exe)<br />
*Пользователь загружает небольшой установщик InnoSetup только с онлайн-установщиком/программой обновления, который, в свою очередь, загружает приложения и вспомогательные файлы.<br />
** Конечно, "installer"(установщик) может '''быть''' основным приложением, а родственные приложения можно установить через меню или что-то подобное.<br />
<syntaxhighlight lang=pascal><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
// Uses SysUtils,LazFileUtils,ulazautoupdate и т.д.<br />
Var sDirectoryToInstallTo: string;<br />
begin<br />
sDirectoryToInstallTo := ProgramDirectory + 'installed';<br />
Application.Title:='My whizzy app'<br />
LazAutoUpdate1.WorkingMode := lauInstall;<br />
LazAutoUpdate1.ProjectType := auSourceForge;<br />
LazAutoUpdate1.SFProjectname:='mywizzy';<br />
LazAutoUpdate1.VersionsININame:='mywizzyapp.ini';<br />
LazAutoUpdate1.ZipfileName:='mywizzyapp.zip';<br />
LazAutoUpdate1.AppFileWithPath := sDirectoryToInstallTo + DirectorySeparator + 'mywizzyapp.exe';<br />
// Наша обязанность создать папку<br />
if not DirectoryExistsUTF8(sDirectoryToInstallTo) then ForceDirectoriesUTF8(sDirectoryToInstallTo);<br />
LazAutoUpdate1.Appversion:='0.0.0.0';<br />
If LazAutoUpdate1.DownloadNewVersion then<br />
begin<br />
If LazAutoUpdate1.UpdateToNewVersion then<br />
begin<br />
LazAutoUpdate1.ShortCut.Category := scUtility;<br />
LazAutoUpdate1.ShortCut.Target := LazAutoUpdate1.AppFileWithPath;<br />
LazAutoUpdate1.ShortCut.ShortcutName := Application.Title;<br />
LazAutoUpdate1.MakeShortCut; //создает ярлык на рабочем столе и пункт меню Пуск в Windows<br />
end;<br />
end;<br />
end;<br />
</syntaxhighlight><br />
* Затем вы можете легко запустить установленное приложение программно:<br />
<syntaxhighlight lang=pascal><br />
// Uses asyncprocess<br />
procedure TForm1.RunInstalledApp;<br />
var<br />
AProcess: TAsyncProcess;<br />
begin<br />
if not FileExistsUTF8(LazAutoUpdate1.AppFileWithPath) then<br />
begin<br />
ShowMessageFmt('%s не существует! Сначала установите его.',<br />
[LazAutoUpdate1.AppFileWithPath]);<br />
Exit;<br />
end;<br />
AProcess := TAsyncProcess.Create(nil);<br />
try<br />
AProcess.Executable := LazAutoUpdate1.AppFileWithPath;<br />
AProcess.Execute;<br />
finally<br />
Aprocess.Free;<br />
end;<br />
end;<br />
</syntaxhighlight><br />
<br><br />
----<br />
<br />
===Список Public-методов===<br />
*Function NewVersionAvailable: Boolean;<br />
*Function DownloadNewVersion: Boolean;<br />
*Function UpdateToNewVersion: Boolean;<br />
*Procedure ShowWhatsNewIfAvailable;<br />
*Procedure AutoUpdate;<br />
*function AppIsActive<br />
*procedure ResetAppVersion;<br />
<br><br />
----<br />
<br />
===Список неопубликованных свойств===<br />
*GUIOnlineVersion: String<br />
*ReturnCode: Integer<br />
*DownloadInprogress: Boolean<br />
*AppFileWithPath: String<br />
*AppVersion: String<br />
*LastError: String;<br />
*DebugMode: boolean<br />
*LCLVersion: string<br />
*WidgetSet: string<br />
*FPCVersion: string<br />
*LastCompiled: string<br />
*TargetOS: string<br />
*WindowsAdminCheck: boolean<br />
<br><br />
----<br />
<br />
===Развертывание нескольких обновлений в одном проекте===<br />
* По умолчанию ZipFilename совпадает с вашим приложением, но вы можете установить для него уникальное значение и развернуть его в своем каталоге Online Files/updates<br />
* Каждое обновляемое приложение должно иметь уникальное имя для файла versions.ini. Установите свойство VersionsINIFilename.<br />
<br><br />
----<br />
===Если загрузка занимает много времени===<br />
* Свойство <tt>VersionCountLimit</tt> определяет, как долго LazAutoUpdate будет проверять наличие новой версии до истечения времени ожидания.<br />
* Свойство <tt>DownloadCountLimit</tt> определяет, как долго LazAutoUpdate будет пытаться загрузить новую версию до истечения времени ожидания.<br />
<br><br />
----<br />
<br />
===Versions.ini===<br />
Формат выглядит следующим образом:<br />
;файл версии LazAutoUpdate <br />
[versions]<br />
GUI=0.0.2<br />
*Файл небольшой, поэтому его очень быстро скачать<br />
<br><br />
----<br />
=== Исходный код и последние версии===<br />
*[https://sourceforge.net/projects/lazautoupdate/ Страница проекта]<br />
*[https://svn.code.sf.net/p/lazarus-ccr/svn/components/lazautoupdate/latest_stable SVN HTTP Checkout]<br />
<br><br />
----<br />
===Безопасность===<br />
====Windows 10====<br />
*Безопасность Windows 10 не позволит пользователю без прав администратора обновлять приложения из Интернета (если только это не приложение Магазина Windows). На мой взгляд, это разумная политика, и LazAutoUpdate придерживается ее.<br />
**Если «обычный пользователь» попытается обновить приложение с помощью LazAutoUpdate, все пройдет гладко до финальной фазы «Обновление приложения». В этот момент у LazAutoUpdate появится диалоговое окно, информирующее пользователя о том, что для фактического обновления необходима учетная запись администратора.<br />
**Для пользователя с правами администратора LazAutoUpdate откроет диалоговое окно UAC (так же, как и любой установщик) и продолжит работу после нажатия «Да», чтобы выполнить обновление.<br />
**Если вы хотите обойти это (возможно, с помощью манифеста), LazAutoUpdate имеет public-свойство 'WindowsAdminCheck', которое вы можете установить в FALSE, чтобы избежать [появление] диалога.<br />
<br />
====Linux====<br />
*Linux будет выполнять обновление, даже не показывая консоль обновления, и пользователь получает беспроблемный опыт.<br />
<br><br />
----<br />
===Рабочий процесс===<br />
(Техническое объяснение)<br />
<br />
Рабочий процесс LazAutoUpdater для обновления запущенного приложения выглядит следующим образом:<br />
<br />
*Приложение загружает небольшой файл 'version.ini' из sourceforge или github с информацией о версии (это можно сделать при запуске)<br />
*Приложение сравнивается с собственной внутренней версией<br />
*Если доступна новая версия<br />
**Приложение удаляет любое содержимое локальной папки/папки обновлений<br />
**Приложение загружает, а затем распаковывает его из Интернета в локальную папку/папку обновлений.<br />
*Updater.exe копирует загруженный файл «whatsnew.txt» в папку с приложением и на несколько секунд переходит в режим сна.<br />
*Между тем приложение производит цикл проверки того, был ли скопирован файл «whatsnew.txt» в его каталог<br />
*Приложение обнаруживает «whatsnew.txt» и закрывает (другими словами, TProcess успешно запускается)<br />
*Updater копирует/обновляет/ обновляет приложение в каталоге приложения.<br />
*Updater использует TProcess для запуска обновленного приложения<br />
*В Form.Show приложение отображает «whatsnew.txt», а затем удаляет его.<br />
<br />
Пользователь видит:<br />
*Диалоговое окно: "Доступна новая версия ххх. Хотите скачать?" Да/Нет<br />
* Если Да, нажмите:<br />
**Загрузка происходит в фоновом режиме (через фоновый поток). Необязательный «счетчик загрузки» отображается для обозначения прогресса [загрузки].<br />
**Пользователю запрещено закрывать приложение во время загрузки (в Form.CloseQuery)<br />
**Диалоговое окно: "Обновление загружено. Нажмите OK, чтобы установить его и перезапустить xxx сейчас" OK<br />
**Пользователь нажимает ОК<br />
**Консоль (окно DOS в Windows) открывается автоматически, а приложение закрывается. Консоль сообщает: «Пожалуйста, подождите, обновляется ххх»<br />
**Через пару секунд консоль исчезает, и запускается новая версия приложения.<br />
**Как только отображается главное окно, отображается информационное окно «Что нового» с кнопкой «ОК»<br />
**Пользователь нажимает кнопку ОК и больше никогда не видит [эту] информацию [вновь]<br />
<br><br />
----<br />
[[Category:Components/ru]]<br />
<br />
[[User:Minesadorada|Minesadorada]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Data_type/ru&diff=124667
Data type/ru
2019-05-28T02:56:07Z
<p>Useroflazarus: /* Типы со знаком */</p>
<hr />
<div>{{Data type}}<br />
<br />
__TOC__<br />
<br />
<br />
=Общее=<br />
На этой странице представлена подборка типов данных в Free Pascal. <br><br />
'''Тип данных''' - это шаблон для [[Data field|поля данных]]. <br><br />
Тип данных поля определяет, как компилятор и процессор интерпретируют его содержимое. <br><br />
Видимость [[Data field|поля данных]] зависит от местоположения его объявления.<br />
<br />
=Целочисленные типы=<br />
==Беззнаковые типы==<br />
[[Data field|Поля данных]] целых типов без знака могут содержать только «положительные» целые числа.<br />
* [[UInt8]] - Диапазон: (0 .. 255)<br />
* [[Byte/ru|Byte]] - Диапазон: (0 .. 255)<br />
* [[UInt16]] - Диапазон: (0 .. 65535)<br />
* [[Word/ru|Word]] - Диапазон: (0 .. 65535)<br />
* [[NativeUInt]] - Диапазон: зависит от типа процессора.<br />
* [[DWord]] - эквивалентно Longword.<br />
* [[Cardinal/ru|Cardinal]] - эквивалентно Longword.<br />
* [[UInt32]] - Диапазон: (0 .. 4294967295)<br />
* [[Longword/ru|Longword]] - Диапазон: (0 .. 4294967295)<br />
* [[UInt64]] - Диапазон: (0 .. 18446744073709551615)<br />
* [[QWord]] - Диапазон: (0 .. 18446744073709551615)<br />
<br><br />
<br />
==Типы со знаком==<br />
[[Data field|Поля данных]] целых типов со знаком могут содержать положительные '''и''' отрицательные целые числа.<br />
* [[Int8]] - Диапазон: (-128 .. 127)<br />
* [[Shortint/ru|ShortInt]] - Диапазон: (-128 .. 127)<br />
* [[Int16]] - Диапазон: (-32768 .. 32767)<br />
* [[Smallint/ru|SmallInt]] - Диапазон: (-32768 .. 32767) <br />
* [[Integer/ru|Integer]] - Диапазон: это эквивалент либо Smallint, либо Longint (для 16 или 32-разрядных процессоров соответственно).<br />
* [[Int32]] - Диапазон: (-2147483648 .. 2147483647)<br />
* [[NativeInt]] - Диапазон: зависит от типа процессора.<br />
* [[Longint/ru|Longint]] - Диапазон: (-2147483648 .. 2147483647)<br />
* [[Int64/ru|Int64]] - Диапазон: (-9223372036854775808 .. 9223372036854775807)<br />
<br><br />
<br />
=Типы с плавающей точкой=<br />
[[Data field|Поля данных]] типов с плавающей точкой могут содержать:<br />
# положительные '''и''' отрицательные целые числа с возможными ошибками округления.<br />
# положительные '''и''' отрицательные числа с плавающей точкой.<br />
<br><br />
* [[Single]] - Диапазон: (1.5E-45 .. 3.4E38)<br />
* [[Real]] - Диапазон: зависит от платформы.<br />
* [[Real48]] - Диапазон: 2.9E-39 .. 1.7E38<br />
* [[Double]] - Диапазон: (5.0E-324 .. 1.7E308)<br />
* [[Extended]] - Диапазон: зависит от платформы.<br />
* [[Comp]] - Диапазон: (-2E64+1 .. 2E63-1)<br />
* [[Currency]] - Диапазон: (-922337203685477.5808 .. 922337203685477.5807)<br />
<br><br />
<br />
=Логические(булевы) типы=<br />
[[Data field|Поля данных]] логического типа содержат значения истинности.<br />
* [[Boolean]] - Диапазон: (True, False), 8 Bit<br />
* [[Bytebool|ByteBool]] - Диапазон: (True, False), 8 Bit<br />
* [[Wordbool|WordBool]] - Диапазон: (True, False), 16 Bit<br />
* [[Longbool|LongBool]] - Диапазон: (True, False), 32 Bit<br />
<br><br />
<br />
=Перечислимые типы=<br />
[[Data field|Поля данных]] перечислимого типа являются «списками» (перечислениями) целочисленных беззнаковых констант.<br />
* [[Enum Type]] - Диапазон: (интегральные типы данных)<br />
<br><br />
<br />
=Символьные типы=<br />
==Типы символов с однобайтовой кодировкой==<br />
* [[Char]] - Постоянная длина: 1 байт, представление: 1 символ.<br />
* [[Shortstring|ShortString]] - Максимальная длина: 255 символов.<br />
* [[String]] - Максимальная длина: Short String или Ansistring (зависит от используемого параметра компилятора).<br />
* [[PChar]] - Указатель на строку с нулевым символом на конце без ограничения длины.<br />
* [[Ansistring|AnsiString]] - Нет ограничений по длине.<br />
* [[Pansichar|PAnsiChar]] - Указатель на строку с нулевым символом в конце без ограничения длины.<br />
Смотрите обзор различных [[Character_and_string_types/ru|типов символов и строк]].<br />
<br><br />
<br />
== Типы символов с многобайтовой кодировкой==<br />
Кодировка с 2 или 4 байтами зависит от [используемой операционной] системы.<br><br />
* [[Widechar|WideChar]] - Постоянная длина: 2 или 4 байта, представление: 1 символ.<br />
* [[Widestring|WideString]] - Нет ограничений по длине.<br />
* [[Pwidechar|PWideChar]] - Указатель на терминированную строку с нулевым символом на конце без ограничения длины.<br />
* [[Unicodechar|UnicodeChar]] - Постоянная длина: 2 или 4 байта, представление: 1 символ.<br />
* [[Unicodestring|UnicodeString]] - Нет ограничений по длине.<br />
* [[Punicodechar|PUnicodeChar]] - Указатель на терминированную Unicode-строку с нулевым символом на конце без ограничения длины.<br />
Смотрите обзор различных [[Character_and_string_types/ru|типов символов и строк]].<br />
<br><br />
<br />
=Вариантные типы=<br />
*[[Variant]]<br />
*[[Olevariant]]<br />
<br><br />
<br />
=Константы=<br />
*Нетипизированные константы<br />
**[[Const]] - Можно использовать только простые типы данных.<br />
*Типизированные константы<br />
**[[Const]] - Можно использовать простые типы данных, а также записи и массивы.<br />
*Resource Strings<br />
**[[Resourcestring|Resourcestring]] - Используется для локализации (доступно не во всех режимах компиляции).<br />
<br><br />
<br />
=Структурные типы=<br />
* [[Array/ru|Array]] - Размер массива зависит от типа и количества элементов, которые он содержит.<br />
* [[Record/ru|Record]] - Сочетание нескольких типов данных.<br />
* [[Set/ru|Set]] - Набор элементов порядкового типа; размер зависит от количества элементов в нем.<br />
<br><br />
<br />
=Типы поддиапазонов=<br />
* [[subrange types|Типы поддиапазонов]] являются подмножеством базового типа.<br />
<br><br />
<br />
=Указатель=<br />
* [[Pointer/ru|Указатель]] - Размер зависит от типа процессора.<br />
<br><br />
<br />
=Классы и объекты=<br />
* [[Object]] - Разработано под Turbo Pascal 5.5 для DOS и предшественников класса.<br />
* [[Class/ru|Class]] - Разработано под Delphi 1.0 для Windows и наследников объекта.<br />
<br><br />
<br><br />
{{AutoCategory}}[[Category:Data types]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Data_type/ru&diff=124666
Data type/ru
2019-05-28T02:54:47Z
<p>Useroflazarus: /* Беззнаковые типы */</p>
<hr />
<div>{{Data type}}<br />
<br />
__TOC__<br />
<br />
<br />
=Общее=<br />
На этой странице представлена подборка типов данных в Free Pascal. <br><br />
'''Тип данных''' - это шаблон для [[Data field|поля данных]]. <br><br />
Тип данных поля определяет, как компилятор и процессор интерпретируют его содержимое. <br><br />
Видимость [[Data field|поля данных]] зависит от местоположения его объявления.<br />
<br />
=Целочисленные типы=<br />
==Беззнаковые типы==<br />
[[Data field|Поля данных]] целых типов без знака могут содержать только «положительные» целые числа.<br />
* [[UInt8]] - Диапазон: (0 .. 255)<br />
* [[Byte/ru|Byte]] - Диапазон: (0 .. 255)<br />
* [[UInt16]] - Диапазон: (0 .. 65535)<br />
* [[Word/ru|Word]] - Диапазон: (0 .. 65535)<br />
* [[NativeUInt]] - Диапазон: зависит от типа процессора.<br />
* [[DWord]] - эквивалентно Longword.<br />
* [[Cardinal/ru|Cardinal]] - эквивалентно Longword.<br />
* [[UInt32]] - Диапазон: (0 .. 4294967295)<br />
* [[Longword/ru|Longword]] - Диапазон: (0 .. 4294967295)<br />
* [[UInt64]] - Диапазон: (0 .. 18446744073709551615)<br />
* [[QWord]] - Диапазон: (0 .. 18446744073709551615)<br />
<br><br />
<br />
==Типы со знаком==<br />
[[Data field|Поля данных]] целых типов со знаком могут содержать положительные '''и''' отрицательные целые числа.<br />
* [[Int8]] - Диапазон: (-128 .. 127)<br />
* [[Shortint|ShortInt]] - Диапазон: (-128 .. 127)<br />
* [[Int16]] - Диапазон: (-32768 .. 32767)<br />
* [[Smallint|SmallInt]] - Диапазон: (-32768 .. 32767) <br />
* [[Integer]] - Диапазон: это эквивалент либо Smallint, либо Longint (для 16 или 32-разрядных процессоров соответственно).<br />
* [[Int32]] - Диапазон: (-2147483648 .. 2147483647)<br />
* [[NativeInt]] - Диапазон: зависит от типа процессора.<br />
* [[Longint]] - Диапазон: (-2147483648 .. 2147483647)<br />
* [[Int64]] - Диапазон: (-9223372036854775808 .. 9223372036854775807)<br />
<br><br />
<br />
=Типы с плавающей точкой=<br />
[[Data field|Поля данных]] типов с плавающей точкой могут содержать:<br />
# положительные '''и''' отрицательные целые числа с возможными ошибками округления.<br />
# положительные '''и''' отрицательные числа с плавающей точкой.<br />
<br><br />
* [[Single]] - Диапазон: (1.5E-45 .. 3.4E38)<br />
* [[Real]] - Диапазон: зависит от платформы.<br />
* [[Real48]] - Диапазон: 2.9E-39 .. 1.7E38<br />
* [[Double]] - Диапазон: (5.0E-324 .. 1.7E308)<br />
* [[Extended]] - Диапазон: зависит от платформы.<br />
* [[Comp]] - Диапазон: (-2E64+1 .. 2E63-1)<br />
* [[Currency]] - Диапазон: (-922337203685477.5808 .. 922337203685477.5807)<br />
<br><br />
<br />
=Логические(булевы) типы=<br />
[[Data field|Поля данных]] логического типа содержат значения истинности.<br />
* [[Boolean]] - Диапазон: (True, False), 8 Bit<br />
* [[Bytebool|ByteBool]] - Диапазон: (True, False), 8 Bit<br />
* [[Wordbool|WordBool]] - Диапазон: (True, False), 16 Bit<br />
* [[Longbool|LongBool]] - Диапазон: (True, False), 32 Bit<br />
<br><br />
<br />
=Перечислимые типы=<br />
[[Data field|Поля данных]] перечислимого типа являются «списками» (перечислениями) целочисленных беззнаковых констант.<br />
* [[Enum Type]] - Диапазон: (интегральные типы данных)<br />
<br><br />
<br />
=Символьные типы=<br />
==Типы символов с однобайтовой кодировкой==<br />
* [[Char]] - Постоянная длина: 1 байт, представление: 1 символ.<br />
* [[Shortstring|ShortString]] - Максимальная длина: 255 символов.<br />
* [[String]] - Максимальная длина: Short String или Ansistring (зависит от используемого параметра компилятора).<br />
* [[PChar]] - Указатель на строку с нулевым символом на конце без ограничения длины.<br />
* [[Ansistring|AnsiString]] - Нет ограничений по длине.<br />
* [[Pansichar|PAnsiChar]] - Указатель на строку с нулевым символом в конце без ограничения длины.<br />
Смотрите обзор различных [[Character_and_string_types/ru|типов символов и строк]].<br />
<br><br />
<br />
== Типы символов с многобайтовой кодировкой==<br />
Кодировка с 2 или 4 байтами зависит от [используемой операционной] системы.<br><br />
* [[Widechar|WideChar]] - Постоянная длина: 2 или 4 байта, представление: 1 символ.<br />
* [[Widestring|WideString]] - Нет ограничений по длине.<br />
* [[Pwidechar|PWideChar]] - Указатель на терминированную строку с нулевым символом на конце без ограничения длины.<br />
* [[Unicodechar|UnicodeChar]] - Постоянная длина: 2 или 4 байта, представление: 1 символ.<br />
* [[Unicodestring|UnicodeString]] - Нет ограничений по длине.<br />
* [[Punicodechar|PUnicodeChar]] - Указатель на терминированную Unicode-строку с нулевым символом на конце без ограничения длины.<br />
Смотрите обзор различных [[Character_and_string_types/ru|типов символов и строк]].<br />
<br><br />
<br />
=Вариантные типы=<br />
*[[Variant]]<br />
*[[Olevariant]]<br />
<br><br />
<br />
=Константы=<br />
*Нетипизированные константы<br />
**[[Const]] - Можно использовать только простые типы данных.<br />
*Типизированные константы<br />
**[[Const]] - Можно использовать простые типы данных, а также записи и массивы.<br />
*Resource Strings<br />
**[[Resourcestring|Resourcestring]] - Используется для локализации (доступно не во всех режимах компиляции).<br />
<br><br />
<br />
=Структурные типы=<br />
* [[Array/ru|Array]] - Размер массива зависит от типа и количества элементов, которые он содержит.<br />
* [[Record/ru|Record]] - Сочетание нескольких типов данных.<br />
* [[Set/ru|Set]] - Набор элементов порядкового типа; размер зависит от количества элементов в нем.<br />
<br><br />
<br />
=Типы поддиапазонов=<br />
* [[subrange types|Типы поддиапазонов]] являются подмножеством базового типа.<br />
<br><br />
<br />
=Указатель=<br />
* [[Pointer/ru|Указатель]] - Размер зависит от типа процессора.<br />
<br><br />
<br />
=Классы и объекты=<br />
* [[Object]] - Разработано под Turbo Pascal 5.5 для DOS и предшественников класса.<br />
* [[Class/ru|Class]] - Разработано под Delphi 1.0 для Windows и наследников объекта.<br />
<br><br />
<br><br />
{{AutoCategory}}[[Category:Data types]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=CopyFile/ru&diff=124614
CopyFile/ru
2019-05-23T16:44:55Z
<p>Useroflazarus: Created page with "{{CopyFile}} Модуль: Lazarus fileutil <syntaxhighlight> // флаги для копирования type TCopyFileFlag = ( cffOverwriteFile, cff..."</p>
<hr />
<div>{{CopyFile}}<br />
<br />
Модуль: Lazarus [[fileutil/ru|fileutil]]<br />
<br />
<syntaxhighlight><br />
// флаги для копирования<br />
type<br />
TCopyFileFlag = (<br />
cffOverwriteFile,<br />
cffCreateDestDirectory,<br />
cffPreserveTime<br />
);<br />
TCopyFileFlags = set of TCopyFileFlag;<br />
<br />
function CopyFile(const SrcFilename, DestFilename: string): boolean;<br />
function CopyFile(const SrcFilename, DestFilename: string; PreserveTime: boolean): boolean;<br />
function CopyFile(const SrcFilename, DestFilename: string; Flags: TCopyFileFlags=[cffOverwriteFile]): boolean;<br />
</syntaxhighlight><br />
<br />
'''copyfile''' копирует файл из места ''SrcFilename'' в место ''DestFilename''. При желании можно сохранить метку времени файла (флаг ''cffPreserveTime''). <br />
<br />
Пример:<br />
<syntaxhighlight><br />
uses <br />
...<br />
fileutil<br />
...<br />
CopyFile('c:\autoexec.bat','c:\windows\temp\autoexec.bat.backup');<br />
</syntaxhighlight><br />
<br />
'''Результат работы функции''' - вернёт [[True/ru|True]] при успешном копировании и [[False/ru|False]] в противном случае.<br />
<br />
{{Note|Если вы хотите использовать данную функцию в консольных программах, вам необходимо добавить модуль '''LazUtils''', который не будет ''тянуть'' за собой весь пакет [[LCL/ru|LCL]]}}</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=fileutil/ru&diff=124560
fileutil/ru
2019-05-14T17:54:29Z
<p>Useroflazarus: Created page with "{{fileutil}} Модуль '''fileutil''' содержит функции и процедуры, обеспечивающие совместимость с одноименн..."</p>
<hr />
<div>{{fileutil}}<br />
<br />
Модуль '''fileutil''' содержит функции и процедуры, обеспечивающие совместимость с одноименным (FileUtil) модулем Delphi.<br />
Файловые процедуры, работающие с именами файлов, которые содержат символы UTF8, находятся в модуле [[LazFileUtils]].<br />
<br />
// атрибуты и состояния файлов<br />
function CompareFilenames(const Filename1, Filename2: string): integer; inline;<br />
function CompareFilenamesIgnoreCase(const Filename1, Filename2: string): integer; inline;<br />
function CompareFilenames(const Filename1, Filename2: string; ResolveLinks: boolean): integer;<br />
function CompareFilenames(Filename1: PChar; Len1: integer; Filename2: PChar; Len2: integer; ResolveLinks: boolean): integer;<br />
function FilenameIsAbsolute(const TheFilename: string):boolean; inline;<br />
function FilenameIsWinAbsolute(const TheFilename: string):boolean; inline;<br />
function FilenameIsUnixAbsolute(const TheFilename: string):boolean; inline;<br />
procedure CheckIfFileIsExecutable(const AFilename: string); inline;<br />
procedure CheckIfFileIsSymlink(const AFilename: string); inline;<br />
function FileIsReadable(const AFilename: string): boolean; inline;<br />
function FileIsWritable(const AFilename: string): boolean; inline;<br />
function FileIsText(const AFilename: string): boolean; inline;<br />
function FileIsText(const AFilename: string; out FileReadable: boolean): boolean; inline;<br />
function FileIsExecutable(const AFilename: string): boolean; inline;<br />
function FileIsSymlink(const AFilename: string): boolean; inline;<br />
function FileIsHardLink(const AFilename: string): boolean; inline;<br />
function FileSize(const Filename: string): int64; overload; inline;<br />
function GetFileDescription(const AFilename: string): string; inline;<br />
function ReadAllLinks(const Filename: string; ExceptionOnError: boolean): string; // если ссылка "битая" то возвращено будет значение ''<br />
function TryReadAllLinks(const Filename: string): string; // если ссылка "битая" то возвращено будет значение Filename <br />
<br />
// директории<br />
function DirPathExists(const FileName: String): Boolean; inline;<br />
function ForceDirectory(DirectoryName: string): boolean; inline;<br />
function DeleteDirectory(const DirectoryName: string; OnlyChildren: boolean): boolean;<br />
function ProgramDirectory: string;<br />
function DirectoryIsWritable(const DirectoryName: string): boolean; inline;<br />
<br />
// составляющие части имён файлов<br />
function ExtractFileNameOnly(const AFilename: string): string; inline;<br />
function ExtractFileNameWithoutExt(const AFilename: string): string;<br />
function CompareFileExt(const Filename, Ext: string; CaseSensitive: boolean): integer; overload; inline;<br />
function CompareFileExt(const Filename, Ext: string): integer; overload; inline;<br />
function FilenameIsPascalUnit(const Filename: string): boolean;<br />
function AppendPathDelim(const Path: string): string; inline;<br />
function ChompPathDelim(const Path: string): string; inline;<br />
function TrimFilename(const AFilename: string): string; inline;<br />
function CleanAndExpandFilename(const Filename: string): string; inline;<br />
function CleanAndExpandDirectory(const Filename: string): string; inline;<br />
function CreateAbsoluteSearchPath(const SearchPath, BaseDirectory: string): string;<br />
function CreateRelativePath(const Filename, BaseDirectory: string; UsePointDirectory: boolean = false; AlwaysRequireSharedBaseFolder: Boolean = True): string; inline;<br />
function CreateAbsolutePath(const Filename, BaseDirectory: string): string;<br />
function FileIsInPath(const Filename, Path: string): boolean;<br />
function FileIsInDirectory(const Filename, Directory: string): boolean; <br />
<br />
// поиск файлов<br />
type<br />
TSearchFileInPathFlag = (<br />
sffDontSearchInBasePath,<br />
sffSearchLoUpCase<br />
);<br />
TSearchFileInPathFlags = set of TSearchFileInPathFlag;<br />
const<br />
AllDirectoryEntriesMask = '*';<br />
<br />
function GetAllFilesMask: string; inline;<br />
function GetExeExt: string; inline;<br />
function SearchFileInPath(const Filename, BasePath, SearchPath, Delimiter: string; Flags: TSearchFileInPathFlags): string;<br />
function SearchAllFilesInPath(const Filename, BasePath, SearchPath, Delimiter: string; Flags: TSearchFileInPathFlags): TStrings;<br />
function FindDiskFilename(const Filename: string): string;<br />
function FindDiskFileCaseInsensitive(const Filename: string): string;<br />
function FindDefaultExecutablePath(const Executable: string; const BaseDir: string = ''): string;<br />
<br />
type<br />
TFileIterator = class<br />
private<br />
FPath: String;<br />
FLevel: Integer;<br />
FFileInfo: TSearchRec;<br />
FSearching: Boolean;<br />
function GetFileName: String;<br />
public<br />
procedure Stop;<br />
function IsDirectory: Boolean;<br />
public<br />
property FileName: String read GetFileName;<br />
property FileInfo: TSearchRec read FFileInfo;<br />
property Level: Integer read FLevel;<br />
property Path: String read FPath;<br />
property Searching: Boolean read FSearching;<br />
end;<br />
<br />
TFileFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryFoundEvent = procedure (FileIterator: TFileIterator) of object;<br />
TDirectoryEnterEvent = procedure (FileIterator: TFileIterator) of object;<br />
<br />
TFileSearcher = class(TFileIterator)<br />
private<br />
FMaskSeparator: char;<br />
FFollowSymLink: Boolean;<br />
FOnFileFound: TFileFoundEvent;<br />
FOnDirectoryFound: TDirectoryFoundEvent;<br />
FOnDirectoryEnter: TDirectoryEnterEvent;<br />
FFileAttribute: Word;<br />
FDirectoryAttribute: Word;<br />
procedure RaiseSearchingError;<br />
protected<br />
procedure DoDirectoryEnter; virtual;<br />
procedure DoDirectoryFound; virtual;<br />
procedure DoFileFound; virtual;<br />
public<br />
constructor Create;<br />
procedure Search(const ASearchPath: String; ASearchMask: String = '';<br />
ASearchSubDirs: Boolean = True; CaseSensitive: Boolean = False);<br />
public<br />
property MaskSeparator: char read FMaskSeparator write FMaskSeparator;<br />
property FollowSymLink: Boolean read FFollowSymLink write FFollowSymLink;<br />
property FileAttribute: Word read FFileAttribute write FFileAttribute default faAnyfile;<br />
property DirectoryAttribute: Word read FDirectoryAttribute write FDirectoryAttribute default faDirectory;<br />
property OnDirectoryFound: TDirectoryFoundEvent read FOnDirectoryFound write FOnDirectoryFound;<br />
property OnFileFound: TFileFoundEvent read FOnFileFound write FOnFileFound;<br />
property OnDirectoryEnter: TDirectoryEnterEvent read FOnDirectoryEnter write FOnDirectoryEnter;<br />
end;<br />
<br />
function [[FindAllFiles/ru|FindAllFiles]]( const SearchPath: String; SearchMask: String = ''; SearchSubDirs: Boolean = True): TStringList;<br />
function FindAllDirectories(const SearchPath: string; SearchSubDirs: Boolean = True): TStringList;<br />
<br />
// копирование файлов или целого дерева каталогов<br />
function [[CopyFile/ru|CopyFile]](const SrcFilename, DestFilename: string; Flags: TCopyFileFlags=[cffOverwriteFile]): boolean;<br />
function [[CopyFile/ru|CopyFile]](const SrcFilename, DestFilename: string; PreserveTime: boolean): boolean;<br />
function CopyDirTree(const SourceDir, TargetDir: string; Flags: TCopyFileFlags=[]): Boolean; <br />
<br />
// действия с файлами<br />
function ReadFileToString(const Filename: string): string;<br />
function GetTempFilename(const Directory, Prefix: string): string; inline; <br />
<br />
// основные функции, подобные функциям из RTL, но работающие с UTF-8 вместо системной кодировки<br />
// для AnsiToUTF8 и UTF8ToAnsi требуется менеджер с поддержкой widestring в системах Linux, BSD, MacOSX <br />
// но обычно эти системы используют UTF-8 в качестве системной кодировки, поэтому менеджер с поддержкой widestring не требуется.<br />
function NeedRTLAnsi: boolean; inline;// true if system encoding is not UTF-8<br />
procedure SetNeedRTLAnsi(NewValue: boolean); inline;<br />
function UTF8ToSys(const s: string): string; inline;// as UTF8ToAnsi but more independent of widestringmanager<br />
function SysToUTF8(const s: string): string; inline;// as AnsiToUTF8 but more independent of widestringmanager<br />
function ConsoleToUTF8(const s: string): string; inline;// converts OEM encoded string to UTF8 (used with some Windows specific functions )<br />
function UTF8ToConsole(const s: string): string; inline;// converts UTF8 string to console encoding (used by Write, WriteLn)<br />
<br />
// файловые операции<br />
function FileExistsUTF8(const Filename: string): boolean; inline;<br />
function FileAgeUTF8(const FileName: string): Longint; inline;<br />
function DirectoryExistsUTF8(const Directory: string): Boolean; inline;<br />
function ExpandFileNameUTF8(const FileName: string): string; inline;<br />
function ExpandUNCFileNameUTF8(const FileName: string): string;<br />
function ExtractShortPathNameUTF8(Const FileName : String) : String;<br />
function FindFirstUTF8(const Path: string; Attr: Longint; out Rslt: TSearchRec): Longint; inline;<br />
function FindNextUTF8(var Rslt: TSearchRec): Longint; inline;<br />
procedure FindCloseUTF8(var F: TSearchrec); inline;<br />
function FileSetDateUTF8(const FileName: String; Age: Longint): Longint; inline;<br />
function FileGetAttrUTF8(const FileName: String): Longint; inline;<br />
function FileSetAttrUTF8(const Filename: String; Attr: longint): Longint; inline;<br />
function DeleteFileUTF8(const FileName: String): Boolean; inline;<br />
function RenameFileUTF8(const OldName, NewName: String): Boolean; inline;<br />
function FileSearchUTF8(const Name, DirList : String; ImplicitCurrentDir : Boolean = True): String; inline;<br />
function FileIsReadOnlyUTF8(const FileName: String): Boolean; inline;<br />
function GetCurrentDirUTF8: String; inline;<br />
function SetCurrentDirUTF8(const NewDir: String): Boolean; inline;<br />
function CreateDirUTF8(const NewDir: String): Boolean; inline;<br />
function RemoveDirUTF8(const Dir: String): Boolean; inline;<br />
function ForceDirectoriesUTF8(const Dir: string): Boolean; inline;<br />
function FileOpenUTF8(Const FileName : string; Mode : Integer) : THandle; inline;<br />
function FileCreateUTF8(Const FileName : string) : THandle; overload; inline;<br />
function FileCreateUTF8(Const FileName : string; Rights: Cardinal) : THandle; overload; inline; <br />
<br />
// работа с параметрами (переменными) окружения<br />
function ParamStrUTF8(Param: Integer): string; inline;<br />
function GetEnvironmentStringUTF8(Index: Integer): string; inline;<br />
function GetEnvironmentVariableUTF8(const EnvVar: string): String; inline;<br />
function GetAppConfigDirUTF8(Global: Boolean; Create: boolean = false): string; inline;<br />
function GetAppConfigFileUTF8(Global: Boolean; SubDir: boolean = false; CreateDir: boolean = false): string; inline; <br />
<br />
// прочее<br />
function SysErrorMessageUTF8(ErrorCode: Integer): String; inline;</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Reserved_word/ru&diff=124343
Reserved word/ru
2019-04-19T19:41:50Z
<p>Useroflazarus: </p>
<hr />
<div>{{Reserved word}}<br />
<br />
Зарезервированное слово - это слово, которое имеет специальное грамматическое значение в языке и не может использоваться в качестве [[Identifier/ru|идентификатора]].<br />
В этом заключается наиболее важное отличие зарезервированных слов от [[Keyword/ru|ключевых]]. Не все ключевые слова являются зарезервированными. При этом все зарезервированные являются ключевыми.<br />
<br />
См. [[Reserved words/ru|зарезервированные слова]] в [[Pascal]]<br />
<br />
[[Category:Pascal/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Reserved_word/ru&diff=124342
Reserved word/ru
2019-04-19T19:41:16Z
<p>Useroflazarus: </p>
<hr />
<div>Зарезервированное слово - это слово, которое имеет специальное грамматическое значение в языке и не может использоваться в качестве [[Identifier/ru|идентификатора]].<br />
В этом заключается наиболее важное отличие зарезервированных слов от [[Keyword/ru|ключевых]]. Не все ключевые слова являются зарезервированными. При этом все зарезервированные являются ключевыми.<br />
<br />
См. [[Reserved words/ru|зарезервированные слова]] в [[Pascal]]<br />
<br />
[[Category:Pascal/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=On/de&diff=124084
On/de
2019-04-03T18:07:59Z
<p>Useroflazarus: </p>
<hr />
<div>{{On}}<br />
<br><br />
Zurück zu den [[Reserved words/de|reservierten Wörtern]].<br><br />
<br><br />
Das reservierte Wort <b>on</b> gehört zur objektorientierten Programmierung.<br><br />
Das reservierte Wort <b>on</b> dient der Behandlung von speziellen Exceptions innerhalb des except-Blocks.<br><br />
<br><br />
Beispiel:<br><br />
<syntaxhighlight><br />
begin<br />
...<br />
try<br />
... // Aktion<br />
except<br />
on EFOpenError do // Fehlerbehandlung für eine spezielle Exception<br />
...<br />
on EOverFlow do // Fehlerbehandlung für eine spezielle Exception<br />
...<br />
else // Fehlerbehandlung für alle anderen Exceptions<br />
...<br />
end;<br />
...<br />
end;<br />
</syntaxhighlight><br />
<br><br />
<br><br />
--[[User:Olaf|Olaf]] 09:24, 1 November 2012 (UTC)<br />
[[Category:Reserved words/de]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Constructor/de&diff=124029
Constructor/de
2019-03-31T11:16:44Z
<p>Useroflazarus: </p>
<hr />
<div>{{Constructor}}<br />
<br><br />
Zurück zu den [[Reserved words/de|reservierten Wörtern]].<br><br />
<br><br />
Das Schlüsselwort <b>constructor</b> gehört zur objektorientierten Programmierung.<br><br />
Ein Konstruktor dient zum initialisieren der Klasse.<br><br />
Einfache Klassen, die keine Initialisierung benötigen, brauchen keinen Konstruktor.<br><br />
Ein selbst geschriebene Klasse die selbst keinen Konstruktor hat kann von Ihrer Elternklasse (sofern diese einen Konstruktor hat) den Konstruktor erben.<br><br />
<br><br />
Beispiel:<br><br />
<syntaxhighlight><br />
// Klassendefinition<br />
type<br />
TKlasse = class<br />
end;<br />
<br />
var<br />
// Variable vom Typ der Klasse bekannt machen (deklarieren)<br />
clsKlasse: TKlasse;<br />
<br />
begin<br />
...<br />
// Klasse erstellen<br />
clsKlasse := TKlasse.Create; // Create ruft den von der Elternklasse geerbten Konstruktor auf<br />
...<br />
end;<br />
</syntaxhighlight><br />
<br><br />
<br><br />
--[[User:Olaf|Olaf]] 17:18, 24 October 2012 (UTC)<br />
[[Category:Reserved words/de]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Constructor/es&diff=124028
Constructor/es
2019-03-31T11:16:36Z
<p>Useroflazarus: </p>
<hr />
<div>{{Constructor}}<br />
[[category:Español]][[category:Castellano]]<br />
<br />
La palabra reservada <b>constructor</b> es parte de la programación orientada a objetos y se utiliza para inicializar una clase.<br />
Las clases simples que no requieren inicialización, no necesitan un constructor.<br />
Una clase auto-escrita que no tiene ningún constructor puede heredar el constructor de su clase principal (si tiene un constructor).<br />
<br />
Ejemplo:<br />
<syntaxhighlight><br />
// Definición de la calse<br />
type<br />
TClase = class<br />
end;<br />
<br />
var <br />
unaClase: TClase; // Declarar una variable del tipo TClase<br />
<br />
begin<br />
...<br />
// Crear la clase<br />
unaClase := TClase.Create; // Create invoca al constructor heredado de la clase primaria<br />
...<br />
end;<br />
</syntaxhighlight><br />
<br />
[[Category:Reserved words/es]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Constructor/ru&diff=124026
Constructor/ru
2019-03-31T11:15:27Z
<p>Useroflazarus: Created page with "{{Constructor}} Зарезервированное слово '''constructor''' относится к object-oriented programming/ru|объектно-..."</p>
<hr />
<div>{{Constructor}}<br />
<br />
[[Reserved word/ru|Зарезервированное слово]] '''constructor''' относится к [[object-oriented programming/ru|объектно-ориентированному программированию]]. Оно является [[Method/ru|методом]] для создания [[Class/ru|класса]], который создает объект класса.<br />
<br />
Пример: <br />
<br />
<syntaxhighlight><br />
// определение класса<br />
type<br />
TKlasse = class<br />
end;<br />
<br />
var<br />
// объявление переменной типа класса<br />
clsKlasse: TKlasse;<br />
<br />
begin<br />
...<br />
// создание класса<br />
clsKlasse := TKlasse.Create; <br />
...<br />
end;<br />
</syntaxhighlight><br />
<br />
== См. также ==<br />
<br />
* [[Destructor/ru|Destructor]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Installing_Lazarus/ru&diff=124005
Installing Lazarus/ru
2019-03-30T16:57:55Z
<p>Useroflazarus: /* Обзор */</p>
<hr />
<div>{{Installing Lazarus}}<br />
<br />
== Обзор ==<br />
<br />
Ознакомится с более подробной инструкцией по сборке можно [http://www.stack.nl/~marcov/buildfaq.pdf здесь].<br />
<br />
Для загрузки исполняемых файлов Lazarus смотрите [http://wiki.lazarus.freepascal.org/Getting_Lazarus/ru#Загрузка_и_установка_релизной_версии_Lazarus Загрузка и установка релизной версии Lazarus]<br />
<br />
Для тех, кто просто хочет установить Lazarus и начать использовать его для написания программ, наиболее простым способом является загрузка и установка последней стабильной версии исполняемых файлов (таких, как rpm-пакеты для Linux, установочные exe-файлы для Windows или dmg-пакеты для Mac OS X). Вы можете прочитать об этом в разделах "Исполняемые файлы FPC" для Linux и Windows или в первых параграфах в разделах установки Lazarus в средах Linux или Windows; оставшуюся часть информации можно спокойно пропустить.<br />
<br />
<br />
<br />
Для тех, кто хочет принимать участие в разработке компилятора, IDE или использовать актуальные инструменты, необходима установка из исходных файлов.<br />
<br />
Lazarus состоит из двух основных частей:<br />
* LCL - Lazarus Component Library, библиотека компонентов Lazarus<br />
* IDE - RAD, среда быстрой разработки<br />
<br />
В свою очередь они зависят от:<br />
* FPC - компилятор Free Pascal<br />
* FCL - Free Pascal Component library, библиотека компонентов компилятора FPC, содержащая большое количество невизуальных компонентов, используемых в Lazarus<br />
<br />
=== Системные требования Lazarus ===<br />
<br />
# компилятор Free Pascal, пакеты и исходные файлы. (*важно*: той же версии/даты сборки)<br />
# поддерживаемый набор виджетов<br />
#:;Win32: может быть использован внутренний набор Win32 API или набор виджетов Qt.<br />
#:;Linux/xxxBSD: GTK+ 2.x or Qt : Most Linux distributions and *BSDs already install the GTK+ 2.x libraries. You can also find them at http://www.gtk.org. <br>Qt is also supported with all distributions (auto installed if you prefer KDE). <br> <br />
#:;Mac OS X: You need the Apple developer tools. See Installing under Mac OS X below. Qt can be used too.<br />
<br />
FAQ - Frequently Asked Questions (часто задаваемые вопросы) доступны по ссылке http://www.lazarus.freepascal.org . Некоторые вопросы можно найти в файле 'FAQ'.<br />
<br />
Qt widget set is supported on Linux 32/64,Win32/64,Mac OS X, Haiku and embedded linux (qtopia) platforms.<br><br />
Более подробно узнать про установку можно по ссылке http://wiki.lazarus.freepascal.org/index.php/Qt_Interface <br><br />
<br />
В следующих разделах описывается как можно получить компилятор Free Pascal и как правильно установить Lazarus.<br />
<br />
== Краткое руководство ==<br />
<br />
Хотя остальная часть этой страницы содержит много ценной информации, многим пользователям может понадобиться не более, чем следующие «краткие руководства» - возможно?<br />
<br />
==== Linux ====<br />
<br />
* См. [[Installing Lazarus on Linux]]<br />
<br />
==== Mac OSX ====<br />
<br />
* См. [[Installing Lazarus on MacOS X]]<br />
<br />
==== Windows ====<br />
<br />
Безусловно, самый простой и распространенный способ установки Lazarus на Windows - это перейти на [https://sourceforge.net/projects/lazarus/files/ сайт загрузки Lazarus] SourceForge, выбрать подходящий комбинированный пакет FPC/Lazarus, скачать и установить.<br />
<br />
== Установка компилятора Free Pascal ==<br />
<br />
Существует подробная инструкция, как устанавливать и собирать компилятор Free Pascal, доступная по ссылке http://www.stack.nl/~marcov/buildfaq.pdf - для некоторых пользователей она может быть слишком подробной, но при этом в ней дана исчерпывающая информация.<br />
<br />
Для Lazarus 1.8 требуется fpc (Free Pascal) версии 3.0.4 или выше, а также необходимо, чтобы библиотеки fpc (исполняемые файлы) и исходные файлы fpc были одинаковых версий.<br />
<br />
=== Установка Free Pascal в Linux ===<br />
<br />
==== Исполняемые файлы FPC ====<br />
<br />
Последнюю стабильную версию Free Pascal 3.0.4 можно получить на сайте Free Pascal (перейдите по ссылке http://www.freepascal.org/download.var и далее выберите зеркало) или на сайте SourceForge (http://sourceforge.net/projects/lazarus). <br />
<br />
В разделе загрузок Lazarus (http://www.lazarus.freepascal.org ) можно получить RPM- или DEB-пакеты компилятора Free Pascal (компилятор для Linux). Если вам не нужны RPM или debian дистрибутивы, вы можете загрузить и установить tar-архивы с http://www.freepascal.org. Если вы хотите самостоятельно скомпилировать исполняемые файлы, смотрите в разделе BSD.<br />
<br />
Инструкции: <br />
<br />
{{Warning| если вы '''не используете RPM- или debian-пакеты''' (даже если вы планируете использовать другие) лучшим вариантом будет получение актуальной стабильной версии fpc (на данный момент 3.0.4) и установка Lazarus из исходных файлов.}}<br><br />
<br />
Запустите Linux и войдите в систему под '''root''''ом.<br />
<br />
Загрузите актуальные версии файлов с https://sourceforge.net/projects/lazarus/files/.<br />
Например:<br />
:* fpc-3.0.4-1.i686.rpm<br />
:* fpc-src-3.0.4-1.i686.rpm<br />
:* lazarus-1.8.0-1.i686.rpm<br />
и установите их с помощью команды:<br />
:* rpm -Uvh *.rpm<br />
<br />
Пользователям системы Debian рекомендуется использовать deb-пакеты, но можно использовать и другие (внимание: они не создают fpc.cfg), например установить tar-архивы.<br />
<br />
==== Исходные файлы FPC ====<br />
Исходные файлы FPC хранятся в репозитории Subversion (SVN), в котором отслеживаются все изменения.<br />
Если у вас уже есть исходные файлы, пожалуйста, посмотрите инструкции по их установке в разделе [[#Installing Free Pascal from source under Linux/BSD]].<br />
<br />
===== Загрузка ежедневных исходных файлов из ветки разработки =====<br />
Вы можете загрузить ежедневно обновляемые исходные файлы в форме упакованных ночных сборок из репозитория SVN: они обновляются ежедневно и отображают состояние исходных файлов. Они не протестированы, могут не работать или даже привести к нарушению работы вашей системы. Файлы сохранены на сайте, который содержит архив SVN. Версия FPC может варьироваться.<br />
Расположены по адресу: [http://www.hu.freepascal.org/lazarus/]<br />
<br />
===== Обновление исходных файлов с помощью SVN =====<br />
В качестве альтернативы ежедневным zip-файлам исходников SVN, репозиторий SVN сделан доступным для всех с доступом только для чтения. Это означает, что вы можете получить прямой доступ к коду, и у вас будут действительно доступные исходники на последний момент. Это также метод, который требует меньшей полосы пропускания после первой загрузки (извлечение в SVN lingo).<br />
<br />
===== Получение исходных файлов =====<br />
Как это можно сделать?<br />
Для начала вам необходим установленный клиент для SVN. Используйте менеджер установки и установите утилиту, например, TortoiseSVN для Windows или смотрите подробней на сайте [http://subversion.tigris.org/].<br />
<br />
Использование командной строки SVN: измените текущую директорию (cd) на родительскую директорию, которая используется для работы, например, чтобы получить полные исходные файлы из репозитория в поддиректорию fpc домашней директории и напишите<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn checkout http://svn.freepascal.org/svn/fpc/trunk fpc<br />
</syntaxhighlight><br />
<br />
Для обновления исходных файлов, загруженных с помощью команды, указанной выше<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn update fpc<br />
</syntaxhighlight><br />
<br />
===== Получение отдельных веток =====<br />
Если текущая версия транка находится в состоянии быстрого изменения и не подходит для большого использования, если вы не хотите работать с самим компилятором, вы можете остаться на версии, которая обновлена с исправлениями.<br />
Чтобы сделать это, вы должны найти стабильную ветку, которую вы хотите отслеживать, вместо девелоперской '''trunk''' версии по умолчанию.<br />
Пример ниже показывает, как вы можете отслеживать версию fixes_2_6; конечно замените [номер версии] по мере необходимости в зависимости от того, какие ветки вы хотите отслеживать.<br />
<br />
Этот пример хранит исправления в другой папке в вашем домашнем каталоге - не имеет смысла помещать две версии исходного кода в один каталог ...<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn checkout http://svn.freepascal.org/svn/fpc/branches/fixes_2_6 fpc_fixes_2_6<br />
</syntaxhighlight><br />
Обычное обновление:<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn update fpc_fixes_2_6<br />
</syntaxhighlight><br />
<br />
===== Документация =====<br />
Исходные файлы документации расположены в отдельном репозитории с именем fpcdocs, поэтому для их получения необходима следующая команда<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn checkout http://svn.freepascal.org/svn/fpcdocs/trunk fpcdocs<br />
</syntaxhighlight><br />
<br />
Если вы хотите больше узнать о subversion, прочитайте эту отличную [http://svnbook.red-bean.com/ книгу по Subversion], которая также бесплатно доступна в разных форматах.<br />
<br />
Более подробную информацию смотрите на [http://www.freepascal.org/develop.var сайте Free Pascal].<br />
<br />
=== Установка Free Pascal в Windows ===<br />
<br />
==== Исполняемые файлы FPC для Windows ====<br />
<br />
Самым простым способом получения установочных файлов Free Pascal является загрузка текущей стабильной версии исполняемых файлов Lazarus для Windows из репозитория SourceForge [http://sourceforge.net/projects/lazarus/files/] - эти файлы содержат текущие стабильные версии компилятора и необходимых библиотек Free Pascal, а также среду разработки Lazarus.<br />
<br />
Если вы хотите установить из исходных файлов читайте дальше!<br />
<br />
Вы можете загрузить zip-архив с fpc в разделе загрузок Free Pascal (перейдите по ссылке http://www.freepascal.org/download.var и далее выберите зеркало). <br />
Установка из исходных файлов -- смотрите следующий раздел, чтобы узнать как это сделать -- не для новичков, так как для этого вам необходим изначально установленный компилятор.<br />
<br />
==== Исходные файлы FPC для Windows ====<br />
<<<< Смотрите выше в разделе [[#FPC Sources|Исходные файлы FPC]] для Linux, где описано использование SVN >>>><br />
<br />
Наиболее простым способом получить исходные файлы Free Pascal является использование SVN; смотрите следующий раздел для более подробной информации. Также вы можете загрузить установочный пакет целиком -- смотрите на сайте http://www.freepascal.org/develop.var ежедневные сборки ветки 3.0.x.<br />
<br />
Исходные файлы FPC для Windows с помощью SVN<br />
<br />
Вам необходим установленный SVN-клиент, например [http://tortoisesvn.tigris.org/ TortoiseSVN], для выполнения дальнейших шагов. Точные команды отличаются для разных SVN-клиентов; приведенные ниже команды должны использоваться для SVN-клиента, который можно скачать здесь.<br />
<br />
Для начала создайте директорию, в которую вы хотите поместить исходные файлы. С этим может справиться любой пользователь. Создайте директорию для fpc (например C:\Source), после чего чего выполните следующую команду в командной строке:<br />
<syntaxhighlight lang="bash">C:\Source> svn co http://svn.freepascal.org/svn/fpc/trunk fpc</syntaxhighlight><br />
Совет: для загрузки/обновления файлов с последними изменениями вы просто можете выполнить<br />
<syntaxhighlight lang="dos"><br />
C:\> cd Source\FPC<br />
C:\Source\FPC> svn up<br />
</syntaxhighlight><br />
<br />
Смотрите: http://www.freepascal.org/down/i386/win32.var . Загрузите FPC одним большим файлом, распакуйте его и запустите install.exe. <br />
<br />
Добавьте путь к директории fpc в переменную среды:<br />
<br />
* Win98: отредактируйте autoexec.bat и добавьте строку: PATH=%PATH%;C:\pp\bin\bin\win32<br />
* WinXP/2k: Мой компьютер (правая кнопка мыши по ярлыку) -> Свойства -> Дополнительно (вкладка) -> Переменные среды -> Системные переменные -> Изменить "PATH", добавить здесь "C:\pp\bin\bin\win32".<br />
<br />
После этого перезагрузите windows.<br />
<br />
После установки исполняемых файлов FPC вы можете собирать исходные файлы FPC из subversion. <br />
<br />
Советы: <br />
* Для Windows 7 (и выше) требуются повышенные права пользователя для работы в командной строке. Щелкните правой кнопкой мыши по ярлыку "Командная строка" в меню Пуск и выберите "Запустить от имени Администратора".<br />
* YOUR-PREFIX полностью зависит от места установки FPC. При составлении данной статьи исполняемые файлы по умолчанию располагаются в директории "C:\FPC" и помещаются в "C:\FPC\3.0.4". В системе Linux сценарии "make install" были скорректированы для создания новой поддиректории ЕСЛИ версия FPC изменилась с момента последней сборки. В сценариях для Windows это не сделано. Поэтому, если вы знаете, что имя поддиректории, например 3.1.1, то вы можете указать это. Однако, по причине частой смены версий, рекомендуется просто выбрать и сохранить один PREFIX вне зависимости от версий FPC. Хорошим значением для prefix является C:\FPC, но вы также должны убедиться, что директория C:\FPC\bin\i386-win32\ добавлена в переменную среды PATH (смотрите выше, как прописать путь и изменить версию исполняемых файлов на только что скомпилированные).<br />
Инструкции:<br />
* В командной строке перейдите к расположенным исходным файлам FPC, например напишите "cd c:\Developer\FPC"<br />
* Для сборки FPC напишите "make all"<br />
* Для перезаписи существующих файлов FPC напишите "make install PREFIX=YOUR-PREFIX"<br />
* Для установки исходных файлов напишите "make install sourceinstall PREFIX=YOUR-PREFIX"<br />
<br />
==== Компиляция/установка FPC и Lazarus из исходных файлов с помощью SVN (Win32) ====<br />
<br />
14 Dec 2017 версия FPC '''3.0.4''' или '''trunk''' - версия Lazarus '''1.9.x'''<br />
<br />
===== Шаг #1: Создать каталоги и скачать исходные файлы =====<br />
Создайте следующие каталоги:<br />
c:\freepascal\<br />
c:\freepascal\binutils\<br />
c:\freepascal\binutils\i386-win32\<br />
c:\freepascal\fpc\<br />
c:\freepascal\fpc\3.0.4\<br />
c:\freepascal\laz\<br />
или для fpc из trunk:<br />
c:\freepascal\<br />
c:\freepascal\binutils\<br />
c:\freepascal\binutils\i386-win32\<br />
c:\freepascal\fpc\<br />
c:\freepascal\fpc\trunk\<br />
c:\freepascal\laz\<br />
<br />
Вам понадобится последняя ''стабильная'' версия компилятора для сборки новой версии компилятора.<br />
Скачайте файл ppc386 (сам компилятор) с FTP (по ссылке ниже) и распакуйте его в c:\freepascal\binutils\<br />
ftp://ftp.freepascal.org/pub/fpc/dist/3.0.4/bootstrap/i386-win32-ppc386.zip<br />
<br />
После установки [http://tortoisesvn.tigris.org/ TortoiseSVN] скачайте исходные файлы из SVN используя URL-адрес для каждого каталога:<br />
Dir: c:\freepascal\binutils\i386-win32\<br />
URL: http://svn.freepascal.org/svn/fpcbuild/branches/fixes_3_0/install/binw32<br />
или для fpc из trunk:<br />
Dir: c:\freepascal\binutils\i386-win32\<br />
URL: http://svn.freepascal.org/svn/fpcbuild/trunk/install/binw32<br />
<br />
<br />
<br />
Dir: c:\freepascal\fpc\3.0.4<br />
URL: http://svn.freepascal.org/svn/fpc/branches/fixes_3_0/<br />
или для fpc из trunk:<br />
Dir: c:\freepascal\fpc\trunk<br />
URL: http://svn.freepascal.org/svn/fpc/trunk/<br />
<br />
<br />
<br />
Dir: c:\freepascal\laz<br />
URL: http://svn.freepascal.org/svn/lazarus/trunk<br />
<br />
===== Шаг #2: Создать BAT-файл для компиляции FPC =====<br />
После того, как всё скачалось, нам необходимо создать BAT-файл для компиляции исходных файлов FPC.<br />
Создайте новый файл c:\freepascal\makefpc.bat и скопируйте в него следующий сценарий:<br />
<br />
<syntaxhighlight lang="dos"><br />
@echo on<br />
set myroot=c:\freepascal<br />
set myFPC=%myroot%\fpc\3.0.4<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myFPC%<br />
rd /s /q %myfpc%\examples<br />
svn cleanup . --remove-unversioned --remove-ignored<br />
make distclean all install INSTALL_PREFIX=%myFPC% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
cd /d %myFPC%\bin\i386-win32<br />
fpcmkcfg -d basepath=%myFPC% -o .\fpc.cfg <br />
copy fpc.exe %mybinutils%\i386-win32<br />
</syntaxhighlight><br />
или для fpc из trunk:<br />
<syntaxhighlight lang="dos"><br />
@echo on<br />
set myroot=c:\freepascal<br />
set myFPC=%myroot%\fpc\trunk<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myFPC%<br />
rd /s /q %myfpc%\examples<br />
svn cleanup . --remove-unversioned --remove-ignored<br />
make distclean all install INSTALL_PREFIX=%myFPC% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
cd /d %myFPC%\bin\i386-win32<br />
del fpc.cfg<br />
fpcmkcfg -d basepath=%myFPC% -o .\fpc.cfg <br />
copy fpc.exe %mybinutils%\i386-win32<br />
</syntaxhighlight><br />
<br />
Для компиляции кросс-платформенных программ в режиме x86_64 добавьте следующие строки после первой команды make:<br />
<syntaxhighlight lang="dos"><br />
make all OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=%myFPC% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
make crossinstall OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=%myFPC% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
</syntaxhighlight><br />
<br />
При использовании данных сценариев скомпилированные файлы компилятора и необходимые директории для корректной его работы будут созданы непосредственно в корневой директории, куда были загружены исходные файлы. В некоторых случаях это не удобно, например, если необходимо ''перенести'' всю директорию с компилятором на другой компьютер или просто сделать несколько директорий разных версий (или ревизий) компилятора и при необходимости пользоваться каждой из них путем выбора нужного пути в свойствах проекта. Для этого необходимо модифицировать сценарий. Ниже представлен пример сценария для создания полностью автономной директории с компилятором и необходимыми файлами (для универсальности добавлены инструкции, позволяющие собрать компилятор версий '''x86''' и '''x64'''):<br />
<br />
<syntaxhighlight lang="dos"><br />
@echo on<br />
set myroot=c:\freepascal<br />
<br />
set instdir=%myroot%\fpc\3.0.5<br />
<br />
set myFPC=%myroot%\fpc\3.0.4<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myFPC%<br />
rd /s /q %myfpc%\examples<br />
svn cleanup . --remove-unversioned --remove-ignored<br />
make distclean all install INSTALL_PREFIX=%instdir% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
make all OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=%instdir% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
make crossinstall OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=%instdir% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
cd /d %instdir%\bin\i386-win32<br />
fpcmkcfg -d basepath=%instdir% -o .\fpc.cfg<br />
copy fpc.exe %mybinutils%\i386-win32<br />
<br />
xcopy %myFPC%\rtl %instdir%\source\rtl /H /Y /C /R /S /I<br />
xcopy %myFPC%\packages %instdir%\source\packages /H /Y /C /R /S /I<br />
</syntaxhighlight><br />
<br />
В данном случае дополнительная переменная '''instdir''' задает новую директорию для компилятора. Последние 2 команды предназначены для копирования содержимого директорий '''rtl''' и '''packages''' в новую директорию компилятора.<br />
<br />
Совет: при переносе в другое место полученной директории для корректной работы компилятора необходимо отредактировать файл '''fpc.cfg'''.<br />
<br />
===== Шаг #3: Собрать и установить FPC =====<br />
С помощью командной строки (cmd.exe) перейдите в директорию c:\freepascal и выполните сценарий, который мы только что написали: <br />
<br />
<syntaxhighlight lang="dos"><br />
cd /d c:\freepascal<br />
makefpc.bat<br />
</syntaxhighlight><br />
<br />
===== Шаг #4: Создать BAT-файл для компиляции Lazarus =====<br />
Если Lazarus компилируется впервые, создайте новый файл c:\freepascal\makelaz.bat и скопируйте в него следующий сценарий:<br />
<br />
<syntaxhighlight lang="dos"><br />
set myroot=c:\freepascal<br />
set myFPC=%myroot%\fpc\3.0.4<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myroot%\laz<br />
make clean all OPT="-glw2 -Xg"<br />
</syntaxhighlight><br />
или для fpc из trunk:<br />
<syntaxhighlight lang="dos"><br />
set myroot=c:\freepascal<br />
set myFPC=%myroot%\fpc\trunk<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myroot%\laz<br />
make clean all OPT="-glw2 -Xg"<br />
</syntaxhighlight><br />
<br />
<br />
Подсказка: данный BAT-файл необходимо использовать только для первой компиляции. В дальнейшем вы можете собирать Lazarus используя команду меню Tools > Build Lazarus.<br />
<br />
===== Шаг #5: Собрать Lazarus =====<br />
С помощью командной строки перейдите в директорию c:\freepascal и выполните сценарий: makelaz.bat<br />
<br />
<br />
Готово!<br />
<br />
=== Установка Free Pascal в FreeBSD/auto ===<br />
<br />
Последняя коллекция портов для FreeBSD имеет версию 3.0.4 и находится в ports/lang/fpc. Но они разбросаны по более чем 96 пакетам (!) и исходный код может быть получен из /usr/ports/distfiles/freepascal.<br />
<br />
Данная команда может быть выполнена с правами администратора (из-под root'а).<br />
<br />
<syntaxhighlight lang="bash">[]# cd /usr/ports/lang/fpc && make install && make clean</syntaxhighlight><br />
<br />
Другая возможность заключается в использовании portinstall.<br />
<br />
<syntaxhighlight lang="bash">[]# portinstall fpc</syntaxhighlight><br />
<br />
Как только fpc установлен, вы можете проверить его работоспособность просто выполнив команду<br />
<br />
<syntaxhighlight lang="bash">[]$ fpc</syntaxhighlight><br />
<br />
=== Установка Free Pascal из исходных файлов в Linux/BSD ===<br />
<br />
Для эффективности вам нужно<br />
<br />
Если у вас есть файл со всеми исходниками FPC или обоих (FPC и Lazarus):<br />
# напр., для fpc (последний снапшот на момент правки статьи) предпочтителен экспорт с [ftp://ftp.freepascal.org/fpc/snapshot/v33/ ftp] (без SVN/dirs).<br />
# снапшот исходника Lazarus.<br />
* начальный компилятор, последняя версия релиза (fpc 3.0.4 на момент правки статьи) является единственной гарантированной версией. Вы можете скачать загрузочный компилятор или использовать систему управления пакетами/программного обеспечения вашего дистрибутива, чтобы установить его<br />
<br />
Процесс сборки FPC:<br />
* Получить необходимые файлы (начиная с компилятора), исходный файл FPC или исходный svn-каталог<br />
* При использовании исходных файлов FPC: extract/de-tgz в рабочий каталог<br />
* Сборка: войдите в work/fpc/ и запустите<br />
<syntaxhighlight lang="bash"><br />
# можно использовать: <br />
export MAKE=`which make` ; echo $MAKE <br />
$MAKE all OPT='-gl' PP=/path/to/startingcompiler-name-ppc386<br />
# $MAKE применяется в linux и gmake в BSD <br />
# /path/to/ может быть пропущен, когда ppc386 прописан в путях поиска<br />
</syntaxhighlight><br />
<br />
* Установка fpc. Снова [заходим] в work/fpc, запускаем<br />
<syntaxhighlight lang="bash"><br />
$MAKE install PP=compiler/ppc386 PREFIX=$THEPREFIX<br />
#заменяем PP=compiler/ppc386 на соответствующий компилятор, если это не Intel x86<br />
#THEPREFIX= обычно это /usr/local или просто /usr (но, например, на NetBSD для портов это /usr/pkg)<br />
</syntaxhighlight><br />
<br />
* Создаем симлинк:<br />
<syntaxhighlight lang="bash"><br />
ln -s $THEPREFIX/lib/fpc/3.0.0/ppc386 $THEPREFIX/bin/ppc386<br />
</syntaxhighlight><br />
<br />
* Устанавливаем исходники:<br />
<syntaxhighlight lang="bash"><br />
$MAKE install sourceinstall PREFIX=$THEPREFIX<br />
</syntaxhighlight><br />
* Создаем симлинк к исходникам по умолчанию для Lazarus:<br />
<syntaxhighlight lang=bash><br />
ln -sf $THEPREFIX/share/src/3.0.0/fpc /usr/share/fpcsrc<br />
</syntaxhighlight><br />
<br />
* Настраиваем файл конфигурации fpc.cfg:<br />
<syntaxhighlight lang="bash">$THEPREFIX/lib/fpc/3.0.0/samplecfg $THEPREFIX/lib/fpc/3.0.0 $ETCDIR</syntaxhighlight><br />
<br />
* При желании можете проверить, выдает ли ppc386 -i (или какой-либо другой компилятор, используемый вашей архитектурой) [какую-либо] информацию, иначе будет предупреждение о том, что пользователю необходимо добавить $PREFIX/bin в его текущий путь. Попробуйте скомпилировать программу с -viwn и посмотрите, не выдаст ли это ошибку.<br />
<br />
Примечание:<br />
* Если вам нужны списки пакетов fpcmake, вам нужно сгенерировать или предоставить их самостоятельно ([с помощью] порта или в дополнительном архиве) в любом случае, выполнить фиктивную установку в /tmp/pack и определить файлы, установленные с <syntaxhighlight lang="bash">find . >ll</syntaxhighlight><br />
<br />
* $THEPREFIX и $ETCDIR должен [иметь возможность] быть настраиваемым пользователем. В противном случае локальная установка невозможна.<br />
<br />
* BSDHIER=1 для всех команд make действуют соглашения об иерархии BSD.<br />
<br />
=== Установка Free Pascal в Mac OS X ===<br />
<br />
См [[Installing Lazarus on MacOS X|Установка Lazarus на MacOS X]]<br />
<br />
==Установка Lazarus==<br />
<br />
===Установка Lazarus в Linux===<br />
<br />
==== Ubuntu / Debian ====<br />
<br />
Рекомендуется использовать установщик обновлений [[fpcup|fpcUP]] для начинающих пользователей Lazarus, который устанавливает FPC и Lazarus за один раз в единую структуру подкаталогов (~/development).<br />
<br />
----<br />
([[User:Zoltanleo|Прим.перев.]]: а еще лучше использовать форк этой утилиты [[fpcupdeluxe]] от [https://github.com/LongDirtyAnimAlf LongDirtyAnimAlf], последний релиз которой всегда можно скачать [https://github.com/LongDirtyAnimAlf/fpcupdeluxe/releases здесь])<br />
----<br />
<br />
Чтобы получить текущую рабочую установку Lazarus, загрузите файлы .deb для Free Pascal и Lazarus из репозитория SourceForge. Вот как: [[Lazarus release version for Ubuntu|Получение Lazarus из нашего репозитория Ubuntu]].<br />
<br />
Обратите внимание, что установка из исходных кодов Ubuntu по умолчанию не приведет к установке Free Pascal Source Libraries - используйте метод выше.<br />
<br />
{{Note|по крайней мере в Linux Ubuntu команда для запуска Lazarus из консоли - [[startlazarus]]. Иначе, если вы установили его из пакета Debian, у вас должен быть пункт меню Lazarus в разделе Application/Programming(«Приложение/Программирование»). <br />
(Проблема: существует неоднозначность с программой, также называемой "lazarus" из пакета "tct", доступного для Ubuntu).}}<br />
<br />
<br />
===== Простой способ сборки из deb-пакетов =====<br />
<br />
Самый простой способ получить текущую рабочую установку Lazarus - это загрузить свои собственные пакеты .deb, следуя инструкциям отсюда: [[How to setup a FPC and Lazarus Ubuntu repository|Как настроить хранилище FPC и Lazarus Ubuntu]]<br />
<br />
===== Установка с использованием rpms =====<br />
<br />
Следующим самым простым способом установки является установка RPM-пакетов для Free Pascal и Lazarus из репозитория SourceForge.<br />
<br />
Вам необходимо загрузить выбранные версии следующих компонентов:<br />
* компилятор (например, fpc-3.0.4-1.i686.rpm)<br />
* исходный код библиотеки pascal (например, fpc-src-3.0.4-1.i686.rpm)<br />
* Lazarus (например, lazarus-1.8.4-0.i686.rpm).<br />
<br />
Удалите старые пакеты:<br />
<syntaxhighlight lang="bash"><br />
rpm -ev lazarus<br />
rpm -ev fpc<br />
rpm -ev fpc-src<br />
</syntaxhighlight><br />
Установите новые пакеты:<br />
<syntaxhighlight lang="bash"><br />
rpm -ivh fpc-*<br />
rpm -ivh lazarus-*<br />
</syntaxhighlight><br />
<br />
=====Установка на Raspbian Wheezy=====<br />
<br />
Raspbian - это специальная версия Debian для компьютера Raspberry Pi размером с кредитную карту. См. [[Lazarus on Raspberry Pi]] для получения детальной информации.<br />
<br />
====Установка на Mandriva====<br />
<br />
===== Lazarus 0.9.30 на Mandriva 2010. =====<br />
<br />
Установите как указано ниже, однако при компиляции программы вы можете получить два сообщения об ошибках, сообщающих, что вам не хватает pixbuf 2.0 и lgtk-x11-2.0. Чтобы исправить это, установите libdgk_pixbuf2.0_0-devel и libgtk + 2.0_0-devel из установщика программного обеспечения.<br />
<br />
====Установка на Slackware====<br />
===== Установка Lazarus на Slackware 13.0 =====<br />
Нет реальной разницы от версий slackware 12.2 или 12.0, поэтому описанная ниже процедура должна работать точно так же.<br />
<br />
===== Установка Lazarus 0.9.30 для пользователей Slackware 12.0 =====<br />
Это работало в Slackware-12.0 на компьютере Pentium-3:<br />
<br />
* Free Pascal Compiler (FPC) устанавливается в режиме SUPERUSER <br />
* Lazarus устанавливается в режиме USER<br />
* Компилятор FPC будет перекомпилирован<br />
* Исходный код IDE Lazarus загружается с сервера SVN. <br />
<br />
-- Загружаем "fpc-2.4.2.i386-linux.tar" в папку пользователя и устанавливаем его. Переходим в эту папку и вводим: <br />
<syntaxhighlight lang="bash"><br />
bash-3.1$ tar -xvf fpc-2.4.2.i386-linux.tar<br />
bash-3.1$ su <br />
bash-3.1$ password:xxxxxx<br />
bash-3.1# sh install.sh<br />
...<br />
(используем ответы по умолчанию для следующих 6 вопросов: нажимаем "Enter" 6 раз)<br />
...<br />
bash-3.1# exit<br />
bash-3.2$ fpc<br />
free pascal compiler version 2.4.2 [] for i386 <br />
Copyright (c) 2010 ...<br />
...<br />
...<br />
</syntaxhighlight><br />
Вы установили компилятор. Возможно, вы захотите перекомпилировать его или нет, но в любом случае вам нужно будет загрузить исходный код в соответствии с требованиями IDE lazarus.<br />
<br />
-- загружаем "fpc-2.4.2.source.tar.gz" во временную папку. Если вы не хотите перекомпилировать исходный код, просто пропустите этот раздел. Если вы хотите запустить свою собственную скомпилированную версию FPC, просто введите:<br />
<syntaxhighlight lang="bash"><br />
bash-3.1$ tar -xvzf fpc-2.4.2.source.tar.gz<br />
bash-3.1$ cd fpc-2.4.2<br />
bash-3.1$ make clean all<br />
bash-3.1$ su<br />
bash-3.1$ password: xxxxxxxx<br />
bash-3.1# make install<br />
bash-3.1# exit<br />
bash-3.1$ fpc<br />
free pascal compiler version 2.4.2 [...] for i386 <br />
Copyright (c) 2010 ...<br />
...<br />
...<br />
</syntaxhighlight><br />
Теперь у вас есть собственная скомпилированная версия. <br />
<br />
-- Редактор Lazarus IDE должен видеть исходный код FPC. Даже если вы не хотите перекомпилировать FPC, вам нужен его исходный код. Однако для экономии места я сохраняю только чистую (не скомпилированную) копию исходного кода. Я снова начинаю с файла "fpc-2.4.2.source.tar.gz" и копирую его в папку /usr/local/src/FPC:<br />
<syntaxhighlight lang="bash"><br />
bash-3.1$ su<br />
bash-3.1$ password: xxxxxxxx<br />
bash-3.1# cp fpc-2.4.2.source.tar.gz /usr/local/src/<br />
bash-3.1# cd /usr/local/src/<br />
bash-3.1# tar -xvzf fpc-2.4.2.source.tar.gz<br />
bash-3.1# rm fpc-2.4.2.source.tar.gz<br />
bash-3.1# exit<br />
</syntaxhighlight><br />
Номер версии включен в название папки "fpc-2.4.2". Таким образом, я могу сохранить многие версии исходного кода компилятора и в конечном итоге переключаться между ними.<br />
<br />
-- The lazarus IDE is kept in my USER "~/lazarus" folder and always compiled in USER mode. I usually download the "lazarus-0.9.30-0.tar.gz" file, but here we can also get the latest development version from the SVN server:<br />
<syntaxhighlight lang="bash">bash-3.1$ svn co http://svn.freepascal.org/svn/lazarus/trunk lazarus</syntaxhighlight><br />
This is for the first time you load it. Next time you will only need to type:<br />
<syntaxhighlight lang="bash">bash-3.1$ svn update</syntaxhighlight><br />
If you do not have SVN installed on your computer, here is how to get it quickly:<br />
<br />
--Download the two files: "subversion-1.4.6.tar.gz" and "subversion-deps-1.4.5.tar.gz" (or later versions). Type:<br />
<syntaxhighlight lang="bash"><br />
bash-3.1$ tar -xvzf subversion-1.4.6.tar.gz<br />
bash-3.1$ tar -xvzf subversion-deps-1.4.6.tar.gz<br />
bash-3.1$ cd subversion-1.4.6<br />
bash-3.1$ ./configure<br />
bash-3.1$ make<br />
bash-3.1$ su<br />
bash-3.1$ password:xxxxxx<br />
bash-3.1# make install<br />
bash-3.1$ exit<br />
</syntaxhighlight><br />
<br />
-- At this point you have the folder "~/lazarus" containing the source code. You should compile it very simply:<br />
bash-3.1$ make clean all<br />
After a few minutes, the compiler stops:<br />
<syntaxhighlight lang="bash"><br />
...<br />
...<br />
Linking ../Lazbuild<br />
987 linescompiled ...<br />
make [2] leaving ...<br />
make [1] leaving ...<br />
bash-3.1$<br />
</syntaxhighlight><br />
<br />
-- Just type:<br />
<syntaxhighlight lang="bash">bash-3.1$ ./lazarus</syntaxhighlight><br />
WOW! You get a message: "Free Pascal sources not found". Just follow the instructions and indicate your Free Pascal Compiler source directory in the panel: "Environment->Options->Files". As explained earlier, on my computer this should point to "/usr/local/src/fpc-2.4.2". Note that when you change this folder, you should click on "Environment / Rescan_FPC_source_directory".<br />
<br />
Voila!<br />
<br />
====Установка на openSUSE====<br />
<br />
===== Установка Lazarus 0.9.30 для пользователей openSUSE 11.1 =====<br />
<br />
Free Pascal Compiler requires:<br><br />
- Gnu binutils (gnu as, gnu ld, gnu make)<br />
These utils can be installed by:<br />
<syntaxhighlight lang="bash">zypper in -t pattern devel_basis</syntaxhighlight><br />
<br />
Lazarus also requires these components:<br />
1) glib2 devel<br />
2) gtk2 devel<br />
<br />
'''Important''': The lazarus rpm requires the gtk 2 version, not the version 1.2.<br />
<br />
These libraries can be installed by:<br />
<syntaxhighlight lang="bash">zypper -n install gtk2 glib2</syntaxhighlight><br />
<br />
Download these binary files (RPM)<br />
:* fpc-2.4.2-0.i686.rpm (yes i686 and not i386)<br />
:* fpc-src-2.4.2-0.i686.rpm<br />
:* lazarus-0.9.30-0.i686.rpm<br />
<br />
install them opening a terminal session (mouse's right button -> Menu: Open in terminal)<br />
<syntaxhighlight lang="bash"><br />
rpm -Uvh fpc-2.4.2-0.i686.rpm<br />
rpm -Uvh fpc-src-2.4.2-0.i686.rpm<br />
rpm -Uvh lazarus-0.9.30-0.i686.rpm<br />
</syntaxhighlight><br />
<br />
====Установка Lazarus 1.0.8 на Fedora Core 18====<br />
<br />
After a fresh install of Fedora Core 18 '''yum''' is installed, but fails with an error messages.<br />
*Open '''Software''', check for new software and update all packages.<br />
*Reboot.<br />
*Install packages '''gtk2-devel''', '''fpc''' and '''subversion'''. Fedora Core 18 already has fpc 2.6.2. <br />
*Open a Terminal and do<br />
svn co svn+ssh://svn.freepascal.org/FPC/svn/lazarus/tags/lazarus_1_0_8 lazarus<br />
cd lazarus<br />
make bigide<br />
./lazarus<br />
<br />
==== Установка Lazarus на Scientific Linux ====<br />
<br />
Scientific Linux is an RPM-based distribution focussing on science and research. See [[Scientific Linux]] for details. <br />
<br />
==== Установка из исходных файлов ====<br />
<br />
If you prefer to install from source and compile the files yourself, follow these instructions. Because the whole lazarus stuff is installed into one directory, uninstall is very easy and you don't need to be root to install lazarus. You can get tgz files for fpc, fpcsrc and lazarus from the downloads section or you can download it directly via svn.<br />
<br />
Here is an example of installing 0.9.28 to Ubuntu 6.06. If you understand Linux commands and bash script, you can get what steps are needed. Just copy the script (change the version number when new version has been released), paste it into a text editor, and save it as something like "install_lazarus.sh". Give it execute permission, and run it in <br />
a console.<br />
{{Note|In this example, fpc is installed in /opt. So when prompted ''''Install prefix'''', enter '/opt/fpc'. }}<br />
<br />
<syntaxhighlight lang="bash"><br />
#!/bin/sh<br />
<br />
#installing required packages<br />
sudo apt-get install build-essential<br />
sudo apt-get install libgtk2.0-dev<br />
sudo apt-get install libgdk-pixbuf-dev<br />
<br />
#installing Free Pascal source<br />
cd /opt<br />
sudo wget http://nchc.dl.sourceforge.net/lazarus/fpc-src-2.4.2.source.tgz<br />
sudo tar -xvf fpc-src-2.4.2.source.tgz<br />
sudo mv fpc fpcsrc<br />
<br />
#installing Free Pascal<br />
sudo mkdir fpc<br />
cd fpc<br />
sudo wget http://nchc.dl.sourceforge.net/lazarus/fpc-2.4.2.i686-linux.tar<br />
sudo tar -xvf fpc-2.4.2.i686-linux.tar<br />
echo "Enter '/opt/fpc' when prompted 'Install prefix'"<br />
sudo sh install.sh<br />
<br />
#adding fpc path to the PATH<br />
echo "#FPC PATH" >> ~/.bash_profile<br />
echo "if [ -d /opt/fpc/bin ] ; then" >> ~/.bash_profile <br />
echo PATH=/opt/fpc/bin:"${PATH}" >> ~/.bash_profile<br />
echo "fi" >> ~/.bash_profile<br />
<br />
#installing Lazarus<br />
cd ../<br />
sudo wget http://nchc.dl.sourceforge.net/lazarus/lazarus-0.9.30-0.tar.gz<br />
# sudo wget https://downloads.sourceforge.net/project/lazarus/Lazarus%20Zip%20_%20GZip/Lazarus%201.8.0RC5/lazarus-1.8.0-RC5.tar.gz<br />
sudo tar -zxvf lazarus-0.9.30-0.tar.gz<br />
PATH=/opt/fpc/bin:"${PATH}"<br />
sudo chmod -R 777 lazarus<br />
cd lazarus<br />
make clean all<br />
./lazarus<br />
</syntaxhighlight><br />
<br />
{{Note|You have to manually set fpc-src path in the Environmental Options.}}<br />
<br />
===== Загрузка исходных файлов Lazarus =====<br />
<br />
Both the Lazarus and FPC source code reside in SVN/subversion repositories. SVN provides an easy way to update your sources by only downloading the changes. This is the recommended way and saves you a lot of time. A connection to the internet is needed for this, but you don't need to be root. <br />
<br />
Please note these instructions are for subversion, but there is also a Git mirror repository of Free Pascal Compiler and Lazarus: see [[git mirrors|Git mirror]]. You can also use git directly with the subversion server using git-svn link: see [[Lazarus git-svn|Lazarus git-svn]].<br />
<br />
Lazarus does not need any special permissions, neither during installation nor at runtime.<br />
<br />
<font color="red">If you decide to use TortoiseSVN, remember to check "command line client tools" during its installation if you want Lazarus to show the SVN revision number in the About dialog.</font><br />
<br />
;Now getting the sources:<br />
<br />
<syntaxhighlight lang="bash"> svn checkout http://svn.freepascal.org/svn/lazarus/trunk/ lazarus</syntaxhighlight><br />
(replace the last lazarus with any other dir where you want to place your sources)<br />
<br />
On subsequent occasions, to update simply type<br />
<br />
<syntaxhighlight lang="bash"> svn update lazarus</syntaxhighlight><br />
<br />
For more information on Subversion, see:<br />
http://subversion.tigris.org/<br />
<br />
===== Компиляция и запуск =====<br />
<br />
Whether you checkout from cvs or svn, the next step is: <br />
<br />
;compile lazarus:<br />
<syntaxhighlight lang="bash"><br />
cd lazarus<br />
make (gmake on BSD)<br />
</syntaxhighlight><br />
<br />
If fpc is installed correctly, the compilation should work without problems. If not, see FAQ.<br />
<br />
;Start lazarus<br />
<syntaxhighlight lang="bash"> ./lazarus</syntaxhighlight><br />
<br />
The IDE should start. If you started lazarus in a terminal, you can see some notes about missing settings. This is normal at first start. The IDE automatically tries to find out where the Free Pascal compiler and its sources are installed by searching in the most common directories.<br />
<br />
;Check the paths:<br />
: Use the IDE menu to go to<br />
:: Environment -> Environment Options -> Files<br />
<br />
The 'FPC Source directory' should point to your fpc source directory. This directory normally ends with /fpc/ or /fpcsrc/ (e.g. /usr/src/fpcsrc or /home/username/freepascal/fpc) and contains directories like 'compiler', 'docs', 'fcl', 'rtl' and 'packages'.<br />
<br />
See here for the documentation about this dialog: [[IDE_Window:_Environment_Options|IDE Options]].<br />
<br />
;Hint:<br />
To update lazarus you can use<br />
<syntaxhighlight lang="bash"> svn update lazarus</syntaxhighlight><br />
then for either update pathway:<br />
<syntaxhighlight lang="bash"> make clean all (gmake on BSD)</syntaxhighlight><br />
This will rebuild lazarus and create an IDE without lazarus packages. To link your installed packages do '''after''' the above:<br />
<syntaxhighlight lang="bash"> ./lazbuild --build-ide=</syntaxhighlight><br />
<br />
You may have to append other options if for example you use a custom config directory (ie. add --pcp="C:\Documents and Settings\<USER>\Local Settings\Application Data\lazarus-tests"). See [[lazbuild]].<br />
<br />
==== Установка Lazarus в Debian GNU/Linux ====<br />
<br />
There are preliminary Debian packages for lazarus available for download. They are not the latest versions, however. Make sure you read /usr/share/doc/lazarus/README.Debian carefully before you start using it. Feedback is needed and appreciated; please send your comments to Carlos Laviola <claviola@debian.org>.<br />
<br />
Note that for a fully working Lazarus install, no older or incompatible versions of, for example, the fpc source or fpc compiler must be installed. Remove them by typing<br />
<br />
<syntaxhighlight lang="bash">dpkg -r <package name></syntaxhighlight><br />
<br />
without .deb extension. And then install the newest versions as described.<br />
<br />
=== Установка Lazarus в Windows ===<br />
<br />
Текущие стабильные версии исполняемых файлов Lazarus для Windows устанавливаются очень легко и могут работать 'из коробки'. <br />
<br />
Исключение составляют Win98 и ME, для которых необходимо указывать специальный флаг при компиляции. Смотрите [[#Installing_from_source_2|Установка из исходных файлов]].<br />
<br />
==== Установка портативной версии Lazarus на USB-диск ====<br />
<br />
It is even possible to install the whole Lazarus/FPC package on a portable USB drive (capacity at least 256 MB), for use in environments where you are not allowed to install software on your Windows workstation or where you haven't got administrator privileges. You do have to be a little careful about adjusting the paths in the compiler and environment options and the fpc.cfg file. It may also be necessary to keep the directory for test compilation on your portable drive. <br />
<br />
<< Q:DOES ANYONE KNOW HOW TO SET UP RELATIVE PATHS IN THESE TAGS AND FILES, SO THAT THE ADDRESSING WORKS WHEN YOU MOVE THE USB DEVICE TO ANOTHER MACHINE WHERE IT HAS A DIFFERENT DRIVE LETTER? <br />
<br />
A: This is what I do. It's relatively convoluted, but it's the best solution I've found. I have a "bin" directory on my USB drive, where I have several scripts and utilities installed. Inside that directory is a batch file called "setenv.bat" which sets an environment variable called THUMBDRIVE. It is set by using this command in the batch file:<br />
<syntaxhighlight lang="dos">set THUMBDRIVE=%CD:~0,2%</syntaxhighlight><br />
This is used in setenv.bat to set some paths to other things I have installed on the USB drive. I also have a link in the root directory of the thumb drive with this property:<br />
<syntaxhighlight lang="dos">%SystemRoot%\system32\cmd.exe /k bin\setenv</syntaxhighlight><br />
so that when I click on that link when the thumb drive folder is diplayed after inserting it, it will open a command prompt at the thumb drive with the environment variables set from setenv.bat.<br />
<br />
Also inside the bin directory is [http://sed.sf.net sed] (the actual binary is one I obtained from the mingw distribution). So I created another batch file called fixlaz.bat which takes one argument, the drive letter which is currently in the Lazarus/fpc settings files that you want to change (note that this is the previous drive letter the last time you ran fixlaz.bat, not the current one of your USB drive which fixlaz.bat already knows). You will need to create this batch file to fit where you installed Lazarus in the root directory structure of the drive if you didn't install it directly in the root folder, and then repeat these lines also for the editoroptions.xml and fpc.cfg files (fpc.cfg is the the fpc bin directory, which might be buried deep in the lazarus folder):<br />
<syntaxhighlight lang="dos"><br />
copy %THUMBDRIVE%\lazarus\environmentoptions.xml %THUMBDRIVE%\lazarus\environmentoptions.bak<br />
sed -e 's/%1/%THUMBDRIVE%/g' %THUMBDRIVE%\lazarus\environmentoptions.bak > %THUMBDRIVE%\lazarus\environmentoptions.xml<br />
</syntaxhighlight><br />
<br />
So to use it, I would type at the command prompt of the USB drive:<br />
<syntaxhighlight lang="dos">fixlaz G:</syntaxhighlight><br />
if "G:" was the previous drive letter used the last time I ran it. This will then scan the file(s) and replace "G:" with the current drive letter of the USB drive, which is in the %THUMBDRIVE% environment variable (after running setenv.bat). Note that you could write it to save the current drive letter in a separate file, so that you wouldn't have to remember it yourself the next time. But this works well enough for me right now.<br />
>><br />
<br />
The binary package is available for Linux and Windows from<br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Download the latest release (currently Lazarus-0.9.30-0-win32.exe) and launch the application. You will be taken through a typical Windows installation, in which the FPC compiler and source libraries are installed within the same directory structure as Lazarus, and the IDE should launch and operate without significant problems, provided you have uninstalled(!!!) any previous version of Lazarus and/or FPC (often found in the C:\pp directory).<br />
<br />
You can also use a Lazarus Snapshot. For download locations see [[Lazarus Snapshots Downloads]].<br />
<br />
Tip:<br />
It's perhaps a good idea to reboot your Windows after you installed Lazarus and before you try to install additional lazarus components as zeoslib fore example.<br />
<br />
==== Установка из исходных файлов ====<br />
If you prefer to install from sources, then follow these instructions.<br />
<br />
Please note these instructions are for SubVersion, but there is also a Git mirror repository of Free Pascal Compiler and Lazarus. See [[git mirrors|Git mirror]] for details. You can also use git directly with SubVersion server using git-svn link. See [[Lazarus git-svn|Lazarus git-svn]] for details.<br />
<br />
Open a command prompt window. Start->Run...>CMD or choose MS-DOS icon. You will use this window to enter the commands below<br />
<br />
You have to download the lazarus source from one of the [[Lazarus Snapshots Downloads|snapshots servers]].<br />
Then unzip it to c:\lazarus for example [below called $(LazarusDir)].<br />
<br />
Or you use SVN (example for text mode SVN; adapt to GUI tools such as TortoiseSVN if you want to):<br />
<syntaxhighlight lang="bash"><br />
mkdir c:\lazarus<br />
cd /d c:\lazarus<br />
svn checkout http://svn.freepascal.org/svn/lazarus/trunk/ c:\lazarus<br />
</syntaxhighlight><br />
<br />
You have to install at least the latests stable FPC version (e.g. FPC 2.6.4, but an FPC 3.1.1 snapshot is also possible). <br />
<br />
<br />
Type (replace $(LazarusDir) with the path you have unzipped/checked out Lazarus; replace <br />
<syntaxhighlight lang="dos"><br />
cd /d $(LazarusDir)<br />
rem Of course change the first path variable to<br />
rem the path of your FPC compiler<br />
set path=c:\freepascal\bin\i386-win32;$(LazarusDir)<br />
make<br />
</syntaxhighlight><br />
<br />
*Win9x: use make OPT="-dWIN9XPLATFORM" (Lazarus trunk (and upcoming 1.4)) otherwise the lazarus.exe will not be able to run on this platform.<br />
<br />
If this works, you can type: lazarus.exe. <br />
<br />
You can compile examples also:<br />
<br />
<syntaxhighlight lang="dos"><br />
cd /d $(LazarusDir)\examples<br />
make<br />
</syntaxhighlight><br />
<br />
<s>If you extracted lazarus to another drive, eg.: d:\lazarus, tt can happen that you need the gnu make utility to make it. If you have it, you can take its path to set path=...;<gmakepath> but it is simpler not to choose drive d:\</s><br />
<br />
==== Установка из исходных файлов с использованием стабильной версии ====<br />
An alternative version of the instructions above.<br />
<br />
1> First of all install the latest stable Lazarus to obtain a good starting FPC, for example in C:\lazarus_1_4<br />
<br />
2> Now use TortoiseSVN to checkout http://svn.freepascal.org/svn/lazarus/trunk/ into c:\lazarus<br />
<br />
3> Make the following C:\lazarus\build.bat file:<br />
<br />
Replace $(LazarusDir) with your Lazarus did and make sure the FPC version number matches<br />
<syntaxhighlight lang="dos"><br />
SET PATH=$(LazarusDir)\fpc\2.6.4\bin\i386-win32\<br />
make bigide<br />
</syntaxhighlight><br />
<br />
Now create a shortcut in your desktop to start Lazarus and put the following command to start Lazarus which will make sure that it separates the config files from the stable and the SVN versions:<br />
<br />
<syntaxhighlight lang="dos">$(LazarusDir)\startlazarus.exe --pcp=$(LazarusDir)\configdir </syntaxhighlight><br />
<br />
Always start Lazarus from this shortcut, never directly from the executable. At the first time you start Lazarus configure you FPC dir, FPC sources dir and Lazarus dir.<br />
<br />
==== Сборка Lazarus в Win98 и WinME ====<br />
<br />
Так как среда разработки Lazarus по умолчанию вызывает функцию "CreateToolhelp32Snapshot", которая отсутствует на платформе Win9x, IDE не запустится в Win9x "из коробки".<br />
<br />
Для того, чтобы сделать это запустите пересборку IDE Lazarus с ключом "-dWIN9XPLATFORM".<br />
<br />
=== Установка Lazarus в FreeBSD ===<br />
Следующие инструкции относятся только для версии FreeBSD 9 и выше.<br />
<br />
====via Ports tree====<br />
The latest version of Lazarus available in the FreeBSD port tree, is v 1.6.4 We can use that to install Lazarus.<br />
<br />
<syntaxhighlight lang="bash">[]# cd /usr/ports/editors/lazarus && make install clean clean-depends</syntaxhighlight><br />
<br />
If you start Lazarus IDE and you get a messages about missing source files, then go to '''Environment - Environment Options - Files Tab: FPC source library''' and enter the directory of the FPC source files. It can be obtained from /usr/ports/distfiles/freepascal<br />
<br />
====via pkgng====<br />
<syntaxhighlight lang="bash">[]# pkg install editors/lazarus</syntaxhighlight><br />
<br />
At this point Lazarus might complain about missing source files. If you don't have them:-<br />
<br />
mkdir /usr/ports/distfiles<br />
mkdir /usr/ports/distfiles/freepscal<br />
cd /usr/ports/distfiles/freepascal<br />
wget http://distcache.freebsd.org/ports-distfiles/freepascal/fpc-3.0.2.source.tar.gz<br />
tar xvfz fpc-3.0.2.source.tar.gz<br />
<br />
Change the 3.0.2 to whatever version of fpc you have installed. Then go to '''Environment - Environment Options - Files Tab: FPC source library''' and enter<br />
<br />
/usr/ports/distfiles/freepascal/fpc-3.0.2<br />
<br />
If when you try to compile something you get this error<br />
<br />
Error: resource compiler "fpcres" not found, switching to external mode<br />
<br />
Then you can install fpcres like this<br />
<br />
<syntaxhighlight lang="bash">[]# pkg install lang/fpc-utils</syntaxhighlight><br />
<br />
====via Lazarus repository====<br />
This option will often be used if you want to follow Lazarus Trunk, a Fixes branch, or some other release (eg: compiling from a source tarball).<br />
* Use the SubVersion or Git repositories to checkout a copy of the source code you want, or unpack a downloaded source archive into a suitable location<br />
* The readme.txt file in Lazarus directory mentions 'make clean all'. This works if you are using Linux. Under FreeBSD 9.1 I had to replace 'make' with 'gmake'.<br />
<br />
cd /patch/to/lazarus_source<br />
gmake clean all<br />
<br />
=== Установка Lazarus в PC-BSD 1.0rc1+ ===<br />
<br />
You can install Lazarus on PB-BSD by simply downloading the Lazarus PBI from [http://www.pbidir.com/ PBI Dir]<br />
<br />
Note that you must install glib* port from /usr/port/devel/glib* or glib packages by pkg_add -r glib12 glib20.<br />
I will fix this in new PBI releases.<br />
<br />
'''[other OpenBSD/NetBSD/DragonFlyBSD goes here]'''<br />
<br />
=== Установка Lazarus в Mac OS X ===<br />
<br />
See [[Installing Lazarus on MacOS X]].<br />
<br />
=== Установка Lazarus в Haiku ===<br />
<br />
Lazarus requires Qt under Haiku. Qt is not installed by default under Haiku. You need to install package available from this site : http://qt-haiku.ru/<br />
<br />
Currently, there is no binary package to install Lazarus.<br />
<br />
You will have to compile Lazarus from sources.<br />
<br />
Detailed instructions to build Lazarus under Haiku are available here : [[Installing Lazarus on Haiku]]<br />
<br />
=Установка нескольких версий Lazarus=<br />
Please see [[Multiple Lazarus]] for details on having more than one Lazarus version installed on one system. We cover issues that can arise due to multiple Lazarus installs here, because they can also happen when installing over a previous version.<br />
<br />
=Устранение проблем=<br />
These hints should (hopefully) be applicable across platforms; please adjust paths etc. according to your platform. Also, problems and solutions might be mentioned in the [[Lazarus_Faq]]. <br />
<br />
== Isolating the component ==<br />
There may be multiple problems when installing Free Pascal and Lazarus.<br />
If you have problems with starting Lazarus or compiling with it, first make sure your underlying FPC installation works, e.g. by trying to compile a simple example program.<br />
<br />
== Расположение установленных компонентов ==<br />
On Linux/Unix/OSX, package/distribution provided installations will often install FPC in /bin or /usr/bin, with the libraries in /lib or /usr/lib, and probably the configuration in /etc/fpc.cfg<br />
Source (Subversion) downloads often install in /usr/local/bin (libraries in /usr/local/lib).<br />
<br />
== Отсутствие или повреждение файла fpc.cfg ==<br />
Файл fpc.cfg является файлом настроек FPC. В системе Windows его можно найти в директории с исполняемыми файлами компилятора fpc. On Unix/Linux/OSX, it is first searched in /etc/fpc.cfg, then<br />
Only some problems that often occur are covered. Please see the Free Pascal User's guide, e.g. chapter Compiler usage/configuration file for more details, including the search order for fpc.cfg<br />
<br />
Если его нет, FPC не скомпилирует вашу программу должным образом.<br />
<br />
=== Автоматическое создание fpc.cfg ===<br />
Вы можете попытаться создать fpc.cfg с помощью специальной утилиты:<br />
<br />
<syntaxhighlight lang="dos"><br />
rem Измените путь к директории с исполняемыми файлами FPC<br />
cd /d C:\freepascal\fpc\2.4.5\bin\i386-win32<br />
rem Создание fpc.cfg; basepath - это "корневая" директория fpc<br />
fpcmkcfg -d basepath=C:\freepascal\fpc\2.4.5 -o .\fpc.cfg<br />
</syntaxhighlight><br />
{{Note|earlier instructions had \bin\i386-win32 appended to the basepath. This is not needed since at least FPC 2.4.4.}}<br />
<br />
=== Ручное создание fpc.cfg ===<br />
If the above doesn't work for you, you can copy/paste the code below to a new file named fpc.cfg to your fpc executable directory (or ~/.fpc.cfg or other location). Modify the paths so they match your situation.<br />
<br />
$FPCVERSION is used to automatically determine the version of FPC being used for the compile. Using this variable allows this single fpc.cfg to be used with multiple fpc versions that have the same path structure making it easier to maintain multiple FPC installs.<br />
<br />
<pre><br />
#<br />
# Config file generated by fpcmkcfg on 24/12/2010 - 18:17:42<br />
# Example fpc.cfg for Free Pascal Compiler<br />
#<br />
<br />
# ----------------------<br />
# Defines (preprocessor)<br />
# ----------------------<br />
<br />
#<br />
# nested #IFNDEF, #IFDEF, #ENDIF, #ELSE, #DEFINE, #UNDEF are allowed<br />
#<br />
# -d is the same as #DEFINE<br />
# -u is the same as #UNDEF<br />
#<br />
<br />
#<br />
# Some examples (for switches see below, and the -? helppages)<br />
#<br />
# Try compiling with the -dRELEASE or -dDEBUG on the commandline<br />
#<br />
<br />
# For a release compile with optimizes and strip debuginfo<br />
#IFDEF RELEASE<br />
-O2<br />
-Xs<br />
#WRITE Compiling Release Version<br />
#ENDIF<br />
<br />
# For a debug version compile with debuginfo and all codegeneration checks on<br />
#IFDEF DEBUG<br />
-glh<br />
-Crtoi<br />
#WRITE Compiling Debug Version<br />
#ENDIF<br />
<br />
# ----------------<br />
# Parsing switches<br />
# ----------------<br />
<br />
# Pascal language mode<br />
# -Mfpc free pascal dialect (default)<br />
# -Mobjfpc switch some Delphi 2 extensions on<br />
# -Mdelphi tries to be Delphi compatible<br />
# -Mtp tries to be TP/BP 7.0 compatible<br />
# -Mgpc tries to be gpc compatible<br />
# -Mmacpas tries to be compatible to the macintosh pascal dialects<br />
#<br />
# Turn on Object Pascal extensions by default<br />
#-Mobjfpc<br />
<br />
# Assembler reader mode<br />
# -Rdefault use default assembler<br />
# -Ratt read AT&T style assembler<br />
# -Rintel read Intel style assembler<br />
#<br />
# All assembler blocks are AT&T styled by default<br />
#-Ratt<br />
<br />
# Semantic checking<br />
# -S2 same as -Mobjfpc<br />
# -Sc supports operators like C (*=,+=,/= and -=)<br />
# -Sa include assertion code.<br />
# -Sd same as -Mdelphi<br />
# -Se<x> compiler stops after the <x> errors (default is 1)<br />
# -Sg allow LABEL and GOTO<br />
# -Sh Use ansistrings<br />
# -Si support C++ styled INLINE<br />
# -SI<x> set interface style to <x><br />
# -SIcomCOM compatible interface (default)<br />
# -SIcorbaCORBA compatible interface<br />
# -Sm support macros like C (global)<br />
# -So same as -Mtp<br />
# -Sp same as -Mgpc<br />
# -Ss constructor name must be init (destructor must be done)<br />
#<br />
# Allow goto, inline, C-operators, C-vars<br />
-Sgic<br />
<br />
# ---------------<br />
# Code generation<br />
# ---------------<br />
<br />
# Uncomment the next line if you always want static/dynamic units by default<br />
# (can be overruled with -CD, -CS at the commandline)<br />
#-CS<br />
#-CD<br />
<br />
# Set the default heapsize to 8Mb<br />
#-Ch8000000<br />
<br />
# Set default codegeneration checks (iocheck, overflow, range, stack)<br />
#-Ci<br />
#-Co<br />
#-Cr<br />
#-Ct<br />
<br />
# Optimizer switches for i386 compiler<br />
# -Os generate smaller code<br />
# -O1 level 1 optimizations (quick optimizations)<br />
# -O2 level 2 optimizations (-O1 + slower optimizations)<br />
# -O3 level 3 optimizations (same as -O2u)<br />
# -Oa=N set alignment to N<br />
# -OoX switch on optimalization X. <br />
# -OoNOX switch off optimalization X.<br />
# X is one of REGVAR UNCERTAIN STACKFRAME PEEPHOLE ASMCSE LOOPUNROLL<br />
# -OpCPU set target processor.<br />
# CPU is one of 386, PENTIUM, PENTIUM2, PENTIUM3, PENTIUM4, PENTIUMM <br />
<br />
<br />
# -----------------------<br />
# Set Filenames and Paths<br />
# -----------------------<br />
<br />
# Both slashes and backslashes are allowed in paths<br />
<br />
# path to the messagefile, not necessary anymore but can be used to override<br />
# the default language<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errore.msg<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errorn.msg<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errores.msg<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errord.msg<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errorr.msg<br />
<br />
#IFDEF FPCAPACHE_1_13<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/httpd13/<br />
#ELSE<br />
#IFDEF FPCAPACHE_2_0<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/httpd20<br />
#ELSE<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/httpd22<br />
#ENDIF<br />
#ENDIF<br />
<br />
# searchpath for units and other system dependent things<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/*<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/rtl<br />
<br />
# path to the gcclib<br />
<br />
<br />
# searchpath for libraries<br />
#-FlC:\freepascal\fpc\$FPCVERSION/lib<br />
#-Fl/lib;/usr/lib<br />
<br />
# searchpath for tools<br />
-FDC:\freepascal\fpc\$FPCVERSION/bin/$FPCTARGET<br />
<br />
#IFNDEF CPUI386<br />
#IFNDEF CPUAMD64<br />
#DEFINE NEEDCROSSBINUTILS<br />
#ENDIF<br />
#ENDIF<br />
<br />
#IFNDEF Win32<br />
#DEFINE NEEDCROSSBINUTILS<br />
#ENDIF<br />
<br />
# binutils prefix for cross compiling<br />
#IFDEF FPC_CROSSCOMPILING<br />
#IFDEF NEEDCROSSBINUTILS<br />
-XP$FPCTARGET-<br />
#ENDIF<br />
#ENDIF<br />
<br />
<br />
# -------------<br />
# Linking<br />
# -------------<br />
<br />
# generate always debugging information for GDB (slows down the compiling<br />
# process)<br />
# -gc generate checks for pointers<br />
# -gd use dbx<br />
# -gg use gsym<br />
# -gh use heap trace unit (for memory leak debugging)<br />
# -gl use line info unit to show more info for backtraces<br />
# -gv generates programs tracable with valgrind<br />
# -gw generate dwarf debugging info<br />
#<br />
# Enable debuginfo and use the line info unit by default<br />
#-gl<br />
<br />
# always pass an option to the linker<br />
#-k-s<br />
<br />
# Always strip debuginfo from the executable<br />
-Xs<br />
<br />
<br />
# -------------<br />
# Miscellaneous<br />
# -------------<br />
<br />
# Write always a nice FPC logo ;)<br />
-l<br />
<br />
# Verbosity<br />
# e : Show errors (default) d : Show debug info<br />
# w : Show warnings u : Show unit info<br />
# n : Show notes t : Show tried/used files<br />
# h : Show hints m : Show defined macros<br />
# i : Show general info p : Show compiled procedures<br />
# l : Show linenumbers c : Show conditionals<br />
# a : Show everything 0 : Show nothing (except errors)<br />
# b : Show all procedure r : Rhide/GCC compatibility mode<br />
# declarations if an error x : Executable info (Win32 only)<br />
# occurs<br />
#<br />
# Display Info, Warnings, Notes and Hints<br />
-viwn<br />
# If you don't want so much verbosity use<br />
#-vw<br />
</pre><br />
<br />
=== Testing and batch file/shortcut usage ===<br />
You can also explicitly specify a fpc.cfg to use:<bash>fpc -n -@/path/to/fpc.cfg</bash>. Handy for testing, creating shortcuts/shell scripts, having multiple FPC installations etc.<br />
<br />
If that does not work, you can try to create fpc.cfg manually: copy over an existing fpc.cfg from a working installation and change the paths.<br />
<br />
== Mixing FPC versions ==<br />
If your FPC cannot find its sources/ppu files while fpc.cfg has the right paths, another cause could be that the fpc executable is a different version than the (link to) ppc<architecture> compiler.<br />
<br />
When compiling with fpc, fpc starts e.g ppc386 to compile for x86 targets. Please make sure fpc and ppc<architecture> are compiled by the same version/sourced from the same package.<br />
<br />
== Lazarus can't find sources ==<br />
There may be a message saying Lazarus can't find the sources; if so, go to the menu at the top and select Environment -> Environment options and insert the name of the directory where you expect to find your lazarus files (eg ~/FreePascal/lazarus), your compiler (e.g. /usr/local/bin/ppc386), the Free Pascal source directory (e.g. /usr/local/lib/fpc/$version/fpc or a directory in your own space e.g. ~/FreePascal/fpc). Then close the dialog and start programming.<br />
<br />
== Пути к файлам в настройках Lazarus и проекта ==<br />
Учтите, что вы можете установить пути (для компилятора, модулей FPC и т.д.) в общих настройках параметров. Параметры, которые вы укажете в ''Параметрах проекта'', могут переопределять параметры, используемые для каждого проекта.<br />
Если вы испытываете проблемы, связанные с путями в данном проекте, но не в других проектах, вам необходимо проверить, не ошиблись ли вы в переопределении параметров в общих настройках.<br />
<br />
=Установка старых версий=<br />
Смотрите [[Installation hints for old versions]]<br />
<br />
<br />
[[Category:Russian (unfinished translation)]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=With/ru&diff=123843
With/ru
2019-03-21T18:15:44Z
<p>Useroflazarus: Created page with "{{With}} Зарезервированное слово '''with''' предназначено для сокращенного написания типа..."</p>
<hr />
<div>{{With}}<br />
<br />
[[Reserved word/ru|Зарезервированное слово]] '''with''' предназначено для сокращенного написания типа [[Record/ru|запись (структура)]]. Оно используется совместно с ключевым словом [[Do/ru|do]].<br />
<br />
Пример:<br />
<syntaxhighlight><br />
// Объявление записи (структуры)<br />
type<br />
TreRecord = record<br />
strValue: string;<br />
intValue: integer;<br />
dblValue: double;<br />
end;<br />
<br />
var<br />
reRecord: TreRecord; // Объявляем переменную типа "запись"<br />
<br />
begin<br />
...<br />
<br />
// стандартное обращение к полям записи:<br />
reRecord.strValue := 'Test';<br />
reRecord.intValue := 5;<br />
reRecord.dblValue := 4.2;<br />
<br />
// с использованием слова "with"<br />
with reRecord do<br />
begin<br />
strValue := 'Test';<br />
intValue := 5;<br />
dblValue := 4.2;<br />
end;<br />
...<br />
end;<br />
</syntaxhighlight></div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Finalization/ru&diff=123724
Finalization/ru
2019-03-17T11:55:41Z
<p>Useroflazarus: Created page with "{{Finalization}} '''Finalization''' является зарезервированным словом в Object Pascal. Оно на..."</p>
<hr />
<div>{{Finalization}}<br />
<br />
'''Finalization''' является [[Reserved words/ru|зарезервированным словом]] в [[Object Pascal/ru|Object Pascal]]. Оно начинает раздел завершения (финализации) в [[Unit/ru|модуле]].<br />
<br />
== См. также ==<br />
* [[Initialization/ru|Initialization]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=fpCEF3&diff=123640
fpCEF3
2019-03-10T05:50:29Z
<p>Useroflazarus: </p>
<hr />
<div>{{fpCEF3}}<br />
<br />
==Description==<br />
<br />
<div class="floatright"> [[Image:SimpleChromium.png|320px]] </div><br />
<br />
Chromium is an open source project (from Google) to create a browser for different platforms. Among other things the browser Chrome is based on it.<br />
<br />
The Chromium Embedded Framework (CEF) is an open source framework for embedding Chromium into user applications. It can be used on Linux, Mac OS X and Windows in 32 and 64 bit versions.<br />
Originally there were two versions of CEF, CEF1 and CEF3, but CEF1 is no longer maintained.<br />
<br />
CEF can be used in Delphi via the Delphi Chromium Embedded Framework (DCEF3). For Lazarus/FreePascal there is the equivalent framework [https://github.com/dliw/fpCEF3 fpCEF3] (or alternative [https://github.com/salvadordf/CEF4Delphi CEF4Delphi] with examples for Lazarus including newest versions of Chromium Embedded Framework).<br />
<br />
==Installation==<br />
<br />
Besides the Lazarus package, the CEF framework itself is needed. It is important to use the correct version of the CEF framework for the fpCEF release used. Further specific installation instructions can be found on Github: [https://github.com/dliw/fpCEF3 https://github.com/dliw/fpCEF3]<br />
<br />
The latest release and its corresponding CEF version can be found on [https://github.com/dliw/fpCEF3/releases/latest]<br />
<br />
CEF releases can be found on http://opensource.spotify.com/cefbuilds/index.html (use the version filter or click "Show more builds" to find the release)<br />
<br />
===Download Package===<br />
<br />
fpCEF3 with [http://git-scm.com/ Git] <br />
<br />
git://github.com/dliw/fpCEF3.git<br />
<br />
You can also download a zipped package:<br />
<br />
[https://github.com/dliw/fpCEF3/archive/master.zip master.zip]<br />
<br />
===Package Installation===<br />
<div class="floatright"> [[Image:Chromium.png]] </div><br />
<br />
After downloading of package fpCEF3, it can be installed in Lazarus:<br />
<br />
* Start Lazarus and open main menu ''Package'' -> ''Open package file (.lpk)...''<br />
* Select the file ''cef3.lpk'' in the fpCEF3 subdirectory ''Component''<br />
* The package editing window will open<br />
* Click on ''Compile'', the package will be compiled<br />
* Click on ''Use...''-> ''Install'' and confirm the dialog window with ''Yes''<br />
* Lazarus is now compiling and create a new tab ''Chromium'' in the component palette<br />
<br />
===Download Framework CEF3===<br />
<br />
You can now download the framework and made the libraries available for a particular project. You can download it from the following pages:<br><br />
[https://cefbuilds.com https://cefbuilds.com]<br><br />
[http://www.magpcss.net/cef_downloads http://www.magpcss.net/cef_downloads] (or a older version from [http://www.magpcss.net/cef_downloads/index.php?query=label%3ADeprecated#list here])<br />
<br />
{{Note|Make sure to use the correct framework version for the fpCEF version! See [[#Installation|Installation]]}}<br />
<br />
==Usage==<br />
<br />
===Minimal example===<br />
<br />
A minimal example with a simple browser is created.<br />
<br />
====Windows====<br />
<br />
The CEF libraries are needed for loading, so it makes sense to create a new project folder, to save the project and the libraries in it together.<br />
<br />
* Create a new directory for the project to a location of your choice such as ''C:\SimpleBrowser''<br />
* Copy the complete CEF3 directory ''Resources'' to ''C:\SimpleBrowser''<br />
* Copy the contents of the CEF3 directory ''Release'' in the directory ''C:\SimpleBrowser'' <br />
The files (''libcef.dll'', ''natives_blob.bin'', ''icudtl.dat'' etc.) are in the same directory as the project and the directory ''locales'' in ''C:\SimpleBrowser\locales''.<br> <br />
To prevent misunderstands, here is a picture how the file and directory structure of the Simplebrowser should look:<br><br><br />
[[Image:FilesForSimplebrowser.png]]<br><br> <br />
<br />
Now build the project with Lazarus<br />
<br />
* Create a new empty [[Form Tutorial#The first GUI app | GUI application]]<br />
* Save the project in the directory you specify for Windows (e.g. under ''C:\SimpleBrowser'')<br />
* Drop a <tt>TEditButton</tt> on the form <br />
* With Object Inspector set the <tt>Name</tt> to <tt>edtURL</tt>, <tt>Align</tt> on <tt>alTop</tt> and <tt>ButtonCaption</tt> to <tt>go</tt><br />
* Put a <tt>TChromium</tt> on the form and set the <tt>Name</tt> to <tt>Chromium</tt> and its <tt>Align</tt> to <tt>alClient</tt><br />
* Create the <tt>OnButtonClick</tt> event handler for the TEditButton <tt>edtURL</tt>. Select the <tt>OnButtonClick</tt> in the Object Inspector tab <tt>events</tt> and click on the button [...]<br />
* Write following code (chromium should open at each click the URL in the text box):<br />
<syntaxhighlight>procedure TForm1.edtURLClick(Sender: TObject);<br />
begin<br />
Chromium.Load(UTF8Decode(edtURL.Text));<br />
end; </syntaxhighlight><br />
* <tt>Chromium</tt> must be initialized at the start of the program, you can do this with the <tt>OnCreate</tt> event handler of the form:<br />
<syntaxhighlight>procedure TForm1.FormCreate(Sender: TObject);<br />
var<br />
PrjPath: ustring;<br />
Lang, FallbackLang: string;<br />
begin<br />
PrjPath := UTF8Decode(GetCurrentDir + PathDelim);<br />
CefLocalesDirPath := PrjPath + 'locales';<br />
GetLanguageIDs(Lang, FallbackLang);<br />
CefLocale := UTF8Decode(FallbackLang);<br />
edtURL.Text:='http://www.lazarus-ide.org/';<br />
end; </syntaxhighlight><br />
* If a identifier wouldn't be found, you have to put some units to the uses clause. These units should be in there:<br />
<syntaxhighlight>uses<br />
sysutils, Forms, EditBtn, cef3lcl, cef3intf, cef3types, cef3lib, gettext; </syntaxhighlight><br />
* Run your program, if all goes well it might look like:<br />
[[Image:SimpleChromium.png]]<br><br><br />
<br />
===Show URL of loaded page===<br />
<br />
Based on [[#Minimal example|Minimal example]]<br />
<br />
* Create the <tt>OnLoadEnd</tt> event handler for <tt>Chromium</tt><br />
* Write following code (URL should be updated after any browsing):<br />
<syntaxhighlight>procedure TForm1.ChromiumLoadEnd(Sender: TObject; const Browser: ICefBrowser;<br />
const Frame: ICefFrame; httpStatusCode: Integer);<br />
begin<br />
edtURL.Text:=UTF8Encode(Browser.MainFrame.Url);<br />
end; </syntaxhighlight><br />
<br />
===Allow downloading of files===<br />
<br />
* Create the <tt>OnBeforeDownload</tt> event handler for <tt>Chromium</tt> and write in it:<br />
<syntaxhighlight>procedure TForm1.ChromiumBeforeDownload(Sender: TObject;<br />
const Browser: ICefBrowser; const downloadItem: ICefDownloadItem;<br />
const suggestedName: ustring; const callback: ICefBeforeDownloadCallback);<br />
begin<br />
callback.Cont(suggestedName, True);<br />
end;</syntaxhighlight><br />
<br />
===Printing per code===<br />
<br />
* Add a <tt>TButton</tt> on your form and write in its <tt>OnClick</tt> event handler:<br />
<syntaxhighlight>procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
Chromium.Browser.Host.Print;<br />
end; </syntaxhighlight><br />
<br />
===Creating a pdf===<br />
<br />
* Add a <tt>TSaveDialog</tt> on your form<br />
* Add a <tt>TButton</tt> on your form and write in its <tt>OnClick</tt> event handler:<br />
<syntaxhighlight>procedure TForm1.Button1Click(Sender: TObject);<br />
var<br />
CefPdfPrintSettings: TCefPdfPrintSettings;<br />
EmptyCefStringUtf16: TCefStringUtf16;<br />
begin<br />
SaveDialog1.DefaultExt := 'pdf';<br />
SaveDialog1.Filter := 'Portable Document Format (pdf)|*.pdf';<br />
if SaveDialog1.Execute then<br />
begin<br />
FillByte(EmptyCefStringUtf16, SizeOf(EmptyCefStringUtf16), 0);<br />
<br />
CefPdfPrintSettings.backgrounds_enabled := 1;<br />
CefPdfPrintSettings.header_footer_enabled := 0;<br />
CefPdfPrintSettings.header_footer_title := EmptyCefStringUtf16;<br />
CefPdfPrintSettings.header_footer_url := EmptyCefStringUtf16;<br />
CefPdfPrintSettings.landscape := 0;<br />
CefPdfPrintSettings.margin_bottom := 0;<br />
CefPdfPrintSettings.margin_left := 0;<br />
CefPdfPrintSettings.margin_right := 0;<br />
CefPdfPrintSettings.margin_top := 0;<br />
CefPdfPrintSettings.margin_type := PDF_PRINT_MARGIN_DEFAULT;<br />
CefPdfPrintSettings.page_height := 0;<br />
CefPdfPrintSettings.page_width := 0;<br />
CefPdfPrintSettings.selection_only := 0;<br />
<br />
Chromium.Browser.Host.PrintToPdf(UTF8Decode(SaveDialog1.FileName), CefPdfPrintSettings, Nil);<br />
end;<br />
end; </syntaxhighlight><br />
<br />
The description of the <tt>TCefPdfPrintSettings</tt> you will find by the declaration of the <tt>TCefPdfPrintSettings</tt> <br />
<br />
==Known Problems==<br />
<br />
* If your program doesn't start, maybe a Antivirus program prevent this.<br />
* If your program start but your TChromium window keeps empty, maybe a firewall block it (see [http://forum.lazarus.freepascal.org/index.php/topic,31361.0.html Chromium Embedded Framework for Free Pascal (fpCEF3) BRUNCH 2556]).<br />
* If your file structure isn't correct (see [[#Minimal_example|Minimal example]]) and therefore some libraries wouldn't be found, you can get optical errors (see [http://forum.lazarus.freepascal.org/index.php/topic,30763.0.html Fpcef red borders in the browser]).<br />
<br />
==Further Information==<br />
* [http://www.lazarusforum.de/viewtopic.php?f=18&t=7676 Thread in the German Lazarusforum]<br />
* [[Webbrowser]]<br />
<br />
[[Category:LCL]]<br />
[[Category:Components]]<br />
{{AutoCategory}}</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Hexadecimal/ru&diff=123280
Hexadecimal/ru
2019-02-17T11:50:21Z
<p>Useroflazarus: </p>
<hr />
<div>{{Hexadecimal}}<br />
<br />
Шестнадцатеричная система (hex) - это система счисления по основанию 16. В шестнадцатеричной системе числа 0–15 представляются символами 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E и F. Шестнадцатеричные числа легко преобразовываются во внутренний двоичный код компьютера и намного компактнее, чем [[Binary numeral system/ru|двоичные числа]]: одна шестнадцатеричная цифра вместо четырех двоичных бит.<br />
<br />
Для указания шестнадцатеричных чисел в языке [[Pascal]] используется префикс [[Dollar_sign/ru|$]]<br />
<br />
<br />
= Таблица преобразований =<br />
<br />
<br />
{| class="wikitable"<br />
! Шестнадцатеричное значение !! Десятичное значение !! Двоичное значение<br />
|-<br />
| &nbsp; $0000 &nbsp;<br />
| &nbsp; 0 &nbsp;<br />
| &nbsp; [[Percent_sign/ru|%]]0000000000000000 &nbsp;<br />
|-<br />
| &nbsp; $0001 &nbsp;<br />
| &nbsp; 1 &nbsp;<br />
| &nbsp; %0000000000000001 &nbsp;<br />
|-<br />
| &nbsp; $0002 &nbsp;<br />
| &nbsp; 2 &nbsp;<br />
| &nbsp; %0000000000000010 &nbsp;<br />
|-<br />
| &nbsp; $0003 &nbsp;<br />
| &nbsp; 3 &nbsp;<br />
| &nbsp; %0000000000000011 &nbsp;<br />
|-<br />
| &nbsp; $0004 &nbsp;<br />
| &nbsp; 4 &nbsp;<br />
| &nbsp; %0000000000000100 &nbsp;<br />
|-<br />
| &nbsp; $0005 &nbsp;<br />
| &nbsp; 5 &nbsp;<br />
| &nbsp; %0000000000000101 &nbsp;<br />
|-<br />
| &nbsp; $0006 &nbsp;<br />
| &nbsp; 6 &nbsp;<br />
| &nbsp; %0000000000000110 &nbsp;<br />
|-<br />
| &nbsp; $0007 &nbsp;<br />
| &nbsp; 7 &nbsp;<br />
| &nbsp; %0000000000000111 &nbsp;<br />
|-<br />
| &nbsp; $0008 &nbsp;<br />
| &nbsp; 8 &nbsp;<br />
| &nbsp; %0000000000001000 &nbsp;<br />
|-<br />
| &nbsp; $0009 &nbsp;<br />
| &nbsp; 9 &nbsp;<br />
| &nbsp; %0000000000001001 &nbsp;<br />
|-<br />
| &nbsp; $000a &nbsp;<br />
| &nbsp; 10 &nbsp;<br />
| &nbsp; %0000000000001010 &nbsp;<br />
|-<br />
| &nbsp; $000b &nbsp;<br />
| &nbsp; 11 &nbsp;<br />
| &nbsp; %0000000000001011 &nbsp;<br />
|-<br />
| &nbsp; $000c &nbsp;<br />
| &nbsp; 12 &nbsp;<br />
| &nbsp; %0000000000001100 &nbsp;<br />
|-<br />
| &nbsp; $000d &nbsp;<br />
| &nbsp; 13 &nbsp;<br />
| &nbsp; %0000000000001101 &nbsp;<br />
|-<br />
| &nbsp; $000e &nbsp;<br />
| &nbsp; 14 &nbsp;<br />
| &nbsp; %0000000000001110 &nbsp;<br />
|-<br />
| &nbsp; $000f &nbsp;<br />
| &nbsp; 15 &nbsp;<br />
| &nbsp; %0000000000001111 &nbsp;<br />
|-<br />
| &nbsp; $0010 &nbsp;<br />
| &nbsp; 16 &nbsp;<br />
| &nbsp; %0000000000010000 &nbsp;<br />
|-<br />
| &nbsp; $0011 &nbsp;<br />
| &nbsp; 17 &nbsp;<br />
| &nbsp; %0000000000010001 &nbsp;<br />
|-<br />
| &nbsp; $0012 &nbsp;<br />
| &nbsp; 18 &nbsp;<br />
| &nbsp; %0000000000010010 &nbsp;<br />
|-<br />
| &nbsp; $0013 &nbsp;<br />
| &nbsp; 19 &nbsp;<br />
| &nbsp; %0000000000010011 &nbsp;<br />
|-<br />
| &nbsp; $0014 &nbsp;<br />
| &nbsp; 20 &nbsp;<br />
| &nbsp; %0000000000010100 &nbsp;<br />
|-<br />
| &nbsp; ... &nbsp;<br />
| &nbsp; ... &nbsp;<br />
| &nbsp; ... &nbsp;<br />
|-<br />
| &nbsp; $009f &nbsp;<br />
| &nbsp; 159 &nbsp;<br />
| &nbsp; %0000000010011111 &nbsp;<br />
|-<br />
| &nbsp; $00a0 &nbsp;<br />
| &nbsp; 160 &nbsp;<br />
| &nbsp; %0000000010100000 &nbsp;<br />
|-<br />
| &nbsp; ... &nbsp;<br />
| &nbsp; ... &nbsp;<br />
| &nbsp; ... &nbsp;<br />
|-<br />
| &nbsp; $00ff &nbsp;<br />
| &nbsp; 255 &nbsp;<br />
| &nbsp; %0000000011111111 &nbsp;<br />
|-<br />
| &nbsp; $0100 &nbsp;<br />
| &nbsp; 256 &nbsp;<br />
| &nbsp; %0000000100000000 &nbsp;<br />
|-<br />
| &nbsp; $0101 &nbsp;<br />
| &nbsp; 257 &nbsp;<br />
| &nbsp; %0000000100000001 &nbsp;<br />
|-<br />
|}<br />
<br />
<br />
= См. также =<br />
<br />
[[Function/ru|Функции]]:<br />
* [[doc:rtl/strutils/hex2dec.html|Hex2Dec]] Преобразовывает шестнадцатеричную [[String/ru|строку]] в десятичное значение.<br />
* [[doc:rtl/strutils/hextobin.html|HexToBin]] Преобразовывает шестнадцатеричную строку в двоичный буфер.<br />
* [[doc:rtl/sysutils/inttohex.html|IntToHex]] Преобразовывает значение [[Integer/ru|Integer]] в шестнадцатеричную строку.<br />
<br />
[[Procedure/ru|Процедуры]]<br />
* [[doc:rtl/strutils/bintohex.html|BinToHex]] Преобразовываетa двоичный буфер в шестнадцатеричную строку.<br />
<br />
[[Category:Glossary/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=TAChart/ru&diff=122995
TAChart/ru
2019-02-03T18:17:09Z
<p>Useroflazarus: /* Возможности */</p>
<hr />
<div>{{TAChart}}<br />
<br />
=== О компоненте ===<br />
TAChart является основным компонентом для построения графиков и диаграмм в [[Lazarus_Faq/ru|Lazarus]], подобным фреймворку TeeChart, и распространяется под лицензией LGPL. TeeChart - это компонент для построения графиков и диаграмм, устанавливаемый в последних версиях Delphi.<br />
<br />
Данный компонент содержит функции, разработанные Филиппом Мартинолем ([[User:Marty|Philippe Martinole]]) для его проекта TeleAuto, которые были тщательно проверены Луисом Родригесом ([[User:LFRodrigues|Luís Rodrigues]]) при портировании приложения Epanet с Delphi на Lazarus.<br />
Александр Кленин ([[User:Ask|Alexander Klenin]]) переписал значительную часть кода и расширил функциональность. На данный момент он является главным сопровождающим проекта.<br />
<br />
Если у вас есть вопросы или предложения, а также если вы хотите сообщить о проблеме, пожалуйста, напишите об этом в <br />
[http://lists.lazarus.freepascal.org/mailman/listinfo Список рассылки Lazarus]<br />
или в [http://www.lazarus.freepascal.org/index.php/board,55.0.html Раздел по TAChart на форуме Lazarus].<br />
<br />
=== Документация ===<br />
<br />
Многие возможности TAChart продемонстрированы в примерах, расположенных в директории (Lazarus Install Dir)/components/tachart/demo/. См. [[TAChart_Demos|Демо-примеры TAChart]] с краткими описаниями и скриншотами.<br />
<br />
Некоторые классы и свойства TAChart представлены в документации FPDoc (доступно из среды разработки Lazarus через клавишу [F1]).<br />
<br />
Обзор большинства понятий и возможностей TAChart можно найти в [[TAChart documentation|документации по TAChart]].<br />
<br />
Для новичков могут быть полезны следующие руководства:<br />
* [[TAChart Tutorial: Getting started|Руководство по TAChart: Getting started]];<br />
* [[TAChart Tutorial: ListChartSource, Logarithmic Axis, Fitting|Руководство по TAChart: ListChartSource, Logarithmic Axis, Fitting]].<br />
* [[TAChart Tutorial: Userdefined ChartSource|Руководство по TAChart: Userdefined ChartSource]]<br />
* [[TAChart Tutorial: BarSeries|Руководство по TAChart: BarSeries]]<br />
* [[TAChart Tutorial: Stacked BarSeries|Руководство по TAChart: Stacked BarSeries]]<br />
* [[TAChart Tutorial: Dual y axis, Legend|Руководство по TAChart: Dual y axis, Legend]]<br />
* [[TAChart Tutorial: Multiple Panes in one Chart|Руководство по TAChart: Multiple Panes in one Chart]]<br />
* [[TAChart Tutorial: Function Series|Руководство по TAChart: Function Series]]<br />
* [[TAChart Tutorial: ColorMapSeries, Zooming|Руководство по TAChart: ColorMapSeries, Zooming]]<br />
* [[TAChart Tutorial: Chart Tools|Руководство по TAChart: Chart Tools]]<br />
* [[TAChart Tutorial: Background design|Руководство по TAChart: Background design]]<br />
* [[TAChart Runtime FAQ|Часто задаваемые вопросы по работе с TAChart в режиме выполнения программы]]<br />
<br />
Отображение может быть исправлено с помощью сторонней библиотеки:<br />
* [[BGRABitmap tutorial TAChart|Отображение с помощью BGRABitmap]].<br />
<br />
=== Возможности ===<br />
* Более 15 различных графиков, включая круговые диаграммы, гистограммы, диаграммы с областями, линейные и точечные графики<br />
* Функциональные ряды с поддержкой домена<br />
* Нет ограничений на количество точек, осей и самих графиков<br />
* Flexible chart sources, including design-time editing, and random, dynamic and database-aware sources.<br />
* Легенда к графикам, заголовки и подписи<br />
* Подписи к осям или маркерам могут быть установлены вручную или сгенерированы автоматически<br />
* Инвертирование осей, независимое масштабирование и смещение, логарифмический масштаб<br />
* Интерактивные утилиты, включая зуммирование и панорамирование <br />
* Автоматическое или ручное ограничение графиков<br />
* Умная отрисовка маркеров<br />
* Легко расширяется с помощью новых типов графиков <br />
* Вывод диаграмм в SVG, OpenGL, printer, WMF, [http://www.crossgl.com/aggpas/ AggPas], [[BGRABitmap]], [[fpvectorial]]<br />
* Может использоваться в неграфических приложениях, таких как веб-сервисы<br />
* Находится в активной разработке (см. [[TAChart_Roadmap|roadmap]])<br />
<br />
=== Скриншот ===<br />
<br />
На данном скриншоте представлен пример работы компонента TAChart с отображением линейного графика, гистограммы и круговой диаграммы<br />
<br />
<center>[[Image:tachart.png]]</center><br />
<br />
=== Авторы ===<br />
[[User:LFRodrigues|Luís Rodrigues]],<br />
[[User:Marty|Philippe Martinole]],<br />
[[User:Ask|Alexander Klenin]]<br />
<br />
=== Загрузить ===<br />
Последнюю актуальную версию можно найти в SVN-репозитории Lazarus (сами компоненты находятся на вкладке [[Chart_tab/ru|Chart]] в Lazarus).<br />
<br />
=== См. также ===<br />
<br />
* [[RingChart and AnalogWatch/ru|RingChart and AnalogWatch]]<br />
* [[PlotPanel/ru|PlotPanel]]<br />
* [[Comparing_TAChart_with_Delphi's_TeeChart_Standard|Сравнение TAChart и TeeChart Standard в Delphi]]<br />
[[Category:Lazarus/ru]]<br />
[[Category:Components/ru]]<br />
[[Category:Graphics/ru]]<br />
[[Category:TAChart/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Lazarus_2.0_fixes_branch&diff=122981
Lazarus 2.0 fixes branch
2019-02-03T06:53:17Z
<p>Useroflazarus: /* Roadmap to 2.0.0 */</p>
<hr />
<div>This page contains the revisions to be merged from trunk to the [http://svn.freepascal.org/svn/lazarus/branches/fixes_2_0/ Lazarus 2.0 fixes] branch.<br />
<br />
These are only fixes made after the branch was created. For other fixes made since the previous release (1.8) see SVN and [[Lazarus_1.8_fixes_branch|Lazarus 1.8 fixes branch]]<br />
<br />
Release notes can be found [[Lazarus 2.0.0 release notes|here]]<br />
<br />
== Fixes for 2.0.0RC4 ==<br />
=== Merge requests ===<br />
==== Submitted by developer / committer and waiting for testing (do not commit yet) ====<br />
*r59186 LCL: TPageControl: Focus first control on page when page is changed and a control on it was focused. {{MantisLink|0033991}} <b>r60081 should be then merged too !</b><br />
*r59647 LCL: fixed TreeItem text is centered instead of left justified. {{MantisLink|0034461}}<br />
*r59919 cocoa: restore readonly functionality {{MantisLink|0034696}}. Adding the code preventing the application from locking up on read-only mode change.<br />
*r60029 cocoa: fix the clipboard pasting of a plain text. {{MantisLink|0034832}} patch by Zoë Peterson<br />
*r60081 LCL: fixed regression from r59186. {{MantisLink|0034870}} <b>depends on merging r59186 - fixes regression</b><br />
*r60092 IDE: Don't close package editors before layout is saved. Just test if package editors can be closed.<br />
*r60217 (#awaiting peer review#) LCL: Grids, Fix crashes if rows/cols are reduced and editor was active in removed grid area. Hide the Editor if cell no longer exists (same as in DeleteRow). {{MantisLink|0034930}}<br />
<br />
==== Merge conflicts ====<br />
<br />
==== Submitted by developer / committer, tested, waiting to be merged ====<br />
<br />
=== Merged revisions for 2.0.0RC4 ===<br />
*r59207: LCL: Prevent a double validation message in TStringGrid. {{MantisLink|34306}}, patch from Tintinux.<br />
*r59691: LCL: Fix stringgrid double validation and revert patch that broke extending selection, modified patch from tintinux, {{MantisLink|34306}}<br />
*r59716 PackageIntf: Detect if a package is installed or not via the packaging interface, function "IsPackageInstalled".<br />
*r59717 Opkman: After a package is opened with "Open package file(.lpk)...", OPM wrongly reports the package as installed when in fact is not.<br />
*r59803 Object Inspector: Prevent component-tree hiding the component-values pane. {{MantisLink|34562}}.<br />
*r59867 AnchorDocking: Save PageIndex. {{MantisLink|34727}}<br />
*r59881 LCL: Fix TListView in virtual mode ignoring StateImages on Windows (patch by Serge Anvarov, {{MantisLink|34739}}).<br />
*r59886 Qt,Qt5: implemented TQtWSCustomListView.GetHitTestInfoAt(), TQtWSCustomListView.ItemSetStateImage(), draw StateImages in virtual mode. {{MantisLink|34742}}<br />
*r59890 LCL: ImageList - associate FHeight from source FHeight {{MantisLink|34708}}<br />
*r59892 LCL: TCustomImageList fix for memory leak. Patch by Ondrej Pokorny. {{MantisLink|0034708}}<br />
*r59893 Qt5: fixed wrong Left & Top form positions when form is wsMaximized under MacOS. {{MantisLink|34698}}<br />
*r59894 Qt,Qt5: deliver left,up,right,down keys to the lcl from calendarWidget. {{MantisLink|0034752}}<br />
*r59895 FpDebug: limit array/string bounds (max len) / partial fix/workaround to prevent crashes when eval locals while in pro-epi-logue (stack not yet initialized / random data for bounds and other). Issue 0034746<br />
*r59897 IDE: fixed leading space in compiler options<br />
*r59899 IDE: message widow: fixed showing ExitCode instead of ExitStatus of a process<br />
*r59907 IDE: regenerated translations and updated Russian translation<br />
*r59912 Installer, Win: do not touch any registry for associating file extensions, if unselected by user.<br />
*r59914 codetools: fixed parsing $IFOpt if option is not defined, issue 34767<br />
*r59917: LCL: GTK2: TMemo: Fixed cursor does not work. {{MantisLink|32616}}<br />
*r59921 IdeIntf: Fix compilation after fpc trunk r40645. {{MantisLink|34765}}<br />
*r59926 cocoa: returning callback object for the secured field. {{MantisLink|0034773}}<br />
*r59929 FpDebug: Fix typecast<br />
*r59930 FpDebug: Fix length of widestring (avoid trailing random data)<br />
*r59931 FpDebug: change "open array" params to "const"<br />
*r59932 LazDebuggerLldb: change "open array" params to "const"<br />
*r59935 TAChart: Add missing overload directives in TBasicDrawer class ({{MantisLink|34774}}, patch by Jonas Maebe).<br />
*r59943 FpDebug: fix accessing Upper-bound-value of open-array. Was missing a context object. Issue 0034781 / Add limit to prevent bad size, if data is corrupt. Issue 34772<br />
*r59951 IDE: fixed warning about missing output directory D:\, issue 34545<br />
*r59959 FpDebug: fix commit 59943 / open-array bounds<br />
*r59960 LCL, grids: fix TStringGrid copy/paste to/from MS Excel and OO Calc bug, patch from K155LA3, {{MantisLink|30623}}<br />
*r59961 FpDebug: added dbgs for debugln<br />
*r59962 FpDebug: fix nested array bounds in dwarf3<br />
*r59964 LazDebuggerFp/FpDebug: tests<br />
*r59971 SynEdit: fix selection with smLine (include some selection via gutter) should include folded lines, if the "fold start" line gets selected. Issue 0034760<br />
*r59978 FpDebug: Callstack, adjust to show the current calling line, instead of the line after it. Issue 0034753<br />
*r59981 GTK2/GTK3: Add widgetset limitations for TEdit.NumbersOnly not implemented. {{MantisLink|0033704}}<br />
*r59982 TurboPower_iPro: Fix line spacing of < br> tag. {{MantisLink|34803}}<br />
*r59983 SynEdit: Added checks for revision 59971 (fix selection with smLine should include folded lines - Issue 0034760) - apply only if AutoExtend is true (indicates user input key/mouse) / Setting Selection from code should not be affected.<br />
*r59985 LCL: TCustomTabControl: don't fire OnChanging when programatically changing TabIndex/PageIndex. Patch by Michl. {{MantisLink|0033720}}.<br />
*r59988 Translations: Polish translation update by Sławomir Niedziela, bug 34788<br />
*r59997 LazDebuggerFpLldb: Prevent occasional crash, when evaluate watch in nested procedure (access callstack out of index)<br />
*r59998 LazDebuggerFpGdbmi: Prevent occasional crash, when evaluate watch in nested procedure (access callstack out of index)<br />
*r60000 LazDebuggerLldb: Fix reading registers for correct frame<br />
*r60001 LazDebuggerFpLldb: fix pre-loading correct registers<br />
*r60004 LazDebugger(Fp)Lldb: fix correct stackframe/thread for registers<br />
*r60005 LazDebuggerFpLldb: fix crash in shutdown (stop debug while paused)<br />
*r60006 LazDebugger(Fp)Lldb: fix 32/64 target detection<br />
*r60007 LazDebuggerFpLldb: get current IP address from register (instead of stack) if available<br />
*r60008 LazDebuggerFpLldb: retrieve register for other stackframes, while evaluation is running (required for nested procedures)<br />
*r60009 LazDebuggerFp/FpDebug: tests, remove virtualtree<br />
*r60010 LazDebuggerFp/FpDebug: tests, fp-lldb<br />
*r60014 LazDebuggerFp/FpDebug: prevent mem-cache from hiding mem-read errors<br />
*r60015 FpDebug: MacOs, loading of dwarf symbols missed some global vars.<br />
*r60019 SynEdit: MultiCaret - handle 2 stroke key combos correct.<br />
*r60024 VirtualTreeView: Fix compilation with FPC trunk after r40745, {{MantisLink|34804}}. Slightly modified patches by Pascal Riekenberg.<br />
*r60031 Converter: Give a converted binary DFM file a .lfm suffix. {{MantisLink|34811}}.<br />
*r60033 SynEdit: fix assert/range-check in multi caret. Issue 0030731<br />
*r60034 SynEdit: test for fix assert/range-check in multi caret. Issue 0030731<br />
*r60035 LazDebuggerFp: use dsInternalPause to set/unset breakpoints<br />
*r60036 Translations: Brazilian Portuguese translation update by Marcelo B Paula, bug 34838<br />
*r60037 Translations: Ukrainian translation update by Olexandr Pylypchuk, bug 34830<br />
*r60041 FpDebug: MacOs, 64bit IDE loading of dwarf for 32 bit target<br />
*r60042 LazDebuggerFpLldb: allow external dwarf symbols on Mac<br />
*r60044 FpDebug: Windows, fixed intercepting system exceptions (access violations, stack overflow, div zero,...)<br />
*r60048 FpDebugServer: fix compilation / support multiple addresses per breakpoint<br />
*r60049 Debugger: keep register-names in register window, while debugger is running (show <unavailable>). This way scroll pos is preserved. {{MantisLink|32654}}<br />
*r60050,r60052 Debugger: fix compile after r60049 "keep register-names in register window, while debugger is running" {{MantisLink|34844}}<br />
*r60061 IDE: Support many picture formats for project icon. It was wrongly changed for {{MantisLink|34464}}.<br />
*r60062 LCL: Prevent a rare range error in ImageListResolution.<br />
*r60069 TAChart: Fix precedance of boolean operators error in TCustomChartSeries.Drawlabels. Issue #34819. Patch by Marcin Wiazowski.<br />
*r60070 TAChart: Use data point index limits FLoBound and FUoBound instead of 0 and Count-1 in data point labeling routines. {{MantisLink|34819}}. Patch by Marcin Wiazowski.<br />
*r60071 TAChart: Fix vertical placement of series labels on stacked series with logarithmic axis ({{MantisLink|34861}})<br />
*r60072 TAChart: Fix painting of a non-stacked bar series in case of a nonlinear axis transformation.<br />
*r60073 TAChart: Fix horizontal position of series labels for a bar series having multiple, non-stacked y values ({{MantisLink|34862}})<br />
*r60074 TAChart: Fix positioning of centered labels for logarithmic, non-stacked bar series with multiple y values.<br />
*r60075 TAChart: Fix AreaSeries drawing inverted area if it extends down to -Inf.<br />
*r60076 Qt,Qt5: call inherited Create for TStrings.<br />
*r60077 TAChart: Fix positioning of series labels (hopefully...) by reverting some of r56492. {{MantisLink|34819}}<br />
*r60082 TAChart: Fix crash of IDE due to r60070<br />
*r60083 FpDebug: fix type in macho debug structure (avoid range check errors)<br />
*r60084 LazDebuggerFpLldb: correctly initialize pretty-printer<br />
*r60085 FpDebug: fix cache when cross debugging a 64bit target from a 32bit IDE. (affects FpLldb)<br />
*r60086 FpDebug: Fix DW_FORM_strp for Dwarf3's 64Bit-Dwarf info<br />
*r60087 TAChart: Correct vertical position of stacked bar series centered labels if ZeroLevel is not used.<br />
*r60088 TAChart: Replace TMarkPositions option lmpInsideCenter by new property "MarkPositionCentered" published for bar and area series.<br />
*r60089 TAChart: Update area demo to show new property "MarkPositionCentered".<br />
*r60090 TAChart: Replace deprecated Reticule in demo/basic by a DataPointCrosshairTool.<br />
*r60104 TAChart: Fix sign error in coordinate transformation ({{MantisLink|34898}}, found by Marcin Wiazowski)<br />
*r60105 TAChart: Undo part of r60075 (see {{MantisLink|34898}}).<br />
*r60109 TAChart: Use ChildSizing technique to position charts in demo/panes.<br />
*r60110 TAChart: Fix scaling of axis with fixed range when associated series is hidden.<br />
*r60119 Sparta docked formeditor: Change visibility of methods so it compiles with FPC trunk. {{MantisLink|34816}}.<br />
*r60120 TAChart: Fix series label direction in case of right-to-left mode.<br />
*r60126 LCL: TComboBox: Fixed invisible mouse. {{MantisLink|34913}}<br />
*r60127 TAChart: Fix series label direction for an inverted axis.<br />
*r60128 TAChart: Fix logical error in previous commit<br />
*r60129 TAChart: Fix axes for series having very long labels. {{MantisLink|34896}}. Based on patch by Marcin Wiazowski.<br />
*r60130 Debugger: remove some active logging<br />
*r60131 LCL-GTK2: Support pasting images copied from another application. {{MantisLink|34840}}.<br />
*r60133 Debugger-tests: speed up internal logging (needed on windows).<br />
*r60141 Translations: Hungarian translation update by Péter Gábor, bug 34912<br />
*r60150 chmhelp: Fix compilation of lhelpconnectiondemo1 project<br />
*r60151 TAChart: Refinements for long series labels (respect device scaling, introduce chart property MinDataSpace). {{MantisLink|34896}}.<br />
*r60154 lplupdate: support dotted pkg names<br />
*r60158 codetools: fixed usesgraph addtargetunit<br />
*r60162 TAChart: Avoid crash of chart if an axis is destroyed. Add chart properties HorAxis and VertAxis. {{MantisLink|34896}}.<br />
*r60163 TAChart: Fix uninitialized variables FLoBound and FUpBound used by TBasicPointSeries. Patch by Marcin Wiazowski. {{MantisLink|34935}}<br />
*r60206 AnchorDocking: Fixed SimplifyOneControl destroy the layout. {{MantisLink|34937}}<br />
*r60216 TAChart: Fix too-late updating of variables FLoBounds and FUpBounds of TBasicChartSeries. Patch by Marcin Wiazowski. {{MantisLink|34935}}.<br />
*r60218 Tools, UpdatePoFiles: corrected accepted resource file extension (.lrt -> .lrj)<br />
*r60224 LCL: Win32: Fixed not every TGroupBox child follows parent's Enabled property. {{MantisLink|0034763}}. Patch by BrunoK<br />
*r60225 TAChart: Fix incorrect scaling of TScaledCanvasDrawer<br />
*r60232 Qt5: fixed invalid positions of TCustomControl. {{MantisLink|0034880}}<br />
*r60235 TAChart: Fix TChart.IsPointInViewPort to allow for floating point round-off errors. {{MantisLink|34961}}<br />
*r60236 Qt,Qt5: fixed themed drawing of combobox when we draw regular dropdown button.<br />
*r60237 Docs: Update documentation for PopupNotifier, remove a duplicate UTF8Process.xml file. {{MantisLink|34962}} and {{MantisLink|34966}}<br />
*r60239 Lldb / FpLldb: fix length of exception class names<br />
*r60242 docs: documentation of lazutf8classes, issue 34968, from Don Siders<br />
*r60246 LazLogger: Fix a crash, due to not thread safe.<br />
*r60248 Qt,Qt5: do not send LM_MOVE from viewport of TCustomControl since param is position of viewport by itself.<br />
*r60249 Qt,Qt5: do not send LM_MOVE from QLineEdit of QComboBox. {{MantisLink|0034880}}<br />
*r60250 LCL: GTK2: Fixed memory leak in StatusBar. {{MantisLink|34951}}<br />
*r60258 docs: lazfileutils, issue 34984, from Don Siders<br />
*r60264 LazLogger: Init is called from DoDebugLn => make thread save<br />
*r60270 Qt,Qt5: fixed application hang when terminated but trying to show another form. Now we don't use QtUseNativeEventLoop on qt4 anymore. {{MantisLink|34982}}<br />
*r60271 Qt,Qt5: fixed AppRun when called with Application.Terminated - eg. app terminated in mainform.OnShow when using QtUseNativeEventLoop. part of {{MantisLink|34982}}<br />
*r60273 Debugger GDBMI: Fix thread context for finding correct frame<br />
*r60274 Debugger GDBMI: Attempt workaround for step-over issue (step-over performs step-in). See Issue 0034159<br />
*r60275 Debugger GDBMI: Fix compilation of tests<br />
*r60276 TAChart: Fix of TChart.IsPointInViewPort and axis labels if all data values are < 1E-12.<br />
*r60296 lazutils: docs, issue 34994, patch from Don Siders<br />
*r60299 docs: fixed xml<br />
*r60301 docs: fixed lazutils xml<br />
<br />
== Fixes for 2.0.0RC3 (merged) ==<br />
*r59374 IDE: Update unit path for all build modes also when creating a new unit. {{MantisLink|34413}}<br />
*r59378 IDE: Add high-dpi icons for images and images/codeexplorer (provided by Roland Hahn)<br />
*r59376 debugger: fix pseudo terminal, only memo needs monospace. {{MantisLink|0034192}}<br />
*r59382 Installer, Win: Allow adjusting install dir, in case of 2ndary/multiple installs.<br />
*r59384 Installer, Win: Prevent a crash, if installing 2ndary into same path, as previous (removed) primary installation. / Added logging.<br />
*r59386, r59385 EditorOpts: Add warning, if outline has no colors set<br />
*r59375, r59377 IDE: Remove unused resource strings.<br />
*r59379, r59388 IDE: regenerated translations and updated Russian translation<br />
*r59450 Translations: Brazilian Portuguese translation update by Marcelo B Paula, bug 34492<br />
*r59402 Ensure bookmark menu is updated if files are opened/closed. Those files may have bookmarks in the session, that will be set for the editor. Part of {{MantisLink|0034194}}<br />
*r59395 IDE: Try to switch path delimiters only for filenames when reading TCompilationToolOptions.Command. {{MantisLink|34476}}<br />
*r59396 IDE: Switch path delimiters only for filenames better for TCompilationToolOptions.Command. {{MantisLink|34476}}<br />
*r59431 IDE: New high-dpi images for folder images/componenttreeview (by Roland Hahn)<br />
*r59432 IDE: Add high-dpi images for folder images/codetoolsdefines (by Roland Hahn)<br />
*r59434 IDE: Update copyright.txt (authorship of images used by IDE). Issue #0034487<br />
*r59447 IDE: New high-dpi images for folder images/states (by Roland Hahn)<br />
*r59416 LazUtils: Raise exception in UTF8To... functions, controlled by a global boolean. {{MantisLink|33686}}<br />
*r59436 LazUtils: Add LazUTF8SysUtils with "deprecated" warnings. The unit was renamed earlier.<br />
*r59439 Debugger, asm dialog: fix mouse wheel scrolling<br />
*r59443 Lldb/Gdb - FpDebug: fix crash in pretty printer when called from lldb/gdb mixed debugger (MemManager not set)<br />
*r59445 lldb debugger: Fixed "stop" => now works while running. Implemented "pause"<br />
*r59440 IDEIntf: Allow to add sliced images to the image list editor of the multi-res imagelist (see https://forum.lazarus.freepascal.org/index.php/topic,43088.msg301126.html)<br />
*r59441 IDEIntf: Use resourcestrings for button "Add sliced" in ImageListEditor<br />
*r59442 IDEIntf: Clean up of unused variables in r59440<br />
*r59448 IdeIntf: fixed ellipsis inconsistency, regenerated translations and updated Russian translation<br />
*r59453 IDE: open package link check if directory<br />
*r59455 IDE: packagelink: do not expand empty package link filename<br />
*r59457 codetools: do not automatically pass -Fr to pas2js<br />
*r59468 lcl: fixed TComboBox.ReadOnly deprecated text<br />
*r59462 IDE: Additional high-dpi icons for folder images/designer (by Roland Hahn)<br />
*r59466 IDE: Updated high-dpi z order icons (by Roland Hahn)<br />
*r59470 IDE: Add missing images from images/designer (issue #34514).<br />
*r59463 IDEIntf: Update German translation, fixed ellipsis inconsistency<br />
*r59469 IDE: Improved German translation of z-order menu captions.<br />
*r59471 Translations: regenerated German translation<br />
*r59476 rpm: workaround for fpc putting libpas2jslib.so in wrong directory on arch64<br />
*r59477 rpm: libpas2jslib.so<br />
*r59478 LCL: Set TPopupNotifier's Color to clInfoBk instead of $DCFFFF (see https://forum.lazarus.freepascal.org/index.php/topic,43125.msg301479/).<br />
*r59481,59482 (ONLY for win64): Debugger-Gdbmi: fix setting internal breakpoints by address only. // Add "step to except" for win64 (SEH). No "step to finally" yet<br />
*r59483 Translations: Brazilian Portuguese translation update by Marcelo B Paula, bug 34519<br />
*r59490 SynEdit: fix showing caret, after getting focus. {{MantisLink|0034527}}, {{MantisLink|0034506}}<br />
*r59491 lldb debuggers: added license info / fp-lldb now beta<br />
*r59493 Opkman: Add high-dpi icon for the IDE (by Roland Hahn)<br />
*r59494 lldb-fp debug: Makefiles<br />
*r59495 fp debug: Makefiles<br />
*r59496 fix Makefiles<br />
*r59497 Added lldb, lldb-fp to BigIde<br />
*r59498 Remove the pure lldb debugger from pre-installed debuggers<br />
*r59499 IDE: Small update of German translation<br />
*r59500 IDE: fixed save file as dlg rename pascal file lowercase<br />
*r59504 macos dmg: default debugger TFpLldbDebugger<br />
*r59506 IDE: New high-dpi Windows file type icons (by Roland Hahn)<br />
*r59510 Fix compilation with debug define<br />
*r59511 LazDebuggerFp: fix mem leaks in logging code.<br />
*r59521 LazDebuggerFp: Fix/Implement "Reset Debugger" / Refactor: Use LockRelease from base class.<br />
*r59525 FpDebug: fixed a memory leak, when the debugged process forked child processes.<br />
*r59526 VTV: Prevent building failure on the following architectures: arm64, armel and armhf(issue #34329).<br />
*r59528 TAChart: Fix panning error of TAreaSeries (caused by r58562, see https://forum.lazarus.freepascal.org/index.php/topic,43182.0.html).<br />
*r59538 FpDebug: temporary workaround to display widestrings (actually pwidechar^)<br />
*r59539 FpDebug: temporary workaround to display widechar<br />
*r59540, r59564 Translations: Czech translation update by chronos, bug 34549<br />
*r59543 Packager: Add BorderSpacing values for controls in IDE package graph dialog ({{MantisLink|34553}}).<br />
*r59544 IDE: Improve layout of Publish Project dialog. {{MantisLink|34547}}<br />
*r59547 Translations: Brazilian Portuguese translation update by Marcelo B Paula, bug 34555<br />
*r59548 Translations: Ukrainian translation update by Olexandr Pylypchuk, bug 34554<br />
*r59552 FpDebug: Windows, fix leaking filehandles / more (temp) fixes for not processing forked children<br />
*r59556 LazDebuggerFp: added auto-typecast for objects (watches, inspect / not working for hints)<br />
*r59557 FpDebug: format structured values (class) as one line per field<br />
*r59558 LazDebuggerFp: return typeinfo for watches<br />
*r59559 codetools: added TCodeCache.ClearAllModified<br />
*r59560 IDE: fixed clear modified files on close project<br />
*r59563 FpDebug: fix memleak if no loader for file format is found<br />
*r59566 Qt5 cbindings:added static QPrinterInfo_availablePrinterNames() which returs QStringList. part of {{MantisLink|34558}} <br />
*r59568 LazDebuggerFp: fix missing result for dcPause<br />
*r59581 IDE: ask new componentname dialog: fixed uninitialized result<br />
*r59590 Qt/Qt5: fixed LCLIntf.CreateCaret() and LCLIntf.ShowCaret() result. {{MantisLink|34653}}<br />
*r59592 Qt5: added QPrinterInfo_availablePrinterNames().part of {{MantisLink|34558}}<br />
*r59593: Qt5: use QPrinterInfo_avaliablePrinterNames() instead of old QPrinterInfo_availablePrinters(). {{MantisLink|34558}}<br />
*r59594: Qt5: fixed crash when caching papers. part of {{MantisLink|34558}}<br />
*r59595 Qt/Qt5: implemented WP_SMALLCAPTION. {{MantisLink|34459}}<br />
*r59597 LazDebuggerFp: Fix accessing property of nil object / CurrentThread may be nil.<br />
*r59617 Translations: Chinese translation update by robsean, bug 34579<br />
*r59584 SynEdit: fix caret blinking during code-completion drop down, if persistent-caret-is-none-blinking<br />
*r59596 SynEdit: (Win10 issue only) fix for "ghost" images of text-caret on Windows 10, in certain conditions where part of the editor is outside the physical screen.<br />
*r59586 LCL: Read a streamed WideString CollectionItem property correctly. {{MantisLink|34561}}<br />
*r59621 LCL: Win32: Fixed PageControl corrupts display when TabPosition is tpLeft or tpRight. {{MantisLink|34577}}<br />
*r59607 LazDebuggerFp: Fix crash, if string read from debugged app is nil / debugged app exception info<br />
*r59608 LazDebuggerFp: more nil handling safety<br />
*r59625 Debugger: fixed breakpoint actions (take snapshot) for address and data breakpoints<br />
*r59614 LazLogger: fixed crash in assign<br />
*r59636 IDE: fpc msg parser: check for Warning too, bug 34582<br />
*r59683 Translations: Brazilian Portuguese translation update by Marcelo B Paula, bug 34610<br />
*r59698 Translations: French translation update by Gilles Vasseur, bug 34616<br />
*r59637 Qt,Qt5: fixed ScrollWindowEx() when contains SW_SCROLLCHILDREN flag. {{MantisLink|34589}}<br />
*r59652 Qt,Qt5: removed old workaround in DrawText() - MacOS. {{MantisLink|34587}} <br />
*r59653 Qt5: fixed crash when printing image under MacOS. {{MantisLink|34598}}<br />
*r59654 Qt5: fixed BringToFront() for TCustomForms under MacOS. {{MantisLink|34599}}<br />
*r59667 Qt: fixed drawText() background painting when BkMode = OPAQUE - MacOS only. {{MantisLink|34587}}<br />
*r59642 TAChart: Fix typo in German translation.<br />
*r59661 TAChart: regenerated German translation<br />
*r59648 Gtk3: removed workaround in GetTextExtentPoint() so it returns correct width of text.<br />
*r59651 LCL: Support autocompletion in TComboBox for single-letter text, too. {{MantisLink|34566}}<br />
*r59666 LCL: Fix unbound dblookupcombobox autocomplete, based on fix from melwinek {{MantisLink|34298}}<br />
*r59668 LCL, missing change from r59666<br />
*r59655 LazDebuggerFp: handle "ignored exceptions" list<br />
*r59656 LazDebuggerFp: deal with fpc info for nested procs variable scopes.<br />
*r59678 LazDebugger(Fp)LLDB: fix, check for ignored exceptions<br />
*r59679 LazDebugger(Fp)LLDB: fix getting class-name for exceptions<br />
*r59680 LazDebugger(Fp)LLDB: fix memory leak<br />
*r59692 FpDebug: print type-name for structured types<br />
*r59693 Debugger: Fix wrong class for threads.<br />
*r59665 fpvectorial: Reduce default border width of table cells from 1mm to 0.5pt (see https://forum.lazarus.freepascal.org/index.php/topic,43322.msg302997).<br />
*r59708 Qt,Qt5: fixed wrong PPI calculation (MacOS only). {{MantisLink|34625}}<br />
*r59709 Qt5: fixed Font.Height value inside TQtWidgetSet.InitStockFont() (MacOS only). {{MantisLink|34625}} <br />
*r59711 Qt: fixed Font.Height value inside TQtWidgetSet.InitStockFont() (MacOS only). {{MantisLink|34625}}<br />
*r59714 Qt5: Fixed showing of popup window over modal form. eg TDateTimePicker calendar. (MacOS only)<br />
*r59756 cocoa: making sure that TEdit and TComboBox (editable) are trully single line<br />
*r59755 cocoa: additional code to handle unassigning of trayicon menu<br />
*r59754 cocoa: menus - fix cocoa app mem leak for allocated TcocoaMenuItems<br />
*r59753 cocoa: update menus to be able to remove separator items<br />
*r59752 cocoa: update removal of menuItems. Removing an item from parent menu rather than from parentItem's menu. #34602<br />
*r59751 cocoa: update printing component to use LCLObjCBoolean type<br />
*r59750 cocoa: update type cocoawsmenu type switching from boolean to LCLObjCBoolean. #34609<br />
*r59749 cocoa: registering cocoadatepicker unit with lcl.lpk<br />
*r59748 cocoa: cleanup in calendar (datepicker) component - removing unused units. #34609<br />
*r59747 cocoa: cleanup in calendar (datepicker) component. #34609<br />
*r59746 cocoa: move NSResponderHotKeys to cocoawindows.pas unit. #34609<br />
*r59726 cocoa: update OpenGL component to use LCLObjCBoolean type (rel #34609)<br />
*r59725 cocoa: updating LCL overrides to recognize different boolean types used in FPC headers. #34609<br />
*r59674 cocoa: fix the issue with using enclosing scrollView for mouse position check. #34516<br />
*r59646 cocoa: any font can utf8 (unicode)... even if it doesn't. #34594<br />
*r59645 cocoa: using additional storage for keeping checked state of a checklist items. #34590<br />
*r59628 cocoa: reporting extended UTF8 character as a question mark for ansi char<br />
*r59627 cocoa: Fixes TTabControl, it previously was placing controls inside it with Left=0 as if they had Left=-20, because NSTabView is not meant to receive views inside it like that, we need a different handle for TTabControl and TPageControl<br />
*r59620 cocoa: restoring the code to identify VK code based on the character (support for Dvorak keyboards). Any national characters would still be determined based on keyCode. Suggested by Zoë Peterson<br />
*r59492 Printers: Support for Cocoa printing, updated examples.<br />
*r59397 cocoa: patch by David Jenkins - forcefully invalidate the content document for manual scroll. Should help with redrawing customcontrols for 10.14. #34478<br />
*r59380 cocoa: preventing spinedit value from being change while destroying the handle. #34468<br />
*r59363 cocoa: update the behaviour of GetFocus function to use HandleView stored with callback object. #34450<br />
*r59362 cocoa: using Device colorspace, instead of Calibrated colorspace for GDI objects. #34427<br />
*r59331 cocoa: additional methods (nsview, nscontrol, nsbuttons, nstextfield) for handling fpc issue #34411<br />
*r59330 cocoa: additional methods for handling fpc issue #34411<br />
*r59329 cocoa: workaround for a problem with 64-bit boolean parameter passing (see fpc issue #34411 for details)<br />
*r59273 cocoa: prevent listview premature handle allocation. Fixes the issue of IDE not being able to add list view onto a designer form<br />
*r59252 cocoa: fix combobox onchange which fixes also lazreport designer on second opening and also fixes issue #33800<br />
*r59251 cocoa: preventing too high values on measuring text with soft-line breaks. #34382<br />
*r59250 cocoa: fix compiler warning<br />
*r59249 cocoa: update deallocation of read-only combobox<br />
*r59247 cocoa: fix the combobox itemindex when the new text is not the list<br />
*r59238 cocoa: fix drawing overlays - resing overlay designer view to the form<br />
*r59237 cocoa: dereferncing tracked control earlier<br />
*r59236 cocoa: improve mouse handling of spinedit<br />
*r59235 cocoa: fix controls leaking spinedit<br />
*r59234 cocoa: memory management - removing unneeded autorelease pools. There's one global and one per each event<br />
*r59233 cocoa: fix for a memory leak in overlay (designer) form<br />
*r59232 cocoa: memory management - removing unneeded autorelease pools. There's one global and one per each event<br />
*r59231 cocoa: memory management - removing unneeded autorelease pools. There's one global and one per each event<br />
*r59206 cocoa: update insertion and removal of rows in cocoa table (fix implementation from #34319)<br />
*r59205 cocoa: fix the conversion between WS to LCL tab index #34361<br />
*r59196 cocoa: adding a check for TCocoaTextLayout.Draw procedure. Do nothing if string is empty or invalid. Prevents SynEdit crashes for unicode characters<br />
*r59195 cocoa: update key processing, adding more exception for non-printable keys<br />
*r59189 cocoa: updating drawing of ownerdrawn statusbar<br />
*r59188 cocoa: removed redundant key emulation events (introduced with #32829). With the latest changes in key handling events those are no longer needed<br />
*r59187 cocoa: implementing owner drawn for status bar panels. #34338<br />
*r59185 cocoa: additional control over cocoa window levels<br />
*r59183 cocoa: adding exception for processing key equivalents and return key, if a first responder is capable of processing the return key. #34354<br />
*r59179 cocoa: update key event handling. Not all characters from macOS are suitable for LCL KeyPress<br />
*r59178 cocoa: using a single place to process keyDown event related to LCL callbacks<br />
*r59164 cocoa: the first oddity of modal sessions. Context Menu would not call an action to indicate the menu item selected #34325<br />
*r59163 cocoa: propagating LM_CONTEXTMENU to parents<br />
*r59141 cocoa: restore key processing, to let hot keys to triggers... odd<br />
*r59140 cocoa: minimze table view invalidation on add / delete items. #34319. Patch by David Jenkins<br />
*r59135 cocoa: adding support for focus rect of TMemo<br />
*r59134 cocoa: restoring keyboard processing events for NSWindow. #34301<br />
*r59132 cocoa: update menus switch in modal. The proper menu history save for modal windows without a menu<br />
*r59131 cocoa: improve tracking of menu changes when modal dialogs are switching. Merged menu routines from coocaojbect.inc into cocoaint.pas<br />
*r59130 cocoa: removed the previously added hack for modal window on activation. Doesn't work on every macOS, as well as causing some issues<br />
*r59129 cocoa: update modality using modalitySessions (to keep event processing in place)<br />
*r59107 cocoa: making sure that window with popup_parent would stay above when attaching to the parent (and remain a keywindow). #34301<br />
*r59106 cocoa: update attachmenu process, so NSMenu can be added into NSMenuItem as a subitem. #34293<br />
*r59105 cocoa: adding the support for TDisplayCode to determine a rectangle in ListView. Based on patch by David Jenkins. #34312<br />
*r59104 cocoa: proper selection of an image index for a sub-item in listview. #34313. Patch by David Jenkins<br />
*r59103 cocoa: allow autosized columns to be user sized as well. #34311. Patch by David Jenkins<br />
*r59102 cocoa: restore radio-menues functionality. #34310<br />
*r59088 cocoa: support for Services menu<br />
*r59087 cocoa: an attempt to resolve the issue during crashes, if a (cocoa) modal window is called during Activation of a window<br />
*r59086 cocoa: fix the compiler warning<br />
*r59065 cocoa: reverting an attemtped workaround (r59060) to fix the problem with a modality during windows activate<br />
*r59063 cocoa: remove debugging output<br />
*r59062 cocoa: update keyDown handling for custom controls<br />
*r59061 cocoa: simplify and more robust mac to LCL virtual key codes conversion<br />
*r59060 cocoa: working around macOS problem with transactions during making a keyWindow<br />
*r59058 cocoa: removing tabControl workaround<br />
*r59057 cocoa: replacing default keyDown handling routine, with a cusomized one. The reason: unable to fully predict the event processing within Cocoa, causing some keys to be lost<br />
*r59039 cocoa: reduce the amount of focus (responders) related code. Process the focus handling in NSWindow only (rather than each control individually). Update tab switch notification to report tab change prior to focus switch<br />
*r59036 cocoa: fix in TListBox.setItemIndex to replace the selection, rather than extend it. #34290<br />
*r59035 cocoa: added code, but not enforcing it for change in border style of TComboBox<br />
*r59034 cocoa: update combobox (NSComboBox) to retain the selection after reopenning the popup window<br />
*r59033 cocoa: preventing NSTabView to appear in chain of responders. That should prevent key event loss. (a very odd cocoa feature)<br />
*r59029 cocoa: update mainmenu implementaiton. Added support for Hide Others and Show All menu items<br />
*r59028 cocoa: resolve mem leak in listbox custom draw<br />
*r59027 cocoa: extend support of CGContextRef (for macOS 10.10 and later). Adding init of context for custom drawn dropdownlist<br />
*r59026 cocoa: adding cocoawschecklst.pas to the list of units in lcl.lpk file<br />
*r59025 cocoa: adding support for borderstyle of a customchecklist box<br />
*r59024 cocoa: support of BorderStyle property for the common rectangular controls<br />
*r59023 cocoa: restore filtering of ampersands in menu titles<br />
*r59022 cocoa: fix compilation issue made by the prev commit<br />
*r59021 cocoa: initial support for enabling/disabling menus on ShowModal<br />
*r59020 cocoa: remove the direct reference between TCocoaWindow and LCLForm<br />
*r59019 cocoa: switch paintstruct back from dynamic (originally changed back in 2012) to static. Saving on heap change call<br />
*r59017 cocoa: prevent MainMenu from being set on a designed form<br />
*r59015 cocoa: remove lclIsHandle method completetly. Handle use is defined on WS level and stored with the callback object<br />
*r59014 cocoa: rename frame view to handleview. HandleView would be used as HWND for any composed control<br />
*r59727 FpDebug: Disable assert, until fixed<br />
*r59728 FpDebug (incl lldb/gdb): Fix crash due to wrong cache removed from list. List could have 2 caches with same address, if a smaller cache was replaced by a bigger. Remove could destroy one and remove the other<br />
*r59729 FpDebug: (Linux/Mac) Do not keep files open longer than needed. Systems may limit max files open. (Mac opens many files)<br />
*r59740 FpDebug: Windows, Check dwDebugEventCode before accessing case dependent data<br />
*r59741 FpDebug: Windows, fix leaking filehandles (again), see r59552 / needed until forked processes are handled.<br />
*r59742 LazDebuggerFp: fix getting exception class/msg for 64bit targets<br />
*r59743 Debugger: Limit size of exception message/window<br />
*r59745 FpDebug: fix accessing nil fileloader. Introduced in rev 59729 / Issue 0034657<br />
*r59737 Qt: fixed TListView Style=vsReport + TListView.Checkable=True - no mouse move events. {{MantisLink|0034656}}. Fixed TListView with Style vsReport + visible columns - it is possible to move columns without LCL interaction.{{MantisLink|0034655}}<br />
*r59738 Qt5: TListView with Style vsReport + visible columns - it is possible to move columns without LCL interaction. {{MantisLink|0034655}}<br />
*r59739 Qt5: TListView Style=vsReport + TListView.Checkable=True - no mouse move events. {{MantisLink|0034656}}<br />
*r59758 Qt5: added missing consts for QFontDialog options.<br />
*r59760 LCL: Rename function NewLineMI back to NewLine for Delphi-compatibility. {{MantisLink|34667}}.<br />
*r59783 Opkman: do not try to download package list on IDE startup if update interval is set to 'never', patch from Balázs<br />
*r59761,59762,59764,59770,59772 Qt5: implemented native TCustomEdit.TextHint property. {{MantisLink|0034670}}<br />
*r59771 Qt,Qt5: do not touch MDI stack order if we are hidden mdichild by minimizing application, or minimizing via pager under X11.<br />
*r59773 Qt,Qt5: show text when TComboBox is csOwnerDrawEditableFixed or csOwnerDrawEditableVariable during design time. {{MantisLink|0033295}}<br />
*r59774 Opkman: Set "Check for package updates" to never by default.<br />
*r59775 lazres: using LazLogger instead of LCLProc to get debugln, turned off warnings 6058, issue 34676<br />
*r59776 FpDebug: Fix Dwarf3 on 64bit. The The 32/64bit signature in the dwarf header should only affect references within the dwarf info. But by accident it affected constant addresses. This lead to truncation of some addresses, when dwarf-3 was used with 64 bit targets.<br />
*r59777 FpDebug: properly encode strings for display (unprintable chars as #$nn)<br />
*r59779 FpDebug: nil check, in case of corrupted debug info<br />
*r59787 LazDebuggerFp: Prevent crash, if debugger instance is destroyed before logging is handled.<br />
*r59807 LCL: Paint a cross mark also in TColorListbox for clNone. {{MantisLink|34632}}<br />
*r59821 LCL: AnchorDocking: Fixed Tab position setting is not saved and restored. {{MantisLink|33061}}<br />
*r59823 Printers, Fix printing regression under linux {{MantisLink|34680}}<br />
*r59829 paradox: Fix typo in Paradox blob file extension (.bm --> .mb), {{MantisLink|33884}}, patch by Bart Broersma<br />
*r59830 IDE: Don't enlarge IDE if MessagesView or CodeExplorerView is shown. {{MantisLink|34447}}<br />
*r59778 FpDebug: handle PWideChar (and WideString, if represented as PWideChar)<br />
*r59780 FpDebug: detect ShortString under dwarf-2<br />
*r59794 FpDebug: started/partly detect strings in dwarf-3<br />
*r59802 LazDebuggerFpLLDB: Fix potential dangling pointer in Locals eval.<br />
*r59805 LazDebugger(Fp)Gdbmi: Fix potential dangling pointer in Locals eval.<br />
*r59806 LazDebuggerFpLLDB: Fix locals, need registers first<br />
*r59811 LazDebuggerFpLLDB: Enable capturing debug history (snapshots) on idle or break-action<br />
*r59812 LazDebuggerFpLLDB: load dwarf info in thread / process simultaneous with lldb<br />
*r59813 LazDebuggerFpLLDB: load dwarf info in thread / fix memleak<br />
*r59824 LazDebuggerFpLLDB: load dwarf info in thread / simplify clean up<br />
*r59696 LazDebuggerFp: linux, fix running process-access in debug-thread (needed when accessing outer vars for nested procs, for which stack has not yet been evaluated)<br />
*r59814 LazDebuggerFp: Implement conditional breakpoints<br />
*r59815 LazDebuggerFp: Implement conditional breakpoints / fix nil access<br />
*r59846 LazDebugger(Fp)LLDB: Show message on unexpected stop<br />
*r59848 LazDebuggerFpLLDB: fix mem leak in locals<br />
*r59850 LazDebuggerFpLLDB: fix mem leak in cache<br />
*r59851 Fix TCustomIcon.AssignImage / Add / UnshareImage. New images must be created according to FSharedImage.GetImagesClass. Otherwise "ci := TCursorImage.Create; ci.Assign(Some_TBitMap);" will crash.<br />
*r59861 FpDebug: Implemented watch for "SomeString[index]"<br />
*r59862 LazDebuggerFp: Fix, showing pchar and string version for index access of string/pchar<br />
*r59864 IDE/FlowPanel: Publish property BorderSpacing ({{MantisLink|34729}}, patch by Pavol S).<br />
*r59865 LCL: TWinControl: Fixed TGraphicControl.Cursor not working properly with TScrollBox. {{MantisLink|34714}}<br />
*r59866 LCL: Missed removing of capfHasScrollOffset in LCL. Needed for revision 59865.<br />
*r59825 FpDebug: Implement correct length for open-array params<br />
*r59872 FpDebug: Fixed Array of String for dwarf-3<br />
*r59870 FpDebug: Fixed Array of ShortString for dwarf2<br />
<br />
== Fixes for 2.0.0RC2 (merged) ==<br />
<br />
*r59016 LCL-GTK2: Do not truncate Groupbox caption. {{MantisLink|32621}}<br />
*r59018 LCL-GTK2: Fix TStaticText Width with Autosize. {{MantisLink|21877}}<br />
*r59030 TValueListEditor: fix DeleteRow {{MantisLink|0034208}}.<br />
*r59031 TFindDialog: fix setting Top/Left. {{MantisLink|0033528}}.<br />
*r59032 TCommondialog: do not publish Widht/Height properties. {{MantisLink|0033480}}. Patch by AlexeyT.<br />
*r59048 TFindDialog: slight improvement on r59031.<br />
*r59049 TFindDialog: use Position := poMainFormCenter in CalcPosition instead of trying to calculate that by ourselves. Patch by Serge Anvarov.<br />
*r59050 TFindDialog: save FFindForm position upon close.<br />
*r59064 Opkman: Bug fix: remove package compiling restriction.<br />
*r59066 IDE: clean up<br />
*r59077 IDE: fixed abstract method<br />
*r59079 IDE: less hints<br />
*r59041 IDE: Use safe typecast for TProjectCompilationToolOptions when building project.<br />
*r59042 Revert r59006 "IdeIntf: Add API for ExecuteCommand in CompOptsIntf." Must be done better.<br />
*r59043 IdeIntf: A new interface class TLazCompilationToolOptions with a Command and CompileReasons. {{MantisLink|34283}}.<br />
*r59044 IdeIntf: Improve the CompilationTool stuff. Remove and clean code. {{MantisLink|34283}}.<br />
*r59046 LCL-GTK2: Do not truncate Groupbox caption (fix for previous). {{MantisLink|32621}}.<br />
*r59047 LCL-GTK2: Fix TListView column widths. {{MantisLink|34044}}.<br />
*r59081 IDE: Add package name to hints for component palette icons.<br />
*r59083 TFindDialog/TReplaceDialog: show dialog poScreenCenter in IDE; fix erratic behaviour of TReplaceDialog in IDE (wrong parent). {{MantisLink|34297}}.<br />
*r59085 LCL: Improved layout of TFindDialog and TReplaceDialog, fix TabOrder.<br />
*r59094 LCL: Fix TCustomListbox not releasing Canvas handle in DestroyWnd {{MantisLink|34249}}.<br />
*r59095 Translations: Turkish translation update by Hakan KIZILHAN, {{MantisLink|34296}}<br />
*r59096 Translations: Spanish translation update by Alonso Cárdenas Márquez, {{MantisLink|34304}}<br />
*r59110 Opkman: Fix memory leak.<br />
*r59141 lazutils: removed duplicate code, {{MantisLink|34320}}<br />
*r59089 IDE: Bug fix: Deleting newly added CoolBar leads to error. {{MantisLink|34302}}.<br />
*r59091 IDE: Check package name validity correctly.<br />
*r59147 IDE: Improve logic for updating Application.Title statement. Now it gets removed, too. {{MantisLink|34318}}.<br />
*r59156 IDE: Add new Application.Title and .Scale statements after Application.Create line. {{MantisLink|34318}}.<br />
*r59170 IDE: Support 3 icons with different resolutions in "New Component" dialog. Improve the GUI.<br />
*r59172 IDE: cleaned up unused resource string<br />
*r59173 IDE: regenerated translations and updated Russian translation<br />
*r59176 IDE: In "New Component" dialog resize the buttons based on icon image size. Improve initial dir for selecting icon.<br />
*r59092 MainInspector: Fix a typo.<br />
*r59111 LCL-GTK2: Prevent flickering in TOpenGLControl. Turn DoubleBuffered off. {{MantisLink|33864}}<br />
*r59190 LCL-GTK3: Add typecasts for Color types. The code may still be wrong but can be tested with Range checks on.<br />
*r59191 LCL-GTK3: Fix menu radio group. {{MantisLink|34350}}.<br />
*r59118 Docs: Fix short description for function StringToColor.<br />
*r59125 LazUtf8: leftpad escaped characters in Utf8EscapeControlChars if EscapeMode = emPascal. Prevents ambiguity when reading the result.<br />
*r59169 LazUtils: Move ExtractFileNameWithoutExt to LazFileUtils. Rhymes with ExtractFileNameOnly.<br />
*r59175 Delete old deprecated methods.<br />
*r59177 LazUtils: Move more functions from FileUtils to LazFileUtilities, deprecate the old ones.<br />
*r59149 LCL: Add support for custom font of TSpeedButton (see https://forum.lazarus.freepascal.org/index.php/topic,42635.msg297800.html#msg297800, patch by Ondrej)<br />
*r59167 LCL: Fix incorrect checked state after deleting an item of a TCheckGroup. {{MantisLink|34327}}.<br />
*r59168 Split command line parameters also when "Run without Debugging".<br />
*r59197 TAChart: deprecate all reticule-related methods and properties (was incomplete). Less hints and warnings.<br />
*r59208 debuggerintf: less hints<br />
*r59210 fpdebug: less hints<br />
*r59212 ideintf: less hints<br />
*r59214 lazdebuggers: less hints<br />
*r59216 lazutils: less hints<br />
*r59218 turbopower_ipro: less hints<br />
*r59220 lcl: gtk2: less hints<br />
*r59222 Translations: Ukrainian translation update by Olexandr Pylypchuk, bug 34367<br />
*r59223 Translations: Brazilian Portuguese translation update by Marcelo B Paula, bug 34368<br />
*r59225 LazControls: Improve and optimize the filter controls. {{MantisLink|34057}}<br />
*r59226 LazControls: Call DoFilterItem instead of DoDefaultFilterItem in TTreeFilterBranch.SortAndFilter.<br />
*r59227 IdeIntf: Delete old deprecated methods and properties.<br />
*r59268 IdeIntf: Improve timestamp updates of TLazCompilationToolOptions + inherited classes. {{MantisLink|34283}}<br />
*r59228 AnchorDocking: Prevent crash on drag-and-dock tab page. {{MantisLink|34371}}<br />
*r59229 LazReport: Delete old deprecated UTF8 functions.<br />
*r59230 TAChart: Remove old deprecated code.<br />
*r59239 TAChart: Check and fix all demos and tutorial projects (mostly layout issues)<br />
*r59241 TAChart: Fix TChartImageList demo.<br />
*r59243 TAChart: Extend dragdrop demo to show horizontal dragging of bars.<br />
*r59240 Packager: Allow overwriting existing unit files in New Component dialog. Error was shown AFTER a file was overwritten. {{MantisLink|26928}}<br />
*r59244 IDE: Always create project's main icon file when saving it. Keeps its size down. {{MantisLink|27287}}<br />
*r59245 IDE: Add initial directory for loading project icon in App options. Use IconImage.Picture.Icon everywhere.<br />
*r59246 IDE: Remove resource generation from DoBuildProject. They have been generated earlier. {{MantisLink|15915}}<br />
*r59248 IDE: Support running external tool with parsers, needed when used through IDE interface.<br />
*r59263 IDE: Reduce DebugLn() calls in Publish Module code. It seems to work.<br />
*r59266 IDE: New High-DPI images in folders images/items and images/packages. Kindly provided by Roland Hahn.<br />
*r59267 IDE: Use scaled images in trees of "Install/Uninstall packages" form.<br />
*r59272 IDE: Center icon and text vertically for each item in ViewUnit dialog. {{MantisLink|34402}}<br />
*r59254 LCL-Gtk2: Don't mix resizing a column with drag-and-drop. {{MantisLink|34393}}<br />
*r59262 LCL-GTK3: Fix TRadioGroup. It did not work at all. {{MantisLink|34396}}<br />
*r59270 LCL: Fix TBitBtn ignoring the Margin property on Windows. {{MantisLink|34379}}<br />
*r59259 TurboPower_iPro: Implement css function rgb().<br />
*r59271 TurboPower_iPro: Implement css function hsl().<br />
*r59275 Translations: Hungarian translation update by Péter Gábor, bug 34397<br />
*r59276 Translations: French translation update by Gilles Vasseur, bug 34403<br />
*r59287 LCL: Avoid SegFault of freshly created TCustomListview with owner-data (issue #34407, patch by Charles Grunwald).<br />
*r59289 chmhelp: Fix memory leak in TLHelpConnector (see forum https://forum.lazarus.freepascal.org/index.php/topic,42832.msg299208.html).<br />
*r59290 ideintf: Add high-DPI icons (provided by Roland Hahn)<br />
*r59291 IDE: Add missing high-dpi icons to folder images/menu (kindly provided by Roland Hahn)<br />
*r59292 IDE: Minor revisions of existing high-DPI icons (by Roland Hahn)<br />
*r59295 IDE: Add new (debugger) and revised High-DPI icons by Roland Hahn<br />
*r59296 IDE: Add forgotten icons from previous commits<br />
*r59301 IDE: Better alignment of Run icon to dropdown btn on toolbar (by Roland Hahn)<br />
*r59302 IDE: New High-DPI icons for Delphi-to-Lazarus conversion (by Roland Hahn).<br />
*r59297 SynEdit: Pas HL, fix folding/markup for code containing "case", if "case" is not enabled for fold/markup. Part 1 of {{MantisLink|0034410}}<br />
*r59298 SynEdit: Pas HL, fix markup if "procedure" is outlined, but top level "begin" is not. Part 2 of {{MantisLink|0034410}}<br />
*r59299 SynEdit: Pas HL, fixes for outline, if only some elements are outlined<br />
*r59300 SynEdit: Pas HL, fixes for fold, detecting "else" in "case", when previous if is nested in other commands<br />
*r59253,59285,59286,59293: Qt, Qt5: fixed OpenGL issues. {{MantisLink|32498}} and {{MantisLink|34401}} <br />
*r59288 Qt5: must return to lcl event loop for X11 targets. {{MantisLink|34369}}<br />
*r59307 IDE: Add mssing High-DPI icons to images/actions (by Roland Hahn)<br />
*r59308 IDE: Replace icon "actions/preferences" (by Roland Hahn)<br />
*r59309 Translations: Brazilian Portuguese translation update by Marcelo B Paula, bug 34426<br />
*r59310 Translations: French translation update by Gilles Vasseur, bug 34428<br />
*r59314 IDE/LCL: Modify some high-DPI icons for more consistent style (Roland Hahn)<br />
*r59319 IDE: Add high-DPI images for propertygrid and widgetset issues (by Roland Hahn).<br />
*r59321 IDE: Improve visibility of high-dpi issue_carbon icons on dark background (by Roland Hahn).<br />
*r59322 IDE/Restriction Browser: Fix visibility of icon on customdrawn button.<br />
*r59323 IDE/ObjectInspector: Fix size of widgetset icons on high-dpi screens.<br />
*r59328 IDE: Add high-dpi icons to images/lazdoc (by Roland Hahn)<br />
*r59318 lhelp: some formatting changes<br />
*r59320 TAChart: Fix numlib issue of returning 0 for exp() function (https://forum.lazarus.freepascal.org/index.php/topic,42913.msg299793)<br />
*r59324 Finnish translation.<br />
*r59342 IDE: regenerated/fixed Finnish translation<br />
*r59325 LCL-GTK2: Fix icon scaling in menuitems.<br />
*r59327 LCL: Do not store anchoring properties of TLabeledEdit.editLabel. It is controlled by property LabelPosition. {{MantisLink|34431}}<br />
*r59332 TFloatSpinEditEx: fix setting DecimalPlaces {{MantisLink|0034370}}<br />
*r59334,r59335,r59336 LCL-WinCE: Fix maximize, minimize and help buttons showing in window title bar<br />
*r59337 LCL-WinCE: Fix form centering for Position=poScreenCenter, poDesktopCenter<br />
*r59339,r59341 LCL-GTK3: Fix Splitter and its related code. {{MantisLink|34106}}<br />
*r59340 IDE: Don't let FindReplace dialog outside the monitor area. {{MantisLink|34436}}<br />
*r59350 Debugger: Fix DebugInspector stopped working after window was open with empty input. {{MantisLink|0034452}}<br />
*r59351 Debugger (gdb): Fix Debug-Inspector for dwarf3. Match fieldnames case insensitive. Depending on gdb, try to find the MixedCase version of any name. {{MantisLink|0034453}}<br />
*r59352 lazutils: fixed ExpandFileNameUTF8 for \\?\<br />
*r59353 debian: renamed debian package name from fpc to fpc-laz to avoid nameclash with ubuntu repos<br />
*r59357 IDE: Add unit/include file's path correctly to search path of a single build mode, too. {{MantisLink|34462}}<br />
*r59359 IDE: Show only the supported .ico format when opening project icon. {{MantisLink|34464}}<br />
<br />
== Roadmap to 2.0.0 ==<br />
The release process will consist of the following steps.<br />
* Creation of the SVN 2.0 fixes branch. (Done 15 Sep 2018)<br />
This is the start of the stabilization process before a new Lazarus release.<br />
<br />
* Release of 2.0.0 RC 1 (Done 16 Sep 2018)<br />
This will be the first Release Candidate. We would like to urge all users to test this version.<br />
The testing period is scheduled to last 2 weeks.<br />
<br />
* Release of 2.0.0 RC 2 (Done 29 Oct 2018)<br />
The testing period is scheduled to last 2 weeks.<br />
<br />
* Release of 2.0.0 RC 3 (Done 21 Dec 2018)<br />
The testing period is scheduled to last 2 weeks.<br />
<br />
* Release of Lazarus 2.0 (ToDo)<br />
Users can download the new stable version.<br />
<br />
=== Tests ===<br />
*Menu item exists<br />
*Clear pcp directory and start IDE, a new project application with a form should be visible<br />
*Double click on form - a FormCreate event should be created<br />
*Check View / IDE internals / What needs building - no package should need building, only the project<br />
*Restart the IDE - there should be no warning about upgrading<br />
*Install the package cody, after restart the component palette should show the component TCodyTreeView<br />
*Run Unit-Tests from menu "Tools"--> "Example Projects". Choose project "runtestsgui.lpi" and run it. It will do about 390 unittests.<br />
<br />
=== Tagging release ===<br />
* SVN merge requests of this page<br />
* Set version in fixes_2_0 branch<br />
** open lazarus/lazarus.lpi in the IDE and change the version numbers in the project options dialog 2.0.0.1 for RC1, 2.0.0.2 for RC2, 2.0.0.3 for RC3, 2.0.0.4 for final<br />
** lazarus/ide/version.inc 2.0.0RC1 for RC1, no spaces! (2.0.0 for final release)<br />
** lazarus/components/lazutils/lazversion.pas 2.0.0.1 for RC1, 2.0.0.2 for RC2, ... 2.0.0.4 for final<br />
** lclbase.lpk<br />
** lcl.lpk<br />
** lazarus/debian/changelog 2.0.0-1 for RC1, 2.0.0-2 for RC2, ... 2.0.0-4 for final<br />
** lazarus/lazarus.app/Contents/Info.plist<br />
*** CFBundleShortVersionString "2.0.0"<br />
*** CFBundleVersion 1 for RC1, 2 for RC2, 3 for RC3, 4 for final release<br />
** tools/install/linux/environmentoptions.xml same as version.inc<br />
** tools/install/win/environmentoptions.xml same as version.inc<br />
** tools/install/macos/environmentoptions.xml same as version.inc<br />
** check lpl files by running "./tools/lplupdate -c" and do the svn mv commands<br />
** Update makefiles: Make sure '''Additions and Overrides''' are empty and run <br />
FPCDIR=/path/to/fpc/src/trunk PATH=/path/trunk/fpc/utils/fpcm/bin/x86_64-linux/:$PATH ./tools/updatemakefiles<br />
* check that ide/lazarus.lpi and ide/lazarus.res have changed:<br />
svn diff | grep Index:<br />
* svn commit<br />
* Tag fixes_2.0 branch to tags/release_2_0_0_RC1 (or tags/lazarus_2_0_0 for final release)<br />
svn copy svn+ssh://svn.freepascal.org/FPC/svn/lazarus/branches/fixes_2_0 svn+ssh://svn.freepascal.org/FPC/svn/lazarus/tags/lazarus_2_0_0_RC1 -m 'tagged 2.0.0RC1 as tags/lazarus_2_0_0_RC1'<br />
* Set version to next version in svn<br />
* Create new section on this page and move waiting merge requests to the new section<br />
<br />
== How to merge ==<br />
See [[Lazarus_1.0_fixes_branch#How_to_merge]]<br />
<br />
== Other branches ==<br />
{{Navbar Lazarus Release Notes}}<br />
<br />
[[Category:Lazarus]]<br />
[[Category:Branches]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Installing_Lazarus/ru&diff=122954
Installing Lazarus/ru
2019-02-02T13:53:00Z
<p>Useroflazarus: /* Установка Free Pascal в FreeBSD/auto */</p>
<hr />
<div>{{Installing Lazarus}}<br />
<br />
== Обзор ==<br />
<br />
Ознакомится с более подробной инструкцией по сборке можно [http://www.stack.nl/~marcov/buildfaq.pdf здесь].<br />
<br />
Для загрузки исполняемых файлов Lazarus смотрите [http://wiki.lazarus.freepascal.org/Getting_Lazarus#Download_and_install_Lazarus_release_version Download and install Lazarus release version]<br />
<br />
Для тех, кто просто хочет установить Lazarus и начать использовать его для написания программ, наиболее простым способом является загрузка и установка последней стабильной версии исполняемых файлов (таких, как rpm-пакеты для Linux, установочные exe-файлы для Windows или dmg-пакеты для Mac OS X). Вы можете прочитать об этом в разделах "Исполняемые файлы FPC" для Linux и Windows или в первых параграфах в разделах установки Lazarus в средах Linux или Windows; оставшуюся часть информации можно спокойно пропустить.<br />
<br />
<br />
<br />
Для тех, кто хочет принимать участие в разработке компилятора, IDE или использовать актуальные инструменты, необходима установка из исходных файлов.<br />
<br />
Lazarus состоит из двух основных частей:<br />
* LCL - Lazarus Component Library, библиотека компонентов Lazarus<br />
* IDE - RAD, среда быстрой разработки<br />
<br />
В свою очередь они зависят от:<br />
* FPC - компилятор Free Pascal<br />
* FCL - Free Pascal Component library, библиотека компонентов компилятора FPC, содержащая большое количество невизуальных компонентов, используемых в Lazarus<br />
<br />
=== Системные требования Lazarus ===<br />
<br />
# компилятор Free Pascal, пакеты и исходные файлы. (*важно*: той же версии/даты сборки)<br />
# поддерживаемый набор виджетов<br />
#:;Win32: может быть использован внутренний набор Win32 API или набор виджетов Qt.<br />
#:;Linux/xxxBSD: GTK+ 2.x or Qt : Most Linux distributions and *BSDs already install the GTK+ 2.x libraries. You can also find them at http://www.gtk.org. <br>Qt is also supported with all distributions (auto installed if you prefer KDE). <br> <br />
#:;Mac OS X: You need the Apple developer tools. See Installing under Mac OS X below. Qt can be used too.<br />
<br />
FAQ - Frequently Asked Questions (часто задаваемые вопросы) доступны по ссылке http://www.lazarus.freepascal.org . Некоторые вопросы можно найти в файле 'FAQ'.<br />
<br />
Qt widget set is supported on Linux 32/64,Win32/64,Mac OS X, Haiku and embedded linux (qtopia) platforms.<br><br />
Более подробно узнать про установку можно по ссылке http://wiki.lazarus.freepascal.org/index.php/Qt_Interface <br><br />
<br />
В следующих разделах описывается как можно получить компилятор Free Pascal и как правильно установить Lazarus.<br />
<br />
== Установка компилятора Free Pascal ==<br />
<br />
Существует подробная инструкция, как устанавливать и собирать компилятор Free Pascal, доступная по ссылке http://www.stack.nl/~marcov/buildfaq.pdf - для некоторых пользователей она может быть слишком подробной, но при этом в ней дана исчерпывающая информация.<br />
<br />
Для Lazarus 1.8 требуется fpc (Free Pascal) версии 3.0.4 или выше, а также необходимо, чтобы библиотеки fpc (исполняемые файлы) и исходные файлы fpc были одинаковых версий.<br />
<br />
=== Установка Free Pascal в Linux ===<br />
<br />
==== Исполняемые файлы FPC ====<br />
<br />
Последнюю стабильную версию Free Pascal 3.0.4 можно получить на сайте Free Pascal (перейдите по ссылке http://www.freepascal.org/download.var и далее выберите зеркало) или на сайте SourceForge (http://sourceforge.net/projects/lazarus). <br />
<br />
В разделе загрузок Lazarus (http://www.lazarus.freepascal.org ) можно получить RPM- или DEB-пакеты компилятора Free Pascal (компилятор для Linux). Если вам не нужны RPM или debian дистрибутивы, вы можете загрузить и установить tar-архивы с http://www.freepascal.org. Если вы хотите самостоятельно скомпилировать исполняемые файлы, смотрите в разделе BSD.<br />
<br />
Инструкции: <br />
<br />
{{Warning| если вы '''не используете RPM- или debian-пакеты''' (даже если вы планируете использовать другие) лучшим вариантом будет получение актуальной стабильной версии fpc (на данный момент 3.0.4) и установка Lazarus из исходных файлов.}}<br><br />
<br />
Запустите Linux и войдите в систему под '''root''''ом.<br />
<br />
Загрузите актуальные версии файлов с https://sourceforge.net/projects/lazarus/files/.<br />
Например:<br />
:* fpc-3.0.4-1.i686.rpm<br />
:* fpc-src-3.0.4-1.i686.rpm<br />
:* lazarus-1.8.0-1.i686.rpm<br />
и установите их с помощью команды:<br />
:* rpm -Uvh *.rpm<br />
<br />
Пользователям системы Debian рекомендуется использовать deb-пакеты, но можно использовать и другие (внимание: они не создают fpc.cfg), например установить tar-архивы.<br />
<br />
==== Исходные файлы FPC ====<br />
Исходные файлы FPC хранятся в репозитории Subversion (SVN), в котором отслеживаются все изменения.<br />
Если у вас уже есть исходные файлы, пожалуйста, посмотрите инструкции по их установке в разделе [[#Installing Free Pascal from source under Linux/BSD]].<br />
<br />
===== Загрузка ежедневных исходных файлов из ветки разработки =====<br />
Вы можете загрузить ежедневно обновляемые исходные файлы в форме упакованных ночных сборок из репозитория SVN: они обновляются ежедневно и отображают состояние исходных файлов. Они не протестированы, могут не работать или даже привести к нарушению работы вашей системы. Файлы сохранены на сайте, который содержит архив SVN. Версия FPC может варьироваться.<br />
Расположены по адресу: [http://www.hu.freepascal.org/lazarus/]<br />
<br />
===== Обновление исходных файлов с помощью SVN =====<br />
As an alternative to the daily zip files of the SVN sources, the SVN repository has been made accessible for everyone, with read-only access. This means that you can directly access the code, and you will have really the last-minute sources available. It is also a method which requires less bandwidth once you have done the first download (checkout in SVN lingo).<br />
<br />
===== Получение исходных файлов =====<br />
Как это можно сделать?<br />
Для начала вам необходим установленный клиент для SVN. Используйте менеджер установки и установите утилиту, например, TortoiseSVN для Windows или смотрите подробней на сайте [http://subversion.tigris.org/].<br />
<br />
Использование командной строки SVN: измените текущую директорию (cd) на родительскую директорию, которая используется для работы, например, чтобы получить полные исходные файлы из репозитория в поддиректорию fpc домашней директории и напишите<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn checkout http://svn.freepascal.org/svn/fpc/trunk fpc<br />
</syntaxhighlight><br />
<br />
Для обновления исходных файлов, загруженных с помощью команды, указанной выше<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn update fpc<br />
</syntaxhighlight><br />
<br />
===== Получение отдельных веток =====<br />
If the current trunk version is in a state of rapid change and unsuitable for much use unless you want to work on the compiler itself, you can stay on a version that is updated with fixes.<br />
To do this, you have to find out a stable '''branch''' that you want to track instead of the default '''trunk''' development version.<br />
The example below shows how you can track the fixes_2_6 version; of course replace as needed depending on what branches you want to track.<br />
<br />
This example keeps the fixes in another directory under your home directory - it wouldn't make sense to put two versions of the source in one directory...<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn checkout http://svn.freepascal.org/svn/fpc/branches/fixes_2_6 fpc_fixes_2_6<br />
</syntaxhighlight><br />
Обычное обновление:<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn update fpc_fixes_2_6<br />
</syntaxhighlight><br />
<br />
===== Документация =====<br />
Исходные файлы документации расположены в отдельном репозитории с именем fpcdocs, поэтому для их получения необходима следующая команда<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
svn checkout http://svn.freepascal.org/svn/fpcdocs/trunk fpcdocs<br />
</syntaxhighlight><br />
<br />
Если вы хотите больше узнать о subversion, прочитайте эту отличную [http://svnbook.red-bean.com/ книгу по Subversion], которая также бесплатно доступна в разных форматах.<br />
<br />
Более подробную информацию смотрите на [http://www.freepascal.org/develop.var сайте Free Pascal].<br />
<br />
=== Установка Free Pascal в Windows ===<br />
<br />
==== Исполняемые файлы FPC для Windows ====<br />
<br />
Самым простым способом получения установочных файлов Free Pascal является загрузка текущей стабильной версии исполняемых файлов Lazarus для Windows из репозитория SourceForge [http://sourceforge.net/projects/lazarus/files/] - эти файлы содержат текущие стабильные версии компилятора и необходимых библиотек Free Pascal, а также среду разработки Lazarus.<br />
<br />
Если вы хотите установить из исходных файлов читайте дальше!<br />
<br />
Вы можете загрузить zip-архив с fpc в разделе загрузок Free Pascal (перейдите по ссылке http://www.freepascal.org/download.var и далее выберите зеркало). <br />
Установка из исходных файлов -- смотрите следующий раздел, чтобы узнать как это сделать -- не для новичков, так как для этого вам необходим изначально установленный компилятор.<br />
<br />
==== Исходные файлы FPC для Windows ====<br />
<<<< Смотрите выше в разделе [[#FPC Sources|Исходные файлы FPC]] для Linux, где описано использование SVN >>>><br />
<br />
Наиболее простым способом получить исходные файлы Free Pascal является использование SVN; смотрите следующий раздел для более подробной информации. Также вы можете загрузить установочный пакет целиком -- смотрите на сайте http://www.freepascal.org/develop.var ежедневные сборки ветки 3.0.x.<br />
<br />
Исходные файлы FPC для Windows с помощью SVN<br />
<br />
Вам необходим установленный SVN-клиент, например [http://tortoisesvn.tigris.org/ TortoiseSVN], для выполнения дальнейших шагов. Точные команды отличаются для разных SVN-клиентов; приведенные ниже команды должны использоваться для SVN-клиента, который можно скачать здесь.<br />
<br />
Для начала создайте директорию, в которую вы хотите поместить исходные файлы. С этим может справиться любой пользователь. Создайте директорию для fpc (например C:\Source), после чего чего выполните следующую команду в командной строке:<br />
<syntaxhighlight lang="bash">C:\Source> svn co http://svn.freepascal.org/svn/fpc/trunk fpc</syntaxhighlight><br />
Совет: для загрузки/обновления файлов с последними изменениями вы просто можете выполнить<br />
<syntaxhighlight lang="dos"><br />
C:\> cd Source\FPC<br />
C:\Source\FPC> svn up<br />
</syntaxhighlight><br />
<br />
Смотрите: http://www.freepascal.org/down/i386/win32.var . Загрузите FPC одним большим файлом, распакуйте его и запустите install.exe. <br />
<br />
Добавьте путь к директории fpc в переменную среды:<br />
<br />
* Win98: отредактируйте autoexec.bat и добавьте строку: PATH=%PATH%;C:\pp\bin\bin\win32<br />
* WinXP/2k: Мой компьютер (правая кнопка мыши по ярлыку) -> Свойства -> Дополнительно (вкладка) -> Переменные среды -> Системные переменные -> Изменить "PATH", добавить здесь "C:\pp\bin\bin\win32".<br />
<br />
После этого перезагрузите windows.<br />
<br />
После установки исполняемых файлов FPC вы можете собирать исходные файлы FPC из subversion. <br />
<br />
Советы: <br />
* Для Windows 7 (и выше) требуются повышенные права пользователя для работы в командной строке. Щелкните правой кнопкой мыши по ярлыку "Командная строка" в меню Пуск и выберите "Запустить от имени Администратора".<br />
* YOUR-PREFIX полностью зависит от места установки FPC. При составлении данной статьи исполняемые файлы по умолчанию располагаются в директории "C:\FPC" и помещаются в "C:\FPC\3.0.4". В системе Linux сценарии "make install" были скорректированы для создания новой поддиректории ЕСЛИ версия FPC изменилась с момента последней сборки. В сценариях для Windows это не сделано. Поэтому, если вы знаете, что имя поддиректории, например 3.1.1, то вы можете указать это. Однако, по причине частой смены версий, рекомендуется просто выбрать и сохранить один PREFIX вне зависимости от версий FPC. Хорошим значением для prefix является C:\FPC, но вы также должны убедиться, что директория C:\FPC\bin\i386-win32\ добавлена в переменную среды PATH (смотрите выше, как прописать путь и изменить версию исполняемых файлов на только что скомпилированные).<br />
Инструкции:<br />
* В командной строке перейдите к расположенным исходным файлам FPC, например напишите "cd c:\Developer\FPC"<br />
* Для сборки FPC напишите "make all"<br />
* Для перезаписи существующих файлов FPC напишите "make install PREFIX=YOUR-PREFIX"<br />
* Для установки исходных файлов напишите "make install sourceinstall PREFIX=YOUR-PREFIX"<br />
<br />
==== Компиляция/установка FPC и Lazarus из исходных файлов с помощью SVN (Win32) ====<br />
<br />
14 Dec 2017 версия FPC '''3.0.4''' или '''trunk''' - версия Lazarus '''1.9.x'''<br />
<br />
===== Шаг #1: Создать каталоги и скачать исходные файлы =====<br />
Создайте следующие каталоги:<br />
c:\freepascal\<br />
c:\freepascal\binutils\<br />
c:\freepascal\binutils\i386-win32\<br />
c:\freepascal\fpc\<br />
c:\freepascal\fpc\3.0.4\<br />
c:\freepascal\laz\<br />
или для fpc из trunk:<br />
c:\freepascal\<br />
c:\freepascal\binutils\<br />
c:\freepascal\binutils\i386-win32\<br />
c:\freepascal\fpc\<br />
c:\freepascal\fpc\trunk\<br />
c:\freepascal\laz\<br />
<br />
Вам понадобится последняя ''стабильная'' версия компилятора для сборки новой версии компилятора.<br />
Скачайте файл ppc386 (сам компилятор) с FTP (по ссылке ниже) и распакуйте его в c:\freepascal\binutils\<br />
ftp://ftp.freepascal.org/pub/fpc/dist/3.0.4/bootstrap/i386-win32-ppc386.zip<br />
<br />
После установки [http://tortoisesvn.tigris.org/ TortoiseSVN] скачайте исходные файлы из SVN используя URL-адрес для каждого каталога:<br />
Dir: c:\freepascal\binutils\i386-win32\<br />
URL: http://svn.freepascal.org/svn/fpcbuild/branches/fixes_3_0/install/binw32<br />
или для fpc из trunk:<br />
Dir: c:\freepascal\binutils\i386-win32\<br />
URL: http://svn.freepascal.org/svn/fpcbuild/trunk/install/binw32<br />
<br />
<br />
<br />
Dir: c:\freepascal\fpc\3.0.4<br />
URL: http://svn.freepascal.org/svn/fpc/branches/fixes_3_0/<br />
или для fpc из trunk:<br />
Dir: c:\freepascal\fpc\trunk<br />
URL: http://svn.freepascal.org/svn/fpc/trunk/<br />
<br />
<br />
<br />
Dir: c:\freepascal\laz<br />
URL: http://svn.freepascal.org/svn/lazarus/trunk<br />
<br />
===== Шаг #2: Создать BAT-файл для компиляции FPC =====<br />
После того, как всё скачалось, нам необходимо создать BAT-файл для компиляции исходных файлов FPC.<br />
Создайте новый файл c:\freepascal\makefpc.bat и скопируйте в него следующий сценарий:<br />
<br />
<syntaxhighlight lang="dos"><br />
@echo on<br />
set myroot=c:\freepascal<br />
set myFPC=%myroot%\fpc\3.0.4<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myFPC%<br />
rd /s /q %myfpc%\examples<br />
svn cleanup . --remove-unversioned --remove-ignored<br />
make distclean all install INSTALL_PREFIX=%myFPC% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
cd /d %myFPC%\bin\i386-win32<br />
fpcmkcfg -d basepath=%myFPC% -o .\fpc.cfg <br />
copy fpc.exe %mybinutils%\i386-win32<br />
</syntaxhighlight><br />
или для fpc из trunk:<br />
<syntaxhighlight lang="dos"><br />
@echo on<br />
set myroot=c:\freepascal<br />
set myFPC=%myroot%\fpc\trunk<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myFPC%<br />
rd /s /q %myfpc%\examples<br />
svn cleanup . --remove-unversioned --remove-ignored<br />
make distclean all install INSTALL_PREFIX=%myFPC% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
cd /d %myFPC%\bin\i386-win32<br />
del fpc.cfg<br />
fpcmkcfg -d basepath=%myFPC% -o .\fpc.cfg <br />
copy fpc.exe %mybinutils%\i386-win32<br />
</syntaxhighlight><br />
<br />
Для компиляции кросс-платформенных программ в режиме x86_64 добавьте следующие строки после первой команды make:<br />
<syntaxhighlight lang="dos"><br />
make all OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=%myFPC% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
make crossinstall OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=%myFPC% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
</syntaxhighlight><br />
<br />
При использовании данных сценариев скомпилированные файлы компилятора и необходимые директории для корректной его работы будут созданы непосредственно в корневой директории, куда были загружены исходные файлы. В некоторых случаях это не удобно, например, если необходимо ''перенести'' всю директорию с компилятором на другой компьютер или просто сделать несколько директорий разных версий (или ревизий) компилятора и при необходимости пользоваться каждой из них путем выбора нужного пути в свойствах проекта. Для этого необходимо модифицировать сценарий. Ниже представлен пример сценария для создания полностью автономной директории с компилятором и необходимыми файлами (для универсальности добавлены инструкции, позволяющие собрать компилятор версий '''x86''' и '''x64'''):<br />
<br />
<syntaxhighlight lang="dos"><br />
@echo on<br />
set myroot=c:\freepascal<br />
<br />
set instdir=%myroot%\fpc\3.0.5<br />
<br />
set myFPC=%myroot%\fpc\3.0.4<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myFPC%<br />
rd /s /q %myfpc%\examples<br />
svn cleanup . --remove-unversioned --remove-ignored<br />
make distclean all install INSTALL_PREFIX=%instdir% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
make all OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=%instdir% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
make crossinstall OS_TARGET=win64 CPU_TARGET=x86_64 INSTALL_PREFIX=%instdir% PP=%mybinutils%\ppc386.exe DATA2INC=%myFPC%\utils\data2inc.exe<br />
cd /d %instdir%\bin\i386-win32<br />
fpcmkcfg -d basepath=%instdir% -o .\fpc.cfg<br />
copy fpc.exe %mybinutils%\i386-win32<br />
<br />
xcopy %myFPC%\rtl %instdir%\source\rtl /H /Y /C /R /S /I<br />
xcopy %myFPC%\packages %instdir%\source\packages /H /Y /C /R /S /I<br />
</syntaxhighlight><br />
<br />
В данном случае дополнительная переменная '''instdir''' задает новую директорию для компилятора. Последние 2 команды предназначены для копирования содержимого директорий '''rtl''' и '''packages''' в новую директорию компилятора.<br />
<br />
Совет: при переносе в другое место полученной директории для корректной работы компилятора необходимо отредактировать файл '''fpc.cfg'''.<br />
<br />
===== Шаг #3: Собрать и установить FPC =====<br />
С помощью командной строки (cmd.exe) перейдите в директорию c:\freepascal и выполните сценарий, который мы только что написали: <br />
<br />
<syntaxhighlight lang="dos"><br />
cd /d c:\freepascal<br />
makefpc.bat<br />
</syntaxhighlight><br />
<br />
===== Шаг #4: Создать BAT-файл для компиляции Lazarus =====<br />
Если Lazarus компилируется впервые, создайте новый файл c:\freepascal\makelaz.bat и скопируйте в него следующий сценарий:<br />
<br />
<syntaxhighlight lang="dos"><br />
set myroot=c:\freepascal<br />
set myFPC=%myroot%\fpc\3.0.4<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myroot%\laz<br />
make clean all OPT="-glw2 -Xg"<br />
</syntaxhighlight><br />
или для fpc из trunk:<br />
<syntaxhighlight lang="dos"><br />
set myroot=c:\freepascal<br />
set myFPC=%myroot%\fpc\trunk<br />
set mybinutils=%myroot%\binutils<br />
set PATH=%mybinutils%\i386-win32;%myFPC%\bin\i386-win32;%PATH%<br />
cd %myroot%\laz<br />
make clean all OPT="-glw2 -Xg"<br />
</syntaxhighlight><br />
<br />
<br />
Подсказка: данный BAT-файл необходимо использовать только для первой компиляции. В дальнейшем вы можете собирать Lazarus используя команду меню Tools > Build Lazarus.<br />
<br />
===== Шаг #5: Собрать Lazarus =====<br />
С помощью командной строки перейдите в директорию c:\freepascal и выполните сценарий: makelaz.bat<br />
<br />
<br />
Готово!<br />
<br />
=== Установка Free Pascal в FreeBSD/auto ===<br />
<br />
Последняя коллекция портов для FreeBSD имеет версию 3.0.4 и находится в ports/lang/fpc. Но они разбросаны по более чем 96 пакетам (!) и исходный код может быть получен из /usr/ports/distfiles/freepascal.<br />
<br />
Данная команда может быть выполнена с правами администратора (из-под root'а).<br />
<br />
<syntaxhighlight lang="bash">[]# cd /usr/ports/lang/fpc && make install && make clean</syntaxhighlight><br />
<br />
Другая возможность заключается в использовании portinstall.<br />
<br />
<syntaxhighlight lang="bash">[]# portinstall fpc</syntaxhighlight><br />
<br />
Как только fpc установлен, вы можете проверить его работоспособность просто выполнив команду<br />
<br />
<syntaxhighlight lang="bash">[]$ fpc</syntaxhighlight><br />
<br />
=== Установка Free Pascal из исходных файлов в Linux/BSD ===<br />
<br />
Effectively, you need<br />
<br />
If you have a file with all FPC sources, or two (FPC and Lazarus):<br />
1. e.g. for fpc ftp://ftp.freepascal.org/fpc/dist/Linux/separate/sources.tar preferably an export (no SVN/ dirs).<br />
2. Lazarus source snapshot.<br />
* a starting compiler, the latest release version (fpc 3.0.2) is the only version guaranteed to work. You can download a bootstrap compiler or use your distribution's package management/software system to install one<br />
<br />
FPC build process:<br />
* Fetch necessary files (starting compiler), FPC source file or source svn directory<br />
* If using FPC source files: extract/de-tgz in work directory,<br />
* Build: enter work/fpc/ and run<br />
<syntaxhighlight lang="bash"><br />
# maybe use: <br />
export MAKE=`which make` ; echo $MAKE <br />
$MAKE all OPT='-gl' PP=/path/to/startingcompiler-name-ppc386<br />
# $MAKE is make on linux and gmake on BSD <br />
# /path/to/ can be omitted when ppc386 is in the path<br />
</syntaxhighlight><br />
<br />
* Install fpc. Again in work/fpc, run<br />
<syntaxhighlight lang="bash"><br />
$MAKE install PP=compiler/ppc386 PREFIX=$THEPREFIX<br />
#replace the PP=compiler/ppc386 with the relevant compiler if not on Intel x86<br />
#THEPREFIX= usually is /usr/local or just /usr, but e.g. on NetBSD it is /usr/pkg for ports)<br />
</syntaxhighlight><br />
<br />
* Create a symlink:<br />
<syntaxhighlight lang="bash"><br />
ln -s $THEPREFIX/lib/fpc/3.0.0/ppc386 $THEPREFIX/bin/ppc386<br />
</syntaxhighlight><br />
<br />
* Install sources:<br />
<syntaxhighlight lang="bash"><br />
$MAKE install sourceinstall PREFIX=$THEPREFIX<br />
</syntaxhighlight><br />
* Create a symlink for default Lazarus source path:<br />
<syntaxhighlight lang=bash><br />
ln -sf $THEPREFIX/share/src/3.0.0/fpc /usr/share/fpcsrc<br />
</syntaxhighlight><br />
<br />
* Set up fpc.cfg configuration file:<br />
<syntaxhighlight lang="bash">$THEPREFIX/lib/fpc/3.0.0/samplecfg $THEPREFIX/lib/fpc/3.0.0 $ETCDIR</syntaxhighlight><br />
<br />
* Optionally test to see if ppc386 -i (or whatever compiler your architecture uses) gives output, else give a warning that user need to add $PREFIX/bin to his current path. Try to compiler a program with -viwn, and see if that gives errors.<br />
<br />
Notes:<br />
* If you need fpcmake package lists, you need to generate or supply them yourself, (in the port, or in an extra archive) either way, do a dummy install to /tmp/pack and determine the files installed with <syntaxhighlight lang="bash">find . >ll</syntaxhighlight><br />
<br />
* $THEPREFIX and $ETCDIR should be user configurable. Otherwise local installs aren't possible.<br />
<br />
* BSDHIER=1 on all make commands forces BSD hierarchy conventions.<br />
<br />
=== Установка Free Pascal в Mac OS X ===<br />
<br />
См [[Installing Lazarus on MacOS X|Установка Lazarus на MacOS X]]<br />
<br />
==Установка Lazarus==<br />
<br />
===Установка Lazarus в Linux===<br />
<br />
==== Ubuntu / Debian ====<br />
<br />
It is recommended to use the [[fpcup|fpcUP]] updater-installer for first time users of Lazarus, which installs fpc & Lazarus in one go into a single subdirectory structure ( ~/development ). <br />
<br />
A way to get a current working installation of Lazarus is to download the .deb files for Free Pascal and Lazarus from the SourceForge repository. Here is how: [[Lazarus release version for Ubuntu|Getting Lazarus from our Ubuntu repository]].<br />
<br />
Note that installing from the default Ubuntu sources will not install the Free Pascal Source Libraries - use the method above.<br />
<br />
{{Note|on Linux Ubuntu at least, the command to start Lazarus from a console is [[startlazarus]]. Else, if you installed it from a Debian package, you should have a Lazarus menu entry under Application/Programming. <br />
(Issue: there is an ambiguity with a program also called "lazarus" from a "tct" package available for Ubuntu).}}<br />
<br />
<br />
===== Простой способ создания debs =====<br />
<br />
The easiest way to get a current working installation of Lazarus is to download build your own .deb packages by following the instructions at:<br />
<br />
[[How to setup a FPC and Lazarus Ubuntu repository]]<br />
<br />
===== Установка с использованием rpms =====<br />
<br />
Следующим самым простым способом установки является установка RPM-пакетов для Free Pascal и Lazarus из репозитория SourceForge.<br />
<br />
Вам необходимо загрузить выбранные версии следующих компонентов:<br />
* компилятор (например, fpc-3.0.4-1.i686.rpm)<br />
* исходный код библиотеки pascal (например, fpc-src-3.0.4-1.i686.rpm)<br />
* Lazarus (например, lazarus-1.8.4-0.i686.rpm).<br />
<br />
Удалите старые пакеты:<br />
<syntaxhighlight lang="bash"><br />
rpm -ev lazarus<br />
rpm -ev fpc<br />
rpm -ev fpc-src<br />
</syntaxhighlight><br />
Установите новые пакеты:<br />
<syntaxhighlight lang="bash"><br />
rpm -ivh fpc-*<br />
rpm -ivh lazarus-*<br />
</syntaxhighlight><br />
<br />
=====Установка на Raspbian Wheezy=====<br />
<br />
Raspbian is a custom version of Debian for the Raspberry Pi creditcard-size computer. See [[Lazarus on Raspberry Pi]] for details.<br />
<br />
====Установка на Mandriva====<br />
<br />
===== Lazarus 0.9.30 на Mandriva 2010. =====<br />
<br />
Install as given lower down however on compiling a program you may get two error messages telling you that you are missing pixbuf 2.0 and lgtk-x11-2.0. to fix this install from the the software installer libdgk_pixbuf2.0_0-devel and libgtk+2.0_0-devel.<br />
<br />
====Установка на Slackware====<br />
===== Установка Lazarus на Slackware 13.0 =====<br />
There is no real difference from the slackware 12.2 or 12.0 version, therefore the procedure described below should work just as well. <br />
<br />
===== Установка Lazarus 0.9.30 для пользователей Slackware 12.0 =====<br />
This have worked in Slackware-12.0 on a Pentium-3 computer: <br />
<br />
* The Free Pascal Compiler (FPC) is installed in SUPERUSER mode <br />
* The lazarus in installed in USER mode<br />
* The FPC compiler will be recompiled<br />
* The lazarus Integrated Development Environment (IDE) source code is loaded from the SVN server <br />
<br />
-- Download "fpc-2.4.2.i386-linux.tar" in a user folder and install it. Go to this folder and type: <br />
<syntaxhighlight lang="bash"><br />
bash-3.1$ tar -xvf fpc-2.4.2.i386-linux.tar<br />
bash-3.1$ su <br />
bash-3.1$ password:xxxxxx<br />
bash-3.1# sh install.sh<br />
...<br />
(use the default answers for the next 6 questions: press "return" 6 times)<br />
...<br />
bash-3.1# exit<br />
bash-3.2$ fpc<br />
free pascal compiler version 2.4.2 [] for i386 <br />
Copyright (c) 2010 ...<br />
...<br />
...<br />
</syntaxhighlight><br />
You have installed the compiler. You may want to recompile it or not, but in any case you will need to download the source code as it is required by the lazarus IDE.<br />
<br />
-- Download "fpc-2.4.2.source.tar.gz" in a temporary folder. If you do not want to recompile the source then just skip this section. If you would like to run your own compiled version of FPC, then just type:<br />
<syntaxhighlight lang="bash"><br />
bash-3.1$ tar -xvzf fpc-2.4.2.source.tar.gz<br />
bash-3.1$ cd fpc-2.4.2<br />
bash-3.1$ make clean all<br />
bash-3.1$ su<br />
bash-3.1$ password: xxxxxxxx<br />
bash-3.1# make install<br />
bash-3.1# exit<br />
bash-3.1$ fpc<br />
free pascal compiler version 2.4.2 [...] for i386 <br />
Copyright (c) 2010 ...<br />
...<br />
...<br />
</syntaxhighlight><br />
Now you have your own compiled version working. <br />
<br />
-- The Lazarus IDE editor needs to look at the FPC source code. Even if you do not want to recompile FPC, you need its source code. However, in order to save some space, I only keep a clean (not compiled) copy of the source code. I start from the file "fpc-2.4.2.source.tar.gz" again and I copy it to the /usr/local/src/FPC folder:<br />
<syntaxhighlight lang="bash"><br />
bash-3.1$ su<br />
bash-3.1$ password: xxxxxxxx<br />
bash-3.1# cp fpc-2.4.2.source.tar.gz /usr/local/src/<br />
bash-3.1# cd /usr/local/src/<br />
bash-3.1# tar -xvzf fpc-2.4.2.source.tar.gz<br />
bash-3.1# rm fpc-2.4.2.source.tar.gz<br />
bash-3.1# exit<br />
</syntaxhighlight><br />
The version number is included in the folder name "fpc-2.4.2". This way I can keep many versions the the compiler source and eventually switch between them.<br />
<br />
-- The lazarus IDE is kept in my USER "~/lazarus" folder and always compiled in USER mode. I usually download the "lazarus-0.9.30-0.tar.gz" file, but here we can also get the latest development version from the SVN server:<br />
<syntaxhighlight lang="bash">bash-3.1$ svn co http://svn.freepascal.org/svn/lazarus/trunk lazarus</syntaxhighlight><br />
This is for the first time you load it. Next time you will only need to type:<br />
<syntaxhighlight lang="bash">bash-3.1$ svn update</syntaxhighlight><br />
If you do not have SVN installed on your computer, here is how to get it quickly:<br />
<br />
--Download the two files: "subversion-1.4.6.tar.gz" and "subversion-deps-1.4.5.tar.gz" (or later versions). Type:<br />
<syntaxhighlight lang="bash"><br />
bash-3.1$ tar -xvzf subversion-1.4.6.tar.gz<br />
bash-3.1$ tar -xvzf subversion-deps-1.4.6.tar.gz<br />
bash-3.1$ cd subversion-1.4.6<br />
bash-3.1$ ./configure<br />
bash-3.1$ make<br />
bash-3.1$ su<br />
bash-3.1$ password:xxxxxx<br />
bash-3.1# make install<br />
bash-3.1$ exit<br />
</syntaxhighlight><br />
<br />
-- At this point you have the folder "~/lazarus" containing the source code. You should compile it very simply:<br />
bash-3.1$ make clean all<br />
After a few minutes, the compiler stops:<br />
<syntaxhighlight lang="bash"><br />
...<br />
...<br />
Linking ../Lazbuild<br />
987 linescompiled ...<br />
make [2] leaving ...<br />
make [1] leaving ...<br />
bash-3.1$<br />
</syntaxhighlight><br />
<br />
-- Just type:<br />
<syntaxhighlight lang="bash">bash-3.1$ ./lazarus</syntaxhighlight><br />
WOW! You get a message: "Free Pascal sources not found". Just follow the instructions and indicate your Free Pascal Compiler source directory in the panel: "Environment->Options->Files". As explained earlier, on my computer this should point to "/usr/local/src/fpc-2.4.2". Note that when you change this folder, you should click on "Environment / Rescan_FPC_source_directory".<br />
<br />
Voila!<br />
<br />
====Установка на openSUSE====<br />
<br />
===== Установка Lazarus 0.9.30 для пользователей openSUSE 11.1 =====<br />
<br />
Free Pascal Compiler requires:<br><br />
- Gnu binutils (gnu as, gnu ld, gnu make)<br />
These utils can be installed by:<br />
<syntaxhighlight lang="bash">zypper in -t pattern devel_basis</syntaxhighlight><br />
<br />
Lazarus also requires these components:<br />
1) glib2 devel<br />
2) gtk2 devel<br />
<br />
'''Important''': The lazarus rpm requires the gtk 2 version, not the version 1.2.<br />
<br />
These libraries can be installed by:<br />
<syntaxhighlight lang="bash">zypper -n install gtk2 glib2</syntaxhighlight><br />
<br />
Download these binary files (RPM)<br />
:* fpc-2.4.2-0.i686.rpm (yes i686 and not i386)<br />
:* fpc-src-2.4.2-0.i686.rpm<br />
:* lazarus-0.9.30-0.i686.rpm<br />
<br />
install them opening a terminal session (mouse's right button -> Menu: Open in terminal)<br />
<syntaxhighlight lang="bash"><br />
rpm -Uvh fpc-2.4.2-0.i686.rpm<br />
rpm -Uvh fpc-src-2.4.2-0.i686.rpm<br />
rpm -Uvh lazarus-0.9.30-0.i686.rpm<br />
</syntaxhighlight><br />
<br />
====Установка Lazarus 1.0.8 на Fedora Core 18====<br />
<br />
After a fresh install of Fedora Core 18 '''yum''' is installed, but fails with an error messages.<br />
*Open '''Software''', check for new software and update all packages.<br />
*Reboot.<br />
*Install packages '''gtk2-devel''', '''fpc''' and '''subversion'''. Fedora Core 18 already has fpc 2.6.2. <br />
*Open a Terminal and do<br />
svn co svn+ssh://svn.freepascal.org/FPC/svn/lazarus/tags/lazarus_1_0_8 lazarus<br />
cd lazarus<br />
make bigide<br />
./lazarus<br />
<br />
==== Установка Lazarus на Scientific Linux ====<br />
<br />
Scientific Linux is an RPM-based distribution focussing on science and research. See [[Scientific Linux]] for details. <br />
<br />
==== Установка из исходных файлов ====<br />
<br />
If you prefer to install from source and compile the files yourself, follow these instructions. Because the whole lazarus stuff is installed into one directory, uninstall is very easy and you don't need to be root to install lazarus. You can get tgz files for fpc, fpcsrc and lazarus from the downloads section or you can download it directly via svn.<br />
<br />
Here is an example of installing 0.9.28 to Ubuntu 6.06. If you understand Linux commands and bash script, you can get what steps are needed. Just copy the script (change the version number when new version has been released), paste it into a text editor, and save it as something like "install_lazarus.sh". Give it execute permission, and run it in <br />
a console.<br />
{{Note|In this example, fpc is installed in /opt. So when prompted ''''Install prefix'''', enter '/opt/fpc'. }}<br />
<br />
<syntaxhighlight lang="bash"><br />
#!/bin/sh<br />
<br />
#installing required packages<br />
sudo apt-get install build-essential<br />
sudo apt-get install libgtk2.0-dev<br />
sudo apt-get install libgdk-pixbuf-dev<br />
<br />
#installing Free Pascal source<br />
cd /opt<br />
sudo wget http://nchc.dl.sourceforge.net/lazarus/fpc-src-2.4.2.source.tgz<br />
sudo tar -xvf fpc-src-2.4.2.source.tgz<br />
sudo mv fpc fpcsrc<br />
<br />
#installing Free Pascal<br />
sudo mkdir fpc<br />
cd fpc<br />
sudo wget http://nchc.dl.sourceforge.net/lazarus/fpc-2.4.2.i686-linux.tar<br />
sudo tar -xvf fpc-2.4.2.i686-linux.tar<br />
echo "Enter '/opt/fpc' when prompted 'Install prefix'"<br />
sudo sh install.sh<br />
<br />
#adding fpc path to the PATH<br />
echo "#FPC PATH" >> ~/.bash_profile<br />
echo "if [ -d /opt/fpc/bin ] ; then" >> ~/.bash_profile <br />
echo PATH=/opt/fpc/bin:"${PATH}" >> ~/.bash_profile<br />
echo "fi" >> ~/.bash_profile<br />
<br />
#installing Lazarus<br />
cd ../<br />
sudo wget http://nchc.dl.sourceforge.net/lazarus/lazarus-0.9.30-0.tar.gz<br />
# sudo wget https://downloads.sourceforge.net/project/lazarus/Lazarus%20Zip%20_%20GZip/Lazarus%201.8.0RC5/lazarus-1.8.0-RC5.tar.gz<br />
sudo tar -zxvf lazarus-0.9.30-0.tar.gz<br />
PATH=/opt/fpc/bin:"${PATH}"<br />
sudo chmod -R 777 lazarus<br />
cd lazarus<br />
make clean all<br />
./lazarus<br />
</syntaxhighlight><br />
<br />
{{Note|You have to manually set fpc-src path in the Environmental Options.}}<br />
<br />
===== Загрузка исходных файлов Lazarus =====<br />
<br />
Both the Lazarus and FPC source code reside in SVN/subversion repositories. SVN provides an easy way to update your sources by only downloading the changes. This is the recommended way and saves you a lot of time. A connection to the internet is needed for this, but you don't need to be root. <br />
<br />
Please note these instructions are for subversion, but there is also a Git mirror repository of Free Pascal Compiler and Lazarus: see [[git mirrors|Git mirror]]. You can also use git directly with the subversion server using git-svn link: see [[Lazarus git-svn|Lazarus git-svn]].<br />
<br />
Lazarus does not need any special permissions, neither during installation nor at runtime.<br />
<br />
<font color="red">If you decide to use TortoiseSVN, remember to check "command line client tools" during its installation if you want Lazarus to show the SVN revision number in the About dialog.</font><br />
<br />
;Now getting the sources:<br />
<br />
<syntaxhighlight lang="bash"> svn checkout http://svn.freepascal.org/svn/lazarus/trunk/ lazarus</syntaxhighlight><br />
(replace the last lazarus with any other dir where you want to place your sources)<br />
<br />
On subsequent occasions, to update simply type<br />
<br />
<syntaxhighlight lang="bash"> svn update lazarus</syntaxhighlight><br />
<br />
For more information on Subversion, see:<br />
http://subversion.tigris.org/<br />
<br />
===== Компиляция и запуск =====<br />
<br />
Whether you checkout from cvs or svn, the next step is: <br />
<br />
;compile lazarus:<br />
<syntaxhighlight lang="bash"><br />
cd lazarus<br />
make (gmake on BSD)<br />
</syntaxhighlight><br />
<br />
If fpc is installed correctly, the compilation should work without problems. If not, see FAQ.<br />
<br />
;Start lazarus<br />
<syntaxhighlight lang="bash"> ./lazarus</syntaxhighlight><br />
<br />
The IDE should start. If you started lazarus in a terminal, you can see some notes about missing settings. This is normal at first start. The IDE automatically tries to find out where the Free Pascal compiler and its sources are installed by searching in the most common directories.<br />
<br />
;Check the paths:<br />
: Use the IDE menu to go to<br />
:: Environment -> Environment Options -> Files<br />
<br />
The 'FPC Source directory' should point to your fpc source directory. This directory normally ends with /fpc/ or /fpcsrc/ (e.g. /usr/src/fpcsrc or /home/username/freepascal/fpc) and contains directories like 'compiler', 'docs', 'fcl', 'rtl' and 'packages'.<br />
<br />
See here for the documentation about this dialog: [[IDE_Window:_Environment_Options|IDE Options]].<br />
<br />
;Hint:<br />
To update lazarus you can use<br />
<syntaxhighlight lang="bash"> svn update lazarus</syntaxhighlight><br />
then for either update pathway:<br />
<syntaxhighlight lang="bash"> make clean all (gmake on BSD)</syntaxhighlight><br />
This will rebuild lazarus and create an IDE without lazarus packages. To link your installed packages do '''after''' the above:<br />
<syntaxhighlight lang="bash"> ./lazbuild --build-ide=</syntaxhighlight><br />
<br />
You may have to append other options if for example you use a custom config directory (ie. add --pcp="C:\Documents and Settings\<USER>\Local Settings\Application Data\lazarus-tests"). See [[lazbuild]].<br />
<br />
==== Установка Lazarus в Debian GNU/Linux ====<br />
<br />
There are preliminary Debian packages for lazarus available for download. They are not the latest versions, however. Make sure you read /usr/share/doc/lazarus/README.Debian carefully before you start using it. Feedback is needed and appreciated; please send your comments to Carlos Laviola <claviola@debian.org>.<br />
<br />
Note that for a fully working Lazarus install, no older or incompatible versions of, for example, the fpc source or fpc compiler must be installed. Remove them by typing<br />
<br />
<syntaxhighlight lang="bash">dpkg -r <package name></syntaxhighlight><br />
<br />
without .deb extension. And then install the newest versions as described.<br />
<br />
=== Установка Lazarus в Windows ===<br />
<br />
Текущие стабильные версии исполняемых файлов Lazarus для Windows устанавливаются очень легко и могут работать 'из коробки'. <br />
<br />
Исключение составляют Win98 и ME, для которых необходимо указывать специальный флаг при компиляции. Смотрите [[#Installing_from_source_2|Установка из исходных файлов]].<br />
<br />
==== Установка портативной версии Lazarus на USB-диск ====<br />
<br />
It is even possible to install the whole Lazarus/FPC package on a portable USB drive (capacity at least 256 MB), for use in environments where you are not allowed to install software on your Windows workstation or where you haven't got administrator privileges. You do have to be a little careful about adjusting the paths in the compiler and environment options and the fpc.cfg file. It may also be necessary to keep the directory for test compilation on your portable drive. <br />
<br />
<< Q:DOES ANYONE KNOW HOW TO SET UP RELATIVE PATHS IN THESE TAGS AND FILES, SO THAT THE ADDRESSING WORKS WHEN YOU MOVE THE USB DEVICE TO ANOTHER MACHINE WHERE IT HAS A DIFFERENT DRIVE LETTER? <br />
<br />
A: This is what I do. It's relatively convoluted, but it's the best solution I've found. I have a "bin" directory on my USB drive, where I have several scripts and utilities installed. Inside that directory is a batch file called "setenv.bat" which sets an environment variable called THUMBDRIVE. It is set by using this command in the batch file:<br />
<syntaxhighlight lang="dos">set THUMBDRIVE=%CD:~0,2%</syntaxhighlight><br />
This is used in setenv.bat to set some paths to other things I have installed on the USB drive. I also have a link in the root directory of the thumb drive with this property:<br />
<syntaxhighlight lang="dos">%SystemRoot%\system32\cmd.exe /k bin\setenv</syntaxhighlight><br />
so that when I click on that link when the thumb drive folder is diplayed after inserting it, it will open a command prompt at the thumb drive with the environment variables set from setenv.bat.<br />
<br />
Also inside the bin directory is [http://sed.sf.net sed] (the actual binary is one I obtained from the mingw distribution). So I created another batch file called fixlaz.bat which takes one argument, the drive letter which is currently in the Lazarus/fpc settings files that you want to change (note that this is the previous drive letter the last time you ran fixlaz.bat, not the current one of your USB drive which fixlaz.bat already knows). You will need to create this batch file to fit where you installed Lazarus in the root directory structure of the drive if you didn't install it directly in the root folder, and then repeat these lines also for the editoroptions.xml and fpc.cfg files (fpc.cfg is the the fpc bin directory, which might be buried deep in the lazarus folder):<br />
<syntaxhighlight lang="dos"><br />
copy %THUMBDRIVE%\lazarus\environmentoptions.xml %THUMBDRIVE%\lazarus\environmentoptions.bak<br />
sed -e 's/%1/%THUMBDRIVE%/g' %THUMBDRIVE%\lazarus\environmentoptions.bak > %THUMBDRIVE%\lazarus\environmentoptions.xml<br />
</syntaxhighlight><br />
<br />
So to use it, I would type at the command prompt of the USB drive:<br />
<syntaxhighlight lang="dos">fixlaz G:</syntaxhighlight><br />
if "G:" was the previous drive letter used the last time I ran it. This will then scan the file(s) and replace "G:" with the current drive letter of the USB drive, which is in the %THUMBDRIVE% environment variable (after running setenv.bat). Note that you could write it to save the current drive letter in a separate file, so that you wouldn't have to remember it yourself the next time. But this works well enough for me right now.<br />
>><br />
<br />
The binary package is available for Linux and Windows from<br />
<br />
http://sourceforge.net/project/showfiles.php?group_id=89339<br />
<br />
Download the latest release (currently Lazarus-0.9.30-0-win32.exe) and launch the application. You will be taken through a typical Windows installation, in which the FPC compiler and source libraries are installed within the same directory structure as Lazarus, and the IDE should launch and operate without significant problems, provided you have uninstalled(!!!) any previous version of Lazarus and/or FPC (often found in the C:\pp directory).<br />
<br />
You can also use a Lazarus Snapshot. For download locations see [[Lazarus Snapshots Downloads]].<br />
<br />
Tip:<br />
It's perhaps a good idea to reboot your Windows after you installed Lazarus and before you try to install additional lazarus components as zeoslib fore example.<br />
<br />
==== Установка из исходных файлов ====<br />
If you prefer to install from sources, then follow these instructions.<br />
<br />
Please note these instructions are for SubVersion, but there is also a Git mirror repository of Free Pascal Compiler and Lazarus. See [[git mirrors|Git mirror]] for details. You can also use git directly with SubVersion server using git-svn link. See [[Lazarus git-svn|Lazarus git-svn]] for details.<br />
<br />
Open a command prompt window. Start->Run...>CMD or choose MS-DOS icon. You will use this window to enter the commands below<br />
<br />
You have to download the lazarus source from one of the [[Lazarus Snapshots Downloads|snapshots servers]].<br />
Then unzip it to c:\lazarus for example [below called $(LazarusDir)].<br />
<br />
Or you use SVN (example for text mode SVN; adapt to GUI tools such as TortoiseSVN if you want to):<br />
<syntaxhighlight lang="bash"><br />
mkdir c:\lazarus<br />
cd /d c:\lazarus<br />
svn checkout http://svn.freepascal.org/svn/lazarus/trunk/ c:\lazarus<br />
</syntaxhighlight><br />
<br />
You have to install at least the latests stable FPC version (e.g. FPC 2.6.4, but an FPC 3.1.1 snapshot is also possible). <br />
<br />
<br />
Type (replace $(LazarusDir) with the path you have unzipped/checked out Lazarus; replace <br />
<syntaxhighlight lang="dos"><br />
cd /d $(LazarusDir)<br />
rem Of course change the first path variable to<br />
rem the path of your FPC compiler<br />
set path=c:\freepascal\bin\i386-win32;$(LazarusDir)<br />
make<br />
</syntaxhighlight><br />
<br />
*Win9x: use make OPT="-dWIN9XPLATFORM" (Lazarus trunk (and upcoming 1.4)) otherwise the lazarus.exe will not be able to run on this platform.<br />
<br />
If this works, you can type: lazarus.exe. <br />
<br />
You can compile examples also:<br />
<br />
<syntaxhighlight lang="dos"><br />
cd /d $(LazarusDir)\examples<br />
make<br />
</syntaxhighlight><br />
<br />
<s>If you extracted lazarus to another drive, eg.: d:\lazarus, tt can happen that you need the gnu make utility to make it. If you have it, you can take its path to set path=...;<gmakepath> but it is simpler not to choose drive d:\</s><br />
<br />
==== Установка из исходных файлов с использованием стабильной версии ====<br />
An alternative version of the instructions above.<br />
<br />
1> First of all install the latest stable Lazarus to obtain a good starting FPC, for example in C:\lazarus_1_4<br />
<br />
2> Now use TortoiseSVN to checkout http://svn.freepascal.org/svn/lazarus/trunk/ into c:\lazarus<br />
<br />
3> Make the following C:\lazarus\build.bat file:<br />
<br />
Replace $(LazarusDir) with your Lazarus did and make sure the FPC version number matches<br />
<syntaxhighlight lang="dos"><br />
SET PATH=$(LazarusDir)\fpc\2.6.4\bin\i386-win32\<br />
make bigide<br />
</syntaxhighlight><br />
<br />
Now create a shortcut in your desktop to start Lazarus and put the following command to start Lazarus which will make sure that it separates the config files from the stable and the SVN versions:<br />
<br />
<syntaxhighlight lang="dos">$(LazarusDir)\startlazarus.exe --pcp=$(LazarusDir)\configdir </syntaxhighlight><br />
<br />
Always start Lazarus from this shortcut, never directly from the executable. At the first time you start Lazarus configure you FPC dir, FPC sources dir and Lazarus dir.<br />
<br />
==== Сборка Lazarus в Win98 и WinME ====<br />
<br />
Так как среда разработки Lazarus по умолчанию вызывает функцию "CreateToolhelp32Snapshot", которая отсутствует на платформе Win9x, IDE не запустится в Win9x "из коробки".<br />
<br />
Для того, чтобы сделать это запустите пересборку IDE Lazarus с ключом "-dWIN9XPLATFORM".<br />
<br />
=== Установка Lazarus в FreeBSD ===<br />
Следующие инструкции относятся только для версии FreeBSD 9 и выше.<br />
<br />
====via Ports tree====<br />
The latest version of Lazarus available in the FreeBSD port tree, is v 1.6.4 We can use that to install Lazarus.<br />
<br />
<syntaxhighlight lang="bash">[]# cd /usr/ports/editors/lazarus && make install clean clean-depends</syntaxhighlight><br />
<br />
If you start Lazarus IDE and you get a messages about missing source files, then go to '''Environment - Environment Options - Files Tab: FPC source library''' and enter the directory of the FPC source files. It can be obtained from /usr/ports/distfiles/freepascal<br />
<br />
====via pkgng====<br />
<syntaxhighlight lang="bash">[]# pkg install editors/lazarus</syntaxhighlight><br />
<br />
At this point Lazarus might complain about missing source files. If you don't have them:-<br />
<br />
mkdir /usr/ports/distfiles<br />
mkdir /usr/ports/distfiles/freepscal<br />
cd /usr/ports/distfiles/freepascal<br />
wget http://distcache.freebsd.org/ports-distfiles/freepascal/fpc-3.0.2.source.tar.gz<br />
tar xvfz fpc-3.0.2.source.tar.gz<br />
<br />
Change the 3.0.2 to whatever version of fpc you have installed. Then go to '''Environment - Environment Options - Files Tab: FPC source library''' and enter<br />
<br />
/usr/ports/distfiles/freepascal/fpc-3.0.2<br />
<br />
If when you try to compile something you get this error<br />
<br />
Error: resource compiler "fpcres" not found, switching to external mode<br />
<br />
Then you can install fpcres like this<br />
<br />
<syntaxhighlight lang="bash">[]# pkg install lang/fpc-utils</syntaxhighlight><br />
<br />
====via Lazarus repository====<br />
This option will often be used if you want to follow Lazarus Trunk, a Fixes branch, or some other release (eg: compiling from a source tarball).<br />
* Use the SubVersion or Git repositories to checkout a copy of the source code you want, or unpack a downloaded source archive into a suitable location<br />
* The readme.txt file in Lazarus directory mentions 'make clean all'. This works if you are using Linux. Under FreeBSD 9.1 I had to replace 'make' with 'gmake'.<br />
<br />
cd /patch/to/lazarus_source<br />
gmake clean all<br />
<br />
=== Установка Lazarus в PC-BSD 1.0rc1+ ===<br />
<br />
You can install Lazarus on PB-BSD by simply downloading the Lazarus PBI from [http://www.pbidir.com/ PBI Dir]<br />
<br />
Note that you must install glib* port from /usr/port/devel/glib* or glib packages by pkg_add -r glib12 glib20.<br />
I will fix this in new PBI releases.<br />
<br />
'''[other OpenBSD/NetBSD/DragonFlyBSD goes here]'''<br />
<br />
=== Установка Lazarus в Mac OS X ===<br />
<br />
See [[Installing Lazarus on MacOS X]].<br />
<br />
=== Установка Lazarus в Haiku ===<br />
<br />
Lazarus requires Qt under Haiku. Qt is not installed by default under Haiku. You need to install package available from this site : http://qt-haiku.ru/<br />
<br />
Currently, there is no binary package to install Lazarus.<br />
<br />
You will have to compile Lazarus from sources.<br />
<br />
Detailed instructions to build Lazarus under Haiku are available here : [[Installing Lazarus on Haiku]]<br />
<br />
=Установка нескольких версий Lazarus=<br />
Please see [[Multiple Lazarus]] for details on having more than one Lazarus version installed on one system. We cover issues that can arise due to multiple Lazarus installs here, because they can also happen when installing over a previous version.<br />
<br />
=Устранение проблем=<br />
These hints should (hopefully) be applicable across platforms; please adjust paths etc. according to your platform. Also, problems and solutions might be mentioned in the [[Lazarus_Faq]]. <br />
<br />
== Isolating the component ==<br />
There may be multiple problems when installing Free Pascal and Lazarus.<br />
If you have problems with starting Lazarus or compiling with it, first make sure your underlying FPC installation works, e.g. by trying to compile a simple example program.<br />
<br />
== Расположение установленных компонентов ==<br />
On Linux/Unix/OSX, package/distribution provided installations will often install FPC in /bin or /usr/bin, with the libraries in /lib or /usr/lib, and probably the configuration in /etc/fpc.cfg<br />
Source (Subversion) downloads often install in /usr/local/bin (libraries in /usr/local/lib).<br />
<br />
== Отсутствие или повреждение файла fpc.cfg ==<br />
Файл fpc.cfg является файлом настроек FPC. В системе Windows его можно найти в директории с исполняемыми файлами компилятора fpc. On Unix/Linux/OSX, it is first searched in /etc/fpc.cfg, then<br />
Only some problems that often occur are covered. Please see the Free Pascal User's guide, e.g. chapter Compiler usage/configuration file for more details, including the search order for fpc.cfg<br />
<br />
Если его нет, FPC не скомпилирует вашу программу должным образом.<br />
<br />
=== Автоматическое создание fpc.cfg ===<br />
Вы можете попытаться создать fpc.cfg с помощью специальной утилиты:<br />
<br />
<syntaxhighlight lang="dos"><br />
rem Измените путь к директории с исполняемыми файлами FPC<br />
cd /d C:\freepascal\fpc\2.4.5\bin\i386-win32<br />
rem Создание fpc.cfg; basepath - это "корневая" директория fpc<br />
fpcmkcfg -d basepath=C:\freepascal\fpc\2.4.5 -o .\fpc.cfg<br />
</syntaxhighlight><br />
{{Note|earlier instructions had \bin\i386-win32 appended to the basepath. This is not needed since at least FPC 2.4.4.}}<br />
<br />
=== Ручное создание fpc.cfg ===<br />
If the above doesn't work for you, you can copy/paste the code below to a new file named fpc.cfg to your fpc executable directory (or ~/.fpc.cfg or other location). Modify the paths so they match your situation.<br />
<br />
$FPCVERSION is used to automatically determine the version of FPC being used for the compile. Using this variable allows this single fpc.cfg to be used with multiple fpc versions that have the same path structure making it easier to maintain multiple FPC installs.<br />
<br />
<pre><br />
#<br />
# Config file generated by fpcmkcfg on 24/12/2010 - 18:17:42<br />
# Example fpc.cfg for Free Pascal Compiler<br />
#<br />
<br />
# ----------------------<br />
# Defines (preprocessor)<br />
# ----------------------<br />
<br />
#<br />
# nested #IFNDEF, #IFDEF, #ENDIF, #ELSE, #DEFINE, #UNDEF are allowed<br />
#<br />
# -d is the same as #DEFINE<br />
# -u is the same as #UNDEF<br />
#<br />
<br />
#<br />
# Some examples (for switches see below, and the -? helppages)<br />
#<br />
# Try compiling with the -dRELEASE or -dDEBUG on the commandline<br />
#<br />
<br />
# For a release compile with optimizes and strip debuginfo<br />
#IFDEF RELEASE<br />
-O2<br />
-Xs<br />
#WRITE Compiling Release Version<br />
#ENDIF<br />
<br />
# For a debug version compile with debuginfo and all codegeneration checks on<br />
#IFDEF DEBUG<br />
-glh<br />
-Crtoi<br />
#WRITE Compiling Debug Version<br />
#ENDIF<br />
<br />
# ----------------<br />
# Parsing switches<br />
# ----------------<br />
<br />
# Pascal language mode<br />
# -Mfpc free pascal dialect (default)<br />
# -Mobjfpc switch some Delphi 2 extensions on<br />
# -Mdelphi tries to be Delphi compatible<br />
# -Mtp tries to be TP/BP 7.0 compatible<br />
# -Mgpc tries to be gpc compatible<br />
# -Mmacpas tries to be compatible to the macintosh pascal dialects<br />
#<br />
# Turn on Object Pascal extensions by default<br />
#-Mobjfpc<br />
<br />
# Assembler reader mode<br />
# -Rdefault use default assembler<br />
# -Ratt read AT&T style assembler<br />
# -Rintel read Intel style assembler<br />
#<br />
# All assembler blocks are AT&T styled by default<br />
#-Ratt<br />
<br />
# Semantic checking<br />
# -S2 same as -Mobjfpc<br />
# -Sc supports operators like C (*=,+=,/= and -=)<br />
# -Sa include assertion code.<br />
# -Sd same as -Mdelphi<br />
# -Se<x> compiler stops after the <x> errors (default is 1)<br />
# -Sg allow LABEL and GOTO<br />
# -Sh Use ansistrings<br />
# -Si support C++ styled INLINE<br />
# -SI<x> set interface style to <x><br />
# -SIcomCOM compatible interface (default)<br />
# -SIcorbaCORBA compatible interface<br />
# -Sm support macros like C (global)<br />
# -So same as -Mtp<br />
# -Sp same as -Mgpc<br />
# -Ss constructor name must be init (destructor must be done)<br />
#<br />
# Allow goto, inline, C-operators, C-vars<br />
-Sgic<br />
<br />
# ---------------<br />
# Code generation<br />
# ---------------<br />
<br />
# Uncomment the next line if you always want static/dynamic units by default<br />
# (can be overruled with -CD, -CS at the commandline)<br />
#-CS<br />
#-CD<br />
<br />
# Set the default heapsize to 8Mb<br />
#-Ch8000000<br />
<br />
# Set default codegeneration checks (iocheck, overflow, range, stack)<br />
#-Ci<br />
#-Co<br />
#-Cr<br />
#-Ct<br />
<br />
# Optimizer switches for i386 compiler<br />
# -Os generate smaller code<br />
# -O1 level 1 optimizations (quick optimizations)<br />
# -O2 level 2 optimizations (-O1 + slower optimizations)<br />
# -O3 level 3 optimizations (same as -O2u)<br />
# -Oa=N set alignment to N<br />
# -OoX switch on optimalization X. <br />
# -OoNOX switch off optimalization X.<br />
# X is one of REGVAR UNCERTAIN STACKFRAME PEEPHOLE ASMCSE LOOPUNROLL<br />
# -OpCPU set target processor.<br />
# CPU is one of 386, PENTIUM, PENTIUM2, PENTIUM3, PENTIUM4, PENTIUMM <br />
<br />
<br />
# -----------------------<br />
# Set Filenames and Paths<br />
# -----------------------<br />
<br />
# Both slashes and backslashes are allowed in paths<br />
<br />
# path to the messagefile, not necessary anymore but can be used to override<br />
# the default language<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errore.msg<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errorn.msg<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errores.msg<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errord.msg<br />
#-FrC:\freepascal\fpc\$FPCVERSION/msg/errorr.msg<br />
<br />
#IFDEF FPCAPACHE_1_13<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/httpd13/<br />
#ELSE<br />
#IFDEF FPCAPACHE_2_0<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/httpd20<br />
#ELSE<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/httpd22<br />
#ENDIF<br />
#ENDIF<br />
<br />
# searchpath for units and other system dependent things<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/*<br />
-FuC:\freepascal\fpc\$FPCVERSION/units/$FPCTARGET/rtl<br />
<br />
# path to the gcclib<br />
<br />
<br />
# searchpath for libraries<br />
#-FlC:\freepascal\fpc\$FPCVERSION/lib<br />
#-Fl/lib;/usr/lib<br />
<br />
# searchpath for tools<br />
-FDC:\freepascal\fpc\$FPCVERSION/bin/$FPCTARGET<br />
<br />
#IFNDEF CPUI386<br />
#IFNDEF CPUAMD64<br />
#DEFINE NEEDCROSSBINUTILS<br />
#ENDIF<br />
#ENDIF<br />
<br />
#IFNDEF Win32<br />
#DEFINE NEEDCROSSBINUTILS<br />
#ENDIF<br />
<br />
# binutils prefix for cross compiling<br />
#IFDEF FPC_CROSSCOMPILING<br />
#IFDEF NEEDCROSSBINUTILS<br />
-XP$FPCTARGET-<br />
#ENDIF<br />
#ENDIF<br />
<br />
<br />
# -------------<br />
# Linking<br />
# -------------<br />
<br />
# generate always debugging information for GDB (slows down the compiling<br />
# process)<br />
# -gc generate checks for pointers<br />
# -gd use dbx<br />
# -gg use gsym<br />
# -gh use heap trace unit (for memory leak debugging)<br />
# -gl use line info unit to show more info for backtraces<br />
# -gv generates programs tracable with valgrind<br />
# -gw generate dwarf debugging info<br />
#<br />
# Enable debuginfo and use the line info unit by default<br />
#-gl<br />
<br />
# always pass an option to the linker<br />
#-k-s<br />
<br />
# Always strip debuginfo from the executable<br />
-Xs<br />
<br />
<br />
# -------------<br />
# Miscellaneous<br />
# -------------<br />
<br />
# Write always a nice FPC logo ;)<br />
-l<br />
<br />
# Verbosity<br />
# e : Show errors (default) d : Show debug info<br />
# w : Show warnings u : Show unit info<br />
# n : Show notes t : Show tried/used files<br />
# h : Show hints m : Show defined macros<br />
# i : Show general info p : Show compiled procedures<br />
# l : Show linenumbers c : Show conditionals<br />
# a : Show everything 0 : Show nothing (except errors)<br />
# b : Show all procedure r : Rhide/GCC compatibility mode<br />
# declarations if an error x : Executable info (Win32 only)<br />
# occurs<br />
#<br />
# Display Info, Warnings, Notes and Hints<br />
-viwn<br />
# If you don't want so much verbosity use<br />
#-vw<br />
</pre><br />
<br />
=== Testing and batch file/shortcut usage ===<br />
You can also explicitly specify a fpc.cfg to use:<bash>fpc -n -@/path/to/fpc.cfg</bash>. Handy for testing, creating shortcuts/shell scripts, having multiple FPC installations etc.<br />
<br />
If that does not work, you can try to create fpc.cfg manually: copy over an existing fpc.cfg from a working installation and change the paths.<br />
<br />
== Mixing FPC versions ==<br />
If your FPC cannot find its sources/ppu files while fpc.cfg has the right paths, another cause could be that the fpc executable is a different version than the (link to) ppc<architecture> compiler.<br />
<br />
When compiling with fpc, fpc starts e.g ppc386 to compile for x86 targets. Please make sure fpc and ppc<architecture> are compiled by the same version/sourced from the same package.<br />
<br />
== Lazarus can't find sources ==<br />
There may be a message saying Lazarus can't find the sources; if so, go to the menu at the top and select Environment -> Environment options and insert the name of the directory where you expect to find your lazarus files (eg ~/FreePascal/lazarus), your compiler (e.g. /usr/local/bin/ppc386), the Free Pascal source directory (e.g. /usr/local/lib/fpc/$version/fpc or a directory in your own space e.g. ~/FreePascal/fpc). Then close the dialog and start programming.<br />
<br />
== Пути к файлам в настройках Lazarus и проекта ==<br />
Учтите, что вы можете установить пути (для компилятора, модулей FPC и т.д.) в общих настройках параметров. Параметры, которые вы укажете в ''Параметрах проекта'', могут переопределять параметры, используемые для каждого проекта.<br />
Если вы испытываете проблемы, связанные с путями в данном проекте, но не в других проектах, вам необходимо проверить, не ошиблись ли вы в переопределении параметров в общих настройках.<br />
<br />
=Установка старых версий=<br />
Смотрите [[Installation hints for old versions]]<br />
<br />
<br />
[[Category:Russian (unfinished translation)]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Developing_with_Graphics/ru&diff=121788
Developing with Graphics/ru
2018-12-16T19:23:09Z
<p>Useroflazarus: /* 2D-рисование */</p>
<hr />
<div>{{Developing with Graphics}}<br />
<br />
Эта страница описывает основные классы и технологии рисования графики в Lazarus. Какие-то специфические вещи ищите в других статьях.<br />
<br />
__TOC__<br />
<br />
== Графические библиотеки ==<br />
<br />
[[Graphics libraries|Графические библиотеки]] - здесь вы можете посмотреть, какие есть основные графические библиотеки.<br />
<br />
==Другие статьи по графике== <br />
===2D-рисование===<br />
* [[ZenGL/ru|ZenGL]] - кроссплатформенная библиотека для разработки игр на основе OpenGL.<br />
* [[BGRABitmap/ru|BGRABitmap]] - Рисование фигур, прозрачных изображений, прямой доступ к пикселям и др.<br />
* [[LazRGBGraphics]] - Пакет для быстрой обработки изображения в памяти и работы с пикселями (например, scan line).<br />
* [[fpvectorial]] - Предоставляет возможность работы с векторной графикой.<br />
* [[Double Gradient]] - Рисуйте легко растровые изображения 'double gradient' и 'n-gradient'.<br />
* [[Gradient Filler]] - TGradientFiller - лучший способ создания пользовательских n-градиентов в Lazarus.<br />
* [[PascalMagick]] - простой в использовании API для взаимодействия с [http://www.imagemagick.org ImageMagick], многоплатформенным пакетом бесплатного программного обеспечения для создания, редактирования и создания растровых изображений.<br />
* [[Sample Graphics]] - графическая галерея, созданная с помощью Lazarus и инструментов для рисования.<br />
* [[Fast direct pixel access]] - сравнение скорости некоторых методов для прямого доступа к растровому пикселю.<br />
* [http://www.crossgl.com/aggpas/ AggPas] - это нативный порт Object Pascal библиотеки Anti-Grain Geometry. Он быстр и очень мощен [при работе] со сглаженным рисунком и субпиксельной точностью. Вы можете думать об AggPas как о механизме рендеринга, который создает пиксельные изображения в памяти из некоторых векторных данных.<br />
<br />
===3D-рисование===<br />
* [[GLScene]] - Порт 3D визуальной графической библиотеки [http://www.glscene.org GLScene OpenGL]<br />
<br />
===Диаграммы===<br />
* [[TAChart]] - компонента для рисования диаграмм в Lazarus<br />
* [[PlotPanel]] - Создание и черчение анимированных графиков<br />
* [[Perlin Noise]] - статья об использовании Perlin Noise в LCL приложениях.<br />
<br />
==Введение в графическую модель LCL==<br />
<br />
LCL предоставляет два вида классов рисования: нативные [(собственные)] классы и не-нативные [(сторонние)] классы. Нативные графические классы являются наиболее традиционным способом рисования графики в LCL, а также являются наиболее важными, в то время как не-нативные классы являются дополнительными, но также очень важными. Собственные классы в основном расположены в модуле '''Graphics''' LCL и являются хорошо известными классами: TBitmap, TCanvas, TFont, TBrush, TPen, TPortableNetworkGraphic и т.д.<br />
<br />
TCanvas - это класс, способный выполнять рисование. Он не может существовать один и должен быть либо прикреплен к чему-то видимому (или, по крайней мере, который может быть видимым), например, к визуальному элементу управления, происходящему из TControl, либо должен быть присоединен к внеэкранному буферу потомка от TRasterImage (TBitmap является наиболее часто использующимся). TFont, TBrush и TPen описывают, как рисование различных операций будет выполняться в Canvas.<br />
<br />
TRasterImage (обычно используется через его потомка TBitmap) - это область памяти, зарезервированная для рисования графики, но она создана для максимальной совместимости с собственным Canvas и, следовательно, в LCL-Gtk2 в X11 она расположена на сервере X11, который обеспечивает попиксельный доступ через свойство Pixels чрезвычайно медленно. В Windows это очень быстро, потому что Windows позволяет создавать локально выделенное изображение, которое может получать рисунки из Windows Canvas.<br />
<br />
Помимо них существуют также не-нативные классы рисования, расположенные в графическом типе модулей (TRawImage), intfgraphics (TLazIntfImage) и lazcanvas (TLazCanvas, этот существует в Lazarus [с версии] 0.9.31+). TRawImage - это хранилище и описание области памяти, которая содержит изображение. TLazIntfImage - это изображение, которое присоединяется к TRawImage и обеспечивает преобразование между TFPColor и форматом настоящего пикселя TRawImage. TLazCanvas - это не нативный Canvas, который может рисовать изображение в TLazIntfImage.<br />
<br />
Основное различие между нативными и не-нативными классами состоит в том, что нативные классы не выполняются одинаково на всех платформах, потому что рисование выполняется самой базовой платформой. Скорость, а также точный конечный результат рисования изображения могут иметь различия. Не-нативные классы гарантированно выполняют одинаковое рисование на всех платформах с точностью до пикселя, и все они работают достаточно быстро на всех платформах.<br />
<br />
В наборе виджетов LCL-CustomDrawn нативные классы реализованы с использованием не-нативных классов.<br />
<br />
Все эти классы будут лучше описаны в разделах ниже.<br />
<br />
==Работа с TCanvas==<br />
=== Рисование прямоугольника ===<br />
Многие элементы управления, например TForm, TPanel или TPaintbox, отображают свой холст как общедоступное свойство или событие OnPaint. Давайте используем TForm в качестве примера, чтобы продемонстрировать, как рисовать на холсте. <br />
<br />
Предположим, мы хотим нарисовать красный прямоугольник с синей рамкой толщиной 5 пикселей в центре формы; размер прямоугольника должен составлять половину размера формы. Для этого мы должны добавить код в событие OnPaint формы. Не рисуйте в обработчике OnClick, потому что это рисование не является постоянным и будет стираться всякий раз, когда операционная система запрашивает перерисовку, всегда рисуйте в событии OnPaint!<br />
<br />
Метод TCanvas для рисования прямоугольника вызывается именно так: <tt>Rectangle()</tt>. Он получает координаты краев прямоугольника либо отдельно, либо в виде записи <tt>TRect</tt>. Цвет заливки определяется цветом кисти Холста, а цвет границы задается цветом пера холста:<br />
<syntaxhighlight>procedure TForm1.FormPaint(Sender: TObject);<br />
var<br />
w, h: Integer; // Ширина и высота прямоугольника<br />
cx, cy: Integer; // центр формы<br />
R: TRect; // запись, содержащая координаты левого, верхнего, правого, нижнего углов прямоугольника<br />
begin<br />
// Высчитываем центр формы<br />
cx := Width div 2;<br />
cy := Height div 2;<br />
<br />
// Рассчитываем размер прямоугольника<br />
w := Width div 2;<br />
h := Height div 2;<br />
<br />
// Рассчитываем углы прямоугольника<br />
R.Left := cx - w div 2;<br />
R.Top := cy - h div 2;<br />
R.Right := cx + w div 2;<br />
R.Bottom := cy + h div 2;<br />
<br />
// Устанавливаем цвет заливки<br />
Canvas.Brush.Color := clRed;<br />
Canvas.Brush.Style := bsSolid;<br />
<br />
// Устанавливаем цвет границы<br />
Canvas.Pen.Color := clBlue;<br />
Canvas.Pen.Width := 5;<br />
Canvas.Pen.Style := psSolid;<br />
<br />
// Рисуем прямоугольник<br />
Canvas.Rectangle(R);<br />
end;<br />
</syntaxhighlight><br />
<br />
===Использование шрифта GUI по умолчанию===<br />
<br />
Это можно сделать с помощью этого простого кода:<br />
<br />
<syntaxhighlight>SelectObject(Canvas.Handle, GetStockObject(DEFAULT_GUI_FONT));</syntaxhighlight><br />
<br />
===Рисование ограниченного по ширине текста===<br />
<br />
Используйте процедуру DrawText, сначала с DT_CALCRECT, а затем без него.<br />
<br />
<syntaxhighlight>// Сначала рассчитываем размер текста, затем рисуем его<br />
TextBox := Rect(0, currentPos.Y, Width, High(Integer));<br />
DrawText(ACanvas.Handle, PChar(Text), Length(Text), TextBox, DT_WORDBREAK or DT_INTERNAL or DT_CALCRECT);<br />
<br />
DrawText(ACanvas.Handle, PChar(Text), Length(Text), TextBox, DT_WORDBREAK or DT_INTERNAL);</syntaxhighlight><br />
<br />
===Рисование текста с резкими краями (без сглаживания)===<br />
<br />
Некоторые виджеты поддерживают это через<br />
<br />
<syntaxhighlight>Canvas.Font.Quality := fqNonAntialiased;</syntaxhighlight><br />
<br />
Некоторые виджеты, такие как gtk2, не поддерживают это и всегда рисуют сглаживание. Вот простая процедура рисования текста с резкими краями под gtk2. Она не предусматривает все случаи, но должна дать представление:<br />
<br />
<syntaxhighlight>procedure PaintAliased(Canvas: TCanvas; x,y: integer; const TheText: string);<br />
var<br />
w,h: integer;<br />
IntfImg: TLazIntfImage;<br />
Img: TBitmap;<br />
dy: Integer;<br />
dx: Integer;<br />
col: TFPColor;<br />
FontColor: TColor;<br />
c: TColor;<br />
begin<br />
w:=0;<br />
h:=0;<br />
Canvas.GetTextSize(TheText,w,h);<br />
if (w<=0) or (h<=0) then exit;<br />
Img:=TBitmap.Create;<br />
IntfImg:=nil;<br />
try<br />
// рисуем текст в растровое изображение<br />
Img.Masked:=true;<br />
Img.SetSize(w,h);<br />
Img.Canvas.Brush.Style:=bsSolid;<br />
Img.Canvas.Brush.Color:=clWhite;<br />
Img.Canvas.FillRect(0,0,w,h);<br />
Img.Canvas.Font:=Canvas.Font;<br />
Img.Canvas.TextOut(0,0,TheText);<br />
// получаем изображение в памяти<br />
IntfImg:=Img.CreateIntfImage;<br />
// заменяем серые пиксели<br />
FontColor:=ColorToRGB(Canvas.Font.Color);<br />
for dy:=0 to h-1 do begin<br />
for dx:=0 to w-1 do begin<br />
col:=IntfImg.Colors[dx,dy];<br />
c:=FPColorToTColor(col);<br />
if c<>FontColor then<br />
IntfImg.Colors[dx,dy]:=colTransparent;<br />
end;<br />
end;<br />
// создаем растровое изображение<br />
Img.LoadFromIntfImage(IntfImg);<br />
// рисуем<br />
Canvas.Draw(x,y,Img);<br />
finally<br />
IntfImg.Free;<br />
Img.Free;<br />
end;<br />
end;</syntaxhighlight><br />
<br />
==Работа с TBitmap и другими потомками TGraphic==<br />
<br />
Объект TBitmap хранит растровое изображение, где вы можете рисовать, прежде чем показывать его на экране. Когда вы создаете растровое изображение, вы должны указать высоту и ширину, иначе это будет ноль, и ничто не будет нарисовано. И вообще, все остальные потомки TRasterImage предоставляют те же возможности. Следует использовать тот, который соответствует формату, необходимому для вывода/ввода с диска или TBitmap, в случае, если операции с дисками не будут выполняться, а также для формата Windows Bitmap (*.bmp).<br />
<br />
===Загрузка/Сохранение изображения из/на диск===<br />
Чтобы загрузить изображение с диска, используйте [http://lazarus-ccr.sourceforge.net/docs/lcl/graphics/tgraphic.loadfromfile.html TGraphic.LoadFromFile] и для сохранения его на другом диске, используйте [http://lazarus-ccr.sourceforge.net/docs/lcl/graphics/tgraphic.savetofile.html TGraphic.SaveToFile]. Используйте соответствующий потомок TGraphic, который соответствует ожидаемому формату. См. [[Developing_with_Graphics/ru#Форматы изображений|форматы изображений]] для [просмотра] списка доступных классов формата изображения.<br />
<syntaxhighlight><br />
var<br />
MyBitmap: TBitmap;<br />
begin<br />
MyBitmap := TBitmap.Create;<br />
try<br />
// Загрузка с диска<br />
MyBitmap.LoadFromFile(MyEdit.Text);<br />
<br />
// Здесь вы можете использовать MyBitmap.Canvas для чтения/записи в/из изображения<br />
<br />
// Записываем обратно на другой диск<br />
MyBitmap.SaveToFile(MyEdit2.Text);<br />
finally<br />
MyBitmap.Free;<br />
end;<br />
end;</syntaxhighlight><br />
<br />
При использовании любого другого формата процесс полностью идентичен, просто используйте соответствующий класс. Например, для изображений PNG:<br />
<br />
<syntaxhighlight><br />
var<br />
MyPNG: TPortableNetworkGraphic;<br />
begin<br />
MyPNG := TPortableNetworkGraphic.Create;<br />
try<br />
// Загрузка с диска<br />
MyPNG.LoadFromFile(MyEdit.Text);<br />
<br />
// Здесь вы можете использовать MyPNG.Canvas для чтения/записи в/из изображения<br />
<br />
// Записываем обратно на другой диск<br />
MyPNG.SaveToFile(MyEdit2.Text);<br />
finally<br />
MyPNG.Free;<br />
end;<br />
end;</syntaxhighlight><br />
<br />
Если вы заранее не знаете формат изображения, используйте TPicture, который определит формат на основе расширения файла. Обратите внимание, что TPicture не поддерживает все форматы, поддерживаемые Lazarus, с Lazarus 0.9.31 он поддерживает BMP, PNG, JPEG, Pixmap и PNM, в то время как Lazarus также поддерживает ICNS и другие форматы:<br />
<br />
<syntaxhighlight><br />
var<br />
MyPicture: TPicture;<br />
begin<br />
MyPicture := TPicture.Create;<br />
try<br />
// Загрузка с диска<br />
MyPicture.LoadFromFile(MyEdit.Text);<br />
<br />
// Здесь вы можете использовать MyPicture.Graphic.Canvas для чтения/записи в/из изображения<br />
<br />
// Записываем обратно на другой диск<br />
MyPicture.SaveToFile(MyEdit2.Text);<br />
finally<br />
MyPicture.Free;<br />
end;<br />
end;</syntaxhighlight><br />
<br />
=== Дополнительные форматы файлов для TImage ===<br />
Вы можете добавить дополнительную поддержку форматов файлов, добавив модули [[fcl-image]] fpread* и/или fpwrite* в вашу секцию uses. Таким образом, вы можете, например, добавить поддержку TIFF для TImage<br />
<br />
===Прямой доступ к пикселям===<br />
Для непосредственного доступа к пикселям растровых изображений можно использовать внешние библиотеки, такие как [[BGRABitmap]], [[LazRGBGraphics]] и [[Current_conversion_projects/ru#Graphics32|Graphics32]], или использовать нативный Lazarus'овский TLazIntfImage. Сравнение методов доступа к пикселям см. [[Fast direct pixel access|fast direct pixel access]].<br />
<br />
В некоторых наборах виджетов Lazarus (в частности, LCL-Gtk2) данные растрового изображения не сохраняются в памяти, к которой может обращаться приложение, и в общем случае собственные интерфейсы LCL рисуются только через собственные процедуры Canvas, поэтому каждая операция SetPixel / GetPixel включает медленный вызов родного Canvas API. В LCL-CustomDrawn это не так, поскольку растровое изображение локально сохраняется для всех бэкэндов, а SetPixel / GetPixel работает быстро. Для получения решения, которое работает во всех наборах виджетов, следует использовать TLazIntfImage. Поскольку Lazarus должен быть независимым от платформы и работать в gtk2, класс TBitmap не предоставляет такое свойство, как Scanline. Существует функция GetDataLineStart, эквивалентная Scanline, но доступная только для образов памяти, таких как [[Developing_with_Graphics/ru#Работа с TLazIntfImage, TRawImage и TLazCanvas|TLazIntfImage]], которая внутренне использует TRawImage.<br />
<br />
Подводя итог, можно сказать, что со стандартным TBitmap вы можете только косвенно изменять пиксели, используя TCanvas.Pixels. Вызов собственного API для рисования / чтения отдельного пикселя, конечно, медленнее, чем прямой доступ к пикселям, особенно в LCL-gtk2 и LCL-Carbon.<br />
<br />
===Drawing color transparent bitmaps===<br />
<br />
Новая функция, реализованная в Lazarus 0.9.11, - это растровые изображения с прозрачными цветами. В растровых файлах (*.BMP) не может храниться информация о прозрачности, но они могут работать так же, как если бы вы выбрали цвет для представления прозрачной области. Это распространенный прием, используемый в приложениях Win32.<br />
<br />
В следующем примере загружается растровое изображение из ресурса Windows, выбирается прозрачный цвет (clFuchsia) и затем он рисуется на холсте.<br />
<br />
<syntaxhighlight>procedure MyForm.MyButtonOnClick(Sender: TObject);<br />
var<br />
buffer: THandle;<br />
bmp: TBitmap;<br />
memstream: TMemoryStream;<br />
begin<br />
bmp := TBitmap.Create;<br />
<br />
buffer := Windows.LoadBitmap(hInstance, MAKEINTRESOURCE(ResourceID));<br />
<br />
if (buffer = 0) then exit; // Ошибка загрузки растрового изображения<br />
<br />
bmp.Handle := buffer;<br />
memstream := TMemoryStream.create;<br />
try<br />
bmp.SaveToStream(memstream);<br />
memstream.position := 0;<br />
bmp.LoadFromStream(memstream);<br />
finally<br />
memstream.free;<br />
end;<br />
<br />
bmp.Transparent := True;<br />
bmp.TransparentColor := clFuchsia;<br />
<br />
MyCanvas.Draw(0, 0, bmp);<br />
<br />
bmp.Free; // Освобождаем выделенный ресурс<br />
end;</syntaxhighlight><br />
<br />
Обратите внимание на операции с памятью, выполненные с помощью [[doc:rtl/classes/tmemorystream.html|TMemoryStream]]. Они необходимы для обеспечения правильной загрузки изображения.<br />
<br />
===Taking a screenshot of the screen===<br />
<br />
Since Lazarus 0.9.16 you can use LCL to take screenshots of the screen on a cross-platform way. The following example code does it (works on gtk2 and win32, but not gtk1 currently):<br />
<br />
<syntaxhighlight>uses Graphics, LCLIntf, LCLType;<br />
<br />
...<br />
<br />
var<br />
MyBitmap: TBitmap;<br />
ScreenDC: HDC;<br />
begin<br />
MyBitmap := TBitmap.Create;<br />
ScreenDC := GetDC(0);<br />
MyBitmap.LoadFromDevice(ScreenDC);<br />
ReleaseDC(0,ScreenDC);<br />
<br />
...</syntaxhighlight><br />
<br />
==Работа с TLazIntfImage, TRawImage и TLazCanvas==<br />
<br />
TLazIntfImage is a non-native equivalent of TRasterImage (more commonly utilized in the form of it's descendent TBitmap). The first thing to be aware about this class is that unlike TBitmap it will not automatically allocate a memory area for the bitmap, one should first initialize a memory area and then give it to the TLazIntfImage. Right after creating a TLazIntfImage one should either connect it to a TRawImage or load it from a TBitmap.<br />
<br />
TRawImage is of the type object and therefore does not need to be created nor freed. It can either allocate the image memory itself when one calls TRawImage.CreateData or one can pass a memory block allocated for examply by a 3rd party library such as the Windows API of the Cocoa Framework from Mac OS X and pass the information of the image in TRawImage.Description, TRawImage.Data and TRawImage.DataSize. Instead of attaching it to a RawImage one could also load it from a TBitmap which will copy the data from the TBitmap and won't be syncronized with it afterwards. The TLazCanvas cannot exist alone and must always be attached to a TLazIntfImage.<br />
<br />
The example below shows how to choose a format for the data and ask the TRawImage to create it for us and then we attach it to a TLazIntfImage and then attach a TLazCanvas to it:<br />
<br />
<syntaxhighlight><br />
uses graphtype, intfgraphics, lazcanvas;<br />
<br />
var<br />
AImage: TLazIntfImage;<br />
ACanvas: TLazCanvas;<br />
lRawImage: TRawImage;<br />
begin<br />
lRawImage.Init;<br />
lRawImage.Description.Init_BPP32_A8R8G8B8_BIO_TTB(AWidth, AHeight);<br />
lRawImage.CreateData(True);<br />
AImage := TLazIntfImage.Create(0,0);<br />
AImage.SetRawImage(lRawImage);<br />
ACanvas := TLazCanvas.Create(AImage);<br />
</syntaxhighlight><br />
<br />
===Initializing a TLazIntfImage===<br />
<br />
One cannot simply create an instance of TLazIntfImage and start using it. It needs to add a storage to it. There are 3 ways to do this:<br />
<br />
1. Attach it to a TRawImage<br />
<br />
2. Load it from a TBitmap. Note that it will copy the memory of the TBitmap so it won't remain connected to it. <br />
<syntaxhighlight><br />
SrcIntfImg:=TLazIntfImage.Create(0,0);<br />
SrcIntfImg.LoadFromBitmap(ABitmap.Handle,ABitmap.MaskHandle);<br />
</syntaxhighlight><br />
<br />
3. Load it from a raw image description, like this:<br />
<br />
<syntaxhighlight><br />
IntfImg := TLazIntfImage.Create(0,0);<br />
IntfImg.DataDescription:=GetDescriptionFromDevice(0);<br />
IntfImg.SetSize(10,10);<br />
</syntaxhighlight><br />
<br />
The 0 device in '''GetDescriptionFromDevice(0)''' uses the current screen format.<br />
<br />
===TLazIntfImage.LoadFromFile===<br />
<br />
Here is an example how to load an image directly into a TLazIntfImage. It initializes the TLazIntfImage to a 32bit RGBA format. Keep in mind that this is probably not the native format of your screen.<br />
<br />
<syntaxhighlight><br />
uses LazLogger, Graphics, IntfGraphics, GraphType;<br />
procedure TForm1.FormCreate(Sender: TObject);<br />
var<br />
AImage: TLazIntfImage;<br />
lRawImage: TRawImage;<br />
begin<br />
// create a TLazIntfImage with 32 bits per pixel, alpha 8bit, red 8 bit, green 8bit, blue 8bit,<br />
// Bits In Order: bit 0 is pixel 0, Top To Bottom: line 0 is top<br />
lRawImage.Init;<br />
lRawImage.Description.Init_BPP32_A8R8G8B8_BIO_TTB(0,0);<br />
lRawImage.CreateData(false);<br />
AImage := TLazIntfImage.Create(0,0);<br />
try<br />
AImage.SetRawImage(lRawImage);<br />
// Load an image from disk.<br />
// It uses the file extension to select the right registered image reader.<br />
// The AImage will be resized to the width, height of the loaded image.<br />
AImage.LoadFromFile('lazarus/examples/openglcontrol/data/texture1.png');<br />
debugln(['TForm1.FormCreate ',AImage.Width,' ',AImage.Height]);<br />
finally<br />
AImage.Free;<br />
end;<br />
end;<br />
</syntaxhighlight><br />
<br />
===Loading a TLazIntfImage into a TImage===<br />
<br />
The pixel data of a '''TImage''' is the '''TImage.Picture''' property, which is of type ''TPicture''. '''TPicture''' is a multi format container containing one of several common image formats like Bitmap, Icon, Jpeg or PNG . Usually you will use the ''TPicture.Bitmap'' to load a '''TLazIntfImage''':<br />
<br />
<syntaxhighlight><br />
Image1.Picture.Bitmap.LoadFromIntfImage(IntfImg);<br />
</syntaxhighlight><br />
<br />
'''Notes:'''<br />
*To load a '''transparent''' TLazIntfImage you have to set the '''Image1.Transparent''' to true.<br />
*TImage uses the screen format. If the TLazIntfImage has a different format then the pixels will be converted. Hint: You can use '''IntfImg.DataDescription:=GetDescriptionFromDevice(0);''' to initialize the TLazIntfImage with the screen format.<br />
<br />
===Fading example===<br />
<br />
A fading example with TLazIntfImage<br />
<br />
<syntaxhighlight>{ This code has been taken from the $LazarusPath/examples/lazintfimage/fadein1.lpi project. }<br />
uses LCLType, // HBitmap type<br />
IntfGraphics, // TLazIntfImage type<br />
fpImage; // TFPColor type<br />
...<br />
procedure TForm1.FadeIn(ABitMap: TBitMap);<br />
var<br />
SrcIntfImg, TempIntfImg: TLazIntfImage;<br />
ImgHandle,ImgMaskHandle: HBitmap;<br />
FadeStep: Integer;<br />
px, py: Integer;<br />
CurColor: TFPColor;<br />
TempBitmap: TBitmap;<br />
begin<br />
SrcIntfImg:=TLazIntfImage.Create(0,0);<br />
SrcIntfImg.LoadFromBitmap(ABitmap.Handle,ABitmap.MaskHandle);<br />
TempIntfImg:=TLazIntfImage.Create(0,0);<br />
TempIntfImg.LoadFromBitmap(ABitmap.Handle,ABitmap.MaskHandle);<br />
TempBitmap:=TBitmap.Create;<br />
for FadeStep:=1 to 32 do begin<br />
for py:=0 to SrcIntfImg.Height-1 do begin<br />
for px:=0 to SrcIntfImg.Width-1 do begin<br />
CurColor:=SrcIntfImg.Colors[px,py];<br />
CurColor.Red:=(CurColor.Red*FadeStep) shr 5;<br />
CurColor.Green:=(CurColor.Green*FadeStep) shr 5;<br />
CurColor.Blue:=(CurColor.Blue*FadeStep) shr 5;<br />
TempIntfImg.Colors[px,py]:=CurColor;<br />
end;<br />
end;<br />
TempIntfImg.CreateBitmaps(ImgHandle,ImgMaskHandle,false);<br />
TempBitmap.Handle:=ImgHandle;<br />
TempBitmap.MaskHandle:=ImgMaskHandle;<br />
Canvas.Draw(0,0,TempBitmap);<br />
end;<br />
SrcIntfImg.Free;<br />
TempIntfImg.Free;<br />
TempBitmap.Free;<br />
end;</syntaxhighlight><br />
<br />
===Image format specific example===<br />
<br />
If you know that the TBitmap is using blue 8bit, green 8bit, red 8bit you can directly access the bytes, which is somewhat faster:<br />
<br />
<syntaxhighlight>uses LCLType, // HBitmap type<br />
IntfGraphics, // TLazIntfImage type<br />
fpImage; // TFPColor type<br />
...<br />
type<br />
TRGBTripleArray = array[0..32767] of TRGBTriple;<br />
PRGBTripleArray = ^TRGBTripleArray;<br />
<br />
procedure TForm1.FadeIn2(aBitMap: TBitMap);<br />
var<br />
IntfImg1, IntfImg2: TLazIntfImage;<br />
ImgHandle,ImgMaskHandle: HBitmap;<br />
FadeStep: Integer;<br />
px, py: Integer;<br />
CurColor: TFPColor;<br />
TempBitmap: TBitmap;<br />
Row1, Row2: PRGBTripleArray;<br />
begin<br />
IntfImg1:=TLazIntfImage.Create(0,0);<br />
IntfImg1.LoadFromBitmap(aBitmap.Handle,aBitmap.MaskHandle);<br />
<br />
IntfImg2:=TLazIntfImage.Create(0,0);<br />
IntfImg2.LoadFromBitmap(aBitmap.Handle,aBitmap.MaskHandle);<br />
<br />
TempBitmap:=TBitmap.Create;<br />
<br />
//with Scanline-like<br />
for FadeStep:=1 to 32 do begin<br />
for py:=0 to IntfImg1.Height-1 do begin<br />
Row1 := IntfImg1.GetDataLineStart(py); //like Delphi TBitMap.ScanLine<br />
Row2 := IntfImg2.GetDataLineStart(py); //like Delphi TBitMap.ScanLine<br />
for px:=0 to IntfImg1.Width-1 do begin<br />
Row2^[px].rgbtRed:= (FadeStep * Row1^[px].rgbtRed) shr 5;<br />
Row2^[px].rgbtGreen := (FadeStep * Row1^[px].rgbtGreen) shr 5; // Fading<br />
Row2^[px].rgbtBlue := (FadeStep * Row1^[px].rgbtBlue) shr 5;<br />
end;<br />
end;<br />
IntfImg2.CreateBitmaps(ImgHandle,ImgMaskHandle,false);<br />
<br />
TempBitmap.Handle:=ImgHandle;<br />
TempBitmap.MaskHandle:=ImgMaskHandle;<br />
Canvas.Draw(0,0,TempBitmap);<br />
end; <br />
<br />
IntfImg1.Free;<br />
IntfImg2.Free;<br />
TempBitmap.Free;<br />
end;</syntaxhighlight><br />
<br />
===Conversion between TLazIntfImage and TBitmap===<br />
<br />
Since Lazarus has no TBitmap.ScanLines property, the best way to access the pixels of an image in a fast way for both reading and writing is by using TLazIntfImage. The TBitmap can be converted to a TLazIntfImage by using TBitmap.CreateIntfImage() and after modifying the pixels it can be converted back to a TBitmap by using TBitmap.LoadFromIntfImage();<br />
Here's the sample on how to create TLazIntfImage from TBitmap, modify it and then go back to the TBitmap.<br />
<br />
<syntaxhighlight>uses<br />
...GraphType, IntfGraphics, LCLType, LCLProc, LCLIntf ...<br />
<br />
procedure TForm1.Button4Click(Sender: TObject);<br />
var<br />
b: TBitmap;<br />
t: TLazIntfImage;<br />
begin<br />
b := TBitmap.Create;<br />
try<br />
b.LoadFromFile('test.bmp');<br />
t := b.CreateIntfImage;<br />
<br />
// Read and/or write to the pixels<br />
t.Colors[10,20] := colGreen;<br />
<br />
b.LoadFromIntfImage(t);<br />
finally<br />
t.Free;<br />
b.Free;<br />
end;<br />
end;</syntaxhighlight><br />
<br />
===Using the non-native StretchDraw from LazCanvas===<br />
<br />
Just like TCanvas.StretchDraw there is TLazCanvas.StretchDraw but you need to specify the interpolation which you desire to use. The interpolation which provides a Windows-like StretchDraw with a very sharp result (the opposite of anti-aliased) can be added with: TLazCanvas.Interpolation := TFPSharpInterpolation.Create;<br />
<br />
There are other interpolations available in the unit fpcanvas.<br />
<br />
<syntaxhighlight><br />
uses intfgraphics, lazcanvas;<br />
<br />
procedure TForm1.StretchDrawBitmapToBitmap(SourceBitmap, DestBitmap: TBitmap; DestWidth, DestHeight: integer);<br />
var<br />
DestIntfImage, SourceIntfImage: TLazIntfImage;<br />
DestCanvas: TLazCanvas;<br />
begin<br />
// Prepare the destination<br />
<br />
DestIntfImage := TLazIntfImage.Create(0, 0);<br />
DestIntfImage.LoadFromBitmap(DestBitmap.Handle, 0);<br />
<br />
DestCanvas := TLazCanvas.Create(DestIntfImage);<br />
<br />
//Prepare the source<br />
SourceIntfImage := TLazIntfImage.Create(0, 0);<br />
SourceIntfImage.LoadFromBitmap(SourceBitmap.Handle, 0);<br />
<br />
// Execute the stretch draw via TFPSharpInterpolation<br />
DestCanvas.Interpolation := TFPSharpInterpolation.Create;<br />
DestCanvas.StretchDraw(0, 0, DestWidth, DestHeight, SourceIntfImage);<br />
<br />
// Reload the image into the TBitmap<br />
DestBitmap.LoadFromIntfImage(DestIntfImage);<br />
<br />
SourceIntfImage.Free;<br />
DestCanvas.Interpolation.Free; <br />
DestCanvas.Free;<br />
DestIntfImage.Free;<br />
end;<br />
<br />
procedure TForm1.FormPaint(Sender: TObject);<br />
var<br />
Bmp, DestBitmap: TBitmap;<br />
begin<br />
// Prepare the destination<br />
DestBitmap := TBitmap.Create;<br />
DestBitmap.Width := 100;<br />
DestBitmap.Height := 100;<br />
<br />
Bmp := TBitmap.Create;<br />
Bmp.Width := 10;<br />
Bmp.Height := 10;<br />
Bmp.Canvas.Pen.Color := clYellow;<br />
Bmp.Canvas.Brush.Color := clYellow;<br />
Bmp.Canvas.Rectangle(0, 0, 10, 10);<br />
StretchDrawBitmapToBitmap(Bmp, DestBitmap, 100, 100);<br />
Canvas.Draw(0, 0, Bmp);<br />
Canvas.Draw(100, 100, DestBitmap);<br />
end; <br />
</syntaxhighlight><br />
<br />
==Motion Graphics - How to Avoid flickering==<br />
<br />
Many programs draw their output to the GUI as 2D graphics. If those graphics need to change quickly you will soon face a problem: quickly changing graphics often flicker on the screen. This happens when users sometimes sees the whole images and sometimes only when it is partially drawn. It occurs because the painting process requires time.<br />
<br />
But how can I avoid the flickering and get the best drawing speed? Of course you could work with hardware acceleration using OpenGL, but this approach is quite heavy for small programs or old computers. This tutorial will focus on drawing to a TCanvas. If you need help with OpenGL, take a look at the example that comes with Lazarus. You can also use A.J. Venter's gamepack, which provides a double-buffered canvas and a sprite component.<br />
<br />
A brief and very helpful article on avoiding flicker can be found at http://delphi.about.com/library/bluc/text/uc052102g.htm. Although written for Delphi, the techniques work well with Lazarus.<br />
<br />
Now we will examine the options we have for drawing to a Canvas:<br />
* [[#Draw to a TImage|Draw to a TImage]]<br />
* [[#Draw on the OnPaint event|Draw on the OnPaint event of the form, a TPaintBox or another control]]<br />
* [[#Create a custom control which draws itself|Create a custom control which draws itself]]<br />
* [[#Using A.J. Venter's gamepack|Using A.J. Venter's gamepack]]<br />
<br />
===Draw to a TImage===<br />
<br />
A TImage consists of 2 parts: A TGraphic, usually a TBitmap, holding the persistent picture and the visual area, which is repainted on every OnPaint. Resizing the TImage does '''not''' resize the bitmap.<br />
The graphic (or bitmap) is accessible via Image1.Picture.Graphic (or Image1.Picture.Bitmap). The canvas is Image1.Picture.Bitmap.Canvas. <br />
The canvas of the visual area of a TImage is only accessible during Image1.OnPaint via Image1.Canvas.<br />
<br />
'''Important''': Never use the OnPaint of the Image1 event to draw to the graphic/bitmap of a TImage. The graphic of a TImage is buffered so all you need to do is draw to it from anywhere and the change is there forever. However, if you are constantly redrawing, the image will flicker. In this case you can try the other options. Drawing to a TImage is considered slower then the other approaches.<br />
<br />
====Resizing the bitmap of a TImage====<br />
<br />
{{Note| Do not use this during OnPaint.}}<br />
<br />
<syntaxhighlight>with Image1.Picture.Bitmap do begin<br />
Width:=100;<br />
Height:=120;<br />
end;</syntaxhighlight><br />
<br />
Same in one step:<br />
<br />
<syntaxhighlight>with Image1.Picture.Bitmap do begin<br />
SetSize(100, 120);<br />
end;</syntaxhighlight><br />
<br />
====Painting on the bitmap of a TImage====<br />
<br />
{{Note| Do not use this during OnPaint.}}<br />
<br />
<syntaxhighlight>with Image1.Picture.Bitmap.Canvas do begin<br />
// fill the entire bitmap with red<br />
Brush.Color := clRed;<br />
FillRect(0, 0, Width, Height);<br />
end;</syntaxhighlight><br />
<br />
{{Note| Inside of Image1.OnPaint the Image1.Canvas points to the volatile visible area. Outside of Image1.OnPaint the Image1.Canvas points to Image1.Picture.Bitmap.Canvas.}}<br />
<br />
Another example:<br />
<br />
<syntaxhighlight>procedure TForm1.BitBtn1Click(Sender: TObject);<br />
var<br />
x, y: Integer;<br />
begin<br />
// Draws the backgroung<br />
MyImage.Canvas.Pen.Color := clWhite;<br />
MyImage.Canvas.Rectangle(0, 0, Image.Width, Image.Height);<br />
<br />
// Draws squares<br />
MyImage.Canvas.Pen.Color := clBlack;<br />
for x := 1 to 8 do<br />
for y := 1 to 8 do<br />
MyImage.Canvas.Rectangle(Round((x - 1) * Image.Width / 8), Round((y - 1) * Image.Height / 8),<br />
Round(x * Image.Width / 8), Round(y * Image.Height / 8));<br />
end;</syntaxhighlight><br />
<br />
==== Painting on the volatile visual area of the TImage====<br />
<br />
You can only paint on this area during OnPaint. OnPaint is eventually called automatically by the LCL when the area was invalidated. You can invalidate the area manually with Image1.Invalidate. This will not immediately call OnPaint and you can call Invalidate as many times as you want.<br />
<br />
<syntaxhighlight>procedure TForm.Image1Paint(Sender: TObject);<br />
begin<br />
// paint a line<br />
Canvas.Pen.Color := clRed;<br />
Canvas.Line(0, 0, Width, Height);<br />
end;</syntaxhighlight><br />
<br />
===Draw on the OnPaint event===<br />
<br />
In this case all the drawing has to be done on the OnPaint event of the form, or of another control. The drawing isn't buffered like in the TImage, and it needs to be fully redrawn in each call of the OnPaint event handler.<br />
<br />
<syntaxhighlight>procedure TForm.Form1Paint(Sender: TObject);<br />
begin<br />
// paint a line<br />
Canvas.Pen.Color := clRed;<br />
Canvas.Line(0, 0, Width, Height);<br />
end;</syntaxhighlight><br />
<br />
===Create a custom control which draws itself===<br />
Creating a custom control has the advantage of structuring your code and you can reuse the control. This approach is very fast, but it can still generate flickering if you don't draw to a TBitmap first and then draw to the canvas. On this case there is no need to use the OnPaint event of the control.<br />
<br />
Here is an example custom control:<br />
<br />
<syntaxhighlight>uses<br />
Classes, SysUtils, Controls, Graphics, LCLType;<br />
<br />
type<br />
TMyDrawingControl = class(TCustomControl)<br />
public<br />
procedure EraseBackground(DC: HDC); override;<br />
procedure Paint; override;<br />
end;<br />
<br />
implementation<br />
<br />
procedure TMyDrawingControl.EraseBackground(DC: HDC);<br />
begin<br />
// Uncomment this to enable default background erasing<br />
//inherited EraseBackground(DC);<br />
end; <br />
<br />
procedure TMyDrawingControl.Paint;<br />
var<br />
x, y: Integer;<br />
Bitmap: TBitmap;<br />
begin<br />
Bitmap := TBitmap.Create;<br />
try<br />
// Initializes the Bitmap Size<br />
Bitmap.Height := Height;<br />
Bitmap.Width := Width;<br />
<br />
// Draws the background<br />
Bitmap.Canvas.Pen.Color := clWhite;<br />
Bitmap.Canvas.Rectangle(0, 0, Width, Height);<br />
<br />
// Draws squares<br />
Bitmap.Canvas.Pen.Color := clBlack;<br />
for x := 1 to 8 do<br />
for y := 1 to 8 do<br />
Bitmap.Canvas.Rectangle(Round((x - 1) * Width / 8), Round((y - 1) * Height / 8),<br />
Round(x * Width / 8), Round(y * Height / 8));<br />
<br />
Canvas.Draw(0, 0, Bitmap);<br />
finally<br />
Bitmap.Free;<br />
end;<br />
<br />
inherited Paint;<br />
end;</syntaxhighlight><br />
<br />
and how we create it on the form:<br />
<syntaxhighlight>procedure TMyForm.FormCreate(Sender: TObject);<br />
begin<br />
MyDrawingControl := TMyDrawingControl.Create(Self);<br />
MyDrawingControl.Height := 400;<br />
MyDrawingControl.Width := 500;<br />
MyDrawingControl.Top := 0;<br />
MyDrawingControl.Left := 0;<br />
MyDrawingControl.Parent := Self;<br />
MyDrawingControl.DoubleBuffered := True;<br />
end;</syntaxhighlight><br />
<br />
It is destroyed automatically, because we use Self as owner.<br />
<br />
Setting Top and Left to zero is not necessary, since this is the standard position, but is done so to reinforce where the control will be put.<br />
<br />
"MyDrawingControl.Parent := Self;" is very important and you won't see your control if you don't do so.<br />
<br />
"MyDrawingControl.DoubleBuffered := True;" is required to avoid flickering on Windows. It has no effect on gtk.<br />
<br />
== Форматы изображений ==<br />
<br />
Here is a table with the correct class to use for each image format.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Format !! Image class !! Unit<br />
|-<br />
|Cursor (cur)||TCursor||Graphics<br />
|-<br />
|Bitmap (bmp)||TBitmap||Graphics<br />
|-<br />
|Windows icon (ico)||TIcon||Graphics<br />
|-<br />
|Mac OS X icon (icns)||TicnsIcon||Graphics<br />
|-<br />
|Pixmap (xpm)||TPixmap||Graphics<br />
|-<br />
|Portable Network Graphic (png)||TPortableNetworkGraphic||Graphics<br />
|-<br />
|JPEG (jpg, jpeg)||TJpegImage||Graphics<br />
|-<br />
|PNM (pnm)||TPortableAnyMapGraphic||Graphics<br />
|-<br />
|Tiff (tif)||TTiffImage||Graphics<br />
|}<br />
<br />
See also the list of [[fcl-image#Image_formats|fcl-image supported formats]].<br />
<br />
=== Converting formats ===<br />
Sometimes it must be necessary to convert one graphic type to another.<br />
One of the ways is to convert a graphic to intermediate format, and then convert it to TBitmap.<br />
Most of the formats can create an image from TBitmap.<br />
<br />
Converting Bitmap to PNG and saving it to a file:<br />
<br />
<syntaxhighlight>procedure SaveToPng(const bmp: TBitmap; PngFileName: String);<br />
var<br />
png : TPortableNetworkGraphic; <br />
begin <br />
png := TPortableNetworkGraphic.Create;<br />
try<br />
png.Assign(bmp);<br />
png.SaveToFile(PngFileName);<br />
finally <br />
png.Free;<br />
end;<br />
end;</syntaxhighlight><br />
<br />
==Pixel Formats==<br />
<br />
===TColor===<br />
<br />
The internal pixel format for TColor in the LCL is the XXBBGGRR format, which matches the native Windows format and is opposite to most other libraries, which use AARRGGBB. The XX part is used to identify if the color is a fixed color, which case XX should be 00 or if it is an index to a system color. There is no space reserved for an alpha channel.<br />
<br />
To convert from separate RGB channels to TColor use:<br />
<br />
<syntaxhighlight>RGBToColor(RedVal, GreenVal, BlueVal);</syntaxhighlight><br />
<br />
To get each channel of a TColor variable use the Red, Green and Blue functions:<br />
<br />
<syntaxhighlight>RedVal := Red(MyColor);<br />
GreenVal := Green(MyColor);<br />
BlueVal := Blue(MyColor);</syntaxhighlight><br />
<br />
===TFPColor===<br />
<br />
TFPColor uses the AARRGGBB format common to most libraries, but it uses 16-bits for the depth of each color channel, totaling 64-bits per pixel, which is unusual. This does not necessarily mean that images will consume that much memory, however. Images created using TRawImage+TLazIntfImage can have any internal storage format and then on drawing operations TFPColor is converted to this internal format.<br />
<br />
The unit Graphics provides routines to convert between TColor and TFPColor:<br />
<br />
<syntaxhighlight><br />
function FPColorToTColorRef(const FPColor: TFPColor): TColorRef;<br />
function FPColorToTColor(const FPColor: TFPColor): TColor;<br />
function TColorToFPColor(const c: TColorRef): TFPColor; overload;<br />
function TColorToFPColor(const c: TColor): TFPColor; overload; // does not work on system color<br />
</syntaxhighlight><br />
<br />
==Drawing with fcl-image==<br />
<br />
You can draw images which won't be displayed in the screen without the LCL, by just using fcl-image directly. For example a program running on a webserver without X11 could benefit from not having a visual library as a dependency. FPImage (alias fcl-image) is a very generic image and drawing library written completely in pascal. In fact the LCL uses FPImage too for all the loading and saving from/to files and implements the drawing function through calls to the widgetset (winapi, gtk, carbon, ...). Fcl-image on the other hand also has drawing routines.<br />
<br />
For more information, please read the article about [[fcl-image]].<br />
<br />
==Common OnPaint Error==<br />
<br />
A common error that causes many false bug reports is to call an Onpaint event for one object from another object. When using the LCL, this may work in GTK2 and Windows but will probably fail with Qt, Carbon and Cocoa. It is not normally necessary to call Invalidate. However, it may sometimes be needed in the Button1Click procedure,<br />
<br />
This is bad:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
Shape1Paint(Self); // Call Shape1Onpaint event<br />
Shape1.Invalidate; // Invoke actual painting<br />
<br />
... more code for Button1 ... <br />
end;<br />
</syntaxhighlight><br />
<br />
This is good:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
... code for Button1 ... <br />
Set some condition; <br />
// Shape1.Invalidate; // May be necessary on some occasions<br />
end;<br />
<br />
// Shape1Paint should be attached to the OnPaint event of shape object !<br />
procedure TForm1.Shape1Paint(Sender: TObject);<br />
var<br />
Myrect: TRect;<br />
begin <br />
if some condition then <br />
with Shape1.Canvas do<br />
begin<br />
... lots of stuff ...<br />
end;<br />
end; <br />
</syntaxhighlight><br />
<br />
==Some useful examples==<br />
===Example 1: Drawing on loaded JPEG with TImage===<br />
Add procedure LoadAndDraw to the public section of your form, and paste next code to implemantation section:<br />
<syntaxhighlight><br />
procedure TForm1.LoadAndDraw(const sFileName: String);<br />
var <br />
jpg: TPicture;<br />
begin<br />
jpg := TPicture.Create;<br />
try<br />
jpg.LoadFromFile(sFileName);<br />
<br />
Image.Picture.Bitmap.SetSize(jpg.Width, jpg.Height);<br />
Image.Picture.Bitmap.Canvas.Draw(0, 0, jpg.Bitmap);<br />
<br />
Image.Picture.Bitmap.Canvas.Pen.Color := clRed;<br />
Image.Picture.Bitmap.Canvas.Line(0, 0, 140, 140);<br />
finally<br />
jpg.Free;<br />
end;<br />
end;<br />
</syntaxhighlight><br />
<br />
===Example 2: Drawing on controls of Form===<br />
<br />
1) Create a New project - Application, add to uses section next modules if needed: Types, Controls, Graphics.<br />
<br />
2) Place on form Button1, GroupBox1 and RadioGroup1<br />
<br />
3) Place on GroupBox1 one more button - Button2<br />
<br />
4) Your TForm1.Create should looks like:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormCreate(Sender: TObject);<br />
var<br />
i: Integer;<br />
begin<br />
for i := 0 to Self.ControlCount - 1 do<br />
RadioGroup1.Items.AddObject(Controls[i].Name, Controls[i]);<br />
<br />
RadioGroup1.Items.AddObject(Button2.Name,Button2);<br />
end;<br />
</syntaxhighlight><br />
<br />
5) For RadioGroup1 create handler of OnSelectionChanged event:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.RadioGroup1SelectionChanged(Sender: TObject);<br />
begin<br />
Self.Repaint;<br />
end; <br />
</syntaxhighlight><br />
<br />
6) Add to public section of your form procedure HighlightControl:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.HighlightControl(AControl: TControl);<br />
var<br />
R: Types.TRect;<br />
aCC: TControlCanvas;<br />
begin<br />
R := AControl.BoundsRect;<br />
InflateRect(R, 2, 2); // make rect a bit bigger then control<br />
aCC := TControlCanvas.Create;<br />
aCC.Control := AControl.Parent;<br />
aCC.Pen.Color := clGreen;<br />
aCC.Pen.Width := 5;<br />
aCC.Pen.Style := psSolid;<br />
aCC.Brush.Style := bsClear;<br />
aCC.Rectangle(R);<br />
aCC.free;<br />
end;<br />
</syntaxhighlight><br />
<br />
==See also==<br />
* [[Fast direct pixel access]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Lazarus_Custom_Drawn_Controls/ru&diff=121574
Lazarus Custom Drawn Controls/ru
2018-12-09T19:29:37Z
<p>Useroflazarus: </p>
<hr />
<div>{{Translate}}<br />
<br />
'''Lazarus Custom Drawn Controls''' это набор элементов управления, эквивалентный стандартным элементам управления Lazarus, но для самостоятельного рисования. Они могут иметь множество применений, включая: возможность полностью настроить прорисовку, возможность одинаково выглядеть на разных платформах, а также более высокую согласованность поведения.<br />
<br />
Этот набор элементов управления разделен на две части:<br />
* настраиваемые элементы управления, необходимые для реализации наборов виджетов Lazarus и расположенные в модуле lazarus/lcl/customdrawncontrols.pas. Здесь их определения.<br />
* все другие пользовательские элементы управления, которые используются часто, но не являются необходимыми для реализации набора пользовательских элементов управления LCL. Те находятся в пакете lazarus/components/customdrawn. Они описаны на странице [[Lazarus Custom Drawn Package]]<br />
<br />
__TOC__<br />
<br />
==Как начать использовать эти компоненты?==<br />
<br />
Чтобы использовать их в конструкторе графического интерфейса Lazarus, установите пакет lazarus/components/customdrawn.lpk<br />
<br />
Чтобы создавать компоненты '''customdrawn''' используя код, можно просто добавить '''customdrawncontrols''', '''customdrawndrawers''' и '''customdrawn_common''' в раздел '''uses''', чтобы объявить и использовать их. Обратите внимание, что в настоящее время в LCL находится Drawer (прорисовщик интерфейса) только для Win2000, поэтому любые другие Drawer'а необходимо получить из пакета customdrawn.lpk<br />
<br />
Важно отметить, что стили доступны только в том случае, если вы добавляете объявление соответствующего модуля стиля в раздел '''uses'''.<br />
<br />
==Как работают эти компоненты?==<br />
<br />
Базовые методы программирования, используемые этим набором элементов управления, объясняется на [[Developing with Graphics#Create a custom control which draws itself]] странице.<br />
<br />
Код самого элемента управления реализован в модуле customdrawncontrols.pas, но этот модуль совсем не имеет кода для рисования. Customdrawncontrols.pas предоставляет код, который обрабатывает все события клавиатуры и мыши элемента управления, реализуя все действия мыши и реакции на нажатия клавиш. Каждый экземпляр элемента управления имеет связанный с ним Drawer. Drawer в нашем представлении (экземпляр класса TCDDrawer) похож на движок рендеринга или нечто подобное. Модуль '''customdrawndrawers.pas''' управляет списком всех известных Drawer'ов, а также объявляет все основные типы данных, необходимые для State и StateEx. Эти свойства содержат всю информацию о текущем состоянии элемента управления, которая передается в Drawer, чтобы он имел информацию, необходимую для правильного рисования элемента управления.<br />
В программе может существовать только один экземпляр каждого Drawer'а, и все элементы управления ссылаются на этот единственный экземпляр через менеджер в customdrawndrawers.pas. Каждый элемент управления имеет свойство DrawStyle, которое позволяет вам выбрать (из перечисляемого типа), какой стиль рисования использовать, а затем customdrawndrawers.pas преобразует эту информацию в экземпляр Drawer. Вы можете указать dsDefault DrawStyle, который затем будет использовать стиль, указанный в глобальной переменной DefaultStyle. Это было сделано для одновременного изменения стиля всех элементов управления. Просто измените эту глобальную переменную и затем вызовите Invalidate для элементов управления. Ниже вы можете увидеть фрагмент кода из customdrawndrawers.pas, который показывает методы, которые были представлены для управления списком Drawer'ов, а также стиль по умолчанию:<br />
<br />
<syntaxhighlight><br />
unit customdrawndrawers;<br />
//...<br />
TCDDrawStyle = (<br />
// Значение по умолчанию задается глобальной переменной DefaultStyle<br />
// Не использовать ничего для этого Drawer<br />
dsDefault = 0,<br />
// Это общий Drawer, основа для всех остальных. Он реализует вид от dsWin2000<br />
dsCommon,<br />
// Стили операционный систем<br />
dsWinCE, dsWin2000, dsWinXP,<br />
dsKDEPlastique, dsGNOME, dsMacOSX,<br />
dsAndroid,<br />
// Другие специальные стили для пользователя<br />
dsExtra1, dsExtra2, dsExtra3, dsExtra4, dsExtra5,<br />
dsExtra6, dsExtra7, dsExtra8, dsExtra9, dsExtra10<br />
);<br />
//...<br />
procedure RegisterDrawer(ADrawer: TCDDrawer; AStyle: TCDDrawStyle);<br />
function GetDefaultDrawer: TCDDrawer;<br />
function GetDrawer(AStyle: TCDDrawStyle): TCDDrawer;<br />
<br />
var<br />
DefaultStyle: TCDDrawStyle = dsCommon; // В начале по умолчанию стандартный, позже для каждой платформы<br />
</syntaxhighlight><br />
<br />
Each Drawer class has methods to draw all controls and also all available primitives. All new drawers created by users should inherit from the class TCDCommonDrawer (which is the basic common drawer declared in the unit customdrawn_common.pas). If you don't inherit from TCDCommonDrawer your application might crash if it hits an abstract method. This is the most complete drawer, which implements all abstract methods from its base class, so inheriting from it guarantees that there will never be crashes owing to methods you have not yet implemented. Other drawers can override the desired methods to change the drawing style.<br />
<br />
The dsCommon drawer uses only TCanvas for all its rendering, but other themes might also use TLazIntfImage and TFPImageCanvas instead, in order to have a faster pixel access. This programming technique is described in [[Developing with Graphics#Working with TLazIntfImage]].<br />
<br />
===Color Palette===<br />
<br />
Drawers have also access to a color Palette, which has the usual LCL system colors. Default drawers will load their colors from the operating system via the LCL acording to the native platform. However, outside their native platform, drawers will use a standard color palette.<br />
<br />
<syntaxhighlight><br />
TCDColorPalette = class<br />
public<br />
ScrollBar, Background, ActiveCaption, InactiveCaption,<br />
Menu, Window, WindowFrame, MenuText, WindowText, CaptionText,<br />
ActiveBorder, InactiveBorder, AppWorkspace, Highlight, HighlightText,<br />
BtnFace, BtnShadow, GrayText, BtnText, InactiveCaptionText,<br />
BtnHighlight, color3DDkShadow, color3DLight, InfoText, InfoBk,<br />
//<br />
HotLight, GradientActiveCaption, GradientInactiveCaption,<br />
MenuHighlight, MenuBar, Form: TColor;<br />
end;<br />
<br />
{ There are 5 possible sources of input for color palettes:<br />
palDefault - Uses palNative when the operating system matches the drawer style,<br />
palFallback otherwise<br />
palNative - Obtain from the operating system<br />
palFallback - Use the fallback colors of the drawer<br />
palUserConfig-Load it from the user configuration files, ToDo<br />
palCustom - The user application has set its own palette<br />
}<br />
TCDPaletteKind = (palDefault, palNative, palFallback, palUserConfig, palCustom);<br />
<br />
{ TCDDrawer }<br />
<br />
TCDDrawer = class<br />
protected<br />
public<br />
Palette: TCDColorPalette;<br />
constructor Create; virtual;<br />
destructor Destroy; override;<br />
procedure SetPaletteKind(APaletteKind: TCDPaletteKind);<br />
procedure LoadNativePaletteColors;<br />
procedure LoadFallbackPaletteColors; virtual;<br />
</syntaxhighlight><br />
<br />
As the code above shows, you can choose where the colors should come from - either from the operating system current theme, from the drawer's default, or from a user-defined scheme provided by your application. This allows you to change all yor application's colors at runtime simply by changing the palette.<br />
<br />
==The Drawers==<br />
<br />
===dsCommon===<br />
<br />
This is the base drawer for all others and it implements a Win2000-look with some small improvements, like better focus drawings on controls<br />
<br />
===dsWinCE===<br />
<br />
Imitates the Windows CE look, with some small improvements like better focus drawings on controls<br />
<br />
===dsWin2000===<br />
<br />
Imitates the Windows 2000 look. Since dsCommon provides the Windows 2000 look already, this class implements no methods at all<br />
<br />
===dsWinXP===<br />
<br />
Imitates the Windows XP look<br />
<br />
===dsKDEPlastique===<br />
<br />
Imitates the look of the Plastique Qt/KDE Theme<br />
<br />
===dsAndroid===<br />
<br />
Imitates the Android look<br />
<br />
===dsWindows7===<br />
<br />
[[File:customdrawnwindows7.png]]<br />
<br />
Imitates the Windows 7 look, and also can be used to imitate Windows XP and Windows 8 look, and most msstyles or Windows skins. Currently is available only with BGRABitmap graphic library, and you can get this drawer in the BGRAControls package: [[BGRAControls]]<br />
<br />
You can try to get this working if you convert the slicescaling.pas unit. The technique used to draw the images is 9-slice scaling.<br />
<br />
Some working code to create 9-slice scaling is available here:<br />
http://sourceforge.net/p/bmpthemeutils/home/Home/<br />
<br />
==Controls which imitate the Standard Palette==<br />
<br />
===TCDButton===<br />
<br />
This is a fully custom drawn button.<br />
<br />
Usage example:<br />
<br />
<syntaxhighlight><br />
uses customdrawnextras;<br />
<br />
procedure TForm1.FormCreate(Sender: TObject);<br />
var<br />
MyButton: TCDButton;<br />
begin<br />
MyButton := TCDButton.Create(Self);<br />
MyButton.Parent := Self;<br />
MyButton.DrawStyle := dsWin2000;<br />
MyButton.Left := 100;<br />
MyButton.Top := 100;<br />
MyButton.Width := 200;<br />
MyButton.Height := 50;<br />
MyButton.Caption := 'My Button';<br />
MyButton.Color := clRed;<br />
MyButton.OnClick := @HandleButtonClick;<br />
end;<br />
</syntaxhighlight><br />
<br />
[[Image:Custom_drawn_buttons.png]]<br />
<br />
===TCDEdit===<br />
<br />
This is a fully custom drawn edit control.<br />
<br />
[[Image:TCDEdit.png]]<br />
<br />
===TCDCheckBox===<br />
<br />
This is a fully custom drawn check box.<br />
<br />
[[Image:TCDCheckBox.png]]<br />
<br />
===TCDRadioButton===<br />
<br />
[[Image:TCDRadioButton.png]]<br />
<br />
===TCDScrollBar===<br />
<br />
[[Image:TCDScrollBar.png]]<br />
<br />
===TCDGroupBox===<br />
<br />
This is a fully custom drawn group box.<br />
<br />
[[Image:TCDGroupBox.png]]<br />
<br />
==Controls which imitate the Additional Palette==<br />
<br />
===TCDStaticText===<br />
<br />
==Controls which imitate the Common Controls Palette==<br />
<br />
===TCDTrackBar===<br />
<br />
A substitute for TTrackBar<br />
<br />
[[Image:TCDTrackBar.png]]<br />
<br />
===TCDProgressBar===<br />
<br />
[[Image:TCDProgressBar.png]]<br />
<br />
===TCDListView===<br />
<br />
Under construction.<br />
<br />
===TCDTabControl===<br />
<br />
A substitute for TTabControl<br />
<br />
===TCDPageControl===<br />
<br />
A substitute for TPageControl<br />
<br />
[[Image:TCDPageControl.png]]<br />
<br />
==Custom Drawn Packages==<br />
<br />
Moved here: [[Lazarus Custom Drawn Package]]<br />
<br />
==Other good custom drawn components for Lazarus==<br />
<br />
* [[VirtualTreeview]]<br />
* [[ATTabs]]<br />
* [[ATStatusBar]]<br />
* [[ATScrollBar]]<br />
<br />
==Maintainers==<br />
<br />
* [[User:Sekelsenmat|Felipe Monteiro de Carvalho]]<br />
* JiXian Yang<br />
<br />
== See Also ==<br />
<br />
*[[Lazarus Components Directory]]<br />
*[[Lazarus Custom Drawn Package]]<br />
*[[Custom Drawn Interface]]<br />
<br />
[[Category:Components]]<br />
[[Category:Custom Drawn]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Lazarus_Custom_Drawn_Controls&diff=121573
Lazarus Custom Drawn Controls
2018-12-09T19:29:16Z
<p>Useroflazarus: </p>
<hr />
<div>{{Translate}}<br />
<br />
The '''Lazarus Custom Drawn Controls''' are a set of controls equivalent to the standard Lazarus controls, but which draw themselves. They can have many uses, including the ability to fully customize the drawing, the ability to have exactly the same look in different platforms and also a higher consistency of behavior.<br />
<br />
This set of controls is divided into two parts:<br />
* the custom drawn controls which are necessary for implementing Lazarus widgetsets and are located in the unit lazarus/lcl/customdrawncontrols.pas. These are described here.<br />
* all other custom drawn controls, which are used often, but aren't indispensable to implement a LCL custom drawn widgetset. Those are located in the package lazarus/components/customdrawn. These are described in the page [[Lazarus Custom Drawn Package]]<br />
<br />
__TOC__<br />
<br />
==How start using these components?==<br />
<br />
To be able to use them in the Lazarus GUI designer install the package lazarus/components/customdrawn.lpk<br />
<br />
To only create customdrawn components by code one can simply add customdrawncontrols, customdrawndrawers and customdrawn_common to the uses clause, declare them and use them. Note that currently only the Win2000 drawer is in the LCL, so any other drawers need to be obtained from the package customdrawn.lpk<br />
<br />
It is important to note that styles are only available if you add the corresponding unit of the style to the uses clause.<br />
<br />
==How do these components work?==<br />
<br />
The basic programming technique utilized by this set of controls is explained at the [[Developing with Graphics#Create a custom control which draws itself]] page.<br />
<br />
The code of the controls itself is implemented in the unit customdrawncontrols.pas, but this unit has no drawing code at all. Customdrawncontrols.pas provides the code which processes all the control's keyboard and mouse events, implementing all the mouse and key response behaviour. Each control instance has a Drawer connected to it. A Drawer in our nomenclature (an instance of the TCDDrawer class) is similar to a theme rendering engine or suchlike. The unit customdrawndrawers.pas manages the list of all known drawers and it also declares all the basic data types needed for State and StateEx. These properties contain all the information about the control's current state, which is passed to the drawer so that it can have the information it requires to draw the control correctly.<br />
Only one instance of each drawer can exist in a program, and all controls refer to that single instance through the drawer's manager in customdrawndrawers.pas. Each control has a property called DrawStyle which allows you to choose (from an enumerated type) which draw style to use, and then customdrawndrawers.pas converts this information into a Drawer instance. You can specify the dsDefault DrawStyle which will then use the style specified in the global variable DefaultStyle. This was done to allow the style of all controls to be changed at once. Simply change this global variable and then call Invalidate on the controls. You can see below a code snippet from customdrawndrawers.pas which shows the methods which have been exposed to manage the list of drawers and also the Default style:<br />
<br />
<syntaxhighlight><br />
unit customdrawndrawers;<br />
//...<br />
TCDDrawStyle = (<br />
// The default is given by the DefaultStyle global variable<br />
// Don't implement anything for this drawer<br />
dsDefault = 0,<br />
// This is a common drawer, the base for all others. It implements the look from dsWin2000<br />
dsCommon,<br />
// Operating system styles<br />
dsWinCE, dsWin2000, dsWinXP,<br />
dsKDEPlastique, dsGNOME, dsMacOSX,<br />
dsAndroid,<br />
// Other special styles for the user<br />
dsExtra1, dsExtra2, dsExtra3, dsExtra4, dsExtra5,<br />
dsExtra6, dsExtra7, dsExtra8, dsExtra9, dsExtra10<br />
);<br />
//...<br />
procedure RegisterDrawer(ADrawer: TCDDrawer; AStyle: TCDDrawStyle);<br />
function GetDefaultDrawer: TCDDrawer;<br />
function GetDrawer(AStyle: TCDDrawStyle): TCDDrawer;<br />
<br />
var<br />
DefaultStyle: TCDDrawStyle = dsCommon; // For now default to the most complete one, later per platform<br />
</syntaxhighlight><br />
<br />
Each Drawer class has methods to draw all controls and also all available primitives. All new drawers created by users should inherit from the class TCDCommonDrawer (which is the basic common drawer declared in the unit customdrawn_common.pas). If you don't inherit from TCDCommonDrawer your application might crash if it hits an abstract method. This is the most complete drawer, which implements all abstract methods from its base class, so inheriting from it guarantees that there will never be crashes owing to methods you have not yet implemented. Other drawers can override the desired methods to change the drawing style.<br />
<br />
The dsCommon drawer uses only TCanvas for all its rendering, but other themes might also use TLazIntfImage and TFPImageCanvas instead, in order to have a faster pixel access. This programming technique is described in [[Developing with Graphics#Working with TLazIntfImage]].<br />
<br />
===Color Palette===<br />
<br />
Drawers have also access to a color Palette, which has the usual LCL system colors. Default drawers will load their colors from the operating system via the LCL acording to the native platform. However, outside their native platform, drawers will use a standard color palette.<br />
<br />
<syntaxhighlight><br />
TCDColorPalette = class<br />
public<br />
ScrollBar, Background, ActiveCaption, InactiveCaption,<br />
Menu, Window, WindowFrame, MenuText, WindowText, CaptionText,<br />
ActiveBorder, InactiveBorder, AppWorkspace, Highlight, HighlightText,<br />
BtnFace, BtnShadow, GrayText, BtnText, InactiveCaptionText,<br />
BtnHighlight, color3DDkShadow, color3DLight, InfoText, InfoBk,<br />
//<br />
HotLight, GradientActiveCaption, GradientInactiveCaption,<br />
MenuHighlight, MenuBar, Form: TColor;<br />
end;<br />
<br />
{ There are 5 possible sources of input for color palettes:<br />
palDefault - Uses palNative when the operating system matches the drawer style,<br />
palFallback otherwise<br />
palNative - Obtain from the operating system<br />
palFallback - Use the fallback colors of the drawer<br />
palUserConfig-Load it from the user configuration files, ToDo<br />
palCustom - The user application has set its own palette<br />
}<br />
TCDPaletteKind = (palDefault, palNative, palFallback, palUserConfig, palCustom);<br />
<br />
{ TCDDrawer }<br />
<br />
TCDDrawer = class<br />
protected<br />
public<br />
Palette: TCDColorPalette;<br />
constructor Create; virtual;<br />
destructor Destroy; override;<br />
procedure SetPaletteKind(APaletteKind: TCDPaletteKind);<br />
procedure LoadNativePaletteColors;<br />
procedure LoadFallbackPaletteColors; virtual;<br />
</syntaxhighlight><br />
<br />
As the code above shows, you can choose where the colors should come from - either from the operating system current theme, from the drawer's default, or from a user-defined scheme provided by your application. This allows you to change all yor application's colors at runtime simply by changing the palette.<br />
<br />
==The Drawers==<br />
<br />
===dsCommon===<br />
<br />
This is the base drawer for all others and it implements a Win2000-look with some small improvements, like better focus drawings on controls<br />
<br />
===dsWinCE===<br />
<br />
Imitates the Windows CE look, with some small improvements like better focus drawings on controls<br />
<br />
===dsWin2000===<br />
<br />
Imitates the Windows 2000 look. Since dsCommon provides the Windows 2000 look already, this class implements no methods at all<br />
<br />
===dsWinXP===<br />
<br />
Imitates the Windows XP look<br />
<br />
===dsKDEPlastique===<br />
<br />
Imitates the look of the Plastique Qt/KDE Theme<br />
<br />
===dsAndroid===<br />
<br />
Imitates the Android look<br />
<br />
===dsWindows7===<br />
<br />
[[File:customdrawnwindows7.png]]<br />
<br />
Imitates the Windows 7 look, and also can be used to imitate Windows XP and Windows 8 look, and most msstyles or Windows skins. Currently is available only with BGRABitmap graphic library, and you can get this drawer in the BGRAControls package: [[BGRAControls]]<br />
<br />
You can try to get this working if you convert the slicescaling.pas unit. The technique used to draw the images is 9-slice scaling.<br />
<br />
Some working code to create 9-slice scaling is available here:<br />
http://sourceforge.net/p/bmpthemeutils/home/Home/<br />
<br />
==Controls which imitate the Standard Palette==<br />
<br />
===TCDButton===<br />
<br />
This is a fully custom drawn button.<br />
<br />
Usage example:<br />
<br />
<syntaxhighlight><br />
uses customdrawnextras;<br />
<br />
procedure TForm1.FormCreate(Sender: TObject);<br />
var<br />
MyButton: TCDButton;<br />
begin<br />
MyButton := TCDButton.Create(Self);<br />
MyButton.Parent := Self;<br />
MyButton.DrawStyle := dsWin2000;<br />
MyButton.Left := 100;<br />
MyButton.Top := 100;<br />
MyButton.Width := 200;<br />
MyButton.Height := 50;<br />
MyButton.Caption := 'My Button';<br />
MyButton.Color := clRed;<br />
MyButton.OnClick := @HandleButtonClick;<br />
end;<br />
</syntaxhighlight><br />
<br />
[[Image:Custom_drawn_buttons.png]]<br />
<br />
===TCDEdit===<br />
<br />
This is a fully custom drawn edit control.<br />
<br />
[[Image:TCDEdit.png]]<br />
<br />
===TCDCheckBox===<br />
<br />
This is a fully custom drawn check box.<br />
<br />
[[Image:TCDCheckBox.png]]<br />
<br />
===TCDRadioButton===<br />
<br />
[[Image:TCDRadioButton.png]]<br />
<br />
===TCDScrollBar===<br />
<br />
[[Image:TCDScrollBar.png]]<br />
<br />
===TCDGroupBox===<br />
<br />
This is a fully custom drawn group box.<br />
<br />
[[Image:TCDGroupBox.png]]<br />
<br />
==Controls which imitate the Additional Palette==<br />
<br />
===TCDStaticText===<br />
<br />
==Controls which imitate the Common Controls Palette==<br />
<br />
===TCDTrackBar===<br />
<br />
A substitute for TTrackBar<br />
<br />
[[Image:TCDTrackBar.png]]<br />
<br />
===TCDProgressBar===<br />
<br />
[[Image:TCDProgressBar.png]]<br />
<br />
===TCDListView===<br />
<br />
Under construction.<br />
<br />
===TCDTabControl===<br />
<br />
A substitute for TTabControl<br />
<br />
===TCDPageControl===<br />
<br />
A substitute for TPageControl<br />
<br />
[[Image:TCDPageControl.png]]<br />
<br />
==Custom Drawn Packages==<br />
<br />
Moved here: [[Lazarus Custom Drawn Package]]<br />
<br />
==Other good custom drawn components for Lazarus==<br />
<br />
* [[VirtualTreeview]]<br />
* [[ATTabs]]<br />
* [[ATStatusBar]]<br />
* [[ATScrollBar]]<br />
<br />
==Maintainers==<br />
<br />
* [[User:Sekelsenmat|Felipe Monteiro de Carvalho]]<br />
* JiXian Yang<br />
<br />
== See Also ==<br />
<br />
*[[Lazarus Components Directory]]<br />
*[[Lazarus Custom Drawn Package]]<br />
*[[Custom Drawn Interface]]<br />
<br />
[[Category:Components]]<br />
[[Category:Custom Drawn]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=How_To_Write_Lazarus_Component/ru&diff=121534
How To Write Lazarus Component/ru
2018-12-07T18:33:31Z
<p>Useroflazarus: /* См. также */</p>
<hr />
<div>{{How_To_Write_Lazarus_Component}}<br />
<br />
<br />
Это руководство по созданию компонентов.<br />
<br />
__TOC__<br />
<br />
==Шаг 1: Создание пакета==<br />
<br />
* В меню IDE Lazarus нажмите "Package" > "New package" для запуска диспетчера пакетов. <br />
<br />
[[Image:package_menu.png]]<br />
<br />
* Появится диалоговое окно "Save". Выберите папку и имя файла и нажмите "Save". Если программа IDE предложит использовать строчные имена файлов, нажмите "да".<br />
<br />
* Поздравляем: вы только что создали свой первый пакет!<br />
<br />
[[Image:How_to_write_lazarus_component_package_maker.png|Package Maker]]<br />
<br />
==Шаг 2: Создание модуля==<br />
Вы можете создать новый модуль или использовать существующий файл. Оба варианта описаны ниже.<br />
<br />
===Создание нового модуля===<br />
* Используйте кнопку '''Add > New component'''.<br /><br />
<br />
[[Image:package_new_component.png]]<br /><br />
<br />
* Выберите компонент, [например такой] как TComboBox.<br />
* Выберите ''customcontrol1.pas'' в качестве '''Unit File Name''' и ''CustomControl1'' в качестве '''Unit Name'''.<br />
* Теперь вы можете задать иконку компоненту и определить, на какой палитре компонент должен появиться позже в Lazarus-IDE. <br />
* Нажмите '''OK'''[, чтобы создать новый компонент].<br /><br />
<br />
<syntaxhighlight><br />
unit CustomControl1;<br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls;<br />
<br />
type<br />
TCustomControl1 = class(TComboBox)<br />
private<br />
{ Private declarations }<br />
protected<br />
{ Protected declarations }<br />
public<br />
{ Public declarations }<br />
published<br />
{ Published declarations }<br />
end;<br />
<br />
procedure Register;<br />
<br />
implementation<br />
<br />
procedure Register;<br />
begin<br />
RegisterComponents('Standard', [TCustomControl1]);<br />
end;<br />
<br />
end.<br />
</syntaxhighlight><br />
<br />
* Установите пакет, кликнув кнопку '''Use -> Install''' вверху редактора пакетов.<br /><br />
<br />
[[Image:package_install.png]]<br /><br />
<br />
* Теперь IDE спросит вас, должна ли она быть пересобрана. Ответьте "Да".<br /><br />
<br />
[[Image:package_rebuild.png]]<br /><br />
<br />
* Перезапустите Lazarus[, если он не сделал этого сам,] и посмотрите на свой новый компонент в палитре компонентов. Поздравляем: вы только что установили свой первый пакет с вашим первым компонентом.<br /><br />
<br />
[[Image:package_installed.png]]<br /><br />
<br />
{{Note| Если вы не видите свой новый компонент в палитре компонентов, скорее всего, вы используете не пересобранную версию Lazarus. Вы можете установить, где Lazarus пересобирается, используя [пункт меню] Tools -> Options -> Files -> Lazarus directory. <br />
<br />
Вместо прямого вызова Lazarus вы также можете использовать startlazarus, который запускает недавно созданный Lazarus, например исполняемый файл Lazarus в каталоге ~ / .lazarus, если у вас нет доступа на запись в каталог, в который был установлен Lazarus.}}<br />
<br />
----<br />
[[User:Zoltanleo|Прим.перев.]] 23:36, 1 December 2018 (CET): В корневом каталоге Lazarus'а после пересборки обычно содержится три исполняемых файла: lazarus (текущий запускаемый файл), startlazarus (лаучер для lazarus) и lazarus.old (старая версия исполняемого файла, существующая после последней удачной пересборки среды). В примечании, вероятнее всего, речь идет о них.<br />
----<br />
<br />
===Добавление существующего модуля===<br />
Если у вас уже есть модуль, вы можете добавить его в пакет:<br />
<br />
[[Image:package_existing_unit.png]]<br /><br />
<br />
* Нажмите кнопку '''Add''', перейдите к вкладке '''Add Files'''. В [колонке] file name модуля добавьте ваш существующий файл. Нажмите '''Add files to package'''. Если диспетчер пакетов жалуется, что модуль находится вне заданных к модулям путей, нажмите "Да", чтобы добавить каталог в пути к модулям.<br />
* Нажмите кнопку '''Add''' снова, перейдите на вкладку '''Add Files''', найдите файл ''.lrs'' и нажмите "OK" (см. Шаг 3 о создании файла иконки).<br />
* Снова нажмите кнопку '''Add''', перейдите к вкладке '''New Requirement''' [(новая зависимость)]. В имени пакета выберите '''LCL''' и нажмите OK.<br />
<br />
Конечный результат должен выглядеть следующим образом:<br /><br />
<br />
[[Image:How_to_write_lazarus_component_package_maker_done.png|Package Maker]]<br /><br />
<br />
* Щелкните по дереву файлов в диспетчере пакетов. В свойствах файла убедитесь, что установлен флажок ''Register unit''.<br />
* Нажмите кнопку Options. Перейдите на вкладку IDE Integration. В опции Package Type убедитесь, что выбраны [режимы] Designtime и Runtime.<br />
* Нажмите кнопку Compile, чтобы проверить, файлы компилируются без ошибок.<br />
* Нажмите кнопку Install. Lazarus автоматически пересоберется и перезагрузится.<br />
<br />
Компонент создан и готов к использованию:<br /><br />
<br />
[[Image:How_to_write_lazarus_component_created.png|Component Created]]<br /><br />
<br />
==Шаг 3: Создание значков для пакета==<br />
<br />
Вы должны создать PNG-файлы размером 24x24 пикселя в виде значков. Если для Lazarus 1.8+ вы хотите, чтобы значки палитры масштабировались при более высоких разрешениях экрана, вы также должны предоставлять значки 36x36 и 48x48 пикселей. Имена более крупных значков требуют добавления [суффиксов] "_150" и "_200" к имени файла, соответственно [увеличению разрешения] ("_150" для 150%, "_200" для 200%).<br />
<br />
FPC способен использовать стандартные файлы ресурсов <tt>.rc</tt> или скомпилированные ресурсы <tt>.res</tt>, [начиная] с версии fpc 2.6. См. [[Lazarus_Resources/ru#FPC ресурсы|FPC ресурсы]]. <br />
[О файлах] <tt>.lrs</tt>: см.ниже.<br />
<br />
=== Использование редактора изображений Lazarus===<br />
Вы можете использовать [[Lazarus_Image_Editor|Lazarus Image Editor]] для создания изображений в .lrs формате.<br />
<br />
<br />
----<br />
[[User:Zoltanleo|Прим.перев.]] 17:13, 3 December 2018 (CET): Поскольку старшие версии Лазаруса (насколько я помню, после v.1.6.х точно) позволяют задавать иконку изображения в png-формате, то удобнее всего для их создания использовать бесплатный векторный редактор [https://inkscape.org/ru InkScape], "родным" для которого является формат SVG. Среди его преимуществ:<br />
* работа со слоями<br />
* поддержка альфа-канала<br />
* предосмотр иконок в разных разрешениях (в файле настроек можно задать даже нестандартные значения)<br />
* вменяемый и оперативный саппорт (можно напрямую пообщаться с разработчиками в [https://inkscape.org/ru/community/discussion чате]) <br />
* экспорт изображений в png-формат<br />
----<br />
<br />
===Использование lazres===<br />
<tt>lazres</tt> обычно находится в каталоге инструментов Lazarus.<br />
<br />
Вам может понадобиться скомпилировать [[lazres]] при первом использовании. Просто откройте ''lazres.lpi'' в среде IDE и нажмите '''run > build''' в меню.<br />
<br />
====Создание lrs-файла====<br />
<br />
Для создания lrs-файла запустите:<br />
<br />
<syntaxhighlight>~/lazarus/tools/lazres samplepackage.lrs TMyCom.png</syntaxhighlight><br />
<br />
или, если доступны изображения с высоким разрешением<br />
<br />
<syntaxhighlight>~/lazarus/tools/lazres samplepackage.lrs TMyCom.png TMyCom_150.pgn TMyCom_200.png</syntaxhighlight><br />
<br />
где<br />
* ''samplepackage'' - имя вашего пакета<br />
* ''TMyCom'' - имя вашего компонента. Имя изображения должно совпадать с именем вашего компонента!<br />
<br />
Вы можете добавить несколько изображений в файл lrs, добавив имя файла изображения в конец [команды]. Например: <br />
<syntaxhighlight>~/lazarus/tools/lazres samplepackage.lrs TMyCom.png TMyOtherCom.png ...</syntaxhighlight><br />
<br />
<br />
'''Пример'''<br />
<br />
Ниже приведен образец полученного файла ''samplepackage.lrs''.<br />
<br />
<syntaxhighlight>LazarusResources.Add('TMyCom','PNG',[<br />
#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#2#0#0#0'o'#21#170#175<br />
+#0#0#0#4'gAMA'#0#0#177#143#11#252'a'#5#0#0#0'|IDAT8O'#237#212#209#10#192' '#8<br />
+#5'P'#247#231#251's'#215#138#133#164#166'\'#220#195'`'#209'c'#157'L'#173#131<br />
+#153#169'd4'#168'dP'#137'r_'#235'5'#136'@Zmk'#16'd9'#144#176#232#164'1'#247<br />
+'I'#8#160'IL'#206'C'#179#144#12#199#140'.'#134#244#141'~'#168#247#209'S~;'#29<br />
+'V+'#196#201'^'#10#15#150'?'#255#18#227#206'NZ>42'#181#159#226#144#15'@'#201<br />
+#148#168'e'#224'7f<@4'#130'u_YD'#23#213#131#134'Q]'#158#188#135#0#0#0#0'IEND'<br />
+#174'B`'#130<br />
]);</syntaxhighlight><br />
<br />
Обязательно включите свой файл ресурсов в исходник нового компонента, добавив нижеследующее в модуль вашего компонента и включив "LResources" в раздел uses<br />
<br />
<syntaxhighlight><br />
initialization<br />
{$I samplepackage.lrs}<br />
</syntaxhighlight><br />
<br />
<br />
====Создание res-файла====<br />
<br />
lazres также может создать скомпилированный файл ресурсов, просто укажите файл с расширением .res, например:<br />
<br />
<syntaxhighlight>~/lazarus/tools/lazres samplepackage.res TMyCom.png</syntaxhighlight><br />
<br />
или, для иконок с высоким разрешением:<br />
<br />
<syntaxhighlight>~/lazarus/tools/lazres samplepackage.res TMyCom.png TMyCom_150.png TMyCom_200.png</syntaxhighlight><br />
<br />
В этом случае вместо включения файла lrs в разделе инициализации просто укажите файл ресурсов в любом месте исходного файла компонента<br />
<br />
<syntaxhighlight><br />
{$R samplepackage.res}<br />
</syntaxhighlight><br />
<br />
=== Использование glazres ===<br />
'''GLazRes''' это графическая версия <tt>lazres</tt>, которая может собирать файлы в файл ресурсов Lazarus (.lrs).<br />
Его можно найти в каталоге инструментов установки Lazarus.<br />
<br />
==Перекомпиляция пакетов==<br />
<br />
Вам нужно пересобирать пакет каждый раз, когда вы вносите изменения в файл ''mycom.pas''. Чтобы пересобрать пакет, откройте файл ''samplepackage.lpk'' в диспетчере пакетов и нажмите кнопку Install.<br />
<br />
==Удаление пакетов==<br />
<br />
* Чтобы удалить установленные компоненты: в меню IDE выберите Package > Configure installed packages. На следующем рисунке показан инструмент Installed Packages.<br />
<br />
[[Image:How_to_write_lazarus_component_installed_components.png|Installed Components]]<br />
<br />
* Выберите пакет, который вы хотите удалить, и нажмите Uninstall selection.<br />
<br />
Если что-то пойдет не так с пакетом (например, каталог пакета удаляется без деинсталляции [пакета в первую очередь]), Lazarus может не разрешить вам удалять пакеты. Чтобы устранить проблему, в меню IDE выберите Tools > Build Lazarus. Lazarus пересоберет все пакеты и перезапустит их. Теперь вы можете удалить проблемные пакеты.<br />
<br />
==Усовершенствование mycom.pas==<br />
<br />
* Код в ''mycom.pas'' выше дает вам основы того, что вам нужно для создания компонента. Далее приведена усовершенствованная версия с некоторыми советами о том, как писать процедуры и события для компонентов.<br />
* ''OnChange2'' показывает, как создавать события.<br />
* ''OnSample'' показывает, как создавать пользовательские события.<br />
* ''MyText'' и ''MyText2'' показывает различные способы записи свойств.<br />
* Вы можете использовать TComboBox вместо TCustomComboBox в качестве базового класса, который [объявляет] публичными все свойства как TComboBox. <br />
* Если TCustomComboBox используется в качестве базового класса, вы заметите, что в Инспекторе объектов IDE будет отсутствовать множество свойств и событий. Чтобы добавить эти свойства и события, просто скопируйте и вставьте свойства, перечисленные ниже [комментария] ''// properties from TComboBox''. Этот список свойств можно получить из объявления TComboBox в модуле StdCtrls. Исключите [из списка] любое свойство, которое вы хотите [определить] самостоятельно.<br />
<br />
<syntaxhighlight><br />
unit mycom;<br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, StdCtrls, Forms, Dialogs,<br />
LCLType,LCLIntf,lresources,LCLProc;<br />
<br />
type<br />
<br />
TSampleEvent = procedure(MyText: String) of Object;<br />
<br />
TMyCom = class (TCustomComboBox)<br />
private<br />
FMyText: String;<br />
FOnChange2: TNotifyEvent;<br />
FOnSample: TSampleEvent;<br />
public<br />
constructor Create(TheOwner: TComponent); override;<br />
procedure CreateWnd; override;<br />
procedure Change; override;<br />
protected<br />
function GetMyText2: String;<br />
procedure SetMyText2(MyText: String);<br />
published<br />
property MyText: String read FMyText write FMyText;<br />
property MyText2: String read GetMyText2 write SetMyText2;<br />
property OnChange2: TNotifyEvent read FOnChange2 write FOnChange2;<br />
property OnSample: TSampleEvent read FOnSample write FOnSample;<br />
<br />
// properties from TComboBox<br />
property Align;<br />
property Anchors;<br />
property ArrowKeysTraverseList;<br />
property AutoComplete;<br />
property AutoCompleteText;<br />
property AutoDropDown;<br />
property AutoSelect;<br />
property AutoSize;<br />
property BidiMode;<br />
property BorderSpacing;<br />
property CharCase;<br />
property Color;<br />
property Ctl3D;<br />
property Constraints;<br />
property DragCursor;<br />
property DragMode;<br />
property DropDownCount;<br />
property Enabled;<br />
property Font;<br />
property ItemHeight;<br />
property ItemIndex;<br />
property Items;<br />
property ItemWidth;<br />
property MaxLength;<br />
property OnChange;<br />
property OnChangeBounds;<br />
property OnClick;<br />
property OnCloseUp;<br />
property OnContextPopup;<br />
property OnDblClick;<br />
property OnDragDrop;<br />
property OnDragOver;<br />
property OnDrawItem;<br />
property OnEndDrag;<br />
property OnDropDown;<br />
property OnEditingDone;<br />
property OnEnter;<br />
property OnExit;<br />
property OnGetItems;<br />
property OnKeyDown;<br />
property OnKeyPress;<br />
property OnKeyUp;<br />
property OnMeasureItem;<br />
property OnMouseDown;<br />
property OnMouseMove;<br />
property OnMouseUp;<br />
property OnStartDrag;<br />
property OnSelect;<br />
property OnUTF8KeyPress;<br />
property ParentBidiMode;<br />
property ParentColor;<br />
property ParentCtl3D;<br />
property ParentFont;<br />
property ParentShowHint;<br />
property PopupMenu;<br />
property ReadOnly;<br />
property ShowHint;<br />
property Sorted;<br />
property Style;<br />
property TabOrder;<br />
property TabStop;<br />
property Text;<br />
property Visible; <br />
end;<br />
<br />
procedure Register;<br />
<br />
implementation<br />
<br />
procedure Register;<br />
begin<br />
RegisterComponents('Sample',[TMyCom]);<br />
end;<br />
<br />
constructor TMyCom.Create(TheOwner: TComponent);<br />
begin<br />
inherited Create(TheOwner);<br />
Self.Style := csDropDownList;<br />
end;<br />
<br />
procedure TMyCom.CreateWnd;<br />
begin<br />
inherited CreateWnd;<br />
Items.Assign(Screen.Fonts);<br />
end;<br />
<br />
procedure TMyCom.Change;<br />
begin<br />
inherited;<br />
if Assigned(FOnChange2) then FOnChange2(Self);<br />
if Assigned(FOnSample) then FOnSample(FMyText);<br />
end;<br />
<br />
function TMyCom.GetMyText2: String;<br />
begin<br />
Result:=FMyText;<br />
end;<br />
<br />
procedure TMyCom.SetMyText2(MyText: String);<br />
begin<br />
FMyText:=MyText;<br />
end;<br />
<br />
initialization<br />
{$I samplepackage.lrs}<br />
<br />
end.<br />
</syntaxhighlight><br />
<br />
Также вы заметите, что в Инспекторе объектов IDE существуют некоторые необъявленные и, возможно, нежелательные элементы.<br />
Чтобы удалить те из них, которые вам не нужны, вы можете переобъявить их в разделе ''Published'' как простые переменные. Например:<br />
<br />
<syntaxhighlight><br />
Published<br />
... <br />
property Height: Integer;<br />
property Width: Integer;<br />
...<br />
</syntaxhighlight><br />
<br />
==Использование встроенных (визуальных) компонентов==<br />
Можно использовать стандартные компоненты, встроенные в ваши собственные компоненты (посмотрите для примера на TLabeledEdit или TButtonPanel).<br />
<br />
Предположим, вы хотите создать пользовательскую панель с TLabel на ней. С помощью описанных выше шагов можно создать базовый пакет и исходные файлы.<br />
Теперь сделайте следующее для добавления TLabel в компонент:<br />
* Добавьте приватный атрибут (поле) для компонента label (<tt>FEmbeddedLabel: TLabel;</tt>).<br />
* Добавьте published-свойство только для чтения для компонента label (<tt>property EmbeddedLabel: TLabel read FEmbeddedLabel;</tt>)<br />
* Создайте label в конструкторе (переопределенном) компонента (<tt>FEmbeddedLabel: = TLabel.Create(self);</tt>)<br />
* Задайте родительский элемент компонента (<tt>FEmbeddedLabel.Parent: = self;</tt>)<br />
* Если встроенный компонент не является 'субкомпонентом' по умолчанию (например, TBoundLabel, TPanelBitBtn и т.д.), то добавьте вызов в SetSubComponent. Это необходимо для IDE, чтобы она знала, что она также должна хранить свойства встроенного компонента. По умолчанию TLabel не является субкомпонентом, поэтому необходимо добавить вызов метода (<tt>FEmbeddedLabel.SetSubComponent(true);</tt>).<br />
<br />
В итоге вы получите что-то вроде этого (показаны только основные части):<br />
<br />
<syntaxhighlight><br />
TEnhancedPanel = class(TCustomControl)<br />
private<br />
{ Новые аттрибуты для встроенного label }<br />
FEmbeddedLabel: TLabel;<br />
<br />
public<br />
{ Конструктор должен быть переопределен, чтобы label могла быть создана}<br />
constructor Create(AOwner: TComponent); override;<br />
<br />
published<br />
{ Сделаем label видимым в IDE }<br />
property EmbeddedLabel: TLabel read FEmbeddedLabel;<br />
end;<br />
<br />
implementation<br />
<br />
constructor TEnhancedPanel.Create(AOwner: TComponent);<br />
begin<br />
inherited Create(AOwner);<br />
<br />
// Устанавливаем дефолтовые width и height<br />
with GetControlClassDefaultSize do<br />
SetInitialBounds(0, 0, CX, CY);<br />
<br />
// Добавляем встроенный label<br />
FEmbeddedLabel := TLabel.Create(Self); // Добавляем встроенный label<br />
FEmbeddedLabel.Parent := self; // Показываем label на panel<br />
FEmbeddedLabel.SetSubComponent(true); // Говорим IDE сохранять измененные свойства<br />
FLabel.Name := 'EmbeddedLabel'; <br />
FLabel.Caption := 'Howdy World!';<br />
<br />
// Убеждаемся, что встроенная label не может быть выделена/удалена средствами IDE<br />
FLabel.ControlStyle := FLabel.ControlStyle - [csNoDesignSelectable];<br />
<br />
// Задаем другие свойства, если необходимо<br />
//...<br />
<br />
end;<br />
</syntaxhighlight><br />
<br />
==Использование пользовательской процедуры рисования==<br />
Вы всегда можете переопределить компонент внутри вашей программы. Например, это реализует пользовательскую процедуру Paint для TLabel:<br />
<br />
<syntaxhighlight><br />
type<br />
TMyLabel = class(TLabel)<br />
protected<br />
procedure Paint; override;<br />
end;<br />
{...}<br />
implementation<br />
{...}<br />
procedure TMyLabel.Paint;<br />
begin<br />
// ваш код для реализации Paint, например<br />
Canvas.TextOut(0,0,Caption);<br />
end; <br />
</syntaxhighlight><br />
<br />
Теперь вы можете создать MyLabel внутри вашей программы во время выполнения с этой переопределенной процедурой Paint вместо стандартной.<br />
<br />
Для большинства компонентов и для большинства методов было бы полезно вызвать унаследованную процедуру внутри него:<br />
<br />
<syntaxhighlight><br />
procedure TMyLabel.Paint;<br />
begin<br />
<br />
inherited Paint; /////////////////////<br />
<br />
// ваш код для реализации Paint, например<br />
Canvas.TextOut(0,0,Caption);<br />
end; <br />
</syntaxhighlight><br />
<br />
Однако унаследованное поведение нежелательно в этом случае, поскольку второе действие записи будет перекрывать первый (унаследованный).<br />
<br />
==Интеграция компонента с IDE==<br />
<br />
===Редакторы свойств===<br />
<br />
Редакторы свойств предоставляют настраиваемые диалоги для редактирования свойств в инспекторе объектов. Для большинства свойств, таких как строки, строковые списки, изображения, перечисленные типы и другие, уже есть редакторы свойств по умолчанию, но если у пользовательского компонента есть особый вид свойства, для изменения свойства может потребоваться настраиваемый диалог.<br />
<br />
Каждый редактор свойств - это класс, который должен происходить из TPropertyEditor или одного из его потомков и реализовывать методы этого базового класса. Они должны быть зарегистрированы в процедуре 'Register', используя функцию RegisterPropertyEditor из модуля PropEdits. Это стандарт для имен редакторов свойств с именем свойства, за которым следует [слово] 'Property', например [имя] TFieldProperty для редактора свойств свойства TField.<br />
<br />
<syntaxhighlight><br />
TPropertyEditor = class<br />
public<br />
function AllEqual: Boolean; Virtual;<br />
function AutoFill: Boolean; Virtual;<br />
procedure Edit; Virtual; // Активируется двойным щелчком по значению свойства<br />
procedure ShowValue; Virtual; // Активируется щелчком по элементу управления значения свойства<br />
function GetAttributes: TPropertyAttributes; Virtual;<br />
function GetEditLimit: Integer; Virtual;<br />
function GetName: ShortString; Virtual;<br />
procedure GetProperties(Proc: TGetPropEditProc); Virtual;<br />
function GetHint(HintType: TPropEditHint; x, y: integer): String; Virtual;<br />
function GetDefaultValue: AnsiString; Virtual;<br />
procedure GetValues(Proc: TGetStrProc); Virtual;<br />
procedure SetValue(const NewValue: AnsiString); Virtual;<br />
procedure UpdateSubProperties; Virtual;<br />
function SubPropertiesNeedsUpdate: Boolean; Virtual;<br />
function IsDefaultValue: Boolean; Virtual;<br />
function IsNotDefaultValue: Boolean; Virtual;<br />
// ... укорочено<br />
end;<br />
</syntaxhighlight><br />
<br />
Хорошим примером для редактора свойств является редактор свойств TFont.<br />
<br />
Один из наиболее распространенных случаев для редакторов свойств - это свойства, которые являются классами. Поскольку классы имеют много полей и могут иметь различные форматы, Lazarus не может иметь [универсальное] поле редактирования в инспекторе объектов, способное их редактировать, [как это сделано,] например, для строк и числовых типов.<br />
<br />
Для классов соглашение состоит в том, чтобы в поле значений постоянно отображалось имя класса в круглых скобках, например "(TFont)", а кнопка "..." показывала диалог для редактирования этого класса. Это поведение, за исключением диалога, реализуется стандартным редактором свойств для классов, называемых TClassPropertyEditor, который может быть унаследован при создании редакторов свойств для классов:<br />
<br />
<syntaxhighlight><br />
TClassPropertyEditor = class(TPropertyEditor)<br />
public<br />
constructor Create(Hook: TPropertyEditorHook; APropCount: Integer); Override;<br />
function GetAttributes: TPropertyAttributes; Override;<br />
procedure GetProperties(Proc: TGetPropEditProc); Override;<br />
function GetValue: AnsiString; Override;<br />
property SubPropsTypeFilter: TTypeKinds Read FSubPropsTypeFilter<br />
Write SetSubPropsTypeFilter<br />
Default tkAny;<br />
end;<br />
</syntaxhighlight><br />
<br />
Возвращаясь к примеру TFont, наследование от TClassPropertyEditor уже предлагает часть желаемого поведения, а затем классу TFontPropertyEditor необходимо реализовать отображение диалога в методе Edit и установить атрибуты для редактора:<br />
<br />
<syntaxhighlight><br />
TFontPropertyEditor = class(TClassPropertyEditor)<br />
public<br />
procedure Edit; Override;<br />
function GetAttributes: TPropertyAttributes; Override;<br />
end;<br />
<br />
procedure TFontPropertyEditor.Edit;<br />
var <br />
FontDialog: TFontDialog;<br />
begin<br />
FontDialog := TFontDialog.Create(NIL);<br />
try<br />
FontDialog.Font := TFont(GetObjectValue(TFont));<br />
FontDialog.Options := FontDialog.Options + [fdShowHelp, fdForceFontExist];<br />
if FontDialog.Execute then SetPtrValue(FontDialog.Font);<br />
finally<br />
FontDialog.Free;<br />
end;<br />
end;<br />
<br />
function TFontPropertyEditor.GetAttributes: TPropertyAttributes;<br />
begin<br />
Result := [paMultiSelect, paSubProperties, paDialog, paReadOnly];<br />
end;<br />
</syntaxhighlight><br />
<br />
===Редакторы компонентов===<br />
<br />
Редакторы компонентов управляют поведением компонентов по щелчку правой кнопкой мыши и двойному щелчку в дизайнере форм.<br />
<br />
Каждый редактор компонентов - это класс, который должен происходить от TComponentEditor или одного из его потомков и реализовывать методы из этого базового класса. Он должен быть зарегистрирован в процедуре 'Register', использущей функцию RegisterComponentEditor из модуля ComponentEditors. Это стандарт для именования редакторов компонентов с именем компонента, за которым следует [слово] 'Editor', например TStringGridComponentEditor для редактора свойств компонента TStringGrid. Хотя редакторы пользовательских компонентов должны быть основаны на TComponentEditor, большинство его методов на самом деле [берут начало] от предка, поэтому необходимо также знать TBaseComponentEditor:<br />
<br />
<syntaxhighlight><br />
TBaseComponentEditor = class<br />
protected<br />
public<br />
constructor Create(AComponent: TComponent;<br />
ADesigner: TComponentEditorDesigner); Virtual;<br />
procedure Edit; Virtual; Abstract;<br />
procedure ExecuteVerb(Index: Integer); Virtual; Abstract;<br />
function GetVerb(Index: Integer): String; Virtual; Abstract;<br />
function GetVerbCount: Integer; Virtual; Abstract;<br />
procedure PrepareItem(Index: Integer; const AnItem: TMenuItem); Virtual; Abstract;<br />
procedure Copy; Virtual; Abstract;<br />
function IsInInlined: Boolean; Virtual; Abstract;<br />
function GetComponent: TComponent; Virtual; Abstract;<br />
function GetDesigner: TComponentEditorDesigner; Virtual; Abstract;<br />
function GetHook(out Hook: TPropertyEditorHook): Boolean; Virtual; Abstract;<br />
procedure Modified; Virtual; Abstract;<br />
end;<br />
</syntaxhighlight><br />
<br />
Наиболее важным методом редактора компонентов является [метод] Edit, который вызывается по двойному щелчку на компоненте. Когда вызывается контекстное меню для компонента, запрашивается метод GetVerbCount и GetVerb для создания меню. Если выбран один из глаголов (что означает пункты меню в этом случае), вызывается ExecuteVerb. Существует редактор компонентов по умолчанию (TDefaultEditor), который реализует Edit для поиска свойств компонента для наиболее подходящего для редактирования. Обычно он выбирает событие, которое будет редактироваться, путем добавления скелета кода в редактор кода и установки курсора в это место.<br />
<br />
Другими важными методами из TBaseComponentEditor являются:<br />
* '''ExecuteVerb(Index)''' - Выполняет один из дополнительных пунктов меню, расположенных во всплывающем меню правой кнопки мыши;<br />
* '''GetVerb''' – Возвращает имя каждого дополнительного пункта всплывающего меню. Обратите внимание, что редактор компонентов должен размещать специальные символы заголовка элемента, такие как &, для создания ускорителя клавиатуры и "-" для создания разделителя; <br />
* '''GetVerbCount''' – Возвращает количество элементов, которые будут добавлены во всплывающее меню. Индекс для подпрограмм GetVerb и ExecuteVerb равен нулю, начиная от 0 до GetVerbCount - 1; <br />
* '''PrepareItem''' – Вызывается для каждого глагола [(GetVerbCount и GetVerb)] после создания пункта меню. Позволяет настраивать элемент меню, например, добавляя подэлементы, добавляя флажок или даже скрывая его, устанавливая Visible в false; <br />
* '''Copy''' - Вызывается, когда компонент копируется в буфер обмена. Данные компонента при использовании Lazarus'ом всегда будут [только] добавляться и не могут быть изменены. Этот метод предназначен для добавления различных типов из буфера обмена при вставке компонента в другие приложения, но не будет влиять на вставку в Lazarus'е.<br />
<br />
Простым и интересным примером является редактор компонентов TCheckListBox, который создает диалоговое окно для редактирования. Более удобный, чем реализация всех методов из TBaseComponentEditor, [он] наследуется от TComponentEditor, и это то, что делает TCheckListBoxEditor. Этот базовый класс добавляет пустые реализации для большинства методов и некоторые умолчательные для других. Для [метода] Edit он вызывает ExecuteVerb(0), поэтому, если первый пункт [popup menu] будет сопоставлен действию двойного щелчка мыши, что является условным обозначением для редактора, то нет необходимости в [ручной] реализации [кода метода] Edit. Это основное действие для двойного щелчка и первого элемента меню часто является диалогом, и для TCheckListBox это также реализуется [так]:<br />
<br />
<syntaxhighlight><br />
TCheckListBoxComponentEditor = class(TComponentEditor)<br />
protected<br />
procedure DoShowEditor;<br />
public<br />
procedure ExecuteVerb(Index: Integer); override;<br />
function GetVerb(Index: Integer): String; override;<br />
function GetVerbCount: Integer; override;<br />
end;<br />
<br />
procedure TCheckGroupComponentEditor.DoShowEditor;<br />
var<br />
Dlg: TCheckGroupEditorDlg;<br />
begin<br />
Dlg := TCheckGroupEditorDlg.Create(NIL);<br />
try<br />
// .. укорочено<br />
Dlg.ShowModal;<br />
// .. укорочено<br />
finally<br />
Dlg.Free;<br />
end;<br />
end;<br />
<br />
procedure TCheckGroupComponentEditor.ExecuteVerb(Index: Integer);<br />
begin<br />
case Index of<br />
0: DoShowEditor;<br />
end;<br />
end;<br />
<br />
function TCheckGroupComponentEditor.GetVerb(Index: Integer): String;<br />
begin<br />
Result := 'CheckBox Editor...';<br />
end;<br />
<br />
function TCheckGroupComponentEditor.GetVerbCount: Integer;<br />
begin<br />
Result := 1;<br />
end;<br />
</syntaxhighlight><br />
<br />
==Отладка компонента в Design-time==<br />
Чтобы отловить ошибки времени разработки во (вновь созданном) ''dbgcomponent'':<br />
* откройте проект <tt>C:\lazarus\ide\lazarus.lpi</tt>;<br />
* запустите проект;<br />
* установите точку останова в ''dbgcomponent'' в главном (1-ом) приложении;<br />
* используйте паскалевский код ''dbgcomponent'' во втором приложении;<br />
* выполнить пошагово код компонента времени разработки в режиме отладки; делайте все, что необходимо;<br />
<br />
==См. также==<br />
* [[Extending_the_IDE/ru|Extending the IDE]]<br />
* [[Lazarus_Packages/ru|Lazarus Packages]] - A guide for creating a package under Lazarus<br />
* [[Components and Code examples/ru|Components and Code examples]]<br />
* [[Lazarus Components]]<br />
* [[IDE Window: Add to Package]]<br />
* [[IDE Window: Create new package component]]<br />
* [http://freepascal.ru/article/lazarus/20050530152619 Создание визуальных компонент для Lazarus] - статья Сергея Смирнова с русскоязычного ресурса<br />
<br />
Все вопросы вы можете оставлять также [http://forum.lazarus.freepascal.org/index.php/topic,5789.0.html на этой] странице<br />
<br />
[[Category:Lazarus/ru]]<br />
[[Category:Component Creation]]<br />
[[Category:Packages/ru]]<br />
[[Category:Code/ru]]<br />
[[Category:Tutorials/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Talk:How_To_Write_Lazarus_Component/ru&diff=121405
Talk:How To Write Lazarus Component/ru
2018-11-30T18:58:35Z
<p>Useroflazarus: </p>
<hr />
<div>Pls, somebody add link for russian version<br />
<br />
:Что значит добавить ссылку?</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=TStringGrid/ru&diff=120135
TStringGrid/ru
2018-10-06T11:59:39Z
<p>Useroflazarus: </p>
<hr />
<div>{{TStringGrid}}<br />
<br />
<br />
----<br />
<span style="color:#FF0000">ENG: '''AT THE MOMENT THIS PAGE IS UNDER TRANSLATION.''' <br /> RUS: '''В НАСТОЯЩИЙ МОМЕНТ СТРАНИЦА НАХОДИТСЯ В ПРОЦЕССЕ ПЕРЕВОДА.'''</span><br />
----<br />
<br />
<br />
----<br />
--[[User:Zoltanleo|Zoltanleo]] 00:38, 6 October 2018 (CEST) Ввиду сложности дословного перевода текста с английского на русский слова, требующиеся по смыслу, но отсутствующие в английской версии, указаны в квадратных скобках.<br />
----<br />
<br />
<br />
'''TStringGrid''' [[image:tstringgrid.png]] это компонент с вкладки [[Additional_tab/ru|Additional tab]] палитры компонент [[Component_Palette/ru|Component Palette]]. Stringgrid обеспечивает табличное представление текстовой информации, которая может быть отредактирована.<br />
<br />
<br />
== Пример программы StringGrid ==<br />
Чтобы создать этот пример, создайте новый проект в Lazarus. Выберите TStringGrid, чтобы добавить на форму, щелкнув компонент TStringGrid из области меню или окна компонента, затем нажмите на форму. В этом случае, как показано [на рисунке], также были выбраны и брошены на форму две кнопки [[TButton/ru|TButton]]. В этом примере также необходимо выбрать компонент [[TOpenDialog/ru|TOpenDialog]] и поместить его в форму.<br /><br /><br />
<br />
[[File:TStringGrid02.png]]<br />
<br />
== Настройка столбцов и изменение их свойств ==<br />
Столбцы могут быть легко добавлены щелчком правой кнопки мыши 'Columns: TGridColumns':<br /><br /><br />
[[File:TStringGrid09.png]]<br /><br /><br />
При выборе AddItem, новый столбец отобразится ниже. На вкладке Properties [в окне] Object Inspector отображается новый список Properties[(свойств)] и Events[(событий)], относящихся к этому столбцу. Отсюда имена столбцов задаются вместе с шириной. Когда закончите [добавлять столбцы], TreeView будет выглядеть так:<br /><br /><br />
[[File:TStringGrid10.png]]<br /><br /><br />
В этом примере имя Button1 было изменено на ButtonAddFiles, а имя Button2 было изменено на ButtonExit. StringGrid1 был растянут и кнопки были выровнены, как показано [на рисунке]. Обратите внимание, что есть строка и столбец другого цвета. Это состояние иллюстрирует концепцию, что эта строка и столбец могут быть [предназначена] для ярлыков заголовков соответствующего столбца или строки. Конечно, это состояние по умолчанию можно изменить, просто изменив 'FixedCols' или 'FixedRows' в Object Inspector.<br /><br /><br />
[[File:TStringGrid03.png]]<br /><br /><br />
В этом случае вы можете увидеть, что строки заголовков изменены, а компонент StringGrid1 привязан [к краям формы]. Это было достигнуто путем выполнения двух шагов. '''''Первый''''' включает в себя просмотр Object Inspector и выбор различных свойств по мере необходимости. Один шаг, который следует предпринять при запуске, - это внимательно посмотреть свойства по умолчанию. Когда вы внесли многочисленные изменения и вам нужно [отменить изменения] , [то сделать] это намного проще, если вы знаете, каково было их состояние в начале или на различных этапах [изменений]. Состояние этих свойств на последнем изображении иллюстрирует только одну фиксированную строку с заголовками столбцов. Это состояние иллюстрируется [следующим кодом]<br /><br /><br />
FixedCols[0], <br />
FixedRows[1], <br />
HeaderHotZones[gzFixedCols], <br />
HeaderPushZones[gzFixedCols], <br />
Options[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,goRangeSelect,goSmoothScroll], <br />
TitleFont[Color[clPurple]], <br />
Style[fsBold], and <br />
RowCount = 1. <br />
<br /><br />
После просмотра [результатов] вашей работы путем нажатия кнопки Run в Lazarus, возможно вы пожелаете изменить эти свойства. В этом случае были выбраны дополнительные свойства ColClickSorts и AlternateColor.<br />
<br />
'''''Второе''''', что можно сделать, это использовать Редактор Привязок (View -> AnchorEditor), чтобы привязать стороны StringGrid к основной формой.<br />
<br />
== Using Available Predefined Properties ==<br />
<br />
At the bottom of the Object Inspector you can find useful information about the properties shown as seen in this example:<br />
<br />
[[File:TStringGrid04.png]]<br />
<br />
To add information to the StringGrid1 component, it is necessary to either add data from a TStream, LoadCVSFile, link the grid to a database or other similar actions. If linking to a database there are other components that should be considered like the TDBGrid. Other components such as the OpenDialog may also assist using methods like the LoadCVSFile. In many cases, it is necessary to either directly link data to given cells or ranges. In our example, we will use the InsertRowWithValues method. It is now necessary to add to the ButtonAddFiles an Event by clicking the Events tab of the Object Inspector and selecting the 'OnClick' event.<br />
<br />
[[File:TStringGrid05.png]]<br />
<br />
== Program Block To Add Data To The StringGrid ==<br />
By clicking on the OnClick the SourceEditor should have added a code block for the ButtonAddFilesClick procedure. To this you should add the following code:<br />
<br />
uses<br />
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,<br />
Grids, LazFileUtils, LazUtf8; <br />
. . . .<br />
types<br />
{ TForm1 }<br />
TForm1 = class(TForm)<br />
ButtonAddFiles : TButton;<br />
. . . .<br />
procedure ButtonAddFilesClick(Sender : TObject);<br />
procedure ButtonExitClick(Sender : TObject); <br />
. . . .<br />
var<br />
Form1 : TForm1;<br />
implementation<br />
{$R *.lfm}<br />
{ TForm1 } <br />
procedure TForm1.ButtonExitClick(Sender : TObject);<br />
begin<br />
Close;<br />
end;<br />
.<br />
procedure TForm1.ButtonAddFilesClick(Sender : TObject);<br />
var<br />
FilePathName : string;<br />
begin<br />
if OpenDialog1.Execute then<br />
FilePathName := OpenDialog1.Filename;<br />
AddFilesToList(FilePathName);<br />
end; <br />
<br />
The procedure for closing the application is shown for completeness. In the ButtonAddFilesClick procedure we now use the OpenDialog1 and select the Execute method. If is shown in a if - then statement where the boolean property of execute is tested. This method by default is true so the following line then when executed gives the OpenDialog1 property 'FileName' to our variable 'FilePathName'.<br />
<br />
In the last line of procedure a new procedure is shown for 'AddFilesToList'. We now need to create this procedure. In the type declaration under either 'Public' or 'Private' we need to add this new procedure. Under implementation, the code block for the procedure is created. In this example we are going to use the files of a DVD as can be seen in this illustration:<br />
<br />
[[File:TStringGrid06.png]]<br />
<br />
We want these files to be listed upon StringGrid1.<br />
<br />
Type<br />
. . . .<br />
private<br />
procedure AddFilesToList(FilePathName : String);<br />
. . . .<br />
procedure TForm1.AddFilesToList(FilePathName : String);<br />
var<br />
D, R, K : integer;<br />
FileName, FilePath : string;<br />
SearchRec1, SearchRec2 : TSearchRec;<br />
FileListVideo, FileListVst : TStringList;<br />
begin<br />
FileListVideo := TStringList.Create;<br />
FileListVst := TStringList.Create;<br />
FileName := ExtractFileName(FilePathName);<br />
FilePath := ExtractFilePath(FilePathName);<br />
FileListVideo := FindAllFiles(FilePath,'VIDEO_TS.*',true, faDirectory);<br />
R := 1;<br />
K := 0;<br />
for D := 0 to FileListVideo.Count -1 do<br />
begin<br />
if FindFirstUtf8(FilePath, faAnyFile and faDirectory, SearchRec1)=0 then<br />
begin<br />
repeat<br />
With SearchRec1 do<br />
begin<br />
FileName := ExtractFileName(FileListVideo.Strings[D]);<br />
K := FileSizeUtf8(FileListVideo.Strings[D]);<br />
StringGrid1.InsertRowWithValues(R,['0', FileName, IntToStr(K)]);<br />
R := R + 1;<br />
end;<br />
until FindNextUtf8(SearchRec1) <> 0;<br />
end;<br />
FindCloseUtf8(SearchRec1);<br />
end;<br />
.<br />
FileListVst := FindAllFiles(FilePath, 'VTS_*.*', true, faDirectory);<br />
K := 0;<br />
for D := 0 to FileListVst.Count -1 do<br />
begin<br />
if FindFirstUtf8(FilePath, faAnyFile and faDirectory,SearchRec2)=0 then<br />
begin<br />
repeat<br />
With SearchRec2 do<br />
begin<br />
FileName := ExtractFileName(FileListVst.Strings[D]);<br />
K := FileSizeUtf8(FileListVst.Strings[D]);<br />
StringGrid1.InsertRowWithValues(R,['1', FileName, IntToStr(K)]);<br />
R := R + 1;<br />
end;<br />
until FindNextUtf8(SearchRec2) <> 0;<br />
end;<br />
FindCloseUtf8(SearchRec2);<br />
end;<br />
StringGrid1.SortColRow(true, 1,1,StringGrid1.RowCount-1);<br />
FileListVst.Free;<br />
FileListVideo.Free;<br />
end;<br />
<br />
This example uses the methods 'FindAllFiles' from 'FileUtils' and 'FindFirstUtf8', 'FindNextUtf8' and 'FindCloseUtf8' from 'LazFileUtils'.<br />
<br />
<br />
== CheckBox Column ==<br />
One feature that can be very helpful in applications of the TStringGrid is having a checkbox column that either a user can click to signify their selection or used to show a certain state for some property. Adding this type of column is illustrated in this code. In the method 'InsertRowWithValues', the first column has '0' shown in the first part of the code when files containing 'VIDEO_TS*' are being selected. The '0' is illustrating the boolean state of a checkbox with 1 being checked and 0 unchecked. In selecting from the Object Inspector under StringGrid1-->Columns: TGridColumns-->0-Select in the TreeView, the ValueChecked and ValueUnchecked are shown. You can use other numbers, or have added code to change the state.<br />
<br />
== InsertRowWithValues Method ==<br />
In this example the method InsertRowWithValues is used to add data to our StringGrid1 component. Each column's data is entered followed by a comma. It may be necessary to use typecasting functions to get data into a string format. Variables can be referenced, or simply shown as text as our '0' and '1' are for checkbox column.<br />
<br />
[[File:TStringGrid08.png]]<br />
<br />
Upon running our new application and clicking the button 'AddFiles' a dialog box opens allowing us to select file(s) to be added. If you click on a column header, StringGrid1 is sorted in the direction as shown by the green arrow. The result should be as shown in the following illustration:<br />
<br />
[[File:TStringGrid07.png]]<br />
<br />
Depending on your needs other properties can be selected to allow editing, resizing columns, etc.<br />
<br />
== См. также ==<br />
* [[TDrawGrid/ru|TDrawGrid]]<br />
* [[TDBGrid/ru|TDBGrid]]<br />
* [[Grids Reference Page/ru|Grids Reference Page]]<br />
<br />
{{LCL Components/ru}}</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Template_talk:ISO_8601&diff=119852
Template talk:ISO 8601
2018-09-28T19:11:27Z
<p>Useroflazarus: Created page with "8601 or 8061?"</p>
<hr />
<div>8601 or 8061?</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Template:Syntax_highlighting&diff=119778
Template:Syntax highlighting
2018-09-26T17:52:57Z
<p>Useroflazarus: Created page with "{{LanguageBar}}<includeonly>{{CategoriesBySuffixForPage |LCL|Components|SynEdit}}</includeonly>"</p>
<hr />
<div>{{LanguageBar}}<includeonly>{{CategoriesBySuffixForPage<br />
|LCL|Components|SynEdit}}</includeonly></div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Template:Left_curly_bracket&diff=119747
Template:Left curly bracket
2018-09-25T16:04:27Z
<p>Useroflazarus: Created page with "{{LanguageBar}}<includeonly>{{CategoriesBySuffixForPage |Symbols}}</includeonly>"</p>
<hr />
<div>{{LanguageBar}}<includeonly>{{CategoriesBySuffixForPage<br />
|Symbols}}</includeonly></div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Clipboard/ru&diff=119646
Clipboard/ru
2018-09-23T06:36:43Z
<p>Useroflazarus: /* View the clipboard contents */</p>
<hr />
<div>{{Clipboard}}<br />
<br><br />
<br><br />
__TOC__<br />
==Предопределенные типы==<br />
<br />
{| class="wikitable sortable"<br />
! TPredefinedClipboardFormat !! тип MIME<br />
|-<br />
| pcfText || text/plain<br />
|-<br />
| pcfBitmap || image/bmp<br />
|-<br />
| pcfPixmap || image/xpm<br />
|-<br />
| pcfIcon || image/lcl.icon<br />
|-<br />
| pcfPicture || image/lcl.picture<br />
|-<br />
| pcfObject || application/lcl.object<br />
|-<br />
| pcfComponent || application/lcl.component<br />
|-<br />
| pcfCustomData || application/lcl.customdata<br />
|-<br />
| pcfDelphiText || text/plain<br />
|-<br />
| pcfDelphiBitmap || text/delphi.bitmap<br />
|-<br />
| pcfDelphiPicture || Delphi picture<br />
|-<br />
| pcfDelphiMetaFilePict || image/delphimetafilepict<br />
|-<br />
| pcfDelphiObject || application/delphi.object<br />
|-<br />
| pcfDelphiComponent || Delphi component<br />
|-<br />
| pcfKylixPicture || image/delphi.picture<br />
|-<br />
| pcfKylixBitmap || image/delphi.bitmap<br />
|-<br />
| pcfKylixDrawing || image/delphi.drawing<br />
|-<br />
| pcfKylixComponent || application/delphi.component<br />
|}<br />
<br />
==Текст==<br />
<br />
Для использования с простым текстом объект '''Clipboard''' предоставляет свойство ''AsText'', которое может быть использовано для чтения и записи текста.<br />
<br />
Запись текста:<br />
<syntaxhighlight>Clipboard.AsText := 'Hello clipboard!';</syntaxhighlight><br />
<br />
Чтение текста:<br />
<syntaxhighlight>ShowMessage('Clipboard content: ' + Clipboard.AsText);</syntaxhighlight><br />
<br />
'''Clipboard''' является объектом класса '''TClipboard''' и для его использования необходимо подключить модуль ''Clipbrd'' в разделе ''uses'':<br />
<br />
<syntaxhighlight>uses<br />
..., Clipbrd;</syntaxhighlight><br />
<br />
==Текстовые элементы управления==<br />
<br />
Некоторые визуальные компоненты, такие как [[TEdit/ru|TEdit]], [[TMemo/ru|TMemo]], [[TStringGrid/ru|TStringGrid]], [[TLabeledEdit/ru|TLabeledEdit]], [[TMaskEdit/ru|TMaskEdit]], [[TSpinEdit/ru|TSpinEdit]] и [[TFloatSpinEdit/ru|TFloatSpinEdit]] обладают возможностью выделения части текста, находящегося в них, и предоставляют дополнительные функциональные возможности для выделенного текста при работе с буфером обмена. <br />
<br />
<syntaxhighlight> procedure CopyToClipboard; <br />
procedure CutToClipboard; <br />
procedure PasteFromClipboard;</syntaxhighlight><br />
<br />
==Текст в формате HTML==<br />
<br />
Объект '''ClipBoard''' поддерживает чтение и запись текста в формате HTML.<br />
<br />
Пример чтения из буфера обмена и записи в буфер обмена текста в формате HTML:<br />
<syntaxhighlight>uses<br />
Clipbrd, ...;<br />
var<br />
Html, PlainText: String;<br />
...<br />
begin<br />
Html := ClipBoard.GetAsHtml;<br />
...<br />
Html := '<b>Formatted</b> text';<br />
PlainText := 'Simple Text';<br />
ClipBoard.SetAsHtml(Html, PlainText);<br />
end.<br />
</syntaxhighlight><br />
<br />
===Windows===<br />
Для обработки Html-текста в буфере обмена Windows требуется подключение заголовочных файлов.<br><br />
В то время, как раньше пользователям необходимо было делать это вручную, теперь это прозрачно делается с помощью подключения модуля ''ClipBrd''.<br><br />
<br />
==Изображения==<br />
<br />
===Загрузка из буфера обмена===<br />
<br />
<syntaxhighlight>uses <br />
Clipbrd, LCLIntf, LCLType, ...;<br />
<br />
procedure LoadBitmapFromClipboard(Bitmap: TBitmap);<br />
begin<br />
if Clipboard.HasFormat(PredefinedClipboardFormat(pcfDelphiBitmap)) then<br />
Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfDelphiBitmap));<br />
if Clipboard.HasFormat(PredefinedClipboardFormat(pcfBitmap)) then<br />
Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfBitmap));<br />
end;</syntaxhighlight><br />
<br />
===Сохранение в буфере обмена===<br />
<br />
<syntaxhighlight>uses <br />
Clipbrd, ...;<br />
<br />
procedure SaveBitmapToClipboard(Bitmap: TBitmap);<br />
begin<br />
Clipboard.Assign(Bitmap);<br />
end;</syntaxhighlight><br />
<br />
==Пользовательский формат==<br />
<br />
==Multiple objects==<br />
<br />
==Получение уведомления об изменении буфера обмена==<br />
<br />
LCL не передает сообщения Windows (передаются только сообщения WM_USER). Это означает, что вы должны написать свой обработчик сообщения.<br />
<br />
Пример кода для реализации обработчика сообщения:<br />
<br />
<syntaxhighlight>unit Unit1;<br />
<br />
{$mode delphi}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,<br />
Clipbrd, StdCtrls, Windows, Messages;<br />
<br />
type<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
procedure FormCreate(Sender: TObject);<br />
procedure FormDestroy(Sender: TObject);<br />
private<br />
FNextClipboardOwner: HWnd; // хэндл на следующий вьювер в цепочке<br />
// обработчики события буфера обмена<br />
function WMChangeCBChain(wParam: WParam; lParam: LParam):LRESULT;<br />
function WMDrawClipboard(wParam: WParam; lParam: LParam):LRESULT;<br />
public<br />
end;<br />
<br />
var<br />
Form1: TForm1;<br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
var<br />
PrevWndProc:windows.WNDPROC;<br />
<br />
function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam): LRESULT; stdcall;<br />
begin<br />
if uMsg = WM_CHANGECBCHAIN then begin<br />
Result := Form1.WMChangeCBChain(wParam, lParam);<br />
Exit;<br />
end <br />
else if uMsg=WM_DRAWCLIPBOARD then begin<br />
Result := Form1.WMDrawClipboard(wParam, lParam);<br />
Exit;<br />
end;<br />
Result := CallWindowProc(PrevWndProc, Ahwnd, uMsg, WParam, LParam);<br />
end;<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
PrevWndProc := Windows.WNDPROC(SetWindowLong(Self.Handle, GWL_WNDPROC, PtrInt(@WndCallback))); // для x64 необходимо использовать SetWindowLongPtr<br />
FNextClipboardOwner := SetClipboardViewer(Self.Handle);<br />
end;<br />
<br />
procedure TForm1.FormDestroy(Sender: TObject);<br />
begin<br />
ChangeClipboardChain(Handle, FNextClipboardOwner);<br />
end;<br />
<br />
function TForm1.WMChangeCBChain(wParam: WParam; lParam: LParam): LRESULT;<br />
var<br />
Remove, Next: THandle;<br />
begin<br />
Remove := WParam;<br />
Next := LParam;<br />
if FNextClipboardOwner = Remove then FNextClipboardOwner := Next<br />
else if FNextClipboardOwner <> 0 then<br />
SendMessage(FNextClipboardOwner, WM_ChangeCBChain, Remove, Next)<br />
end;<br />
<br />
function TForm1.WMDrawClipboard(wParam: WParam; lParam: LParam): LRESULT;<br />
begin<br />
if Clipboard.HasFormat(CF_TEXT) Then Begin<br />
ShowMessage(Clipboard.AsText);<br />
end;<br />
SendMessage(FNextClipboardOwner, WM_DRAWCLIPBOARD, 0, 0); // ВАЖНО!<br />
Result := 0;<br />
end;<br />
<br />
end.</syntaxhighlight><br />
<br />
==Просмотр содержимого буфера обмена==<br />
<br />
Иногда бывает полезно посмотреть, что находится в данный момент в буфере обмена. Вот несколько методов, которые я использую (на форме расположен элемент [[TMemo/ru|TMemo]] и один таймер с интервалом 1 секунда) - <br />
<syntaxhighlight><br />
procedure TForm1.CheckClipboard();<br />
var<br />
I : integer;<br />
List : TStringList;<br />
begin<br />
memo1.clear;<br />
Memo1.Append('[' + Clipboard.AsText + ']');<br />
List := TStringList.Create;<br />
try<br />
ClipBoard.SupportedFormats(List);<br />
for i := 0 to List.Count-1 do begin<br />
//Memo1.Append(List.Strings[i]); // раскомментируйте, чтобы увидеть все доступные форматы<br />
case List.Strings[i] of // показать конкретные форматы<br />
'Rich Text Format', 'text/plain', 'UTF8_STRING' :<br />
ReadClip(List.Strings[i]);<br />
end;<br />
end;<br />
finally<br />
List.Free;<br />
end;<br />
end;<br />
<br />
function TForm1.ReadClip(TheFormat : ANSIString) : ANSIString;<br />
var<br />
Stream: TMemoryStream;<br />
Fmt : TClipboardFormat;<br />
List : TStringList;<br />
begin<br />
if TheFormat = '' then exit;<br />
Stream := TMemoryStream.Create;<br />
List := TStringList.Create;<br />
try<br />
if Clipboard.HasFormatName(TheFormat) then begin<br />
Memo1.Append(#10+TheFormat);<br />
Fmt := ClipBoard.FindFormatID(TheFormat);<br />
ClipBoard.GetFormat(Fmt, Stream);<br />
if Stream.Size > 0 then begin<br />
Stream.Seek(0, soFromBeginning);<br />
List.LoadFromStream(Stream);<br />
Memo1.Lines.AddStrings(List, False);<br />
end;<br />
end;<br />
finally<br />
List.Free;<br />
Stream.Free;<br />
end;<br />
end;</syntaxhighlight><br />
<br />
==How to fix empty GTK2 clipboard on exit==<br />
<br />
Usually when your GTK2 app exits, it's clipboard becomes empty. Bad for usual user.<br />
This unit is a dirty fix, add it to "uses" somewhere.<br />
<br />
<syntaxhighlight><br />
unit fix_gtk_clipboard;<br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
gtk2, gdk2, Clipbrd;<br />
<br />
implementation<br />
<br />
var<br />
c: PGtkClipboard;<br />
t: string;<br />
<br />
finalization<br />
c := gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);<br />
t := Clipboard.AsText;<br />
gtk_clipboard_set_text(c, PChar(t), Length(t));<br />
gtk_clipboard_store(c);<br />
end.<br />
</syntaxhighlight><br />
<br />
In May 2018 I (dbannon) found that putting this bit of code in a finalization section did fix the problem when the clipboard contents had come from the application itself but if it was there before the application started, that is, the application did not write to the clipboard, it introduces another, similar problem. Clipboard contents are, again, cleared in that case. And appears to happen because by time the finalization clause is executed, the clipboard has already been cleared.<br />
<br />
An easy solution is to put that same code into the main form's onClose event. Its early enough that the contents, from either source are still there and late enough not to be subsequently cleared.<br />
<syntaxhighlight>uses .... {$ifdef LINUX}gtk2, gdk2, Clipbrd{$endif};<br />
.....<br />
procedure TMainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
var<br />
c: PGtkClipboard;<br />
t: string;<br />
begin<br />
{$ifdef LINUX}<br />
c := gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);<br />
t := Clipboard.AsText;<br />
gtk_clipboard_set_text(c, PChar(t), Length(t));<br />
gtk_clipboard_store(c);<br />
{$endif}<br />
end; </syntaxhighlight><br />
<br />
==Внешние ссылки==<br />
<br />
* [http://delphi.about.com/od/vclusing/a/tclipboard.htm Базовые операции для работы с буфером обмена (вырезать/скопировать/вставить) при использовании объекта TClipboard]<br />
<br />
[[Category:Russian (unfinished translation)]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Clipboard/ru&diff=119591
Clipboard/ru
2018-09-21T17:32:02Z
<p>Useroflazarus: /* External links */</p>
<hr />
<div>{{Clipboard}}<br />
<br><br />
<br><br />
__TOC__<br />
==Предопределенные типы==<br />
<br />
{| class="wikitable sortable"<br />
! TPredefinedClipboardFormat !! тип MIME<br />
|-<br />
| pcfText || text/plain<br />
|-<br />
| pcfBitmap || image/bmp<br />
|-<br />
| pcfPixmap || image/xpm<br />
|-<br />
| pcfIcon || image/lcl.icon<br />
|-<br />
| pcfPicture || image/lcl.picture<br />
|-<br />
| pcfObject || application/lcl.object<br />
|-<br />
| pcfComponent || application/lcl.component<br />
|-<br />
| pcfCustomData || application/lcl.customdata<br />
|-<br />
| pcfDelphiText || text/plain<br />
|-<br />
| pcfDelphiBitmap || text/delphi.bitmap<br />
|-<br />
| pcfDelphiPicture || Delphi picture<br />
|-<br />
| pcfDelphiMetaFilePict || image/delphimetafilepict<br />
|-<br />
| pcfDelphiObject || application/delphi.object<br />
|-<br />
| pcfDelphiComponent || Delphi component<br />
|-<br />
| pcfKylixPicture || image/delphi.picture<br />
|-<br />
| pcfKylixBitmap || image/delphi.bitmap<br />
|-<br />
| pcfKylixDrawing || image/delphi.drawing<br />
|-<br />
| pcfKylixComponent || application/delphi.component<br />
|}<br />
<br />
==Текст==<br />
<br />
Для использования с простым текстом объект '''Clipboard''' предоставляет свойство ''AsText'', которое может быть использовано для чтения и записи текста.<br />
<br />
Запись текста:<br />
<syntaxhighlight>Clipboard.AsText := 'Hello clipboard!';</syntaxhighlight><br />
<br />
Чтение текста:<br />
<syntaxhighlight>ShowMessage('Clipboard content: ' + Clipboard.AsText);</syntaxhighlight><br />
<br />
'''Clipboard''' является объектом класса '''TClipboard''' и для его использования необходимо подключить модуль ''Clipbrd'' в разделе ''uses'':<br />
<br />
<syntaxhighlight>uses<br />
..., Clipbrd;</syntaxhighlight><br />
<br />
==Текстовые элементы управления==<br />
<br />
Некоторые визуальные компоненты, такие как [[TEdit/ru|TEdit]], [[TMemo/ru|TMemo]], [[TStringGrid/ru|TStringGrid]], [[TLabeledEdit/ru|TLabeledEdit]], [[TMaskEdit/ru|TMaskEdit]], [[TSpinEdit/ru|TSpinEdit]] и [[TFloatSpinEdit/ru|TFloatSpinEdit]] обладают возможностью выделения части текста, находящегося в них, и предоставляют дополнительные функциональные возможности для выделенного текста при работе с буфером обмена. <br />
<br />
<syntaxhighlight> procedure CopyToClipboard; <br />
procedure CutToClipboard; <br />
procedure PasteFromClipboard;</syntaxhighlight><br />
<br />
==Текст в формате HTML==<br />
<br />
Объект '''ClipBoard''' поддерживает чтение и запись текста в формате HTML.<br />
<br />
Пример чтения из буфера обмена и записи в буфер обмена текста в формате HTML:<br />
<syntaxhighlight>uses<br />
Clipbrd, ...;<br />
var<br />
Html, PlainText: String;<br />
...<br />
begin<br />
Html := ClipBoard.GetAsHtml;<br />
...<br />
Html := '<b>Formatted</b> text';<br />
PlainText := 'Simple Text';<br />
ClipBoard.SetAsHtml(Html, PlainText);<br />
end.<br />
</syntaxhighlight><br />
<br />
===Windows===<br />
Для обработки Html-текста в буфере обмена Windows требуется подключение заголовочных файлов.<br><br />
В то время, как раньше пользователям необходимо было делать это вручную, теперь это прозрачно делается с помощью подключения модуля ''ClipBrd''.<br><br />
<br />
==Изображения==<br />
<br />
===Загрузка из буфера обмена===<br />
<br />
<syntaxhighlight>uses <br />
Clipbrd, LCLIntf, LCLType, ...;<br />
<br />
procedure LoadBitmapFromClipboard(Bitmap: TBitmap);<br />
begin<br />
if Clipboard.HasFormat(PredefinedClipboardFormat(pcfDelphiBitmap)) then<br />
Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfDelphiBitmap));<br />
if Clipboard.HasFormat(PredefinedClipboardFormat(pcfBitmap)) then<br />
Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfBitmap));<br />
end;</syntaxhighlight><br />
<br />
===Сохранение в буфере обмена===<br />
<br />
<syntaxhighlight>uses <br />
Clipbrd, ...;<br />
<br />
procedure SaveBitmapToClipboard(Bitmap: TBitmap);<br />
begin<br />
Clipboard.Assign(Bitmap);<br />
end;</syntaxhighlight><br />
<br />
==Пользовательский формат==<br />
<br />
==Multiple objects==<br />
<br />
==Получение уведомления об изменении буфера обмена==<br />
<br />
LCL не передает сообщения Windows (передаются только сообщения WM_USER). Это означает, что вы должны написать свой обработчик сообщения.<br />
<br />
Пример кода для реализации обработчика сообщения:<br />
<br />
<syntaxhighlight>unit Unit1;<br />
<br />
{$mode delphi}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,<br />
Clipbrd, StdCtrls, Windows, Messages;<br />
<br />
type<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
procedure FormCreate(Sender: TObject);<br />
procedure FormDestroy(Sender: TObject);<br />
private<br />
FNextClipboardOwner: HWnd; // хэндл на следующий вьювер в цепочке<br />
// обработчики события буфера обмена<br />
function WMChangeCBChain(wParam: WParam; lParam: LParam):LRESULT;<br />
function WMDrawClipboard(wParam: WParam; lParam: LParam):LRESULT;<br />
public<br />
end;<br />
<br />
var<br />
Form1: TForm1;<br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
var<br />
PrevWndProc:windows.WNDPROC;<br />
<br />
function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam): LRESULT; stdcall;<br />
begin<br />
if uMsg = WM_CHANGECBCHAIN then begin<br />
Result := Form1.WMChangeCBChain(wParam, lParam);<br />
Exit;<br />
end <br />
else if uMsg=WM_DRAWCLIPBOARD then begin<br />
Result := Form1.WMDrawClipboard(wParam, lParam);<br />
Exit;<br />
end;<br />
Result := CallWindowProc(PrevWndProc, Ahwnd, uMsg, WParam, LParam);<br />
end;<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
PrevWndProc := Windows.WNDPROC(SetWindowLong(Self.Handle, GWL_WNDPROC, PtrInt(@WndCallback))); // для x64 необходимо использовать SetWindowLongPtr<br />
FNextClipboardOwner := SetClipboardViewer(Self.Handle);<br />
end;<br />
<br />
procedure TForm1.FormDestroy(Sender: TObject);<br />
begin<br />
ChangeClipboardChain(Handle, FNextClipboardOwner);<br />
end;<br />
<br />
function TForm1.WMChangeCBChain(wParam: WParam; lParam: LParam): LRESULT;<br />
var<br />
Remove, Next: THandle;<br />
begin<br />
Remove := WParam;<br />
Next := LParam;<br />
if FNextClipboardOwner = Remove then FNextClipboardOwner := Next<br />
else if FNextClipboardOwner <> 0 then<br />
SendMessage(FNextClipboardOwner, WM_ChangeCBChain, Remove, Next)<br />
end;<br />
<br />
function TForm1.WMDrawClipboard(wParam: WParam; lParam: LParam): LRESULT;<br />
begin<br />
if Clipboard.HasFormat(CF_TEXT) Then Begin<br />
ShowMessage(Clipboard.AsText);<br />
end;<br />
SendMessage(FNextClipboardOwner, WM_DRAWCLIPBOARD, 0, 0); // ВАЖНО!<br />
Result := 0;<br />
end;<br />
<br />
end.</syntaxhighlight><br />
<br />
==View the clipboard contents==<br />
<br />
Sometimes its useful to see whats actually in the clipboard at any one time. Here are a couple of methods I use, on a form with a TMemo and a one second timer to do just that - <br />
<syntaxhighlight><br />
procedure TForm1.CheckClipboard();<br />
var<br />
I : integer;<br />
List : TStringList;<br />
begin<br />
memo1.clear;<br />
Memo1.Append('[' + Clipboard.AsText + ']');<br />
List := TStringList.Create;<br />
try<br />
ClipBoard.SupportedFormats(List);<br />
for i := 0 to List.Count-1 do begin<br />
//Memo1.Append(List.Strings[i]); // uncomment to see all available formats<br />
case List.Strings[i] of // show these specific ones<br />
'Rich Text Format', 'text/plain', 'UTF8_STRING' :<br />
ReadClip(List.Strings[i]);<br />
end;<br />
end;<br />
finally<br />
List.Free;<br />
end;<br />
end;<br />
<br />
function TForm1.ReadClip(TheFormat : ANSIString) : ANSIString;<br />
var<br />
Stream: TMemoryStream;<br />
Fmt : TClipboardFormat;<br />
List : TStringList;<br />
begin<br />
if TheFormat = '' then exit;<br />
Stream := TMemoryStream.Create;<br />
List := TStringList.Create;<br />
try<br />
if Clipboard.HasFormatName(TheFormat) then begin<br />
Memo1.Append(#10+TheFormat);<br />
Fmt := ClipBoard.FindFormatID(TheFormat);<br />
ClipBoard.GetFormat(Fmt, Stream);<br />
if Stream.Size > 0 then begin<br />
Stream.Seek(0, soFromBeginning);<br />
List.LoadFromStream(Stream);<br />
Memo1.Lines.AddStrings(List, False);<br />
end;<br />
end;<br />
finally<br />
List.Free;<br />
Stream.Free;<br />
end;<br />
end;</syntaxhighlight><br />
<br />
==How to fix empty GTK2 clipboard on exit==<br />
<br />
Usually when your GTK2 app exits, it's clipboard becomes empty. Bad for usual user.<br />
This unit is a dirty fix, add it to "uses" somewhere.<br />
<br />
<syntaxhighlight><br />
unit fix_gtk_clipboard;<br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
gtk2, gdk2, Clipbrd;<br />
<br />
implementation<br />
<br />
var<br />
c: PGtkClipboard;<br />
t: string;<br />
<br />
finalization<br />
c := gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);<br />
t := Clipboard.AsText;<br />
gtk_clipboard_set_text(c, PChar(t), Length(t));<br />
gtk_clipboard_store(c);<br />
end.<br />
</syntaxhighlight><br />
<br />
In May 2018 I (dbannon) found that putting this bit of code in a finalization section did fix the problem when the clipboard contents had come from the application itself but if it was there before the application started, that is, the application did not write to the clipboard, it introduces another, similar problem. Clipboard contents are, again, cleared in that case. And appears to happen because by time the finalization clause is executed, the clipboard has already been cleared.<br />
<br />
An easy solution is to put that same code into the main form's onClose event. Its early enough that the contents, from either source are still there and late enough not to be subsequently cleared.<br />
<syntaxhighlight>uses .... {$ifdef LINUX}gtk2, gdk2, Clipbrd{$endif};<br />
.....<br />
procedure TMainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
var<br />
c: PGtkClipboard;<br />
t: string;<br />
begin<br />
{$ifdef LINUX}<br />
c := gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);<br />
t := Clipboard.AsText;<br />
gtk_clipboard_set_text(c, PChar(t), Length(t));<br />
gtk_clipboard_store(c);<br />
{$endif}<br />
end; </syntaxhighlight><br />
<br />
==Внешние ссылки==<br />
<br />
* [http://delphi.about.com/od/vclusing/a/tclipboard.htm Базовые операции для работы с буфером обмена (вырезать/скопировать/вставить) при использовании объекта TClipboard]<br />
<br />
[[Category:Russian (unfinished translation)]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Roadmap/ru&diff=119387
Roadmap/ru
2018-09-16T15:20:47Z
<p>Useroflazarus: /* Статус встроенных элементов управления в интерфейсе LCL для каждой платформы */</p>
<hr />
<div>{{Roadmap}}<br />
<br />
Этот документ дает представление о текущем состоянии различных частей '''Lazarus''', а также помогает новым участникам найти подходящее для себя направление, в котором они могут помочь. Здесь также отображаются имена людей, реализующих некоторые части для целевых платформ.<br />
<br />
__TOC__<br />
<br />
{{Template:Development Status/ru}}<br />
<br />
==Общее состояние наборов виджетов==<br />
<br />
{{Template:Widgetset Roadmap}}<br />
<br />
==Текущее состояние различных частей Lazarus==<br />
<br />
<br />
{| class="wikitable sortable"<br />
! Unit !! Item !! Состояние !! Target !! Навыки !! Ответственный !! Комментарии<br />
|---- class="working"<br />
|[[IDE]]||TCollection Editor||Работает||0.9.x||FCL, RTTI, IDE||-||A generic TCollection editor for the various TCollections in the LCL/FCL.<br />
|---- class="working"<br />
|[[IDE]]||TActionList||Работает||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[IDE]]||Doc Editor||Работает||-||fpdoc||-||The doc editor will be an integrated fpDoc editor similar to fpde. It will be a process of its own, so that it can show help for dialogs as well. It should also be able to write help for packages.<br />
|---- class="working"<br />
|[[IDE]]||Export LFM as xml||Работает||-||-||-||Load and save LFM files to XML.<br />
|---- class="partial"<br />
|[[IDE]]||[[Icon Editor Roadmap]]||в процессе||после 1.0||-||-||A simple icon editor with the ability to create lrs files. It will be a good example and can help newbies to create icons for their components.<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Borderspacing||Работает||0.9.x||-||-||for aligned controls<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Drag&Drop||Работает||||-||-||<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to Darwin Power PC, Mac OS X||Работает||0.9.x||-||-||depends on FPC 1.9.5<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to Mac OS X x86||Работает||-||-||-||depends on FPC 2.1.1<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TSplitter||Работает||0.9.x||easy||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TFindDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TReplaceDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TControl.Font||в процессе||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TTabControl||в процессе||0.9.x||-||-||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||Docking (= комбинация форм)||частично работает, в процессе||после 1.0||глубокое знание LCL и интерфейсов||Mattias||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Frames (= forms as children)||Работает||0.9.28||глубокое знание LCL||Mattias, Paul||-<br />
|---- class="working"<br />
|[[IDE]]||Visual Form Inheritence||Работает||после 1.0||IDE||Mattias||Properties are not yet propagated to open descendants<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||MDI - Multiple Documents Interfaces Putting fo ...||в процессе||1.2||глубокое знание LCL и интерфейсов||[[User:Zeljan|Zeljan]]||An MDI LCL emulator for widgetsets which does not support MDI, also native implementation of MDI for qt and win32/64. Currently only qt has full MDI support, others are in progress.<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Palette support||не реализовано||-||-||-||Required to correctly show colors on a 256 colors display<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TCoolBar||частично работает, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TControlBar||скелетная реализация для предотвращения ошибок в преобразовании из Delphi, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TMaskEdit||Работает||-||-||[[User:Bart|Bart]]||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||TDirectoryTreeView||не реализовано||-||-||-||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Constrain maximization to specific area||не реализовано||-||winapi, gtk||-||When maximizing a window, the left, top, width and height can all be constrained to a specific rectangular area on the screen/desktop. After this is done, constrain the source editor and maybe other windows<br />
|---- class="working"<br />
|Components||TIcon||Работает||0.9.26||-||Marc||-<br />
|---- class="working"<br />
|Components||CUPS Package||Работает||0.9.x||easy||-||<br />
|---- class="working"<br />
|}<br />
<br />
==Статус возможностей в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|Accelerator Keys<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не применимо<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Caret<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[Clipboard]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|Cursors<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|Drag & Drop<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[Drop files event]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|MDI Support<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Printing<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Regions<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="working"|Работает<br />
|----<br />
|TCustomControl descendents<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|Unicode Support<br />
|class="working"|Работает||class="not"|Невозможно реализовать||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[BidiMode]]<br />
|class="working"|Работает||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Application||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTimer/ru|TTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TApplication.QueueAsyncCall||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|TThread.Synchronize||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|PostMessage||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class=""unknown"|Не известно<br />
|class="working"|Работает||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|PostThreadMessage||class="working"|Работает||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="unknown"|Не известно||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="unknown"|Не известно||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус Graphics в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|TBitmap/TPixmap/TIcon/etc||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TBrush||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TFont||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TPen||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|ExtTextOut||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|}<br />
<br />
==Статус встроенных элементов управления в интерфейсе LCL для каждой платформы==<br />
Встроенные элементы управления являются потомками TWinControl, которые не происходят от TCustomControl.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBitBtn/ru|TBitBtn]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TButton/ru|TButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCalendar/ru|TCalendar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TCheckBox/ru|TCheckBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCheckGroup/ru|TCheckGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TCheckListBox/ru|TCheckListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TComboBox/ru|TComboBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TEdit/ru|TEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TForm/ru|TForm]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TGroupBox/ru|TGroupBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TIdleTimer/ru|TIdleTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TImageList/ru|TImageList]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает|| class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TListBox/ru|TListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TListView/ru|TListView]]||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TMainMenu/ru|TMainMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TMemo/ru|TMemo]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TMenuItem/ru|TMenuItem]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TPageControl/ru|TPageControl]] and [[TTabSheet/ru|TTabSheet]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPairSplitter/ru|TPairSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TPanel/ru|TPanel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPopupMenu/ru|TPopupMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TProgressBar/ru|TProgressBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TRadioButton/ru|TRadioButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TRadioGroup/ru|TRadioGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TScrollBar/ru|TScrollBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|----<br />
|[[TScrollBox/ru|TScrollBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TSpinEdit/ru|TSpinEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TSplitter/ru|TSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TStaticText/ru|TStaticText]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TStatusBar/ru|TStatusBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TToggleBox/ru|TToggleBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TTrackbar/ru|TTrackbar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTrayIcon/ru|TTrayIcon]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус диалогов в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|LCLIntf.MessageBox||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="partial"|Реализовано для Android<br />
|----<br />
|Application.MessageBox, MessageDlg, LCLIntf.PromptUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="partial"|Реализовано для Android<br />
|----<br />
|LCLIntf.AskUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|[[TColorDialog/ru|TColorDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TFontDialog/ru|TFontDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TOpenDialog/ru|TOpenDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPrinterSetupDialog/ru|TPrinterSetupDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TSaveDialog/ru|TSaveDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TCustomControl в интерфейсе LCL для каждой платформы==<br />
Обратите внимание, что будучи потомком TCustomControl не гарантирует, что элемент управления не имеет реализации widgetset. TArrow имеет его, хотя он имеет хорошую реализацию по умолчанию. TNotebook будет полностью реализована в LCL.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TArrow/ru|TArrow]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TNotebook/ru|TNoteBook]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TUpDown/ru|TUpDown]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|----<br />
|[[TStringGrid/ru|TStringGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TDrawGrid/ru|TDrawGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TToolBar/ru|TToolBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TTreeView/ru|TTreeView]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TValueListEditor/ru|TValueListEditor]]||class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TGraphicControl в интерфейсе LCL для каждой платформы==<br />
'''Примечание:''' Они предназначены для заворачивания в LCL компоненты, а '''не''' для конкретных самостоятельных функций GUI инструментария.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBevel/ru|TBevel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TLabel/ru|TLabel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано для Android<br />
|----<br />
|[[TShape/ru|TShape]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TSpeedButton/ru|TSpeedButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPaintBox/ru|TPaintBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TImage/ru|TImage]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|}<br />
<br />
==Статус LazDeviceAPIs на каждом widgetset==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! customdrawn-android<br />
|----<br />
|Accelerometer||class="working"|Работает<br />
|----<br />
|Messaging (SMS, MMS and E-Mail)||class="partial"|Реализовано SMS<br />
|----<br />
|PositionInfo||class="working"|Работает<br />
|}<br />
<br />
{{Navbar Lazarus Release Notes}}<br />
<br />
==Смотри также==<br />
<br />
*[[LCL Internals]]<br />
*[[TAChart Roadmap]]<br />
<br />
[[Category:Lazarus/ru]]<br />
[[Category:Roadmaps/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Roadmap/ru&diff=119385
Roadmap/ru
2018-09-16T15:10:23Z
<p>Useroflazarus: /* Статус диалогов в интерфейсе LCL для каждой платформы */</p>
<hr />
<div>{{Roadmap}}<br />
<br />
Этот документ дает представление о текущем состоянии различных частей '''Lazarus''', а также помогает новым участникам найти подходящее для себя направление, в котором они могут помочь. Здесь также отображаются имена людей, реализующих некоторые части для целевых платформ.<br />
<br />
__TOC__<br />
<br />
{{Template:Development Status/ru}}<br />
<br />
==Общее состояние наборов виджетов==<br />
<br />
{{Template:Widgetset Roadmap}}<br />
<br />
==Текущее состояние различных частей Lazarus==<br />
<br />
<br />
{| class="wikitable sortable"<br />
! Unit !! Item !! Состояние !! Target !! Навыки !! Ответственный !! Комментарии<br />
|---- class="working"<br />
|[[IDE]]||TCollection Editor||Работает||0.9.x||FCL, RTTI, IDE||-||A generic TCollection editor for the various TCollections in the LCL/FCL.<br />
|---- class="working"<br />
|[[IDE]]||TActionList||Работает||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[IDE]]||Doc Editor||Работает||-||fpdoc||-||The doc editor will be an integrated fpDoc editor similar to fpde. It will be a process of its own, so that it can show help for dialogs as well. It should also be able to write help for packages.<br />
|---- class="working"<br />
|[[IDE]]||Export LFM as xml||Работает||-||-||-||Load and save LFM files to XML.<br />
|---- class="partial"<br />
|[[IDE]]||[[Icon Editor Roadmap]]||в процессе||после 1.0||-||-||A simple icon editor with the ability to create lrs files. It will be a good example and can help newbies to create icons for their components.<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Borderspacing||Работает||0.9.x||-||-||for aligned controls<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Drag&Drop||Работает||||-||-||<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to Darwin Power PC, Mac OS X||Работает||0.9.x||-||-||depends on FPC 1.9.5<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to Mac OS X x86||Работает||-||-||-||depends on FPC 2.1.1<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TSplitter||Работает||0.9.x||easy||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TFindDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TReplaceDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TControl.Font||в процессе||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TTabControl||в процессе||0.9.x||-||-||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||Docking (= комбинация форм)||частично работает, в процессе||после 1.0||глубокое знание LCL и интерфейсов||Mattias||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Frames (= forms as children)||Работает||0.9.28||глубокое знание LCL||Mattias, Paul||-<br />
|---- class="working"<br />
|[[IDE]]||Visual Form Inheritence||Работает||после 1.0||IDE||Mattias||Properties are not yet propagated to open descendants<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||MDI - Multiple Documents Interfaces Putting fo ...||в процессе||1.2||глубокое знание LCL и интерфейсов||[[User:Zeljan|Zeljan]]||An MDI LCL emulator for widgetsets which does not support MDI, also native implementation of MDI for qt and win32/64. Currently only qt has full MDI support, others are in progress.<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Palette support||не реализовано||-||-||-||Required to correctly show colors on a 256 colors display<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TCoolBar||частично работает, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TControlBar||скелетная реализация для предотвращения ошибок в преобразовании из Delphi, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TMaskEdit||Работает||-||-||[[User:Bart|Bart]]||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||TDirectoryTreeView||не реализовано||-||-||-||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Constrain maximization to specific area||не реализовано||-||winapi, gtk||-||When maximizing a window, the left, top, width and height can all be constrained to a specific rectangular area on the screen/desktop. After this is done, constrain the source editor and maybe other windows<br />
|---- class="working"<br />
|Components||TIcon||Работает||0.9.26||-||Marc||-<br />
|---- class="working"<br />
|Components||CUPS Package||Работает||0.9.x||easy||-||<br />
|---- class="working"<br />
|}<br />
<br />
==Статус возможностей в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|Accelerator Keys<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не применимо<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Caret<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[Clipboard]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|Cursors<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|Drag & Drop<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[Drop files event]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|MDI Support<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Printing<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Regions<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="working"|Работает<br />
|----<br />
|TCustomControl descendents<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|Unicode Support<br />
|class="working"|Работает||class="not"|Невозможно реализовать||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[BidiMode]]<br />
|class="working"|Работает||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Application||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTimer/ru|TTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TApplication.QueueAsyncCall||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|TThread.Synchronize||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|PostMessage||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class=""unknown"|Не известно<br />
|class="working"|Работает||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|PostThreadMessage||class="working"|Работает||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="unknown"|Не известно||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="unknown"|Не известно||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус Graphics в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|TBitmap/TPixmap/TIcon/etc||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TBrush||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TFont||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TPen||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|ExtTextOut||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|}<br />
<br />
==Статус встроенных элементов управления в интерфейсе LCL для каждой платформы==<br />
Встроенные элементы управления являются потомками TWinControl, которые не происходят от TCustomControl.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBitBtn/ru|TBitBtn]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="partial"|Частично реализовано||class="partial"|Частично реализовано<br />
|----<br />
|[[TButton/ru|TButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCalendar/ru|TCalendar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TCheckBox/ru|TCheckBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCheckGroup/ru|TCheckGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TCheckListBox/ru|TCheckListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TComboBox/ru|TComboBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TEdit/ru|TEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TForm/ru|TForm]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TGroupBox/ru|TGroupBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TIdleTimer/ru|TIdleTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TImageList/ru|TImageList]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает|| class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TListBox/ru|TListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TListView/ru|TListView]]||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TMainMenu/ru|TMainMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TMemo/ru|TMemo]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TMenuItem/ru|TMenuItem]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TPageControl/ru|TPageControl]] and [[TTabSheet/ru|TTabSheet]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPairSplitter/ru|TPairSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TPanel/ru|TPanel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPopupMenu/ru|TPopupMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TProgressBar/ru|TProgressBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TRadioButton/ru|TRadioButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TRadioGroup/ru|TRadioGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TScrollBar/ru|TScrollBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|----<br />
|[[TScrollBox/ru|TScrollBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TSpinEdit/ru|TSpinEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TSplitter/ru|TSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TStaticText/ru|TStaticText]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TStatusBar/ru|TStatusBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TToggleBox/ru|TToggleBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TTrackbar/ru|TTrackbar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTrayIcon/ru|TTrayIcon]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус диалогов в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|LCLIntf.MessageBox||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="partial"|Реализовано для Android<br />
|----<br />
|Application.MessageBox, MessageDlg, LCLIntf.PromptUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="partial"|Реализовано для Android<br />
|----<br />
|LCLIntf.AskUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|[[TColorDialog/ru|TColorDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TFontDialog/ru|TFontDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TOpenDialog/ru|TOpenDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPrinterSetupDialog/ru|TPrinterSetupDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TSaveDialog/ru|TSaveDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TCustomControl в интерфейсе LCL для каждой платформы==<br />
Обратите внимание, что будучи потомком TCustomControl не гарантирует, что элемент управления не имеет реализации widgetset. TArrow имеет его, хотя он имеет хорошую реализацию по умолчанию. TNotebook будет полностью реализована в LCL.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TArrow/ru|TArrow]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TNotebook/ru|TNoteBook]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TUpDown/ru|TUpDown]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|----<br />
|[[TStringGrid/ru|TStringGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TDrawGrid/ru|TDrawGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TToolBar/ru|TToolBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TTreeView/ru|TTreeView]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TValueListEditor/ru|TValueListEditor]]||class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TGraphicControl в интерфейсе LCL для каждой платформы==<br />
'''Примечание:''' Они предназначены для заворачивания в LCL компоненты, а '''не''' для конкретных самостоятельных функций GUI инструментария.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBevel/ru|TBevel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TLabel/ru|TLabel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано для Android<br />
|----<br />
|[[TShape/ru|TShape]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TSpeedButton/ru|TSpeedButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPaintBox/ru|TPaintBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TImage/ru|TImage]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|}<br />
<br />
==Статус LazDeviceAPIs на каждом widgetset==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! customdrawn-android<br />
|----<br />
|Accelerometer||class="working"|Работает<br />
|----<br />
|Messaging (SMS, MMS and E-Mail)||class="partial"|Реализовано SMS<br />
|----<br />
|PositionInfo||class="working"|Работает<br />
|}<br />
<br />
{{Navbar Lazarus Release Notes}}<br />
<br />
==Смотри также==<br />
<br />
*[[LCL Internals]]<br />
*[[TAChart Roadmap]]<br />
<br />
[[Category:Lazarus/ru]]<br />
[[Category:Roadmaps/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Roadmap/ru&diff=119384
Roadmap/ru
2018-09-16T15:07:01Z
<p>Useroflazarus: /* Статус элементов управления на основе TCustomControl в интерфейсе LCL для каждой платформы */</p>
<hr />
<div>{{Roadmap}}<br />
<br />
Этот документ дает представление о текущем состоянии различных частей '''Lazarus''', а также помогает новым участникам найти подходящее для себя направление, в котором они могут помочь. Здесь также отображаются имена людей, реализующих некоторые части для целевых платформ.<br />
<br />
__TOC__<br />
<br />
{{Template:Development Status/ru}}<br />
<br />
==Общее состояние наборов виджетов==<br />
<br />
{{Template:Widgetset Roadmap}}<br />
<br />
==Текущее состояние различных частей Lazarus==<br />
<br />
<br />
{| class="wikitable sortable"<br />
! Unit !! Item !! Состояние !! Target !! Навыки !! Ответственный !! Комментарии<br />
|---- class="working"<br />
|[[IDE]]||TCollection Editor||Работает||0.9.x||FCL, RTTI, IDE||-||A generic TCollection editor for the various TCollections in the LCL/FCL.<br />
|---- class="working"<br />
|[[IDE]]||TActionList||Работает||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[IDE]]||Doc Editor||Работает||-||fpdoc||-||The doc editor will be an integrated fpDoc editor similar to fpde. It will be a process of its own, so that it can show help for dialogs as well. It should also be able to write help for packages.<br />
|---- class="working"<br />
|[[IDE]]||Export LFM as xml||Работает||-||-||-||Load and save LFM files to XML.<br />
|---- class="partial"<br />
|[[IDE]]||[[Icon Editor Roadmap]]||в процессе||после 1.0||-||-||A simple icon editor with the ability to create lrs files. It will be a good example and can help newbies to create icons for their components.<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Borderspacing||Работает||0.9.x||-||-||for aligned controls<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Drag&Drop||Работает||||-||-||<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to Darwin Power PC, Mac OS X||Работает||0.9.x||-||-||depends on FPC 1.9.5<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Port to Mac OS X x86||Работает||-||-||-||depends on FPC 2.1.1<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TSplitter||Работает||0.9.x||easy||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TFindDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TReplaceDialog||Работает||-||-||-||Реализовано в 0.9.16<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TControl.Font||в процессе||0.9.x||-||-||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TTabControl||в процессе||0.9.x||-||-||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||Docking (= комбинация форм)||частично работает, в процессе||после 1.0||глубокое знание LCL и интерфейсов||Mattias||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||Frames (= forms as children)||Работает||0.9.28||глубокое знание LCL||Mattias, Paul||-<br />
|---- class="working"<br />
|[[IDE]]||Visual Form Inheritence||Работает||после 1.0||IDE||Mattias||Properties are not yet propagated to open descendants<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||MDI - Multiple Documents Interfaces Putting fo ...||в процессе||1.2||глубокое знание LCL и интерфейсов||[[User:Zeljan|Zeljan]]||An MDI LCL emulator for widgetsets which does not support MDI, also native implementation of MDI for qt and win32/64. Currently only qt has full MDI support, others are in progress.<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Palette support||не реализовано||-||-||-||Required to correctly show colors on a 256 colors display<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TCoolBar||частично работает, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="partial"<br />
|[[LCL/ru|LCL]]||TControlBar||скелетная реализация для предотвращения ошибок в преобразовании из Delphi, в процессе||после 1.0||LCL and anchoring||[[User:JuhaManninen|Juha]]||-<br />
|---- class="working"<br />
|[[LCL/ru|LCL]]||TMaskEdit||Работает||-||-||[[User:Bart|Bart]]||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||TDirectoryTreeView||не реализовано||-||-||-||-<br />
|---- class="not"<br />
|[[LCL/ru|LCL]]||Constrain maximization to specific area||не реализовано||-||winapi, gtk||-||When maximizing a window, the left, top, width and height can all be constrained to a specific rectangular area on the screen/desktop. After this is done, constrain the source editor and maybe other windows<br />
|---- class="working"<br />
|Components||TIcon||Работает||0.9.26||-||Marc||-<br />
|---- class="working"<br />
|Components||CUPS Package||Работает||0.9.x||easy||-||<br />
|---- class="working"<br />
|}<br />
<br />
==Статус возможностей в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|Accelerator Keys<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не применимо<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Caret<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[Clipboard]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|Cursors<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|Drag & Drop<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[Drop files event]]<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не применимо<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|MDI Support<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Printing<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Regions<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="working"|Работает<br />
|----<br />
|TCustomControl descendents<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|Unicode Support<br />
|class="working"|Работает||class="not"|Невозможно реализовать||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[BidiMode]]<br />
|class="working"|Работает||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|Application||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTimer/ru|TTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TApplication.QueueAsyncCall||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|TThread.Synchronize||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|PostMessage||class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|class="unknown"|Не известно||class="working"|Работает||class=""unknown"|Не известно<br />
|class="working"|Работает||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|PostThreadMessage||class="working"|Работает||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="unknown"|Не известно||class="unknown"|Не известно||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="unknown"|Не известно||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус Graphics в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|TBitmap/TPixmap/TIcon/etc||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TBrush||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TFont||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|TPen||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|ExtTextOut||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="working"|Работает<br />
|}<br />
<br />
==Статус встроенных элементов управления в интерфейсе LCL для каждой платформы==<br />
Встроенные элементы управления являются потомками TWinControl, которые не происходят от TCustomControl.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBitBtn/ru|TBitBtn]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="partial"|Частично реализовано||class="partial"|Частично реализовано<br />
|----<br />
|[[TButton/ru|TButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCalendar/ru|TCalendar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TCheckBox/ru|TCheckBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TCheckGroup/ru|TCheckGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TCheckListBox/ru|TCheckListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TComboBox/ru|TComboBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TEdit/ru|TEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TForm/ru|TForm]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TGroupBox/ru|TGroupBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TIdleTimer/ru|TIdleTimer]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TImageList/ru|TImageList]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает|| class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TListBox/ru|TListBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TListView/ru|TListView]]||class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TMainMenu/ru|TMainMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TMemo/ru|TMemo]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TMenuItem/ru|TMenuItem]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано в Android<br />
|----<br />
|[[TPageControl/ru|TPageControl]] and [[TTabSheet/ru|TTabSheet]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPairSplitter/ru|TPairSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TPanel/ru|TPanel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPopupMenu/ru|TPopupMenu]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TProgressBar/ru|TProgressBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TRadioButton/ru|TRadioButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TRadioGroup/ru|TRadioGroup]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="partial"|Частично реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TScrollBar/ru|TScrollBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|----<br />
|[[TScrollBox/ru|TScrollBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TSpinEdit/ru|TSpinEdit]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TSplitter/ru|TSplitter]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TStaticText/ru|TStaticText]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TStatusBar/ru|TStatusBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TToggleBox/ru|TToggleBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TTrackbar/ru|TTrackbar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TTrayIcon/ru|TTrayIcon]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус диалогов в интерфейсе LCL для каждой платформы==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|LCLIntf.MessageBox||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="partial"|Частично реализовано||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="partial"|Реализовано для Android<br />
|----<br />
|Application.MessageBox, MessageDlg, LCLIntf.PromptUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="unknown"|Не известно||class="partial"|Реализовано для Android<br />
|----<br />
|LCLIntf.AskUser||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="unknown"|Не известно||class="not"|Не реализовано<br />
|----<br />
|[[TColorDialog/ru|TColorDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TFontDialog/ru|TFontDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TOpenDialog/ru|TOpenDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TPrinterSetupDialog/ru|TPrinterSetupDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TSaveDialog/ru|TSaveDialog]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TCustomControl в интерфейсе LCL для каждой платформы==<br />
Обратите внимание, что будучи потомком TCustomControl не гарантирует, что элемент управления не имеет реализации widgetset. TArrow имеет его, хотя он имеет хорошую реализацию по умолчанию. TNotebook будет полностью реализована в LCL.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TArrow/ru|TArrow]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TNotebook/ru|TNoteBook]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TUpDown/ru|TUpDown]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="not"|Не реализовано||class="partial"|Частично реализовано<br />
|----<br />
|[[TStringGrid/ru|TStringGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TDrawGrid/ru|TDrawGrid]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="unknown"|Не известно<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|----<br />
|[[TToolBar/ru|TToolBar]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|----<br />
|[[TTreeView/ru|TTreeView]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="working"|Работает<br />
|class="not"|Не реализовано||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TValueListEditor/ru|TValueListEditor]]||class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="partial"|Частично реализовано||class="partial"|Частично реализовано<br />
|class="partial"|Частично реализовано||class="not"|Не реализовано||class="not"|Не реализовано<br />
|}<br />
<br />
==Статус элементов управления на основе TGraphicControl в интерфейсе LCL для каждой платформы==<br />
'''Примечание:''' Они предназначены для заворачивания в LCL компоненты, а '''не''' для конкретных самостоятельных функций GUI инструментария.<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! win32 !! gtk !! gtk2 !! carbon !! qt !! wince !! fpgui !! cocoa !! customdrawn<br />
|----<br />
|[[TBevel/ru|TBevel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="not"|Не реализовано<br />
|----<br />
|[[TLabel/ru|TLabel]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Реализовано для Android<br />
|----<br />
|[[TShape/ru|TShape]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="partial"|Частично реализовано||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TSpeedButton/ru|TSpeedButton]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TPaintBox/ru|TPaintBox]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="unknown"|Не известно<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|----<br />
|[[TImage/ru|TImage]]||class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|class="working"|Работает||class="working"|Работает||class="partial"|Частично реализовано<br />
|class="working"|Работает||class="working"|Работает||class="working"|Работает<br />
|}<br />
<br />
==Статус LazDeviceAPIs на каждом widgetset==<br />
<br />
{| class="wikitable sortable"<br />
! Компонент !! customdrawn-android<br />
|----<br />
|Accelerometer||class="working"|Работает<br />
|----<br />
|Messaging (SMS, MMS and E-Mail)||class="partial"|Реализовано SMS<br />
|----<br />
|PositionInfo||class="working"|Работает<br />
|}<br />
<br />
{{Navbar Lazarus Release Notes}}<br />
<br />
==Смотри также==<br />
<br />
*[[LCL Internals]]<br />
*[[TAChart Roadmap]]<br />
<br />
[[Category:Lazarus/ru]]<br />
[[Category:Roadmaps/ru]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Clipboard/ru&diff=119383
Clipboard/ru
2018-09-16T14:54:35Z
<p>Useroflazarus: /* Получение уведомления об изменении буфера обмена */</p>
<hr />
<div>{{Clipboard}}<br />
<br><br />
<br><br />
__TOC__<br />
==Предопределенные типы==<br />
<br />
{| class="wikitable sortable"<br />
! TPredefinedClipboardFormat !! тип MIME<br />
|-<br />
| pcfText || text/plain<br />
|-<br />
| pcfBitmap || image/bmp<br />
|-<br />
| pcfPixmap || image/xpm<br />
|-<br />
| pcfIcon || image/lcl.icon<br />
|-<br />
| pcfPicture || image/lcl.picture<br />
|-<br />
| pcfObject || application/lcl.object<br />
|-<br />
| pcfComponent || application/lcl.component<br />
|-<br />
| pcfCustomData || application/lcl.customdata<br />
|-<br />
| pcfDelphiText || text/plain<br />
|-<br />
| pcfDelphiBitmap || text/delphi.bitmap<br />
|-<br />
| pcfDelphiPicture || Delphi picture<br />
|-<br />
| pcfDelphiMetaFilePict || image/delphimetafilepict<br />
|-<br />
| pcfDelphiObject || application/delphi.object<br />
|-<br />
| pcfDelphiComponent || Delphi component<br />
|-<br />
| pcfKylixPicture || image/delphi.picture<br />
|-<br />
| pcfKylixBitmap || image/delphi.bitmap<br />
|-<br />
| pcfKylixDrawing || image/delphi.drawing<br />
|-<br />
| pcfKylixComponent || application/delphi.component<br />
|}<br />
<br />
==Текст==<br />
<br />
Для использования с простым текстом объект '''Clipboard''' предоставляет свойство ''AsText'', которое может быть использовано для чтения и записи текста.<br />
<br />
Запись текста:<br />
<syntaxhighlight>Clipboard.AsText := 'Hello clipboard!';</syntaxhighlight><br />
<br />
Чтение текста:<br />
<syntaxhighlight>ShowMessage('Clipboard content: ' + Clipboard.AsText);</syntaxhighlight><br />
<br />
'''Clipboard''' является объектом класса '''TClipboard''' и для его использования необходимо подключить модуль ''Clipbrd'' в разделе ''uses'':<br />
<br />
<syntaxhighlight>uses<br />
..., Clipbrd;</syntaxhighlight><br />
<br />
==Текстовые элементы управления==<br />
<br />
Некоторые визуальные компоненты, такие как [[TEdit/ru|TEdit]], [[TMemo/ru|TMemo]], [[TStringGrid/ru|TStringGrid]], [[TLabeledEdit/ru|TLabeledEdit]], [[TMaskEdit/ru|TMaskEdit]], [[TSpinEdit/ru|TSpinEdit]] и [[TFloatSpinEdit/ru|TFloatSpinEdit]] обладают возможностью выделения части текста, находящегося в них, и предоставляют дополнительные функциональные возможности для выделенного текста при работе с буфером обмена. <br />
<br />
<syntaxhighlight> procedure CopyToClipboard; <br />
procedure CutToClipboard; <br />
procedure PasteFromClipboard;</syntaxhighlight><br />
<br />
==Текст в формате HTML==<br />
<br />
Объект '''ClipBoard''' поддерживает чтение и запись текста в формате HTML.<br />
<br />
Пример чтения из буфера обмена и записи в буфер обмена текста в формате HTML:<br />
<syntaxhighlight>uses<br />
Clipbrd, ...;<br />
var<br />
Html, PlainText: String;<br />
...<br />
begin<br />
Html := ClipBoard.GetAsHtml;<br />
...<br />
Html := '<b>Formatted</b> text';<br />
PlainText := 'Simple Text';<br />
ClipBoard.SetAsHtml(Html, PlainText);<br />
end.<br />
</syntaxhighlight><br />
<br />
===Windows===<br />
Для обработки Html-текста в буфере обмена Windows требуется подключение заголовочных файлов.<br><br />
В то время, как раньше пользователям необходимо было делать это вручную, теперь это прозрачно делается с помощью подключения модуля ''ClipBrd''.<br><br />
<br />
==Изображения==<br />
<br />
===Загрузка из буфера обмена===<br />
<br />
<syntaxhighlight>uses <br />
Clipbrd, LCLIntf, LCLType, ...;<br />
<br />
procedure LoadBitmapFromClipboard(Bitmap: TBitmap);<br />
begin<br />
if Clipboard.HasFormat(PredefinedClipboardFormat(pcfDelphiBitmap)) then<br />
Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfDelphiBitmap));<br />
if Clipboard.HasFormat(PredefinedClipboardFormat(pcfBitmap)) then<br />
Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfBitmap));<br />
end;</syntaxhighlight><br />
<br />
===Сохранение в буфере обмена===<br />
<br />
<syntaxhighlight>uses <br />
Clipbrd, ...;<br />
<br />
procedure SaveBitmapToClipboard(Bitmap: TBitmap);<br />
begin<br />
Clipboard.Assign(Bitmap);<br />
end;</syntaxhighlight><br />
<br />
==Пользовательский формат==<br />
<br />
==Multiple objects==<br />
<br />
==Получение уведомления об изменении буфера обмена==<br />
<br />
LCL не передает сообщения Windows (передаются только сообщения WM_USER). Это означает, что вы должны написать свой обработчик сообщения.<br />
<br />
Пример кода для реализации обработчика сообщения:<br />
<br />
<syntaxhighlight>unit Unit1;<br />
<br />
{$mode delphi}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,<br />
Clipbrd, StdCtrls, Windows, Messages;<br />
<br />
type<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
procedure FormCreate(Sender: TObject);<br />
procedure FormDestroy(Sender: TObject);<br />
private<br />
FNextClipboardOwner: HWnd; // хэндл на следующий вьювер в цепочке<br />
// обработчики события буфера обмена<br />
function WMChangeCBChain(wParam: WParam; lParam: LParam):LRESULT;<br />
function WMDrawClipboard(wParam: WParam; lParam: LParam):LRESULT;<br />
public<br />
end;<br />
<br />
var<br />
Form1: TForm1;<br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
var<br />
PrevWndProc:windows.WNDPROC;<br />
<br />
function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam): LRESULT; stdcall;<br />
begin<br />
if uMsg = WM_CHANGECBCHAIN then begin<br />
Result := Form1.WMChangeCBChain(wParam, lParam);<br />
Exit;<br />
end <br />
else if uMsg=WM_DRAWCLIPBOARD then begin<br />
Result := Form1.WMDrawClipboard(wParam, lParam);<br />
Exit;<br />
end;<br />
Result := CallWindowProc(PrevWndProc, Ahwnd, uMsg, WParam, LParam);<br />
end;<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
PrevWndProc := Windows.WNDPROC(SetWindowLong(Self.Handle, GWL_WNDPROC, PtrInt(@WndCallback))); // для x64 необходимо использовать SetWindowLongPtr<br />
FNextClipboardOwner := SetClipboardViewer(Self.Handle);<br />
end;<br />
<br />
procedure TForm1.FormDestroy(Sender: TObject);<br />
begin<br />
ChangeClipboardChain(Handle, FNextClipboardOwner);<br />
end;<br />
<br />
function TForm1.WMChangeCBChain(wParam: WParam; lParam: LParam): LRESULT;<br />
var<br />
Remove, Next: THandle;<br />
begin<br />
Remove := WParam;<br />
Next := LParam;<br />
if FNextClipboardOwner = Remove then FNextClipboardOwner := Next<br />
else if FNextClipboardOwner <> 0 then<br />
SendMessage(FNextClipboardOwner, WM_ChangeCBChain, Remove, Next)<br />
end;<br />
<br />
function TForm1.WMDrawClipboard(wParam: WParam; lParam: LParam): LRESULT;<br />
begin<br />
if Clipboard.HasFormat(CF_TEXT) Then Begin<br />
ShowMessage(Clipboard.AsText);<br />
end;<br />
SendMessage(FNextClipboardOwner, WM_DRAWCLIPBOARD, 0, 0); // ВАЖНО!<br />
Result := 0;<br />
end;<br />
<br />
end.</syntaxhighlight><br />
<br />
==View the clipboard contents==<br />
<br />
Sometimes its useful to see whats actually in the clipboard at any one time. Here are a couple of methods I use, on a form with a TMemo and a one second timer to do just that - <br />
<syntaxhighlight><br />
procedure TForm1.CheckClipboard();<br />
var<br />
I : integer;<br />
List : TStringList;<br />
begin<br />
memo1.clear;<br />
Memo1.Append('[' + Clipboard.AsText + ']');<br />
List := TStringList.Create;<br />
try<br />
ClipBoard.SupportedFormats(List);<br />
for i := 0 to List.Count-1 do begin<br />
//Memo1.Append(List.Strings[i]); // uncomment to see all available formats<br />
case List.Strings[i] of // show these specific ones<br />
'Rich Text Format', 'text/plain', 'UTF8_STRING' :<br />
ReadClip(List.Strings[i]);<br />
end;<br />
end;<br />
finally<br />
List.Free;<br />
end;<br />
end;<br />
<br />
function TForm1.ReadClip(TheFormat : ANSIString) : ANSIString;<br />
var<br />
Stream: TMemoryStream;<br />
Fmt : TClipboardFormat;<br />
List : TStringList;<br />
begin<br />
if TheFormat = '' then exit;<br />
Stream := TMemoryStream.Create;<br />
List := TStringList.Create;<br />
try<br />
if Clipboard.HasFormatName(TheFormat) then begin<br />
Memo1.Append(#10+TheFormat);<br />
Fmt := ClipBoard.FindFormatID(TheFormat);<br />
ClipBoard.GetFormat(Fmt, Stream);<br />
if Stream.Size > 0 then begin<br />
Stream.Seek(0, soFromBeginning);<br />
List.LoadFromStream(Stream);<br />
Memo1.Lines.AddStrings(List, False);<br />
end;<br />
end;<br />
finally<br />
List.Free;<br />
Stream.Free;<br />
end;<br />
end;</syntaxhighlight><br />
<br />
==How to fix empty GTK2 clipboard on exit==<br />
<br />
Usually when your GTK2 app exits, it's clipboard becomes empty. Bad for usual user.<br />
This unit is a dirty fix, add it to "uses" somewhere.<br />
<br />
<syntaxhighlight><br />
unit fix_gtk_clipboard;<br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
gtk2, gdk2, Clipbrd;<br />
<br />
implementation<br />
<br />
var<br />
c: PGtkClipboard;<br />
t: string;<br />
<br />
finalization<br />
c := gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);<br />
t := Clipboard.AsText;<br />
gtk_clipboard_set_text(c, PChar(t), Length(t));<br />
gtk_clipboard_store(c);<br />
end.<br />
</syntaxhighlight><br />
<br />
In May 2018 I (dbannon) found that putting this bit of code in a finalization section did fix the problem when the clipboard contents had come from the application itself but if it was there before the application started, that is, the application did not write to the clipboard, it introduces another, similar problem. Clipboard contents are, again, cleared in that case. And appears to happen because by time the finalization clause is executed, the clipboard has already been cleared.<br />
<br />
An easy solution is to put that same code into the main form's onClose event. Its early enough that the contents, from either source are still there and late enough not to be subsequently cleared.<br />
<syntaxhighlight>uses .... {$ifdef LINUX}gtk2, gdk2, Clipbrd{$endif};<br />
.....<br />
procedure TMainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
var<br />
c: PGtkClipboard;<br />
t: string;<br />
begin<br />
{$ifdef LINUX}<br />
c := gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);<br />
t := Clipboard.AsText;<br />
gtk_clipboard_set_text(c, PChar(t), Length(t));<br />
gtk_clipboard_store(c);<br />
{$endif}<br />
end; </syntaxhighlight><br />
<br />
==External links==<br />
<br />
* [http://delphi.about.com/od/vclusing/a/tclipboard.htm Basic Clipboard Operations (Cut/Copy/Paste) using the TClipboard object]<br />
<br />
[[Category:Russian (unfinished translation)]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Clipboard/ru&diff=119382
Clipboard/ru
2018-09-16T14:37:15Z
<p>Useroflazarus: /* Windows */</p>
<hr />
<div>{{Clipboard}}<br />
<br><br />
<br><br />
__TOC__<br />
==Предопределенные типы==<br />
<br />
{| class="wikitable sortable"<br />
! TPredefinedClipboardFormat !! тип MIME<br />
|-<br />
| pcfText || text/plain<br />
|-<br />
| pcfBitmap || image/bmp<br />
|-<br />
| pcfPixmap || image/xpm<br />
|-<br />
| pcfIcon || image/lcl.icon<br />
|-<br />
| pcfPicture || image/lcl.picture<br />
|-<br />
| pcfObject || application/lcl.object<br />
|-<br />
| pcfComponent || application/lcl.component<br />
|-<br />
| pcfCustomData || application/lcl.customdata<br />
|-<br />
| pcfDelphiText || text/plain<br />
|-<br />
| pcfDelphiBitmap || text/delphi.bitmap<br />
|-<br />
| pcfDelphiPicture || Delphi picture<br />
|-<br />
| pcfDelphiMetaFilePict || image/delphimetafilepict<br />
|-<br />
| pcfDelphiObject || application/delphi.object<br />
|-<br />
| pcfDelphiComponent || Delphi component<br />
|-<br />
| pcfKylixPicture || image/delphi.picture<br />
|-<br />
| pcfKylixBitmap || image/delphi.bitmap<br />
|-<br />
| pcfKylixDrawing || image/delphi.drawing<br />
|-<br />
| pcfKylixComponent || application/delphi.component<br />
|}<br />
<br />
==Текст==<br />
<br />
Для использования с простым текстом объект '''Clipboard''' предоставляет свойство ''AsText'', которое может быть использовано для чтения и записи текста.<br />
<br />
Запись текста:<br />
<syntaxhighlight>Clipboard.AsText := 'Hello clipboard!';</syntaxhighlight><br />
<br />
Чтение текста:<br />
<syntaxhighlight>ShowMessage('Clipboard content: ' + Clipboard.AsText);</syntaxhighlight><br />
<br />
'''Clipboard''' является объектом класса '''TClipboard''' и для его использования необходимо подключить модуль ''Clipbrd'' в разделе ''uses'':<br />
<br />
<syntaxhighlight>uses<br />
..., Clipbrd;</syntaxhighlight><br />
<br />
==Текстовые элементы управления==<br />
<br />
Некоторые визуальные компоненты, такие как [[TEdit/ru|TEdit]], [[TMemo/ru|TMemo]], [[TStringGrid/ru|TStringGrid]], [[TLabeledEdit/ru|TLabeledEdit]], [[TMaskEdit/ru|TMaskEdit]], [[TSpinEdit/ru|TSpinEdit]] и [[TFloatSpinEdit/ru|TFloatSpinEdit]] обладают возможностью выделения части текста, находящегося в них, и предоставляют дополнительные функциональные возможности для выделенного текста при работе с буфером обмена. <br />
<br />
<syntaxhighlight> procedure CopyToClipboard; <br />
procedure CutToClipboard; <br />
procedure PasteFromClipboard;</syntaxhighlight><br />
<br />
==Текст в формате HTML==<br />
<br />
Объект '''ClipBoard''' поддерживает чтение и запись текста в формате HTML.<br />
<br />
Пример чтения из буфера обмена и записи в буфер обмена текста в формате HTML:<br />
<syntaxhighlight>uses<br />
Clipbrd, ...;<br />
var<br />
Html, PlainText: String;<br />
...<br />
begin<br />
Html := ClipBoard.GetAsHtml;<br />
...<br />
Html := '<b>Formatted</b> text';<br />
PlainText := 'Simple Text';<br />
ClipBoard.SetAsHtml(Html, PlainText);<br />
end.<br />
</syntaxhighlight><br />
<br />
===Windows===<br />
Для обработки Html-текста в буфере обмена Windows требуется подключение заголовочных файлов.<br><br />
В то время, как раньше пользователям необходимо было делать это вручную, теперь это прозрачно делается с помощью подключения модуля ''ClipBrd''.<br><br />
<br />
==Изображения==<br />
<br />
===Загрузка из буфера обмена===<br />
<br />
<syntaxhighlight>uses <br />
Clipbrd, LCLIntf, LCLType, ...;<br />
<br />
procedure LoadBitmapFromClipboard(Bitmap: TBitmap);<br />
begin<br />
if Clipboard.HasFormat(PredefinedClipboardFormat(pcfDelphiBitmap)) then<br />
Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfDelphiBitmap));<br />
if Clipboard.HasFormat(PredefinedClipboardFormat(pcfBitmap)) then<br />
Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfBitmap));<br />
end;</syntaxhighlight><br />
<br />
===Сохранение в буфере обмена===<br />
<br />
<syntaxhighlight>uses <br />
Clipbrd, ...;<br />
<br />
procedure SaveBitmapToClipboard(Bitmap: TBitmap);<br />
begin<br />
Clipboard.Assign(Bitmap);<br />
end;</syntaxhighlight><br />
<br />
==Пользовательский формат==<br />
<br />
==Multiple objects==<br />
<br />
==Получение уведомления об изменении буфера обмена==<br />
<br />
The LCL does not pass on Windows messages. It only passes on messages > WM_USER. This means you have to write your own message handler. [http://wiki.lazarus.freepascal.org/Win32/64_Interface#Processing_non-user_messages_in_your_window Processing non - user messages in your window]<br />
<br />
Sample code to implement message handler:<br />
<br />
<syntaxhighlight>unit Unit1;<br />
<br />
{$mode delphi}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,<br />
Clipbrd, StdCtrls, Windows, Messages;<br />
<br />
type<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
procedure FormCreate(Sender: TObject);<br />
procedure FormDestroy(Sender: TObject);<br />
private<br />
FNextClipboardOwner: HWnd; // handle to the next viewer<br />
// Here are the clipboard event handlers<br />
function WMChangeCBChain(wParam: WParam; lParam: LParam):LRESULT;<br />
function WMDrawClipboard(wParam: WParam; lParam: LParam):LRESULT;<br />
public<br />
end;<br />
<br />
var<br />
Form1: TForm1;<br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
var<br />
PrevWndProc:windows.WNDPROC;<br />
<br />
function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam;<br />
lParam: LParam): LRESULT; stdcall;<br />
begin<br />
if uMsg = WM_CHANGECBCHAIN then begin<br />
Result := Form1.WMChangeCBChain(wParam, lParam);<br />
Exit;<br />
end <br />
else if uMsg=WM_DRAWCLIPBOARD then begin<br />
Result := Form1.WMDrawClipboard(wParam, lParam);<br />
Exit;<br />
end;<br />
Result := CallWindowProc(PrevWndProc, Ahwnd, uMsg, WParam, LParam);<br />
end;<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
PrevWndProc := Windows.WNDPROC(SetWindowLong(Self.Handle, GWL_WNDPROC, PtrInt(@WndCallback)));<br />
FNextClipboardOwner := SetClipboardViewer(Self.Handle);<br />
end;<br />
<br />
procedure TForm1.FormDestroy(Sender: TObject);<br />
begin<br />
ChangeClipboardChain(Handle, FNextClipboardOwner);<br />
end;<br />
<br />
function TForm1.WMChangeCBChain(wParam: WParam; lParam: LParam): LRESULT;<br />
var<br />
Remove, Next: THandle;<br />
begin<br />
Remove := WParam;<br />
Next := LParam;<br />
if FNextClipboardOwner = Remove then FNextClipboardOwner := Next<br />
else if FNextClipboardOwner <> 0 then<br />
SendMessage(FNextClipboardOwner, WM_ChangeCBChain, Remove, Next)<br />
end;<br />
<br />
function TForm1.WMDrawClipboard(wParam: WParam; lParam: LParam): LRESULT;<br />
begin<br />
if Clipboard.HasFormat(CF_TEXT) Then Begin<br />
ShowMessage(Clipboard.AsText);<br />
end;<br />
SendMessage(FNextClipboardOwner, WM_DRAWCLIPBOARD, 0, 0); // VERY IMPORTANT<br />
Result := 0;<br />
end;<br />
<br />
end.</syntaxhighlight><br />
<br />
==View the clipboard contents==<br />
<br />
Sometimes its useful to see whats actually in the clipboard at any one time. Here are a couple of methods I use, on a form with a TMemo and a one second timer to do just that - <br />
<syntaxhighlight><br />
procedure TForm1.CheckClipboard();<br />
var<br />
I : integer;<br />
List : TStringList;<br />
begin<br />
memo1.clear;<br />
Memo1.Append('[' + Clipboard.AsText + ']');<br />
List := TStringList.Create;<br />
try<br />
ClipBoard.SupportedFormats(List);<br />
for i := 0 to List.Count-1 do begin<br />
//Memo1.Append(List.Strings[i]); // uncomment to see all available formats<br />
case List.Strings[i] of // show these specific ones<br />
'Rich Text Format', 'text/plain', 'UTF8_STRING' :<br />
ReadClip(List.Strings[i]);<br />
end;<br />
end;<br />
finally<br />
List.Free;<br />
end;<br />
end;<br />
<br />
function TForm1.ReadClip(TheFormat : ANSIString) : ANSIString;<br />
var<br />
Stream: TMemoryStream;<br />
Fmt : TClipboardFormat;<br />
List : TStringList;<br />
begin<br />
if TheFormat = '' then exit;<br />
Stream := TMemoryStream.Create;<br />
List := TStringList.Create;<br />
try<br />
if Clipboard.HasFormatName(TheFormat) then begin<br />
Memo1.Append(#10+TheFormat);<br />
Fmt := ClipBoard.FindFormatID(TheFormat);<br />
ClipBoard.GetFormat(Fmt, Stream);<br />
if Stream.Size > 0 then begin<br />
Stream.Seek(0, soFromBeginning);<br />
List.LoadFromStream(Stream);<br />
Memo1.Lines.AddStrings(List, False);<br />
end;<br />
end;<br />
finally<br />
List.Free;<br />
Stream.Free;<br />
end;<br />
end;</syntaxhighlight><br />
<br />
==How to fix empty GTK2 clipboard on exit==<br />
<br />
Usually when your GTK2 app exits, it's clipboard becomes empty. Bad for usual user.<br />
This unit is a dirty fix, add it to "uses" somewhere.<br />
<br />
<syntaxhighlight><br />
unit fix_gtk_clipboard;<br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
gtk2, gdk2, Clipbrd;<br />
<br />
implementation<br />
<br />
var<br />
c: PGtkClipboard;<br />
t: string;<br />
<br />
finalization<br />
c := gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);<br />
t := Clipboard.AsText;<br />
gtk_clipboard_set_text(c, PChar(t), Length(t));<br />
gtk_clipboard_store(c);<br />
end.<br />
</syntaxhighlight><br />
<br />
In May 2018 I (dbannon) found that putting this bit of code in a finalization section did fix the problem when the clipboard contents had come from the application itself but if it was there before the application started, that is, the application did not write to the clipboard, it introduces another, similar problem. Clipboard contents are, again, cleared in that case. And appears to happen because by time the finalization clause is executed, the clipboard has already been cleared.<br />
<br />
An easy solution is to put that same code into the main form's onClose event. Its early enough that the contents, from either source are still there and late enough not to be subsequently cleared.<br />
<syntaxhighlight>uses .... {$ifdef LINUX}gtk2, gdk2, Clipbrd{$endif};<br />
.....<br />
procedure TMainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
var<br />
c: PGtkClipboard;<br />
t: string;<br />
begin<br />
{$ifdef LINUX}<br />
c := gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);<br />
t := Clipboard.AsText;<br />
gtk_clipboard_set_text(c, PChar(t), Length(t));<br />
gtk_clipboard_store(c);<br />
{$endif}<br />
end; </syntaxhighlight><br />
<br />
==External links==<br />
<br />
* [http://delphi.about.com/od/vclusing/a/tclipboard.htm Basic Clipboard Operations (Cut/Copy/Paste) using the TClipboard object]<br />
<br />
[[Category:Russian (unfinished translation)]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Clipboard/ru&diff=119337
Clipboard/ru
2018-09-14T18:08:37Z
<p>Useroflazarus: </p>
<hr />
<div>{{Clipboard}}<br />
<br><br />
<br><br />
__TOC__<br />
==Предопределенные типы==<br />
<br />
{| class="wikitable sortable"<br />
! TPredefinedClipboardFormat !! тип MIME<br />
|-<br />
| pcfText || text/plain<br />
|-<br />
| pcfBitmap || image/bmp<br />
|-<br />
| pcfPixmap || image/xpm<br />
|-<br />
| pcfIcon || image/lcl.icon<br />
|-<br />
| pcfPicture || image/lcl.picture<br />
|-<br />
| pcfObject || application/lcl.object<br />
|-<br />
| pcfComponent || application/lcl.component<br />
|-<br />
| pcfCustomData || application/lcl.customdata<br />
|-<br />
| pcfDelphiText || text/plain<br />
|-<br />
| pcfDelphiBitmap || text/delphi.bitmap<br />
|-<br />
| pcfDelphiPicture || Delphi picture<br />
|-<br />
| pcfDelphiMetaFilePict || image/delphimetafilepict<br />
|-<br />
| pcfDelphiObject || application/delphi.object<br />
|-<br />
| pcfDelphiComponent || Delphi component<br />
|-<br />
| pcfKylixPicture || image/delphi.picture<br />
|-<br />
| pcfKylixBitmap || image/delphi.bitmap<br />
|-<br />
| pcfKylixDrawing || image/delphi.drawing<br />
|-<br />
| pcfKylixComponent || application/delphi.component<br />
|}<br />
<br />
==Текст==<br />
<br />
Для использования с простым текстом объект '''Clipboard''' предоставляет свойство ''AsText'', которое может быть использовано для чтения и записи текста.<br />
<br />
Запись текста:<br />
<syntaxhighlight>Clipboard.AsText := 'Hello clipboard!';</syntaxhighlight><br />
<br />
Чтение текста:<br />
<syntaxhighlight>ShowMessage('Clipboard content: ' + Clipboard.AsText);</syntaxhighlight><br />
<br />
'''Clipboard''' является объектом класса '''TClipboard''' и для его использования необходимо подключить модуль ''Clipbrd'' в разделе ''uses'':<br />
<br />
<syntaxhighlight>uses<br />
..., Clipbrd;</syntaxhighlight><br />
<br />
==Текстовые элементы управления==<br />
<br />
Некоторые визуальные компоненты, такие как [[TEdit/ru|TEdit]], [[TMemo/ru|TMemo]], [[TStringGrid/ru|TStringGrid]], [[TLabeledEdit/ru|TLabeledEdit]], [[TMaskEdit/ru|TMaskEdit]], [[TSpinEdit/ru|TSpinEdit]] и [[TFloatSpinEdit/ru|TFloatSpinEdit]] обладают возможностью выделения части текста, находящегося в них, и предоставляют дополнительные функциональные возможности для выделенного текста при работе с буфером обмена. <br />
<br />
<syntaxhighlight> procedure CopyToClipboard; <br />
procedure CutToClipboard; <br />
procedure PasteFromClipboard;</syntaxhighlight><br />
<br />
==Текст в формате HTML==<br />
<br />
Объект '''ClipBoard''' поддерживает чтение и запись текста в формате HTML.<br />
<br />
Пример чтения из буфера обмена и записи в буфер обмена текста в формате HTML:<br />
<syntaxhighlight>uses<br />
Clipbrd, ...;<br />
var<br />
Html, PlainText: String;<br />
...<br />
begin<br />
Html := ClipBoard.GetAsHtml;<br />
...<br />
Html := '<b>Formatted</b> text';<br />
PlainText := 'Simple Text';<br />
ClipBoard.SetAsHtml(Html, PlainText);<br />
end.<br />
</syntaxhighlight><br />
<br />
===Windows===<br />
Handling Html content on the clipboard in Windows requires fidling with headers on Windows.<br><br />
While in the past users had to do this manually, this now is handled transparently by the ClipBrd unit.<br><br />
<br />
==Изображения==<br />
<br />
===Загрузка из буфера обмена===<br />
<br />
<syntaxhighlight>uses <br />
Clipbrd, LCLIntf, LCLType, ...;<br />
<br />
procedure LoadBitmapFromClipboard(Bitmap: TBitmap);<br />
begin<br />
if Clipboard.HasFormat(PredefinedClipboardFormat(pcfDelphiBitmap)) then<br />
Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfDelphiBitmap));<br />
if Clipboard.HasFormat(PredefinedClipboardFormat(pcfBitmap)) then<br />
Bitmap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfBitmap));<br />
end;</syntaxhighlight><br />
<br />
===Сохранение в буфере обмена===<br />
<br />
<syntaxhighlight>uses <br />
Clipbrd, ...;<br />
<br />
procedure SaveBitmapToClipboard(Bitmap: TBitmap);<br />
begin<br />
Clipboard.Assign(Bitmap);<br />
end;</syntaxhighlight><br />
<br />
==Пользовательский формат==<br />
<br />
==Multiple objects==<br />
<br />
==Получение уведомления об изменении буфера обмена==<br />
<br />
The LCL does not pass on Windows messages. It only passes on messages > WM_USER. This means you have to write your own message handler. [http://wiki.lazarus.freepascal.org/Win32/64_Interface#Processing_non-user_messages_in_your_window Processing non - user messages in your window]<br />
<br />
Sample code to implement message handler:<br />
<br />
<syntaxhighlight>unit Unit1;<br />
<br />
{$mode delphi}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,<br />
Clipbrd, StdCtrls, Windows, Messages;<br />
<br />
type<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
procedure FormCreate(Sender: TObject);<br />
procedure FormDestroy(Sender: TObject);<br />
private<br />
FNextClipboardOwner: HWnd; // handle to the next viewer<br />
// Here are the clipboard event handlers<br />
function WMChangeCBChain(wParam: WParam; lParam: LParam):LRESULT;<br />
function WMDrawClipboard(wParam: WParam; lParam: LParam):LRESULT;<br />
public<br />
end;<br />
<br />
var<br />
Form1: TForm1;<br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
var<br />
PrevWndProc:windows.WNDPROC;<br />
<br />
function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam;<br />
lParam: LParam): LRESULT; stdcall;<br />
begin<br />
if uMsg = WM_CHANGECBCHAIN then begin<br />
Result := Form1.WMChangeCBChain(wParam, lParam);<br />
Exit;<br />
end <br />
else if uMsg=WM_DRAWCLIPBOARD then begin<br />
Result := Form1.WMDrawClipboard(wParam, lParam);<br />
Exit;<br />
end;<br />
Result := CallWindowProc(PrevWndProc, Ahwnd, uMsg, WParam, LParam);<br />
end;<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
PrevWndProc := Windows.WNDPROC(SetWindowLong(Self.Handle, GWL_WNDPROC, PtrInt(@WndCallback)));<br />
FNextClipboardOwner := SetClipboardViewer(Self.Handle);<br />
end;<br />
<br />
procedure TForm1.FormDestroy(Sender: TObject);<br />
begin<br />
ChangeClipboardChain(Handle, FNextClipboardOwner);<br />
end;<br />
<br />
function TForm1.WMChangeCBChain(wParam: WParam; lParam: LParam): LRESULT;<br />
var<br />
Remove, Next: THandle;<br />
begin<br />
Remove := WParam;<br />
Next := LParam;<br />
if FNextClipboardOwner = Remove then FNextClipboardOwner := Next<br />
else if FNextClipboardOwner <> 0 then<br />
SendMessage(FNextClipboardOwner, WM_ChangeCBChain, Remove, Next)<br />
end;<br />
<br />
function TForm1.WMDrawClipboard(wParam: WParam; lParam: LParam): LRESULT;<br />
begin<br />
if Clipboard.HasFormat(CF_TEXT) Then Begin<br />
ShowMessage(Clipboard.AsText);<br />
end;<br />
SendMessage(FNextClipboardOwner, WM_DRAWCLIPBOARD, 0, 0); // VERY IMPORTANT<br />
Result := 0;<br />
end;<br />
<br />
end.</syntaxhighlight><br />
<br />
==View the clipboard contents==<br />
<br />
Sometimes its useful to see whats actually in the clipboard at any one time. Here are a couple of methods I use, on a form with a TMemo and a one second timer to do just that - <br />
<syntaxhighlight><br />
procedure TForm1.CheckClipboard();<br />
var<br />
I : integer;<br />
List : TStringList;<br />
begin<br />
memo1.clear;<br />
Memo1.Append('[' + Clipboard.AsText + ']');<br />
List := TStringList.Create;<br />
try<br />
ClipBoard.SupportedFormats(List);<br />
for i := 0 to List.Count-1 do begin<br />
//Memo1.Append(List.Strings[i]); // uncomment to see all available formats<br />
case List.Strings[i] of // show these specific ones<br />
'Rich Text Format', 'text/plain', 'UTF8_STRING' :<br />
ReadClip(List.Strings[i]);<br />
end;<br />
end;<br />
finally<br />
List.Free;<br />
end;<br />
end;<br />
<br />
function TForm1.ReadClip(TheFormat : ANSIString) : ANSIString;<br />
var<br />
Stream: TMemoryStream;<br />
Fmt : TClipboardFormat;<br />
List : TStringList;<br />
begin<br />
if TheFormat = '' then exit;<br />
Stream := TMemoryStream.Create;<br />
List := TStringList.Create;<br />
try<br />
if Clipboard.HasFormatName(TheFormat) then begin<br />
Memo1.Append(#10+TheFormat);<br />
Fmt := ClipBoard.FindFormatID(TheFormat);<br />
ClipBoard.GetFormat(Fmt, Stream);<br />
if Stream.Size > 0 then begin<br />
Stream.Seek(0, soFromBeginning);<br />
List.LoadFromStream(Stream);<br />
Memo1.Lines.AddStrings(List, False);<br />
end;<br />
end;<br />
finally<br />
List.Free;<br />
Stream.Free;<br />
end;<br />
end;</syntaxhighlight><br />
<br />
==How to fix empty GTK2 clipboard on exit==<br />
<br />
Usually when your GTK2 app exits, it's clipboard becomes empty. Bad for usual user.<br />
This unit is a dirty fix, add it to "uses" somewhere.<br />
<br />
<syntaxhighlight><br />
unit fix_gtk_clipboard;<br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
gtk2, gdk2, Clipbrd;<br />
<br />
implementation<br />
<br />
var<br />
c: PGtkClipboard;<br />
t: string;<br />
<br />
finalization<br />
c := gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);<br />
t := Clipboard.AsText;<br />
gtk_clipboard_set_text(c, PChar(t), Length(t));<br />
gtk_clipboard_store(c);<br />
end.<br />
</syntaxhighlight><br />
<br />
In May 2018 I (dbannon) found that putting this bit of code in a finalization section did fix the problem when the clipboard contents had come from the application itself but if it was there before the application started, that is, the application did not write to the clipboard, it introduces another, similar problem. Clipboard contents are, again, cleared in that case. And appears to happen because by time the finalization clause is executed, the clipboard has already been cleared.<br />
<br />
An easy solution is to put that same code into the main form's onClose event. Its early enough that the contents, from either source are still there and late enough not to be subsequently cleared.<br />
<syntaxhighlight>uses .... {$ifdef LINUX}gtk2, gdk2, Clipbrd{$endif};<br />
.....<br />
procedure TMainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
var<br />
c: PGtkClipboard;<br />
t: string;<br />
begin<br />
{$ifdef LINUX}<br />
c := gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);<br />
t := Clipboard.AsText;<br />
gtk_clipboard_set_text(c, PChar(t), Length(t));<br />
gtk_clipboard_store(c);<br />
{$endif}<br />
end; </syntaxhighlight><br />
<br />
==External links==<br />
<br />
* [http://delphi.about.com/od/vclusing/a/tclipboard.htm Basic Clipboard Operations (Cut/Copy/Paste) using the TClipboard object]<br />
<br />
[[Category:Tutorials/ru]]<br />
[[Category:Russian (unfinished translation)]]</div>
Useroflazarus
https://wiki.freepascal.org/index.php?title=Template:Clipboard&diff=119336
Template:Clipboard
2018-09-14T17:52:45Z
<p>Useroflazarus: </p>
<hr />
<div><small> <br />
[[Clipboard/de|'''{{#language:de}} (de)''']] |<br />
[[Clipboard|'''{{#language:en}} (en)''']] |<br />
[[Clipboard/hu|'''{{#language:hu}} (hu)''']] |<br />
[[Clipboard/ru|'''{{#language:ru}} (ru)''']]<br />
</small></div>
Useroflazarus