Почему бы не использовать UTF8String в Lazarus?
Кратко: потому что FCL не использует его.
Исчерпывающе:
UTF8String определен в модуле system как
UTF8String = type AnsiString(CP_UTF8);
Компилятор всегда предполагает, что он имеет кодировку UTF-8 (CP_UTF8), которая является многобайтовой кодировкой (то есть 1-4 байта на кодовую точку)
Обратите внимание, что оператор [] обращается к байтам, а не к символам или кодовым точкам. То же самое для UnicodeString, но только слова вместо байтов.
С другой стороны, предполагается, что String во время компиляции имеет DefaultSystemCodePage (CP_ACP)
DefaultSystemCodePage определяется во время выполнения, поэтому компилятор консервативно полагает, что String и UTF8String имеют разные кодировки. Когда вы присваиваете или комбинируете String и UTF8String, компилятор вставляет код преобразования. То же самое для ShortString и UTF8String.
Lazarus использует FCL, который использует String, поэтому использование UTF8String добавит конверсии. Если DefaultSystemCodePage не UTF-8, вы теряете символы. Если это UTF-8, то нет смысла использовать UTF8String.
UTF8String станет полезным, когда в конце концов появится FCL UTF-16.
Как НЕ надо делать рерайт текста
Есть несколько типичных ошибок начинающего рерайтера.
- Выбор сложных тематик. Может показаться, что если вы переписываете текст с исходника, то вам необязательно разбираться в тематике. Попробуйте перефразировать SEO-мем: «LSI – это просто сингулярное разложение терм-документной матрицы». Если вы не математик и не сеошник, то вам придется хорошенько погуглить и долго вникать в суть. Чтобы таких ситуаций не возникало, выбирайте либо простые темы, либо темы, которые хорошо вам знакомы.
- Превращение текста в несвязный набор слов. Повышение уникальности текста никак не отменяет того факта, что он должен быть полезным и легко читаемым. Не забывайте, что статьи в интернете пишутся в первую очередь для людей, а не для роботов. Еще раз: ваши заказчики и покупатели – люди, как и посетители их сайтов.
- Избыток воды. Под «водой» здесь подразумеваются лишние, бесполезные слова и словосочетания, которые не несут в себе особого смысла. Например, у вас может возникнуть соблазн уникализировать предложение как-то так: «В современном мире выполнять рерайтинг (переписывание своими словами с сохранением смысла) текста чрезвычайно сложно». Жирным выделена чушь, от которой нужно избавляться. Если вы пишете что-то подобное, то не удивляйтесь, когда получите отрицательный отзыв.
- Использование неуместных слов и выражений. Здесь подразумевается все, что может усложнить чтение и / или понимание текста человеку, либо сбить его с толку. Например, категорически противопоказано употребление всяких «книжных словечек» типа «коррелирует», «импрессивный», «аутентичность» и прочих в этом духе. Большая часть людей встречает эти слова крайне редко. Поэтому лучше не строить из себя доктора наук, а использовать более понятные синонимы, чтобы вас понимали даже дети.
- Автоматический синонимайзинг. Интернет полон программ и сайтов, которые делают текст уникальным автоматически. Но у них есть одна беда: на выходе получается настолько бредовая чушь, что из глаз течет кровь. Я хочу сказать, взгляните на это: На картинке авто-рерайт первого абзаца этой страницы. Красным выделены синонимы, которые придумала программа. Очевидно, что автоматически генерированный синонимайз требует серьезной постобработки, с которой вы намучаетесь, будьте уверены.
- Продажа удаленных текстов под видом рерайта. Есть в сети специальный сервис, который хранит кэшированные копии множества сайтов – веб-архив. Некоторые хитрые ленивые «рерайтеры» додумались брать оттуда тексты с удаленных источников, а потом продавать их на биржах копирайтинга. Делать этого не нужно. Во-первых, вы не один такой «умный», и текст в любой момент может потерять уникальность. Во-вторых, тексты из веб-архива практически бесполезны для сайтов, а иногда даже вредны. Поисковики помнят домен, на котором текст был размещен впервые, даже если сайт уже давно снесли.
- Замена кириллицы латиницей. Подмешивать в русский текст английские буквы – это самая глупая глупость, какую можно придумать, и она не нова. Такая попытка обмана легко распознается, потому что неправильно написанные слова сегодня подчеркивает красной волнистой линией почти каждое текстовое поле. За подобные махинации вы гарантировано вылетите с любой биржи копирайтинга.
- Написание чисел прописью. Избитый и грязный прием, когда рерайтер вместо «42» пишет «сорок два». Так делать нехорошо. То же касается замены римских цифр арабскими и наоборот. Да, вы можете написать «жил в конце 17-го века» или «заказал II пиццы на ужин», но так не принято. Вряд ли вас за это похвалят.
Если вы хотите научиться писать рерайт качественно, не делайте того, что описано выше. Не жертвуйте интересами читателя в пользу уникальности, но ищите обоюдовыгодный компромисс.
Как создать новую таблицу базы данных
Поскольку для Lazarus нет приложения наподобии «Database Desktop», мы должны создать новую базу данных в коде.
Установка пути
Хорошей мыслью будет выделение для базы данных Вашего приложения собственного каталога. Это упростит резервирование данных. Есть два варианта установки пути. Вы можете установить полный путь используя свойство FilePathFull, или установить путь относительно пути приложения с помощью свойства FilePath. Нипример, установка «FilePath» во время выполнения к «data/» будет использовать субдиректорию data только в директории исполнимого файла. Установка свойства «FilePathFull» к «/var/data/» будет размещать точно по указанному пути, игнорируя расположение приложения.
Выбор TableLevel
По умолчанию, TDbf создает таблицы dBase IV. Хотя это и наиболее совместимо, некоторые возможности, которые Вам могут понадобиться, не поддерживаются. Для поддержки автоинкрементных полей вы должны использовать кое-что поновее. Типы таблиц могут быть следующими::
- 3 dBase III+
- 4 dBase IV
- 7 Visual dBase VII
- 25 FoxPro
Вы выбираете тип таблицы установкой свойства TableLevel соответственно.
Добавление полей
Создание полей для Вашей новой таблицы во время выполнения в большинстве следует старому стандарту Delphi. Как только вы установили свои значения для свойств FilePath, TableLevel, и TableName, манипулируйте свойством FieldDefs чтобы определить структуру. Например:
MyDbf.FilePathFull := '/location/to/my/data'; MyDbf.TableLevel := 7; MyDbf.TableName := 'customers.dbf'; // примечание: действительно ли необходимо .dbf? With MyDbf.FieldDefs do begin Add('Id', ftAutoInc, 0, True); Add('Name', ftString, 80, True); End;
Типы полей определены как:
- ftUnknown
- ftString
- ftSmallInt
- ftInteger
- ftWord
- ftBoolean
- ftFloat
- ftCurrency (TableLevel 25)
- ftBCD (TableLevel 25)
- ftDate
- ftTime
- ftDateTime
- ftBytes (TableLevel 25)
- ftVarBytes
- ftAutoInc (TableLevel 7 or 25)
- ftBlob
- ftMemo
- ftGraphic
- ftFmtMemo
- ftParadoxOle
- ftDBaseOle
- ftTypedBinary
- ftCursor
- ftFixedChar
- ftWideString
- ftLargeInt
- ftADT
- ftArray
- ftReference
- ftDataSet
- ftOraBlob
- ftOraClob
- ftVariant
- ftInterface
- ftIDispatch
- ftGuid
- ftTimeStamp
- ftFMTBcd
Выделенные жирным типы полей поддерживаются
Идем дальше и создаем!
Как только вы определили поля, которые желаете использовать в вашей новой таблице, вы можете идти дальше и создать таблицу:
MyDbf.CreateTable;
Создаём TEXT в Delphi без единой строчки кода!
Прежде всего сборка проекта, после внедрение FastReport c компонентом “экспорт в Text file”, реализовываем отчёт, запускаем, нажимаем в предпросмотре “сохранить” и вызываем экспорт из предпросмотра (ниже покажу, как реализовать запись в TEXT с помощью кода Delphi). Появляется окошко настроек экспорта в TEXT.
Какие страницы нашего документа отправить в Excel, диапазон или только определённые страницы.Настройки экспорта – переносить ли из отчёта разрывы страниц, делать ли рамку для отчета , добавлять ли пустые строки (после каждой строки отчета), использование OEM кодировки (по умолчанию используется Windows кодировка).Как и всегда можно указать, куда отправить TEXT-файл (локально в файл, на электронную почту, FTP или поместить в облако).
Открыть после экспорта – результирующий файл будет открыт сразу же после экспорта программой, которая стоит по умолчанию для открытия TEXT-документов (Блокнот, TextEditor).
Манифест
В каждом расширении для браузера должен быть манифест — документ, в котором написано:
- как называется расширение;
- к чему расширение может получить доступ;
- какие скрипты будут работать в фоне;
- как должна выглядеть иконка расширения;
- что показать или что выполнить, когда пользователь нажмёт на иконку расширения.
Манифест задаёт общие правила для всего расширения, поэтому манифест — единственный обязательный компонент. Можно обойтись без иконок и скриптов, но манифест обязательно должен быть.Каждый манифест хранится в файле — создадим пустой файл с таким именем и напишем внутри такое:
Первые две строчки — это название и подробное описание расширения. Третья отвечает за номер версии расширения, а последняя говорит браузеру, какая версия манифеста используется в описании. На момент выхода статьи в феврале 2021 года используется третья версия.
Сохраняем файл и всё, расширение готово. Оно ничего не умеет, ничего не делает, зато мы уже можем добавить его в браузер. Для этого запускаем Хром и в адресной строке пишем:
Мы попадаем на страницу, которая нам покажет все установленные расширения:
Чтобы добавить своё расширение, в правом верхнем углу включаем режим разработчика, а затем нажимаем «Загрузить распакованное расширение»:
Теперь выбираем папку, в которой лежит наш манифест:
Отлично, мы только что добавили в браузер новое расширение:
Теперь мы можем обновлять наш манифест, класть в ту же папку дополнительные файлы, а для обновления в браузере достаточно будет нажать на круглую стрелку на карточке расширения.
Чтобы было проще работать и тестировать расширение, закрепим его на панели браузера:
Формат Open Document
Собственно, для тех, кто имеет хотя бы общие представления об устройстве XML-файла, не составит особого труда разобраться и с форматом Open Document.
Дело в том, что любой документ из OpenOffice (текстовый, таблица, презентация, формула) представляет собой простой zip-архив внутри которого содержаться XML-файлы, каждый из которых содержит какую-либо информацию о документе.
Более того, само содержание и расположение файлов в архиве чертовски напоминает мне сайты на narod.ru :). Вот, например, содержимое файа *.odt в котором содержится всего одна строка по центру страницы – “hello world”
Тут, наверное, разберется даже ребенок, что основное содержимое документа располагается в файле content.xml. Посмотрим, как выглядит наша строка Hello world”. Открываем файл в браузере и видим:
Всё те же знакомые узлы XML и не менее знакомые атрибуты типа center и пр.
Получается следующее. Если необходимо создавать документы по какому-либо шаблону (что мне наиболее часто и приходится делать), то достаточно накидать шаблон документа и распакавать его в какую-либо папку, затем уже в своей программе открыть нужный xml-файл, изменить и запокавать обратно в zip-архив, но с расширением файла Open Document. И никаких тебе OLE и т.д. и т.п. Организуется всё элементарно и без каких-либо сторонних компонентов.
Если же Вам требуется разрабатывать документы какого-нибудь уникального содержания, то тут Вам, как ни крути, придётся с головой окунуться в документацию по Open Document Format.
Итак, первый шаг к разработке кроссплатформенного проекта сделан – определились с форматами документов и в общих чертах представляем себе алгоритм работы.
Остается решить вопрос с тем, как паковать документ? Использоать dll, какой-либо компонент или обойтись тем, что есть в Lazarus?
Файлы Lazarus
Исходный архив Lazarus содержится в одном каталоге. Вы можете просто скомпилировать Lazarus (см. Инструкции по установке), и будет создано множество файлов и подкаталогов, но все они будут ниже этого единственного подкаталога.
Экземпляр Lazarus (исходники и ресурсы) представляет собой один подкаталог. Просто скопируйте этот каталог, и вы получите совершенно новый экземпляр Lazarus.
Вам не нужно устанавливать Lazarus, чтобы запустить его. Но если вы действительно установите Lazarus, вы получите несколько хороших ярлыков на рабочем столе, и некоторые типы файлов (например, lpk, lpi, pas) связаны с этой установкой Lazarus. Эти вещи зависят от платформы. На самом деле Lazarus не более одного установленного, второстепенные копии просто «там».
Более новые установщики поддерживают установку Lazarus несколько раз. В качестве альтернативы, вы также можете легко добавить еще один экземпляр Lazarus вручную. Конечно, ассоциации файлов и т.д. могут быть связаны только с одним экземпляром Lazarus.
Linux
Найдите 2015 год для Linux 64 bit в DualLaz.
Пример 1: Нормально установленный Lazarus плюс SVN версия
Скачайте и установите пакеты Lazarus debian- и .rpm- как обычно.
Затем загрузите svn-архив Lazarus’а в каталог по вашему выбору, желательно где-нибудь в вашем домашнем каталоге (например, ~/lazarus). См. здесь .
Запустите свой дополнительно установленный Lazarus с :
/home/you/lazarus/startlazarus --pcp=~/.lazarus2nd
Пример 2: нормально установленный экземпляр Lazarus плюс копия вручную
то есть вы получаете две подкаталога:
/usr/lib/lazarus оригинал через установку Debian /home/you/lazarus вторичная копия
или вы можете посмотреть на:
/home/you/development/lazarus оригинал установленный через fpcUP /home/you/lazarus вторичная копия
Скачайте и установите Debian-пакеты Lazarus как обычно.
Затем скопируйте каталог Lazarus в свой домашний каталог и измените владельца файлов:
cp -a /usr/lib/lazarus $(HOME)/ chown $USER:$USER -R $(HOME)/lazarus
Примечание: Строка chown предполагает, что ваша группа имеет то же имя, что и ваше имя пользователя. Если нет, замените $USER:$USER на ваши username:groupname
Теперь измените ярлык на рабочем столе/в меню Lazarus, чтобы запустить дополнительно установленную копию
/home/you/lazarus/startlazarus --pcp=~/.lazarus2nd
Затем запустите среду IDE и измените параметры среды: Tools(Сервис) -> Options(Параметры) -> Environment(Окружение) / Lazarus directory(каталог Lazarus) на вторичный подкаталог, а именно
/home/you/lazarus
В последних версиях Lazarus вам также предоставляется окно для обозначения других важных путей, поэтому вы можете указать вторичные подкаталоги во втором конфигурационном файле.
Кроме того, в /home/you/development/fpc/bin/x86_64-linux/’fpc.cfg ‘все пути должны указывать на вашу дополнительную копию.
Чтобы убедиться, что все в порядке, запустите startlazarus изнутри xterm и посмотрите сообщения об ошибках. убедитесь, что все пути найдены (очень сложно в настоящее время).
Теперь у вас есть дополнительная копия, которую вы можете редактировать и перекомпилировать. Не забудьте закрыть исходные файлы первичного /usr/lib/lazarus.
Windows
Example 1: SVN и Release
Это должно быть справедливо как SVN, так и для релизной версии Lazarus.
1) Установите последний релиз Lazarus и проверьте опцию установки ‘create desktop shortcut'(создать ярлык на рабочем столе), вы получите ‘Lazarus.lnk’ на рабочем столе.
2) Скачайте Lazarus из SVN и скомпилируйте, затем создайте ярлык на рабочем столе для ‘lazarus.exe’ и переименуйте его в ‘Lazarus SVN.lnk’.
Затем вы можете установить директорию config для каждой версии, редактируя путь к исполняемому файлу:
Это для релиза, потому что вы не изменяете параметр основного пути конфигурации, конфигурация будет сохранена в пути по умолчанию:
C\lazarus\startlazarus.exe
Для SVN сохраните настройки, например, в папке ‘C:\lazsvncfg\’:
C\FPC\laz\startlazarus.exe --primary-config-path=C:\lazsvncfg
Усовершенствование mycom.pas
- Код в mycom.pas выше дает вам основы того, что вам нужно для создания компонента. Далее приведена усовершенствованная версия с некоторыми советами о том, как писать процедуры и события для компонентов.
- OnChange2 показывает, как создавать события.
- OnSample показывает, как создавать пользовательские события.
- MyText и MyText2 показывает различные способы записи свойств.
- Вы можете использовать TComboBox вместо TCustomComboBox в качестве базового класса, который публичными все свойства как TComboBox.
- Если TCustomComboBox используется в качестве базового класса, вы заметите, что в Инспекторе объектов IDE будет отсутствовать множество свойств и событий. Чтобы добавить эти свойства и события, просто скопируйте и вставьте свойства, перечисленные ниже // properties from TComboBox. Этот список свойств можно получить из объявления TComboBox в модуле StdCtrls. Исключите любое свойство, которое вы хотите самостоятельно.
unit mycom; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, Forms, Dialogs, LCLType,LCLIntf,lresources,LCLProc; type TSampleEvent = procedure(MyText String) of Object; TMyCom = class (TCustomComboBox) private FMyText String; FOnChange2 TNotifyEvent; FOnSample TSampleEvent; public constructor Create(TheOwner TComponent); override; procedure CreateWnd; override; procedure Change; override; protected function GetMyText2 String; procedure SetMyText2(MyText String); published property MyText String read FMyText write FMyText; property MyText2 String read GetMyText2 write SetMyText2; property OnChange2 TNotifyEvent read FOnChange2 write FOnChange2; property OnSample TSampleEvent read FOnSample write FOnSample; // properties from TComboBox property Align; property Anchors; property ArrowKeysTraverseList; property AutoComplete; property AutoCompleteText; property AutoDropDown; property AutoSelect; property AutoSize; property BidiMode; property BorderSpacing; property CharCase; property Color; property Ctl3D; property Constraints; property DragCursor; property DragMode; property DropDownCount; property Enabled; property Font; property ItemHeight; property ItemIndex; property Items; property ItemWidth; property MaxLength; property OnChange; property OnChangeBounds; property OnClick; property OnCloseUp; property OnContextPopup; property OnDblClick; property OnDragDrop; property OnDragOver; property OnDrawItem; property OnEndDrag; property OnDropDown; property OnEditingDone; property OnEnter; property OnExit; property OnGetItems; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnMeasureItem; property OnMouseDown; property OnMouseMove; property OnMouseUp; property OnStartDrag; property OnSelect; property OnUTF8KeyPress; property ParentBidiMode; property ParentColor; property ParentCtl3D; property ParentFont; property ParentShowHint; property PopupMenu; property ReadOnly; property ShowHint; property Sorted; property Style; property TabOrder; property TabStop; property Text; property Visible; end; procedure Register; implementation procedure Register; begin RegisterComponents('Sample',TMyCom]); end; constructor TMyCom.Create(TheOwner TComponent); begin inherited Create(TheOwner); Self.Style := csDropDownList; end; procedure TMyCom.CreateWnd; begin inherited CreateWnd; Items.Assign(Screen.Fonts); end; procedure TMyCom.Change; begin inherited; if Assigned(FOnChange2) then FOnChange2(Self); if Assigned(FOnSample) then FOnSample(FMyText); end; function TMyCom.GetMyText2 String; begin Result:=FMyText; end; procedure TMyCom.SetMyText2(MyText String); begin FMyText:=MyText; end; initialization {$I samplepackage.lrs} end.
Также вы заметите, что в Инспекторе объектов IDE существуют некоторые необъявленные и, возможно, нежелательные элементы.
Чтобы удалить те из них, которые вам не нужны, вы можете переобъявить их в разделе Published как простые переменные. Например:
Published ... property Height Integer; property Width Integer; ...
Lazarus и dBase
Вы можете также посетить TDbf Страница руководства.
Компонент TDbf имеет преимущество перед другими компонентами баз данных, т.к. не требует никаких внешних библиотек, однако это не самая лучшая идея для больших приложений баз данных.
Компонент очень удобен в применении. Просто поместите TDbf на свою форму, установите путь к каталогу, в котором будут Ваши файлы базы данных, задайте название таблицы, и свяжите его с Вашим компонентом TDatasource.
Реальная программа требует немного большего усилия, как бы то ни было. Если таблица ещё не существует, то Вы должны будете её создать программно до открытия.
Примечание: Версия OpenOffice 2.0x и выше содержит OpenOffice Base, которое может создать dbf файлы более дружественным способом.
Попытка открыть несуществующую таблицу вызовет ошибку. Таблицы могут быть созданы программно через компонент после того, как во время выполнения будут заданы путь и название таблицы.
Например, чтобы создать таблицу с названием «dvds», чтобы сохранить Вашу dvd коллекцию, Вы поместите компонент на свою форму, установите во время выполнения путь к каталогу с базой и установите название таблицы в «dvds». Получающийся файл будет назван «dvds.dbf».
В свой код вставьте такие строки:
Dbf1.FilePathFull := '/path/to/my/database'; Dbf1.TableName := 'dvds'; With Dbf1.FieldDefs do begin Add('Name', ftString, 80, True); Add('Description', ftMemo, , False); Add('Rating', ftString, 5, False); end; Dbf1.CreateTable;
Когда этот код будет выполнен, cоздасться таблица коллекции DVD. После этого данные можно будет отображать в компонентах просмотра данных, связав их через TDatasource с этим компонентом.
Добавление индексов является немного отличным от типичного TTable. Это должно быть сделано после того, как база данных открыта. Этот же метод используется и для того, чтобы перестроить индексы. Например:
Dbf1.Exclusive := True; Dbf1.Open; Dbf1.AddIndex('dvdsname','Name',ixPrimary, ixUnique, ixCaseInsensitive]); Dbf1.AddIndex('rating.ndx', 'Rating', ixCaseInsensitive]); Dbf1.Close;
Первичный индекс будет файлом с названием «dvdsname.mdx», а второй будет файл с названием «rating.ndx». Однако в базе данных с множеством таблиц, Вы должны позаботиться об уникальности имени файлов индексов.
Примечание. Для версий dBase, которые поддерживают несколько индексов в одном файле, расширение в имени индекса указывать не надо, только имя индекса. Тогда все индексы будут созданы в одном файле с названием таким же, как и имя таблицы, но с расширением «.mdx».
Для того, чтобы указать конкретную версию таблицы, нужно задать свойство TDbf.TableLevel.
Поиск и отображение набора данных
В этом примере я хочу найти в базе данных книг все названия, у которых есть автор
и затем отобразить список в мемобоксе:
Dbf1.FilePathFull := '/home/somelocatio/database_location/'; // путь к базе данных Dbf1.TableName := 'books.dbase'; // файл таблицы, включая расширение DbF1.Open; memo1.Clear; // очистка мемобокса Dbf1.FilterOptions := foCaseInsensitive; Df1.Filter := 'AU=' + QuotedStr('anauthor'); // AU это поле, где содержится имя автора Dbf1.Filtered := true; // Включаем фильтрование Dbf1.First; // Переходим в начало отфильтрованных данных while not dbf1.EOF do // В цикле проходим весь полученый набор данных begin memo1.Append(Dbf1.FieldByName('TI').AsString); //TI это поле названий dbf1.next; // Переход на следующую запись end; Dbf1.Close;
Заметьте, что Вы можете использовать Ddf1.findfirst, чтобы перейти на первую запись в отфильтрованном наборе, затем используйте
Dbf1.next, чтобы перемещаться по данным. Я нашел, что использование Dbf1.Findnext подвешивает программуь.
Обзор
Что нам понадобится
Этот документ был написан с версией Free Pascal Compiler 2.3.1 /Lazarus 0.9.23.
Пакет DbfLaz установлен по умолчанию.
Что обеспечивает TDbf
TDbf обеспечивает доступ к таблицам баз данных dBase и FoxPro для Lazarus (и других IDE),
учитывая чтение, запись и создание dBase III +, dBase IV, Visual dBase VII и FoxPro таблиц. Все это делается без использования дополнительных библиотек или движков базы данных. Просто разместите компонент TDbf на вашей форме, и Вы имеете мгновенный доступ в окружающей среде базы данных на разных платформах. TDbf работает и в Windows и в Linux используя Лазарус.
Пользовательские параметры
Обычно вы определяете здесь некоторые параметры компилятора. Например, вы можете определить в режиме сборки что-то вроде
-dRELEASE
Затем в режиме сборки будет скомпилирован только код, окруженный {$IFDEF RELEASE} {$ENDIF}. Это можно использовать в качестве альтернативы системе Macro, особенно если вы «переехали» с Delphi.
Пробелы в начале и в конце удаляются. Разрывы строк заменяются пробелом перед передачей компилятору. Ведущий пробел добавляется автоматически.
Среда IDE заменяет макросы IDE в пользовательских параметрах и анализирует параметры. Флаги, такие как -dRelease, передаются в codetools, поэтому редактор исходного кода знает их немедленно.
Предупреждение: Не добавляйте параметры пути -Fu, -Fi, -Fl, -FU, -o. Вместо этого используйте поля на странице . Среда IDE игнорирует пути в пользовательских параметрах. Она не обновляет их при добавлении или удалении файлов или при открытии проекта на другом хосте.
Zlibar
Скачать архив можно здесь. Дата последнего изменения на SourceForge – 2012-02-24.
Распаковываем архив в удобное место, открываем в Lazarus файл пакета “zlibar_package.lpk” и жмем “Компилировать”:
Компиляция на Lazarus 2.0.8 прошла успешно. Попробуем протестировать zlibar на предмет работы с zip-архивами в Lazarus. Для этого создаем новый проект в Lazarus и в окне пакета zlibar выбираем “Использовать – Добавить к проекту”:
В исходном коде проекта появится модуль zlibar_package:
Теперь, для того, чтобы использовать возможности zlibar по работе с zip-архивами нам необходимо подключить в uses модуля приложения модуль zlibar, например, так:
Для работы с zip-архивами в zlibar предусмотрено два класса:
{Класс для создания zip-архива} TZlibWriteArchive = class(TObject) public constructor Create; destructor Destroy; override; public function CreateArchive boolean; property OnError TZlibErrorProc read fOnError write fOnError; property OnCompress TZlibCompressProgProc read fOnCompress write fOnCompress; published property OutStream TStream read fStream write SetStream; property InputFiles TZlibFilesList read fInputFiles; end; {Класс для чтения zip-архива} TZLibReadArchive = class(TObject) public constructor Create; constructor Create(InStream TStream); destructor Destroy; override; public procedure ExtractFileToStream(AIndex Integer; Stream TStream); procedure ExtractFileToStream(const AFileName String; Stream TStream); procedure ExtractFileToStream(const AFileName , APath String; Stream TStream); property Header TZlibArchiveHeader read fHeader; property FilesInArchiveIndex Integer TTOCEntry read GetTOCEntry; property Count Integer read GetCount; property OnError TZlibErrorProc read fOnError write fOnError; property OnExtract TZlibExtractProgProc read fOnExtract write fOnExtract; published property InStream TStream read fStream write SetStream; end;
При работе с большими архивами можно использовать следующие события:
{При архивации фалов в zip-архив} TZlibCompressProgProc = procedure (Sender TObject; FileIndex Integer; FileSize, FilePos Int64) of object; {при распаковке Zip-архива} TZlibExtractProgProc = procedure (Sender TObject; FileSize, FilePos Int64) of object; {при возникновении ошибок архивации/разархивации} TZlibErrorProc = procedure(Sender TObject; var ErrorCode Integer; ErrorStr String) of object;
На страничке wiki, посвященной работе с zlibar есть два простеньких примера работы с этими классами в Lazarus. Я решил воспользоваться ими и посмотреть на работу zlibar. Вот такой код у меня получился на создания zip-архива в Lazarus:
var MyZip TZlibWriteArchive; Stream TMemoryStream; begin Stream = TMemoryStream.Create(); try MyZip = TZlibWriteArchive.Create; try MyZip.OutStream = Stream; //добавляем файлы для упаковки MyZip.InputFiles.Add('appnote.txt'); //создаем архив MyZip.CreateArchive; //сохраняем архив Stream.SaveToFile('archive.zip'); finally FreeAndNil(MyZip) end; finally FreeAndNil(Stream); end; end;
и, соответственно, распаковку zip-архива (код взят с wiki):
var ArchStream TMemoryStream; FileStream TMemoryStream; ZReadArc TZlibReadArchive; X integer; DestPath string; begin ArchStream = TMemoryStream.Create; //поток для zip-файла FileStream = TmemoryStream.Create; //поток для распакованного файла ArchStream.LoadFromFile('archive.zip'); //загружаем архив в поток ZReadArc = TZlibReadArchive.Create(ArchStream);//создаем объект для работы с архивом DestPath = ExtractFilePath(ParamStr());//путь по которому будут сохраняться файлы {Распаковываем файлы с сохранением их пути в архиве} for X = to ZReadArc.Count - 1 do begin ZReadArc.ExtractFileToStream(X, FileStream); FileStream.SaveToFile(DestPath + ZReadArc.FilesInArchiveX.FilePath + '/' + ZReadArc.FilesInArchiveX.FIleName); FileStream.Position = ; FileStream.Size = ; end; ZReadArc.Free; ArchStream.Free; FileStream.Free; end;
Что в итоге получилось: создался архив с названием archive.zip, который не читается штатными средствами Windows 10:
При этом распаковка архива средствами zlibar прошла успешно – файл распаковался, не испортился.
Таким образом, для себя я сделал следующий вывод по zlibar: использовать можно, но осторожно и только при условии, что с созданными архивами будет работать только моя программа
Как присоединить TDbf к компонентам доступа к данным
Пример, описанный ранее, показывает, как создать новую таблицу базы данных программно. Использование этой таблицы более чем простое.
Компоненты доступа к данным в Lazarus (как например TDbEdit) указывают на компонент TDataSource используя свои свойства «DataSource» и «DataField». Компонент TDataSource обрабатывает соединение между движком базы данных и компонентами доступа к данным. Затем компонент TDataSource указывает на компонент TDbf используя его свойство «DataSet». Связь напоминает следующее:
TDbEdit------- | TDbEdit------|-->TDataSource-->TDbf | TDbNavigator--
Убедитесь, что Вы установили свойства FilePath (или FilePathFulll), TableLevel, и TableName вашего компонента TDbf перед вызовом
TDbf.Active := True;
Можно сказать гораздо больше о программировании баз данных в Lazarus, и я рекомендую хорошую книгу или две о программировании баз данных в Delphi, так как основные понятия одинаковые. Я постоянно обращаюсь к своей копии «Delphi 2 Unleashed» потому что концепции и базовый код не меняются уже 8 лет.
Внешние пакеты / библиотеки
Zeos DataBase Objects
Эти компоненты обеспечивают доступ к различным базам данных. Вы можете найти больше информации здесь. Эта вики также содержит руководство по Zeos.
Pascal Data Objects
Теперь есть альтернатива.
Поддерживаются:
- MySQL 4.1 и 5.0
- sqlite-2 и sqlite-3
- pgsql-8.1
- interbase-5, interbase-6, firebird-1.0, firebird-1.5, firebird-1.5E, firebird-2.0, firebird-2.0E
- mssql (Microsoft library) и sybase (FreeTDS library)
- oracle
TPSQL
Эти компоненты обеспечивают доступ к базам данных PostgreSQL посредством TCP/IP. Вы можете найти больше информации на этой странице.
FBLib Firebird Library
Текущие функции включают в себя:
- Прямой доступ к Firebird 1.0.x, 1.5.x и 2.x Classic или SuperServer
- Мультиплатформа [Win32, Gnu/Linux, FreeBSD)
- Автоматический выбор клиентской библиотеки ‘fbclient’ или ‘gds32’
- Запрос с параметрами
- Поддержка диалекта SQL 1/3
- Лицензионное соглашение LGPL
- Извлечение метаданных
- Парсер простого сценария
- В окончательный EXE-файл добавляется только 100-150 КБ
- Поддержка BLOB-полей
- Экспорт данных в HTML-скрипт SQL
- Диспетчер служб (резервное копирование, восстановление, исправление …)
- Оповещение событий
Advantage TDataSet Descedant
Advantage TDataSet Descedant предоставляет средства для подключения (и открытия таблиц) к серверу базы данных Advantage. Advantage — это гибкая, не требующая администрирования встроенная база данных, которая предоставляет клиент-сервер, а также одноранговый доступ к форматам файлов Clipper, FoxPro и Visual FoxPro 9 DBF, и также собственный формат файлов, обеспечивающий путь миграции, позволяющий использовать новые функции.
Основные характеристики:
- Бесплатный доступ к одноранговой базе данных с возможностью перехода на клиент/сервер
- Многоплатформенность (клиенты поддерживаются в Windows и Linux, сервер поддерживается в Windows, Linux и NetWare)
- Поддерживает как навигационный, так и реляционный SQL доступ к базе данных
- Полнотекстовая поисковая система
- Шифрование таблиц, индексов, memo-полей и передаваемых данных
- Совместимость с нативными компонентами TDataset
- Резервное копирование в онлайн-хранилище
- Сервер поддерживает репликацию
ZMSQL, sql-расширяемая база данных в памяти
Для получения дополнительной информации см. ZMSQL wiki-страницу ZMSQL
ZMSQL — это база данных с открытым исходным кодом, наследуемая от TBufDataset, sql-расширяемая база данных в памяти для Free Pascal (FPC), работающая со значениями, разделяемых точкой с запятой, плоских текстовых таблиц. Полностью написанная на Pascal она не зависит от внешних библиотек. Использует движок JanSQL для реализации SQL.
Она предлагает:
- Загрузку из и сохранение данных в виде плоских текстовых таблиц
- Использование SQL-запросов для получения данных
- Копирование данных и схем из других наборов данных
- Возможность предопределения fielddefs или создание их на лету
- Механизм фильтрации Master/detail
- Ссылочную целостность
- Параметризованные запросы
Загружаемый архив содержит исходный код, некоторые демонстрационные приложения, иллюстрирующие функции компонента, а также файл readme.