├── .github
├── dependabot.yml
└── workflows
│ └── make.yml
├── COPYING.GPL.txt
├── COPYING.LGPL.txt
├── README.md
├── help
├── img
│ ├── addtbl.png
│ ├── expcsv.png
│ ├── expdbf.png
│ ├── exphtml.png
│ ├── expsql.png
│ ├── expxls.png
│ ├── expxml.png
│ ├── icons8_compress_16px.png
│ ├── icons8_delete_database_16px.png
│ ├── icons8_delete_row_16px.png
│ ├── icons8_edit_column_16px.png
│ ├── icons8_new_copy_16px.png
│ ├── icons8_opened_folder_16px.png
│ ├── icons8_resize_horizontal_16px.png
│ ├── icons8_theatre_mask_16px.png
│ ├── icons8_tree_structure_16px.png
│ ├── impcsv.png
│ ├── mdsicon.png
│ ├── newtable.png
│ ├── openbyalias.png
│ ├── sorttable.png
│ ├── subtbl.png
│ └── table.png
└── index.html
├── make.ps1
├── make.sh
├── sample_files
├── DeadlyMushrooms.dbf
├── DeadlyMushrooms.dbt
├── README.txt
├── country_codes.dbf
└── country_codes.mdx
├── screenshots
├── MyDBFStudio_v0.5.2.png
└── MyDBFStudio_v0.6.0.png
└── src
├── MyDbfStudio.ico
├── MyDbfStudio.lpi
├── MyDbfStudio.lpr
├── dsbifffile.pas
├── dscsv.pas
├── dsdataexport.pas
├── dsdataexport.rsj
├── dsdataexport.rst
├── dshtml.pas
├── dsxls.pas
├── historyfiles.pas
├── img
├── MdsIcon.png
├── MyDbfStudio.ico
├── README.txt
├── dbf_file_16px.png
├── dbf_file_200.svg
├── dbf_file_24px.png
├── dbf_file_32px.png
├── dbf_file_48px.png
├── dbf_file_64px.png
├── icons8-license.pdf
├── icons8_add_new_16px.png
├── icons8_add_new_24px.png
├── icons8_add_new_32px.png
├── icons8_add_new_48px.png
├── icons8_add_row_16px.png
├── icons8_add_row_24px.png
├── icons8_add_row_32px.png
├── icons8_add_row_48px.png
├── icons8_automatic_16px.png
├── icons8_automatic_24px.png
├── icons8_automatic_32px_1.png
├── icons8_automatic_48px.png
├── icons8_cancel_16px.png
├── icons8_cancel_24px.png
├── icons8_cancel_32px.png
├── icons8_cancel_48px.png
├── icons8_checked_16px.png
├── icons8_checked_24px.png
├── icons8_checked_32px.png
├── icons8_checked_48px.png
├── icons8_checklist_16px.png
├── icons8_checklist_24px.png
├── icons8_checklist_32px.png
├── icons8_checklist_48px.png
├── icons8_checkmark_16px.png
├── icons8_checkmark_24px.png
├── icons8_checkmark_32px.png
├── icons8_checkmark_48px.png
├── icons8_clock_16px.png
├── icons8_clock_24px.png
├── icons8_clock_32px.png
├── icons8_clock_48px.png
├── icons8_close_window_16px.png
├── icons8_close_window_24px.png
├── icons8_close_window_32px.png
├── icons8_close_window_48px.png
├── icons8_compress_16px.png
├── icons8_compress_24px.png
├── icons8_compress_32px.png
├── icons8_compress_48px.png
├── icons8_conversion_16px.png
├── icons8_conversion_24px.png
├── icons8_conversion_32px.png
├── icons8_conversion_48px.png
├── icons8_csv_16px.png
├── icons8_csv_16px_3.png
├── icons8_csv_16px_4.png
├── icons8_csv_24px.png
├── icons8_csv_24px_1.png
├── icons8_csv_24px_2.png
├── icons8_csv_32px.png
├── icons8_csv_32px_2.png
├── icons8_csv_32px_3.png
├── icons8_csv_48px.png
├── icons8_csv_48px_1.png
├── icons8_csv_48px_2.png
├── icons8_db_2_16px.png
├── icons8_db_2_24px.png
├── icons8_db_2_32px.png
├── icons8_db_2_48px.png
├── icons8_dbf_16px.png
├── icons8_dbf_24px.png
├── icons8_dbf_32px.png
├── icons8_dbf_48px.png
├── icons8_delete_16px.png
├── icons8_delete_24px.png
├── icons8_delete_32px.png
├── icons8_delete_48px.png
├── icons8_delete_database_16px.png
├── icons8_delete_database_24px.png
├── icons8_delete_database_32px.png
├── icons8_delete_database_48px.png
├── icons8_delete_row_16px.png
├── icons8_delete_row_24px.png
├── icons8_delete_row_32px.png
├── icons8_delete_row_48px.png
├── icons8_door_16px.png
├── icons8_door_24px.png
├── icons8_door_32px.png
├── icons8_door_48px.png
├── icons8_edit_column_16px.png
├── icons8_edit_column_24px.png
├── icons8_edit_column_32px.png
├── icons8_edit_column_48px.png
├── icons8_end_16px_1.png
├── icons8_end_24px_1.png
├── icons8_end_32px.png
├── icons8_end_48px.png
├── icons8_erase_16px.png
├── icons8_erase_24px.png
├── icons8_erase_32px.png
├── icons8_erase_48px.png
├── icons8_eraser_16px.png
├── icons8_eraser_24px.png
├── icons8_eraser_32px.png
├── icons8_eraser_48px.png
├── icons8_export_16px.png
├── icons8_export_24px.png
├── icons8_export_32px.png
├── icons8_export_48px.png
├── icons8_fb2_16px.png
├── icons8_fb2_24px.png
├── icons8_fb2_32px.png
├── icons8_fb2_48px.png
├── icons8_filter_16px.png
├── icons8_filter_24px.png
├── icons8_filter_32px.png
├── icons8_filter_48px.png
├── icons8_help_16px.png
├── icons8_help_24px.png
├── icons8_help_32px.png
├── icons8_help_48px.png
├── icons8_html_16px_2.png
├── icons8_html_24px.png
├── icons8_html_32px.png
├── icons8_html_48px.png
├── icons8_html_filetype_16px.png
├── icons8_html_filetype_16px_1.png
├── icons8_html_filetype_24px.png
├── icons8_html_filetype_24px_1.png
├── icons8_html_filetype_32px.png
├── icons8_html_filetype_32px_1.png
├── icons8_html_filetype_48px.png
├── icons8_html_filetype_48px_1.png
├── icons8_info_16px.png
├── icons8_info_24px.png
├── icons8_info_32px.png
├── icons8_info_48px.png
├── icons8_list_16px.png
├── icons8_list_24px.png
├── icons8_list_32px.png
├── icons8_list_48px.png
├── icons8_list_of_thumbnails_16px.png
├── icons8_list_of_thumbnails_24px.png
├── icons8_list_of_thumbnails_32px.png
├── icons8_list_of_thumbnails_48px.png
├── icons8_new_copy_16px.png
├── icons8_new_copy_24px.png
├── icons8_new_copy_32px.png
├── icons8_new_copy_48px.png
├── icons8_ok_16px.png
├── icons8_ok_24px.png
├── icons8_ok_32px.png
├── icons8_ok_48px.png
├── icons8_opened_folder_16px.png
├── icons8_opened_folder_24px.png
├── icons8_opened_folder_32px.png
├── icons8_opened_folder_48px.png
├── icons8_pencil_16px.png
├── icons8_pencil_24px_1.png
├── icons8_pencil_32px.png
├── icons8_pencil_48px.png
├── icons8_play_16px.png
├── icons8_play_24px.png
├── icons8_play_32px.png
├── icons8_play_48px.png
├── icons8_plus_math_16px.png
├── icons8_plus_math_24px.png
├── icons8_plus_math_32px.png
├── icons8_plus_math_48px.png
├── icons8_reduce_16px.png
├── icons8_reduce_24px.png
├── icons8_reduce_32px.png
├── icons8_reduce_48px.png
├── icons8_refresh_16px.png
├── icons8_refresh_24px.png
├── icons8_refresh_32px.png
├── icons8_refresh_48px.png
├── icons8_resize_horizontal_16px.png
├── icons8_resize_horizontal_24px.png
├── icons8_resize_horizontal_32px.png
├── icons8_resize_horizontal_48px.png
├── icons8_save_16px.png
├── icons8_save_24px.png
├── icons8_save_32px.png
├── icons8_save_48px.png
├── icons8_save_as_16px.png
├── icons8_save_as_24px.png
├── icons8_save_as_32px.png
├── icons8_save_as_48px.png
├── icons8_shutdown_16px.png
├── icons8_shutdown_24px.png
├── icons8_shutdown_32px_2.png
├── icons8_shutdown_48px.png
├── icons8_skip_to_start_16px_1.png
├── icons8_skip_to_start_24px_1.png
├── icons8_skip_to_start_32px.png
├── icons8_skip_to_start_48px.png
├── icons8_small_icons_16px.png
├── icons8_small_icons_24px.png
├── icons8_small_icons_32px.png
├── icons8_small_icons_48px.png
├── icons8_sort_16px.png
├── icons8_sort_24px.png
├── icons8_sort_32px.png
├── icons8_sort_48px.png
├── icons8_sort_left_16px.png
├── icons8_sort_left_24px.png
├── icons8_sort_left_32px.png
├── icons8_sort_left_48px.png
├── icons8_sort_right_16px.png
├── icons8_sort_right_24px.png
├── icons8_sort_right_32px.png
├── icons8_sort_right_48px.png
├── icons8_sql_16px.png
├── icons8_sql_24px.png
├── icons8_sql_32px.png
├── icons8_sql_48px.png
├── icons8_subtract_16px.png
├── icons8_subtract_24px.png
├── icons8_subtract_32px_1.png
├── icons8_subtract_48px.png
├── icons8_theatre_mask_16px.png
├── icons8_theatre_mask_24px.png
├── icons8_theatre_mask_32px.png
├── icons8_theatre_mask_48px.png
├── icons8_thick_arrow_pointing_down_16px.png
├── icons8_thick_arrow_pointing_down_24px.png
├── icons8_thick_arrow_pointing_down_32px.png
├── icons8_thick_arrow_pointing_down_48px.png
├── icons8_thick_arrow_pointing_up_16px.png
├── icons8_thick_arrow_pointing_up_24px.png
├── icons8_thick_arrow_pointing_up_32px.png
├── icons8_thick_arrow_pointing_up_48px.png
├── icons8_tree_structure_16px.png
├── icons8_tree_structure_24px.png
├── icons8_tree_structure_32px.png
├── icons8_tree_structure_48px.png
├── icons8_xls_16px.png
├── icons8_xls_16px_1.png
├── icons8_xls_16px_3.png
├── icons8_xls_24px.png
├── icons8_xls_24px_1.png
├── icons8_xls_24px_2.png
├── icons8_xls_32px.png
├── icons8_xls_32px_1.png
├── icons8_xls_32px_2.png
├── icons8_xls_48px.png
├── icons8_xls_48px_1.png
├── icons8_xls_48px_2.png
├── icons8_xml_16px.png
├── icons8_xml_24px.png
├── icons8_xml_32px.png
├── icons8_xml_48px.png
├── mydbfstudio_icon.ico
├── mydbfstudio_icon_256.png
├── mydbfstudio_icon_256.svg
└── splash.png
├── third-party
├── README.txt
├── tdbf_fpc_322
│ ├── Makefile
│ ├── Makefile.fpc
│ ├── dbf.pas
│ ├── dbf_avl.pas
│ ├── dbf_collate.pas
│ ├── dbf_common.inc
│ ├── dbf_common.pas
│ ├── dbf_cursor.pas
│ ├── dbf_dbffile.pas
│ ├── dbf_fields.pas
│ ├── dbf_idxcur.pas
│ ├── dbf_idxfile.pas
│ ├── dbf_lang.pas
│ ├── dbf_memo.pas
│ ├── dbf_parser.pas
│ ├── dbf_pgcfile.pas
│ ├── dbf_pgfile.pas
│ ├── dbf_prscore.pas
│ ├── dbf_prsdef.pas
│ ├── dbf_prssupp.pas
│ ├── dbf_reg.pas
│ ├── dbf_str.inc
│ ├── dbf_str.pas
│ ├── dbf_str_es.pas
│ ├── dbf_str_fr.pas
│ ├── dbf_str_ita.pas
│ ├── dbf_str_nl.pas
│ ├── dbf_str_pl.pas
│ ├── dbf_str_pt.pas
│ ├── dbf_str_ru.pas
│ ├── dbf_struct.inc
│ ├── dbf_wnix.inc
│ ├── dbf_wos2.inc
│ ├── dbf_wtil.pas
│ ├── fpmake.inc
│ ├── fpmake.pp
│ ├── getstrfromint.inc
│ ├── history.txt
│ ├── package.txt
│ ├── readme.txt
│ ├── tdbf_l.pas
│ └── testdbf.pp
└── tdbf_svn
│ ├── dbf.dcr
│ ├── dbf.pas
│ ├── dbf_ansistrings.pas
│ ├── dbf_avl.pas
│ ├── dbf_collate.pas
│ ├── dbf_common.inc
│ ├── dbf_common.pas
│ ├── dbf_cursor.pas
│ ├── dbf_dbffile.pas
│ ├── dbf_fields.pas
│ ├── dbf_idxcur.pas
│ ├── dbf_idxfile.pas
│ ├── dbf_lang.pas
│ ├── dbf_memo.pas
│ ├── dbf_parser.pas
│ ├── dbf_pgcfile.pas
│ ├── dbf_pgfile.pas
│ ├── dbf_prscore.pas
│ ├── dbf_prsdef.pas
│ ├── dbf_prssupp.pas
│ ├── dbf_reg.pas
│ ├── dbf_soundex.inc
│ ├── dbf_str.inc
│ ├── dbf_str.pas
│ ├── dbf_str_de.pas
│ ├── dbf_str_es.pas
│ ├── dbf_str_fr.pas
│ ├── dbf_str_ita.pas
│ ├── dbf_str_nl.pas
│ ├── dbf_str_pl.pas
│ ├── dbf_str_pt.pas
│ ├── dbf_str_ru.pas
│ ├── dbf_struct.inc
│ └── dbf_wtil.pas
├── uaddalias.lfm
├── uaddalias.pas
├── uaddtables.lfm
├── uaddtables.pas
├── udatamodule.lfm
├── udatamodule.pas
├── udbftable.lfm
├── udbftable.pas
├── uexpcsv.lfm
├── uexpcsv.pas
├── uexpdbf.lfm
├── uexpdbf.pas
├── uexphtml.lfm
├── uexphtml.pas
├── uexpsql.lfm
├── uexpsql.pas
├── uexpxls.lfm
├── uexpxls.pas
├── uexpxml.lfm
├── uexpxml.pas
├── uidxtable.lfm
├── uidxtable.pas
├── uimpcsv.lfm
├── uimpcsv.pas
├── uinfo.lfm
├── uinfo.pas
├── umain.lfm
├── umain.pas
├── unewtable.lfm
├── unewtable.pas
├── uopenba.lfm
├── uopenba.pas
├── uoptions.lfm
├── uoptions.pas
├── urestructure.lfm
├── urestructure.pas
├── usetfv.lfm
├── usetfv.pas
├── usorttable.lfm
├── usorttable.pas
├── usplash.lfm
├── usplash.pas
├── usubtables.lfm
├── usubtables.pas
├── utabform.pas
├── utabslist.lfm
├── utabslist.pas
└── uutils.pas
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | ---
2 | version: 2
3 | updates:
4 | - package-ecosystem: "github-actions"
5 | directory: "/"
6 | schedule:
7 | interval: "weekly"
8 |
--------------------------------------------------------------------------------
/.github/workflows/make.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Make
3 |
4 | on:
5 | push:
6 | branches:
7 | - "**"
8 | pull_request:
9 | branches:
10 | - master
11 |
12 | concurrency:
13 | group: ${{ github.workflow }}-${{ github.ref }}
14 | cancel-in-progress: true
15 |
16 | jobs:
17 | build:
18 | runs-on: ${{ matrix.os }}
19 | timeout-minutes: 120
20 | strategy:
21 | matrix:
22 | os:
23 | - ubuntu-latest
24 | - windows-latest
25 | steps:
26 | - name: Checkout
27 | uses: actions/checkout@v4
28 | with:
29 | submodules: true
30 |
31 | - name: Build on Linux
32 | if: runner.os == 'Linux'
33 | shell: bash
34 | run: bash -x make.sh build
35 |
36 | - name: Build on Windows
37 | if: runner.os == 'Windows'
38 | shell: powershell
39 | run: pwsh -File make.ps1 build
40 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MyDBFStudio
2 |
3 | 
4 |
5 | MyDbf Studio is a multi-platform open source program made with Lazarus that will help you to manage your dbf tables.
6 | The main features are:
7 |
8 | * You can work with multiple tables at once, in a tabbed user interface.
9 | * You can directly add, modify or delete data.
10 | * You can view deleted data.
11 | * You can create, empty, delete, change or restructure a table.
12 | * You can create, delete or modify any index in a table.
13 | * You can add or substract two tables.
14 | * You can directly export data in the following formats: CSV, HTML, XLS, DBF, XML or SQL script.
15 | * It works on Windows, Linux and all platforms supported by Lazarus.
16 |
17 | The application is distributed as source code. You must compile it with a recent Lazarus version, v2.0 or later.
18 |
19 | The program originally was written by Enzo Antonio Calogiuri (aka Fog76), but since the original sources of v0.4.2 were no longer readily available
20 | I decided to put them onto my github and to refactor some places. Later Enzo published a v0.5 (https://forum.lazarus.freepascal.org/index.php/topic,8954.msg406180.html#msg406180), but since I had some ideas how to improve it I merged the new version and continued with this fork:
21 |
22 | * Display memo and picture (.jpg, .png, .bmp, .ico) fields
23 | * Display ansi characters from the table's code page correctly as utf-8.
24 | * Store user settings and the names of recently loaded files in an ini file in the the user's home directory.
25 | * Layout of the controls is determined by anchoring and autosizing and thus should work out in all operating systems supported. Form positions are stored in the ini file.
26 | * Support drag and drop of dbf files from the operating system.
27 | * Optionally, auto-fill the column of the DBGrid displaying the dbf file.
28 | * Import from CSV files
29 | * Sample files for "playing" (DeadlyMushrooms.dbf, country_codes.dbf).
30 |
--------------------------------------------------------------------------------
/help/img/addtbl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/addtbl.png
--------------------------------------------------------------------------------
/help/img/expcsv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/expcsv.png
--------------------------------------------------------------------------------
/help/img/expdbf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/expdbf.png
--------------------------------------------------------------------------------
/help/img/exphtml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/exphtml.png
--------------------------------------------------------------------------------
/help/img/expsql.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/expsql.png
--------------------------------------------------------------------------------
/help/img/expxls.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/expxls.png
--------------------------------------------------------------------------------
/help/img/expxml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/expxml.png
--------------------------------------------------------------------------------
/help/img/icons8_compress_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/icons8_compress_16px.png
--------------------------------------------------------------------------------
/help/img/icons8_delete_database_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/icons8_delete_database_16px.png
--------------------------------------------------------------------------------
/help/img/icons8_delete_row_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/icons8_delete_row_16px.png
--------------------------------------------------------------------------------
/help/img/icons8_edit_column_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/icons8_edit_column_16px.png
--------------------------------------------------------------------------------
/help/img/icons8_new_copy_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/icons8_new_copy_16px.png
--------------------------------------------------------------------------------
/help/img/icons8_opened_folder_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/icons8_opened_folder_16px.png
--------------------------------------------------------------------------------
/help/img/icons8_resize_horizontal_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/icons8_resize_horizontal_16px.png
--------------------------------------------------------------------------------
/help/img/icons8_theatre_mask_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/icons8_theatre_mask_16px.png
--------------------------------------------------------------------------------
/help/img/icons8_tree_structure_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/icons8_tree_structure_16px.png
--------------------------------------------------------------------------------
/help/img/impcsv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/impcsv.png
--------------------------------------------------------------------------------
/help/img/mdsicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/mdsicon.png
--------------------------------------------------------------------------------
/help/img/newtable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/newtable.png
--------------------------------------------------------------------------------
/help/img/openbyalias.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/openbyalias.png
--------------------------------------------------------------------------------
/help/img/sorttable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/sorttable.png
--------------------------------------------------------------------------------
/help/img/subtbl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/subtbl.png
--------------------------------------------------------------------------------
/help/img/table.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/help/img/table.png
--------------------------------------------------------------------------------
/make.ps1:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env pwsh
2 | ##############################################################################################################
3 |
4 | Function PrivClipper {
5 | Return "
6 | Usage: pwsh -File $($PSCommandPath) [OPTIONS]
7 | Options:
8 | build Build program
9 | "
10 | }
11 |
12 | Function PrivPrepare {
13 | $VAR = @(
14 | @{
15 | Cmd = 'lazbuild'
16 | Url = 'https://netix.dl.sourceforge.net/project/lazarus/Lazarus%20Windows%2064%20bits/Lazarus%203.6/lazarus-3.6-fpc-3.2.2-win64.exe?viasf=1'
17 | Path = "C:\Lazarus"
18 | }
19 | )
20 | ForEach ($REPLY in $VAR) {
21 | If (-not (Get-Command $REPLY.Cmd -ea 'continue')) {
22 | $params = @{
23 | Uri = $REPLY.Url
24 | OutFile = (Split-Path -Path $REPLY.Url -Leaf).Split('?')[0]
25 | }
26 | Invoke-WebRequest @params
27 | Start-Process -PassThru -Wait -FilePath $params.OutFile -ArgumentList '/SP-', '/VERYSILENT', '/SUPPRESSMSGBOXES', '/NORESTART'
28 | Remove-Item $params.OutFile
29 | $env:PATH+=";$($REPLY.Path)"
30 | Get-Command $REPLY.Cmd
31 | }
32 | }
33 | }
34 |
35 | Function PrivMain {
36 | $ErrorActionPreference = 'stop'
37 | Set-PSDebug -Strict -Trace 1
38 | Invoke-ScriptAnalyzer -EnableExit -Path $PSCommandPath
39 | If ($args.count -gt 0) {
40 | Switch ($args[0]) {
41 | 'build' {
42 | PrivPrepare
43 | If (Test-Path -Path 'use') {
44 | Start-Process -Wait -FilePath 'git' -ArgumentList 'submodule', 'update', '--recursive', '--init'
45 | Start-Process -Wait -FilePath 'git' -ArgumentList 'submodule', 'update', '--recursive', '--remote'
46 | Get-ChildItem -Filter '*.lpk' -Recurse -File –Path 'use' | ForEach-Object {
47 | Start-Process -PassThru -Wait -FilePath 'lazbuild' -ArgumentList '--add-package-link', $_.Name
48 | }
49 | }
50 | Get-ChildItem -Filter '*.lpi' -Recurse -File –Path 'src' | ForEach-Object {
51 | Start-Process -Wait -FilePath 'lazbuild' -ArgumentList '--no-write-project', '--recursive', '--build-mode=release', $_.Name
52 | }
53 | }
54 | Default {
55 | PrivClipper
56 | }
57 | }
58 | } Else {
59 | PrivClipper
60 | }
61 | }
62 |
63 | ##############################################################################################################
64 | PrivMain @args
65 |
--------------------------------------------------------------------------------
/make.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | ##############################################################################################################
3 |
4 | function priv_clippit
5 | (
6 | cat <>"${STAGING_DIR}/DEBIAN/control"
22 | gzip -9 -n 'deb.staging/usr/share/doc/tgshd/changelog.Debian'
23 | read -rp "Input package filename: "
24 | dpkg-deb --root-owner-group --build "${STAGING_DIR}" "${REPLY}.deb"
25 | )
26 |
27 | function priv_main
28 | (
29 | set -euo pipefail
30 | if ((${#})); then
31 | case ${1} in
32 | build)
33 | if ! (which 'lazbuild'); then
34 | source '/etc/os-release'
35 | case ${ID:?} in
36 | debian | ubuntu)
37 | sudo apt-get update
38 | sudo apt-get install -y lazarus
39 | ;;
40 | esac
41 | fi
42 | if [[ -d 'use' ]]; then
43 | git submodule update --recursive --init
44 | git submodule update --recursive --remote
45 | find 'use' -type 'f' -name '*.lpk' -exec lazbuild --add-package-link {} +
46 | fi
47 | find 'src' -type 'f' -name '*.lpi' -exec \
48 | lazbuild --no-write-project --recursive --no-write-project --build-mode=release {} + 1>&2
49 | ;;
50 | dpkg) priv_dpkg ;;
51 | esac
52 | else
53 | priv_clippit
54 | fi
55 | )
56 |
57 | ##############################################################################################################
58 | priv_main "${@}" >/dev/null
59 |
--------------------------------------------------------------------------------
/sample_files/DeadlyMushrooms.dbf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/sample_files/DeadlyMushrooms.dbf
--------------------------------------------------------------------------------
/sample_files/DeadlyMushrooms.dbt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/sample_files/DeadlyMushrooms.dbt
--------------------------------------------------------------------------------
/sample_files/README.txt:
--------------------------------------------------------------------------------
1 | Source of the sample files
2 |
3 | DeadlyMushrooms - Lazarus example database,
4 | converted from FB to DBF
5 |
6 | country_codes - https://gist.github.com/radcliff/f09c0f88344a7fcef373,
7 | converted from CSV to DBF
--------------------------------------------------------------------------------
/sample_files/country_codes.dbf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/sample_files/country_codes.dbf
--------------------------------------------------------------------------------
/sample_files/country_codes.mdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/sample_files/country_codes.mdx
--------------------------------------------------------------------------------
/screenshots/MyDBFStudio_v0.5.2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/screenshots/MyDBFStudio_v0.5.2.png
--------------------------------------------------------------------------------
/screenshots/MyDBFStudio_v0.6.0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/screenshots/MyDBFStudio_v0.6.0.png
--------------------------------------------------------------------------------
/src/MyDbfStudio.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/MyDbfStudio.ico
--------------------------------------------------------------------------------
/src/MyDbfStudio.lpr:
--------------------------------------------------------------------------------
1 | program MyDbfStudio;
2 |
3 | {$mode objfpc}{$H+}
4 |
5 | uses
6 | {$IFDEF UNIX}{$IFDEF UseCThreads}
7 | cthreads,
8 | {$ENDIF}{$ENDIF}
9 | Interfaces, // this includes the LCL widgetset
10 | Forms, uMain, uDatamodule;
11 |
12 | {$R *.res}
13 |
14 | begin
15 | Application.Scaled:=True;
16 | Application.Initialize;
17 | Application.CreateForm(TCommonData, CommonData);
18 | Application.CreateForm(TMain, Main);
19 | Application.Run;
20 | end.
21 |
22 |
--------------------------------------------------------------------------------
/src/dsdataexport.rsj:
--------------------------------------------------------------------------------
1 | {"version":1,"strings":[
2 | {"hash":117164132,"name":"dsdataexport.sdatanotassigned","sourcebytes":[67,97,110,110,111,116,32,112,101,114,102,111,114,109,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,119,105,116,104,111,117,116,32,97,32,100,97,116,97,115,101,116],"value":"Cannot perform this operation without a dataset"},
3 | {"hash":158113645,"name":"dsdataexport.sstreamnotassigned","sourcebytes":[67,97,110,110,111,116,32,112,101,114,102,111,114,109,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,119,105,116,104,111,117,116,32,97,32,83,116,114,101,97,109],"value":"Cannot perform this operation without a Stream"},
4 | {"hash":80565140,"name":"dsdataexport.sdatasetclosed","sourcebytes":[67,97,110,110,111,116,32,112,101,114,102,111,114,109,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,111,110,32,97,32,99,108,111,115,101,100,32,100,97,116,97,115,101,116],"value":"Cannot perform this operation on a closed dataset"},
5 | {"hash":188732516,"name":"dsdataexport.sdatasetempty","sourcebytes":[67,97,110,110,111,116,32,112,101,114,102,111,114,109,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,111,110,32,97,32,101,109,112,116,121,32,100,97,116,97,115,101,116],"value":"Cannot perform this operation on a empty dataset"}
6 | ]}
7 |
--------------------------------------------------------------------------------
/src/dsdataexport.rst:
--------------------------------------------------------------------------------
1 |
2 | # hash value = 117164132
3 | dsdataexport.sdatanotassigned='Cannot perform this operation without a da'+
4 | 'taset'
5 |
6 |
7 | # hash value = 158113645
8 | dsdataexport.sstreamnotassigned='Cannot perform this operation without a '+
9 | 'Stream'
10 |
11 |
12 | # hash value = 80565140
13 | dsdataexport.sdatasetclosed='Cannot perform this operation on a closed da'+
14 | 'taset'
15 |
16 |
17 | # hash value = 188732516
18 | dsdataexport.sdatasetempty='Cannot perform this operation on a empty data'+
19 | 'set'
20 |
21 |
--------------------------------------------------------------------------------
/src/img/MdsIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/MdsIcon.png
--------------------------------------------------------------------------------
/src/img/MyDbfStudio.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/MyDbfStudio.ico
--------------------------------------------------------------------------------
/src/img/README.txt:
--------------------------------------------------------------------------------
1 | Most of the icons in this folder are kindly provided by https:/icons8.com.
2 | They are taken from the "Windows Metro" icon set, and colored as #FF2980B9
3 | (R=41, G=128, B=185).
4 |
5 | See the license in "icons8-license.pdf".
--------------------------------------------------------------------------------
/src/img/dbf_file_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/dbf_file_16px.png
--------------------------------------------------------------------------------
/src/img/dbf_file_200.svg:
--------------------------------------------------------------------------------
1 |
2 |
123 |
--------------------------------------------------------------------------------
/src/img/dbf_file_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/dbf_file_24px.png
--------------------------------------------------------------------------------
/src/img/dbf_file_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/dbf_file_32px.png
--------------------------------------------------------------------------------
/src/img/dbf_file_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/dbf_file_48px.png
--------------------------------------------------------------------------------
/src/img/dbf_file_64px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/dbf_file_64px.png
--------------------------------------------------------------------------------
/src/img/icons8-license.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8-license.pdf
--------------------------------------------------------------------------------
/src/img/icons8_add_new_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_add_new_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_add_new_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_add_new_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_add_new_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_add_new_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_add_new_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_add_new_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_add_row_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_add_row_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_add_row_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_add_row_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_add_row_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_add_row_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_add_row_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_add_row_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_automatic_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_automatic_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_automatic_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_automatic_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_automatic_32px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_automatic_32px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_automatic_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_automatic_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_cancel_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_cancel_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_cancel_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_cancel_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_cancel_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_cancel_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_cancel_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_cancel_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_checked_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_checked_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_checked_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_checked_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_checked_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_checked_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_checked_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_checked_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_checklist_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_checklist_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_checklist_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_checklist_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_checklist_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_checklist_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_checklist_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_checklist_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_checkmark_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_checkmark_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_checkmark_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_checkmark_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_checkmark_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_checkmark_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_checkmark_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_checkmark_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_clock_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_clock_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_clock_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_clock_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_clock_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_clock_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_clock_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_clock_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_close_window_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_close_window_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_close_window_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_close_window_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_close_window_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_close_window_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_close_window_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_close_window_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_compress_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_compress_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_compress_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_compress_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_compress_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_compress_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_compress_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_compress_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_conversion_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_conversion_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_conversion_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_conversion_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_conversion_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_conversion_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_conversion_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_conversion_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_csv_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_csv_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_csv_16px_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_csv_16px_3.png
--------------------------------------------------------------------------------
/src/img/icons8_csv_16px_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_csv_16px_4.png
--------------------------------------------------------------------------------
/src/img/icons8_csv_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_csv_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_csv_24px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_csv_24px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_csv_24px_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_csv_24px_2.png
--------------------------------------------------------------------------------
/src/img/icons8_csv_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_csv_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_csv_32px_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_csv_32px_2.png
--------------------------------------------------------------------------------
/src/img/icons8_csv_32px_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_csv_32px_3.png
--------------------------------------------------------------------------------
/src/img/icons8_csv_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_csv_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_csv_48px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_csv_48px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_csv_48px_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_csv_48px_2.png
--------------------------------------------------------------------------------
/src/img/icons8_db_2_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_db_2_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_db_2_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_db_2_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_db_2_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_db_2_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_db_2_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_db_2_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_dbf_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_dbf_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_dbf_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_dbf_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_dbf_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_dbf_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_dbf_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_dbf_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_delete_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_delete_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_delete_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_delete_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_delete_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_delete_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_delete_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_delete_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_delete_database_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_delete_database_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_delete_database_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_delete_database_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_delete_database_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_delete_database_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_delete_database_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_delete_database_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_delete_row_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_delete_row_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_delete_row_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_delete_row_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_delete_row_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_delete_row_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_delete_row_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_delete_row_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_door_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_door_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_door_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_door_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_door_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_door_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_door_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_door_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_edit_column_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_edit_column_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_edit_column_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_edit_column_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_edit_column_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_edit_column_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_edit_column_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_edit_column_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_end_16px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_end_16px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_end_24px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_end_24px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_end_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_end_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_end_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_end_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_erase_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_erase_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_erase_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_erase_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_erase_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_erase_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_erase_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_erase_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_eraser_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_eraser_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_eraser_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_eraser_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_eraser_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_eraser_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_eraser_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_eraser_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_export_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_export_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_export_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_export_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_export_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_export_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_export_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_export_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_fb2_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_fb2_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_fb2_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_fb2_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_fb2_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_fb2_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_fb2_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_fb2_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_filter_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_filter_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_filter_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_filter_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_filter_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_filter_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_filter_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_filter_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_help_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_help_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_help_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_help_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_help_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_help_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_help_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_help_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_html_16px_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_html_16px_2.png
--------------------------------------------------------------------------------
/src/img/icons8_html_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_html_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_html_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_html_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_html_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_html_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_html_filetype_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_html_filetype_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_html_filetype_16px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_html_filetype_16px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_html_filetype_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_html_filetype_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_html_filetype_24px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_html_filetype_24px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_html_filetype_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_html_filetype_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_html_filetype_32px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_html_filetype_32px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_html_filetype_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_html_filetype_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_html_filetype_48px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_html_filetype_48px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_info_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_info_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_info_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_info_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_info_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_info_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_info_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_info_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_list_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_list_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_list_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_list_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_list_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_list_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_list_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_list_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_list_of_thumbnails_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_list_of_thumbnails_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_list_of_thumbnails_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_list_of_thumbnails_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_list_of_thumbnails_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_list_of_thumbnails_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_list_of_thumbnails_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_list_of_thumbnails_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_new_copy_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_new_copy_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_new_copy_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_new_copy_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_new_copy_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_new_copy_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_new_copy_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_new_copy_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_ok_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_ok_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_ok_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_ok_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_ok_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_ok_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_ok_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_ok_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_opened_folder_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_opened_folder_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_opened_folder_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_opened_folder_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_opened_folder_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_opened_folder_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_opened_folder_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_opened_folder_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_pencil_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_pencil_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_pencil_24px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_pencil_24px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_pencil_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_pencil_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_pencil_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_pencil_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_play_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_play_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_play_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_play_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_play_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_play_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_play_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_play_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_plus_math_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_plus_math_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_plus_math_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_plus_math_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_plus_math_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_plus_math_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_plus_math_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_plus_math_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_reduce_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_reduce_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_reduce_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_reduce_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_reduce_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_reduce_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_reduce_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_reduce_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_refresh_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_refresh_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_refresh_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_refresh_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_refresh_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_refresh_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_refresh_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_refresh_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_resize_horizontal_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_resize_horizontal_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_resize_horizontal_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_resize_horizontal_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_resize_horizontal_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_resize_horizontal_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_resize_horizontal_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_resize_horizontal_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_save_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_save_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_save_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_save_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_save_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_save_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_save_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_save_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_save_as_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_save_as_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_save_as_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_save_as_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_save_as_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_save_as_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_save_as_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_save_as_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_shutdown_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_shutdown_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_shutdown_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_shutdown_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_shutdown_32px_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_shutdown_32px_2.png
--------------------------------------------------------------------------------
/src/img/icons8_shutdown_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_shutdown_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_skip_to_start_16px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_skip_to_start_16px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_skip_to_start_24px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_skip_to_start_24px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_skip_to_start_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_skip_to_start_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_skip_to_start_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_skip_to_start_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_small_icons_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_small_icons_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_small_icons_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_small_icons_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_small_icons_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_small_icons_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_small_icons_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_small_icons_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_sort_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sort_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_sort_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sort_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_sort_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sort_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_sort_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sort_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_sort_left_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sort_left_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_sort_left_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sort_left_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_sort_left_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sort_left_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_sort_left_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sort_left_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_sort_right_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sort_right_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_sort_right_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sort_right_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_sort_right_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sort_right_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_sort_right_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sort_right_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_sql_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sql_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_sql_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sql_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_sql_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sql_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_sql_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_sql_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_subtract_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_subtract_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_subtract_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_subtract_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_subtract_32px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_subtract_32px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_subtract_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_subtract_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_theatre_mask_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_theatre_mask_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_theatre_mask_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_theatre_mask_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_theatre_mask_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_theatre_mask_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_theatre_mask_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_theatre_mask_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_thick_arrow_pointing_down_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_thick_arrow_pointing_down_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_thick_arrow_pointing_down_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_thick_arrow_pointing_down_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_thick_arrow_pointing_down_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_thick_arrow_pointing_down_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_thick_arrow_pointing_down_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_thick_arrow_pointing_down_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_thick_arrow_pointing_up_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_thick_arrow_pointing_up_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_thick_arrow_pointing_up_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_thick_arrow_pointing_up_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_thick_arrow_pointing_up_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_thick_arrow_pointing_up_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_thick_arrow_pointing_up_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_thick_arrow_pointing_up_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_tree_structure_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_tree_structure_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_tree_structure_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_tree_structure_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_tree_structure_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_tree_structure_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_tree_structure_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_tree_structure_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_xls_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xls_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_xls_16px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xls_16px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_xls_16px_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xls_16px_3.png
--------------------------------------------------------------------------------
/src/img/icons8_xls_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xls_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_xls_24px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xls_24px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_xls_24px_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xls_24px_2.png
--------------------------------------------------------------------------------
/src/img/icons8_xls_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xls_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_xls_32px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xls_32px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_xls_32px_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xls_32px_2.png
--------------------------------------------------------------------------------
/src/img/icons8_xls_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xls_48px.png
--------------------------------------------------------------------------------
/src/img/icons8_xls_48px_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xls_48px_1.png
--------------------------------------------------------------------------------
/src/img/icons8_xls_48px_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xls_48px_2.png
--------------------------------------------------------------------------------
/src/img/icons8_xml_16px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xml_16px.png
--------------------------------------------------------------------------------
/src/img/icons8_xml_24px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xml_24px.png
--------------------------------------------------------------------------------
/src/img/icons8_xml_32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xml_32px.png
--------------------------------------------------------------------------------
/src/img/icons8_xml_48px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/icons8_xml_48px.png
--------------------------------------------------------------------------------
/src/img/mydbfstudio_icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/mydbfstudio_icon.ico
--------------------------------------------------------------------------------
/src/img/mydbfstudio_icon_256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/mydbfstudio_icon_256.png
--------------------------------------------------------------------------------
/src/img/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/img/splash.png
--------------------------------------------------------------------------------
/src/third-party/README.txt:
--------------------------------------------------------------------------------
1 | By default, MyDBFStudio requires the DBFLaz package which belongs to FPC.
2 | The program initially was tested with FPC 3.2.0 and 3.2.2.
3 |
4 | Normally the dbf package DbfLaz built in to the Lazarus IDE would be used.
5 | But in order to have some flexibility in testing and buf fixing DbfLaz was
6 | removed from the project's requirements, and the TDbf files from FPC v3.2.2
7 | (packages/fcl-db/src/dbase/) were copied to a this "third-party" subdirectory of
8 | the source folder (tdbf_fpc_322).
9 | As alternative TDbf source, the code from https://sourceforge.net/p/tdbf/code/HEAD/tree/trunk/
10 | was copied to subfolder tdbf_svn.
11 |
12 | By adapting the "Other unit files" in the project options one of these tdbf
13 | source versions can be compiled into the application.
14 |
15 | The normal build modes of the project work with the fpc_322 version, but
16 | build modes "Debug (based on TDbf from sourceforge)" and "Release (based on TDbf
17 | from sourceforge)" use the alternative code in the tdbf_svn folder.
18 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/Makefile.fpc:
--------------------------------------------------------------------------------
1 | #
2 | # Makefile.fpc for DBase FCL db units
3 | #
4 |
5 | [package]
6 | main=fcl-db
7 |
8 | [target]
9 | units=dbf
10 | examples=testdbf
11 |
12 | [require]
13 | packages=fcl-base
14 |
15 | [compiler]
16 | options=-S2 -Sh
17 |
18 | [default]
19 | fpcdir=../../../..
20 |
21 | [install]
22 | fpcpackage=y
23 | units=dbf_collate dbf_common dbf_cursor dbf_dbffile dbf_fields \
24 | dbf_idxcur dbf_idxfile dbf_lang dbf_memo dbf_parser dbf_pgfile \
25 | dbf_prscore dbf_prsdef dbf_prssupp dbf_str
26 |
27 | [clean]
28 | units=dbf_collate dbf_common dbf_cursor dbf_dbffile dbf_fields \
29 | dbf_idxcur dbf_idxfile dbf_lang dbf_memo dbf_parser dbf_pgfile \
30 | dbf_prscore dbf_prsdef dbf_prssupp dbf_str
31 |
32 | [prerules]
33 | # dbf_Wtil is needed on all targets except windows
34 | ifneq ($(OS_TARGET),win32)
35 | ifneq ($(OS_TARGET),win64)
36 | ifneq ($(OS_TARGET),wince)
37 |
38 | INSTALL_UNITS+=dbf_wtil
39 | CLEAN_UNITS+=dbf_wtil
40 |
41 | endif
42 | endif
43 | endif
44 |
45 | [rules]
46 | .NOTPARALLEL:
47 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_cursor.pas:
--------------------------------------------------------------------------------
1 | unit dbf_cursor;
2 |
3 | interface
4 |
5 | {$I dbf_common.inc}
6 |
7 | uses
8 | SysUtils,
9 | Classes,
10 | dbf_pgfile,
11 | dbf_common;
12 |
13 | type
14 |
15 | //====================================================================
16 | TVirtualCursor = class(TObject)
17 | private
18 | FFile: TPagedFile;
19 |
20 | protected
21 | function GetPhysicalRecNo: Integer; virtual; abstract;
22 | function GetSequentialRecNo: Integer; virtual; abstract;
23 | function GetSequentialRecordCount: Integer; virtual; abstract;
24 | procedure SetPhysicalRecNo(RecNo: Integer); virtual; abstract;
25 | procedure SetSequentialRecNo(RecNo: Integer); virtual; abstract;
26 |
27 | public
28 | constructor Create(pFile: TPagedFile);
29 | destructor Destroy; override;
30 |
31 | function RecordSize: Integer;
32 |
33 | function Next: Boolean; virtual; abstract;
34 | function Prev: Boolean; virtual; abstract;
35 | procedure First; virtual; abstract;
36 | procedure Last; virtual; abstract;
37 |
38 | property PagedFile: TPagedFile read FFile;
39 | property PhysicalRecNo: Integer read GetPhysicalRecNo write SetPhysicalRecNo;
40 | property SequentialRecNo: Integer read GetSequentialRecNo write SetSequentialRecNo;
41 | property SequentialRecordCount: Integer read GetSequentialRecordCount;
42 | end;
43 |
44 | implementation
45 |
46 | constructor TVirtualCursor.Create(pFile: TPagedFile);
47 | begin
48 | FFile := pFile;
49 | end;
50 |
51 | destructor TVirtualCursor.Destroy; {override;}
52 | begin
53 | end;
54 |
55 | function TVirtualCursor.RecordSize : Integer;
56 | begin
57 | if FFile = nil then
58 | Result := 0
59 | else
60 | Result := FFile.RecordSize;
61 | end;
62 |
63 | end.
64 |
65 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_dbffile.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_fpc_322/dbf_dbffile.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_idxcur.pas:
--------------------------------------------------------------------------------
1 | unit dbf_idxcur;
2 |
3 | interface
4 |
5 | {$I dbf_common.inc}
6 |
7 | uses
8 | SysUtils,
9 | Classes,
10 | db,
11 | dbf_cursor,
12 | dbf_idxfile,
13 | dbf_prsdef,
14 | {$ifndef WINDOWS}
15 | dbf_wtil,
16 | {$endif}
17 | dbf_common;
18 |
19 | type
20 |
21 | //====================================================================
22 | //=== Index support
23 | //====================================================================
24 | TIndexCursor = class(TVirtualCursor)
25 | private
26 | FIndexFile: TIndexFile;
27 | protected
28 | function GetPhysicalRecNo: Integer; override;
29 | function GetSequentialRecNo: Integer; override;
30 | function GetSequentialRecordCount: Integer; override;
31 | procedure SetPhysicalRecNo(RecNo: Integer); override;
32 | procedure SetSequentialRecNo(RecNo: Integer); override;
33 |
34 | procedure VariantStrToBuffer(Key: Variant; ABuffer: TRecordBuffer);
35 | public
36 | constructor Create(DbfIndexFile: TIndexFile);
37 | destructor Destroy; override;
38 |
39 | function Next: Boolean; override;
40 | function Prev: Boolean; override;
41 | procedure First; override;
42 | procedure Last; override;
43 |
44 | procedure Insert(RecNo: Integer; Buffer: TRecordBuffer);
45 | procedure Update(RecNo: Integer; PrevBuffer, NewBuffer: TRecordBuffer);
46 |
47 | {$ifdef SUPPORT_VARIANTS}
48 | function VariantToBuffer(Key: Variant; ABuffer: TRecordBuffer): TExpressionType;
49 | {$endif}
50 | function CheckUserKey(Key: PChar; StringBuf: PChar): PChar;
51 |
52 | property IndexFile: TIndexFile read FIndexFile;
53 | end;
54 |
55 | //====================================================================
56 | // TIndexCursor = class;
57 | //====================================================================
58 | PIndexPosInfo = ^TIndexPage;
59 |
60 | //====================================================================
61 | implementation
62 |
63 | {$ifdef WINDOWS}
64 | uses
65 | Windows;
66 | {$endif}
67 |
68 | //==========================================================
69 | //============ TIndexCursor
70 | //==========================================================
71 | constructor TIndexCursor.Create(DbfIndexFile: TIndexFile);
72 | begin
73 | inherited Create(DbfIndexFile);
74 |
75 | FIndexFile := DbfIndexFile;
76 | end;
77 |
78 | destructor TIndexCursor.Destroy; {override;}
79 | begin
80 | inherited Destroy;
81 | end;
82 |
83 | procedure TIndexCursor.Insert(RecNo: Integer; Buffer: TRecordBuffer);
84 | begin
85 | TIndexFile(PagedFile).Insert(RecNo,Buffer);
86 | // TODO SET RecNo and Key
87 | end;
88 |
89 | procedure TIndexCursor.Update(RecNo: Integer; PrevBuffer, NewBuffer: TRecordBuffer);
90 | begin
91 | TIndexFile(PagedFile).Update(RecNo, PrevBuffer, NewBuffer);
92 | end;
93 |
94 | procedure TIndexCursor.First;
95 | begin
96 | TIndexFile(PagedFile).First;
97 | end;
98 |
99 | procedure TIndexCursor.Last;
100 | begin
101 | TIndexFile(PagedFile).Last;
102 | end;
103 |
104 | function TIndexCursor.Prev: Boolean;
105 | begin
106 | Result := TIndexFile(PagedFile).Prev;
107 | end;
108 |
109 | function TIndexCursor.Next: Boolean;
110 | begin
111 | Result := TIndexFile(PagedFile).Next;
112 | end;
113 |
114 | function TIndexCursor.GetPhysicalRecNo: Integer;
115 | begin
116 | Result := TIndexFile(PagedFile).PhysicalRecNo;
117 | end;
118 |
119 | procedure TIndexCursor.SetPhysicalRecNo(RecNo: Integer);
120 | begin
121 | TIndexFile(PagedFile).PhysicalRecNo := RecNo;
122 | end;
123 |
124 | function TIndexCursor.GetSequentialRecordCount: Integer;
125 | begin
126 | Result := TIndexFile(PagedFile).SequentialRecordCount;
127 | end;
128 |
129 | function TIndexCursor.GetSequentialRecNo: Integer;
130 | begin
131 | Result := TIndexFile(PagedFile).SequentialRecNo;
132 | end;
133 |
134 | procedure TIndexCursor.SetSequentialRecNo(RecNo: Integer);
135 | begin
136 | TIndexFile(PagedFile).SequentialRecNo := RecNo;
137 | end;
138 |
139 | {$ifdef SUPPORT_VARIANTS}
140 |
141 | procedure TIndexCursor.VariantStrToBuffer(Key: Variant; ABuffer: TRecordBuffer);
142 | var
143 | currLen: Integer;
144 | StrKey: string;
145 | begin
146 | StrKey := Key;
147 | currLen := TranslateString(GetACP, FIndexFile.CodePage, PAnsiChar(StrKey), PAnsiChar(ABuffer), -1);
148 | // we have null-terminated string, pad with spaces if string too short
149 | FillChar(ABuffer[currLen], TIndexFile(PagedFile).KeyLen-currLen, ' ');
150 | end;
151 |
152 | function TIndexCursor.VariantToBuffer(Key: Variant; ABuffer: TRecordBuffer): TExpressionType;
153 | // assumes ABuffer is large enough ie. at least max key size
154 | begin
155 | if (TIndexFile(PagedFile).KeyType='N') then
156 | begin
157 | PDouble(ABuffer)^ := Key;
158 | if (TIndexFile(PagedFile).IndexVersion <> xBaseIII) then
159 | begin
160 | // make copy of userbcd to buffer
161 | Move(TIndexFile(PagedFile).PrepareKey(ABuffer, etFloat)[0], ABuffer[0], 11);
162 | end;
163 | Result := etInteger;
164 | end else begin
165 | VariantStrToBuffer(Key, ABuffer);
166 | Result := etString;
167 | end;
168 | end;
169 |
170 | {$endif}
171 |
172 | function TIndexCursor.CheckUserKey(Key: PChar; StringBuf: PChar): PChar;
173 | var
174 | keyLen, userLen: Integer;
175 | begin
176 | // default is to use key
177 | Result := Key;
178 | // if key is double, then no check
179 | if (TIndexFile(PagedFile).KeyType = 'N') then
180 | begin
181 | // nothing needs to be done
182 | end else begin
183 | // check if string long enough then no copying needed
184 | userLen := StrLen(Key);
185 | keyLen := TIndexFile(PagedFile).KeyLen;
186 | if userLen < keyLen then
187 | begin
188 | // copy string
189 | Move(Key^, StringBuf[0], userLen);
190 | // add spaces to searchstring
191 | FillChar(StringBuf[userLen], keyLen - userLen, ' ');
192 | // set buffer to temporary buffer
193 | Result := StringBuf;
194 | end;
195 | end;
196 | end;
197 |
198 | end.
199 |
200 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_pgcfile.pas:
--------------------------------------------------------------------------------
1 | unit dbf_pgcfile;
2 |
3 | // paged, cached file
4 |
5 | interface
6 |
7 | {$I dbf_common.inc}
8 |
9 | {$ifdef USE_CACHE}
10 |
11 | uses
12 | Classes,
13 | SysUtils,
14 | dbf_common,
15 | dbf_avl,
16 | dbf_pgfile;
17 |
18 | type
19 |
20 | PPageInfo = ^TPageInfo;
21 | TPageInfo = record
22 | TimeStamp: Cardinal;
23 | Modified: Boolean;
24 | Data: Char;
25 | end;
26 |
27 | TCachedFile = class(TPagedFile)
28 | private
29 | FPageTree: TAvlTree;
30 | FUseTree: TAvlTree;
31 | FTimeStamp: Cardinal;
32 | FPageInfoSize: Integer;
33 | FCacheSize: Integer;
34 | FMaxPages: Cardinal;
35 |
36 | function GetTimeStamp: Cardinal;
37 | procedure UpdateTimeStamp(RecNo: Integer; Data: PPageInfo);
38 | procedure PageDeleted(Sender: TAvlTree; Data: PData);
39 | procedure UpdateMaxPages;
40 | function AddToCache(RecNo: Integer; Buffer: Pointer): PPageInfo;
41 | protected
42 | procedure SetRecordSize(NewValue: Integer); override;
43 | procedure SetCacheSize(NewSize: Integer);
44 | public
45 | constructor Create;
46 | destructor Destroy; override;
47 |
48 | procedure CloseFile; override;
49 | procedure Flush; override;
50 |
51 | function ReadRecord(RecNo: Integer; Buffer: Pointer): Integer; override;
52 | procedure WriteRecord(RecNo: Integer; Buffer: Pointer); override;
53 |
54 | property CacheSize: Integer read FCacheSize write SetCacheSize;
55 | end;
56 |
57 | {$endif}
58 |
59 | implementation
60 |
61 | {$ifdef USE_CACHE}
62 |
63 | constructor TCachedFile.Create;
64 | begin
65 | inherited;
66 |
67 | FPageTree := TAvlTree.Create;
68 | FPageTree.OnDelete := PageDeleted;
69 | FUseTree := TAvlTree.Create;
70 | FPageInfoSize := 0;
71 | FTimeStamp := 0;
72 | FCacheSize := 256 * 1024;
73 | end;
74 |
75 | destructor TCachedFile.Destroy;
76 | begin
77 | Flush;
78 |
79 | FPageTree.Free;
80 | FUseTree.Free;
81 | FPageTree := nil;
82 | FUseTree := nil;
83 |
84 | inherited;
85 | end;
86 |
87 | procedure TCachedFile.Flush;
88 | begin
89 | if FPageTree <> nil then
90 | begin
91 | FPageTree.Clear;
92 | FUseTree.Clear;
93 | end;
94 | FTimeStamp := 0;
95 | end;
96 |
97 | procedure TCachedFile.CloseFile;
98 | begin
99 | // flush modified pages to disk
100 | Flush;
101 |
102 | // now we can safely close
103 | inherited;
104 | end;
105 |
106 | procedure TCachedFile.SetRecordSize(NewValue: Integer);
107 | begin
108 | inherited;
109 |
110 | // first flush all pages, restart caching with new parameters
111 | Flush;
112 |
113 | // calculate size of extra data of pagetree
114 | FPageInfoSize := SizeOf(TPageInfo) - SizeOf(Char) + RecordSize;
115 | UpdateMaxPages;
116 | end;
117 |
118 | procedure TCachedFile.SetCacheSize(NewSize: Integer);
119 | begin
120 | if FCacheSize <> NewSize then
121 | begin
122 | FCacheSize := NewSize;
123 | UpdateMaxPages;
124 | end;
125 | end;
126 |
127 | procedure TCachedFile.UpdateMaxPages;
128 | begin
129 | if RecordSize = 0 then
130 | FMaxPages := 0
131 | else
132 | FMaxPages := FCacheSize div RecordSize;
133 | end;
134 |
135 | function TCachedFile.GetTimeStamp: Cardinal;
136 | begin
137 | Result := FTimeStamp;
138 | Inc(FTimeStamp);
139 | end;
140 |
141 | procedure TCachedFile.PageDeleted(Sender: TAvlTree; Data: PData);
142 | begin
143 | // data modified? write to disk
144 | if PPageInfo(Data^.ExtraData)^.Modified then
145 | inherited WriteRecord(Data^.ID, @PPageInfo(Data^.ExtraData)^.Data);
146 |
147 | // free cached page mem
148 | FreeMem(Data^.ExtraData);
149 | end;
150 |
151 | function TCachedFile.AddToCache(RecNo: Integer; Buffer: Pointer): PPageInfo;
152 | var
153 | oldData: PData;
154 | begin
155 | // make sure there is a free page in the cache
156 | while FPageTree.Count >= FMaxPages do
157 | begin
158 | // no free space, find oldest page
159 | oldData := FUseTree.Lowest;
160 | // remove from cache
161 | FPageTree.Delete(Integer(oldData^.ExtraData));
162 | FUseTree.Delete(oldData^.ID);
163 | end;
164 | // add to cache
165 | GetMem(Result, FPageInfoSize);
166 | Result^.TimeStamp := GetTimeStamp;
167 | Result^.Modified := false;
168 | Move(Buffer^, Result^.Data, RecordSize);
169 | FPageTree.Insert(RecNo, Result);
170 | FUseTree.Insert(Result^.TimeStamp, Pointer(RecNo));
171 | end;
172 |
173 | procedure TCachedFile.UpdateTimeStamp(RecNo: Integer; Data: PPageInfo);
174 | begin
175 | // update time used
176 | FUseTree.Delete(Data^.TimeStamp);
177 | Data^.TimeStamp := GetTimeStamp;
178 | FUseTree.Insert(Data^.TimeStamp, Pointer(RecNo));
179 | end;
180 |
181 | function TCachedFile.ReadRecord(RecNo: Integer; Buffer: Pointer): Integer;
182 | var
183 | Data: PPageInfo;
184 | begin
185 | // only cache when we do not need locking
186 | if NeedLocks then
187 | begin Result := inherited ReadRecord(RecNo, Buffer) end else begin
188 | // do we have this page in cache?
189 | Data := PPageInfo(FPageTree.Find(RecNo));
190 | if Data <> nil then
191 | begin
192 | // copy from cache
193 | Move(Data^.Data, Buffer^, RecordSize);
194 | UpdateTimeStamp(RecNo, Data);
195 | Result := RecordSize;
196 | end else begin
197 | // not yet in cache
198 | Result := inherited ReadRecord(RecNo, Buffer);
199 | // add
200 | if Result > 0 then
201 | AddToCache(RecNo, Buffer);
202 | end;
203 | end;
204 | end;
205 |
206 | procedure TCachedFile.WriteRecord(RecNo: Integer; Buffer: Pointer);
207 | var
208 | Data: PPageInfo;
209 | begin
210 | // only cache when we do not need locking
211 | if NeedLocks then
212 | begin inherited end else begin
213 | // do we have this page in cache?
214 | Data := PPageInfo(FPageTree.Find(RecNo));
215 | if Data <> nil then
216 | begin
217 | // copy to cache
218 | Move(Buffer^, Data^.Data, RecordSize);
219 | UpdateTimeStamp(RecNo, Data);
220 | end else begin
221 | // add
222 | Data := AddToCache(RecNo, Buffer);
223 | // notify we've added a page
224 | UpdateCachedSize(CalcPageOffset(RecNo+PagesPerRecord));
225 | end;
226 | Data^.Modified := true;
227 | end;
228 | end;
229 |
230 | {$endif} // USE_CACHE
231 |
232 | end.
233 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_str.inc:
--------------------------------------------------------------------------------
1 | var
2 | STRING_FILE_NOT_FOUND: string;
3 | STRING_VERSION: string;
4 | STRING_FEATURE_NOT_SUPPORTED_THIS_TABLELEVEL: string;
5 |
6 | STRING_RECORD_LOCKED: string;
7 | STRING_WRITE_ERROR: string;
8 | STRING_WRITE_INDEX_ERROR: string;
9 | STRING_KEY_VIOLATION: string;
10 |
11 | STRING_INVALID_DBF_FILE: string;
12 | STRING_INVALID_DBF_FILE_FIELDERROR: string;
13 | STRING_FIELD_TOO_LONG: string;
14 | STRING_INVALID_FIELD_COUNT: string;
15 | STRING_INVALID_FIELD_TYPE: string;
16 | STRING_INVALID_VCL_FIELD_TYPE: string;
17 |
18 | STRING_INDEX_BASED_ON_UNKNOWN_FIELD: string;
19 | STRING_INDEX_BASED_ON_INVALID_FIELD: string;
20 | STRING_INDEX_EXPRESSION_TOO_LONG: string;
21 | STRING_INVALID_INDEX_TYPE: string;
22 | STRING_CANNOT_OPEN_INDEX: string;
23 | STRING_TOO_MANY_INDEXES: string;
24 | STRING_INDEX_NOT_EXIST: string;
25 | STRING_NEED_EXCLUSIVE_ACCESS: string;
26 |
27 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_str.pas:
--------------------------------------------------------------------------------
1 | unit dbf_str;
2 |
3 | interface
4 |
5 | {$I dbf_common.inc}
6 | {$I dbf_str.inc}
7 |
8 | implementation
9 |
10 | initialization
11 |
12 | STRING_FILE_NOT_FOUND := 'Open: file not found: "%s".';
13 | STRING_VERSION := 'TDbf V%d.%d';
14 | STRING_FEATURE_NOT_SUPPORTED_THIS_TABLELEVEL := 'This feature is not supported in tablelevel %d';
15 |
16 | STRING_RECORD_LOCKED := 'Record locked.';
17 | STRING_WRITE_ERROR := 'Error while writing occurred. (Disk full?)';
18 | STRING_WRITE_INDEX_ERROR := 'Error while writing occurred; indexes probably corrupted. (Disk full?)';
19 | STRING_KEY_VIOLATION := 'Key violation. (Key already present in file).'+#13+#10+
20 | 'Index: %s'+#13+#10+'Record=%d Key=''%s''.';
21 |
22 | STRING_INVALID_DBF_FILE := 'Invalid DBF file.';
23 | STRING_INVALID_DBF_FILE_FIELDERROR := 'Invalid DBF file. Invalid field definition.';
24 | STRING_FIELD_TOO_LONG := 'Value is too long: %d characters (it can''t be more than %d).';
25 | STRING_INVALID_FIELD_COUNT := 'Invalid field count: %d (must be between 1 and 4095).';
26 | STRING_INVALID_FIELD_TYPE := 'Invalid field type ''%s'' for field ''%s''.';
27 | STRING_INVALID_VCL_FIELD_TYPE := 'Cannot create field "%s", VCL field type %x not supported by DBF.';
28 |
29 | STRING_INDEX_BASED_ON_UNKNOWN_FIELD := 'Index based on unknown field "%s".';
30 | STRING_INDEX_BASED_ON_INVALID_FIELD := 'Field "%s" is an invalid field type to base index on.';
31 | STRING_INDEX_EXPRESSION_TOO_LONG := 'Index result for "%s" too long, >100 characters (%d).';
32 | STRING_INVALID_INDEX_TYPE := 'Invalid index type: can only be string or float.';
33 | STRING_CANNOT_OPEN_INDEX := 'Cannot open index: "%s".';
34 | STRING_TOO_MANY_INDEXES := 'Can not create index: too many indexes in file.';
35 | STRING_INDEX_NOT_EXIST := 'Index "%s" does not exist.';
36 | STRING_NEED_EXCLUSIVE_ACCESS := 'Exclusive access is required for this operation.';
37 | end.
38 |
39 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_str_es.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_fpc_322/dbf_str_es.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_str_fr.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_fpc_322/dbf_str_fr.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_str_ita.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_fpc_322/dbf_str_ita.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_str_nl.pas:
--------------------------------------------------------------------------------
1 | unit dbf_str;
2 |
3 | interface
4 |
5 | {$I dbf_common.inc}
6 | {$I dbf_str.inc}
7 |
8 | implementation
9 |
10 | initialization
11 |
12 | STRING_FILE_NOT_FOUND := 'Openen: bestand niet gevonden: "%s"';
13 | STRING_VERSION := 'TDbf V%d.%d';
14 | STRING_FEATURE_NOT_SUPPORTED_THIS_TABLELEVEL := 'Deze functionaliteit wordt niet ondersteund in tablelevel %d';
15 |
16 | STRING_RECORD_LOCKED := 'Record in gebruik.';
17 | STRING_WRITE_ERROR := 'Error tijdens schrijven. (Disk vol?)';
18 | STRING_KEY_VIOLATION := 'Indexsleutel bestond al in bestand.'+#13+#10+
19 | 'Index: %s'+#13+#10+'Record=%d Sleutel=''%s''';
20 |
21 | STRING_INVALID_DBF_FILE := 'Ongeldig DBF bestand.';
22 | STRING_INVALID_DBF_FILE_FIELDERROR := 'Ongeldig DBF bestand. Ongeldige velddefinitie.';
23 | STRING_FIELD_TOO_LONG := 'Waarde is te lang: %d karakters (maximum is %d).';
24 | STRING_INVALID_FIELD_COUNT := 'Ongeldig aantal velden: %d (moet tussen 1 en 4095).';
25 | STRING_INVALID_FIELD_TYPE := 'Veldtype ''%s'' is ongeldig voor veld ''%s''.';
26 | STRING_INVALID_VCL_FIELD_TYPE := 'Veld "%s": VCL veldtype %x wordt niet ondersteund door DBF.';
27 |
28 | STRING_INDEX_BASED_ON_UNKNOWN_FIELD := 'Index gebaseerd op onbekend veld "%s".';
29 | STRING_INDEX_BASED_ON_INVALID_FIELD := 'Veld "%s" heeft een ongeldig veldtype om index op te baseren.';
30 | STRING_INDEX_EXPRESSION_TOO_LONG := 'Index expressie resultaat "%s" is te lang, >100 karakters (%d).';
31 | STRING_INVALID_INDEX_TYPE := 'Ongeldig index type: kan alleen karakter of numeriek.';
32 | STRING_CANNOT_OPEN_INDEX := 'Openen index gefaald: "%s".';
33 | STRING_TOO_MANY_INDEXES := 'Toevoegen index onmogenlijk: te veel indexen in bestand.';
34 | STRING_INDEX_NOT_EXIST := 'Index "%s" bestaat niet.';
35 | STRING_NEED_EXCLUSIVE_ACCESS := 'Exclusieve toegang is vereist voor deze actie.';
36 | end.
37 |
38 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_str_pl.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_fpc_322/dbf_str_pl.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_str_pt.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_fpc_322/dbf_str_pt.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_str_ru.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_fpc_322/dbf_str_ru.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_wnix.inc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_fpc_322/dbf_wnix.inc
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/dbf_wos2.inc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_fpc_322/dbf_wos2.inc
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/fpmake.inc:
--------------------------------------------------------------------------------
1 | { Make DB directory and all subdirectories }
2 | { FULLDB will be defined if included from db directory }
3 | { FULLFCL will be defined if included from main FCL directory }
4 |
5 | { DBase, only for I386}
6 | Targets.ResetDefaults;
7 | Targets.DefaultCPU:=[i386];
8 | Targets.DefaultOS:=[linux,win32,freebsd,os2,emx];
9 | Targets.DefaultDir:='db/dbase';
10 | T:=Targets.AddUnit('dbf');
11 | T:=Targets.Addexampleunit('testdbf');
12 | If (Defaults.CPU=i386) and (Defaults.OS in [linux,win32,freebsd,os2,emx]) then
13 | begin
14 | { Install files. }
15 | InstallFiles.add('dbf_common.o');
16 | InstallFiles.add('dbf_common.ppu');
17 | InstallFiles.add('dbf_cursor.o');
18 | InstallFiles.add('dbf_cursor.ppu');
19 | InstallFiles.add('dbf_dbffile.o');
20 | InstallFiles.add('dbf_dbffile.ppu');
21 | InstallFiles.add('dbf_fields.o');
22 | InstallFiles.add('dbf_fields.ppu');
23 | InstallFiles.add('dbf_idxcur.o');
24 | InstallFiles.add('dbf_idxcur.ppu');
25 | InstallFiles.add('dbf_idxfile.o');
26 | InstallFiles.add('dbf_idxfile.ppu');
27 | InstallFiles.add('dbf_lang.o');
28 | InstallFiles.add('dbf_lang.ppu');
29 | InstallFiles.add('dbf_memo.o');
30 | InstallFiles.add('dbf_memo.ppu');
31 | InstallFiles.add('dbf_parser.o');
32 | InstallFiles.add('dbf_parser.ppu');
33 | InstallFiles.add('dbf_pgfile.o');
34 | InstallFiles.add('dbf_pgfile.ppu');
35 | InstallFiles.add('dbf_prscore.o');
36 | InstallFiles.add('dbf_prscore.ppu');
37 | InstallFiles.add('dbf_prsdef.o');
38 | InstallFiles.add('dbf_prsdef.ppu');
39 | InstallFiles.add('dbf_prssupp.o');
40 | InstallFiles.add('dbf_prssupp.ppu');
41 | InstallFiles.add('dbf_str.o');
42 | InstallFiles.add('dbf_str.ppu');
43 | if (Defaults.OS<>win32) then
44 | begin
45 | InstallFiles.add('dbf_wtil.ppu');
46 | InstallFiles.add('dbf_wtil.o');
47 | end;
48 | { Clean files }
49 | CleanFiles.add('dbf_common.o');
50 | CleanFiles.add('dbf_common.ppu');
51 | CleanFiles.add('dbf_cursor.o');
52 | CleanFiles.add('dbf_cursor.ppu');
53 | CleanFiles.add('dbf_dbffile.o');
54 | CleanFiles.add('dbf_dbffile.ppu');
55 | CleanFiles.add('dbf_fields.o');
56 | CleanFiles.add('dbf_fields.ppu');
57 | CleanFiles.add('dbf_idxcur.o');
58 | CleanFiles.add('dbf_idxcur.ppu');
59 | CleanFiles.add('dbf_idxfile.o');
60 | CleanFiles.add('dbf_idxfile.ppu');
61 | CleanFiles.add('dbf_lang.o');
62 | CleanFiles.add('dbf_lang.ppu');
63 | CleanFiles.add('dbf_memo.o');
64 | CleanFiles.add('dbf_memo.ppu');
65 | CleanFiles.add('dbf_parser.o');
66 | CleanFiles.add('dbf_parser.ppu');
67 | CleanFiles.add('dbf_pgfile.o');
68 | CleanFiles.add('dbf_pgfile.ppu');
69 | CleanFiles.add('dbf_prscore.o');
70 | CleanFiles.add('dbf_prscore.ppu');
71 | CleanFiles.add('dbf_prsdef.o');
72 | CleanFiles.add('dbf_prsdef.ppu');
73 | CleanFiles.add('dbf_prssupp.o');
74 | CleanFiles.add('dbf_prssupp.ppu');
75 | CleanFiles.add('dbf_str.o');
76 | CleanFiles.add('dbf_str.ppu');
77 | if (Defaults.OS<>win32) then
78 | begin
79 | Cleanfiles.add('dbf_wtil.ppu');
80 | CleanFiles.add('dbf_wtil.o');
81 | end;
82 | end;
83 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/fpmake.pp:
--------------------------------------------------------------------------------
1 | {$mode objfpc}
2 | {$H+}
3 | program fpmake;
4 |
5 | uses fpmkunit;
6 |
7 | Var
8 | T : TTarget;
9 |
10 | begin
11 | ChangeDir('../..');
12 | With Installer do
13 | begin
14 | {$i ../../fclmake.inc}
15 | {$i fpmake.inc}
16 | EndPackage;
17 | Run;
18 | end;
19 | end.
20 |
21 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/getstrfromint.inc:
--------------------------------------------------------------------------------
1 | if Width <= 0 then
2 | exit;
3 |
4 | NegSign := Val < 0;
5 | Val := Abs(Val);
6 | // we'll have to store characters backwards first
7 | I := 0;
8 | repeat
9 | Temp[I] := Chr((Val mod 10) + Ord('0'));
10 | Val := Val div 10;
11 | Inc(I);
12 | until (Val = 0) or (I = Width);
13 | // add spaces
14 | J := Width - I;
15 | FillChar(Dst^, J, PadChar);
16 | // add sign
17 | if NegSign then
18 | begin
19 | if PadChar = '0' then
20 | begin
21 | Dst[0] := '-';
22 | end else begin
23 | if J = 0 then
24 | begin
25 | // need one character for sign, shorten
26 | Inc(J);
27 | Dec(I);
28 | end;
29 | Dst[J - 1] := '-';
30 | end;
31 | end;
32 | // copy value, stored backwards
33 | repeat
34 | Dec(I);
35 | Dst[J] := Temp[I];
36 | Inc(J);
37 | until I = 0;
38 | // done!
39 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/package.txt:
--------------------------------------------------------------------------------
1 | Help on packages:
2 |
3 | TDbf_<< (D)elphi | (C)++Builder | (K)ylix | (L)azarus >> << Version >> << (D)esign | untime >>
4 |
5 | eg:
6 |
7 | TDbf_c5d = C++ Builder 5 design time package
8 | TDbf_d6r = Delphi 6 runtime package
9 | TDbf_l = Lazarus design/runtime package
10 |
11 | NOTE: Version 4 and earlier don't have designtime/runtime separated packages
12 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/readme.txt:
--------------------------------------------------------------------------------
1 | This package provides support for DBase files.
2 | It is derived from the upstream package at
3 | http://sourceforge.net/projects/tdbf/
4 | It is supported by FPC developers and the upstream maintainers.
5 |
6 | Support from other tdbf users may be available on the tdbf forum on
7 | SourceForge: http://sourceforge.net/projects/tdbf/forums/forum/107245
8 |
9 |
10 | TDbf readme:
11 |
12 | See history.txt for changelog, and version number.
13 | See INSTALL for installation procedure.
14 | License is LGPL (Library General Public License); see COPYING.LIB for details.
15 |
16 | Development notes
17 | =================
18 | (Includes possible additions to end user documentation)
19 |
20 | property RecNo: approximate record number. Does not take deleted records into account. Used mainly in grids.
21 |
22 | File format references:
23 | Flagship/FoxPro/Clipper/DBase III..V .dbf file format description
24 | ftp://fship.com/pub/multisoft/flagship/docu/dbfspecs.txt
25 |
26 | DBase IV language drivers
27 | - Russian list: ...
28 | http://www.autopark.ru/ASBProgrammerGuide/DBFSTRUC.HTM
29 | ... English extract:
30 | - http://shapelib.maptools.org/codepage.html
31 |
32 | - as supported by ArcPad .shp files (basically DBase IV) (page 128):
33 | http://downloads.esri.com/support/documentation/pad_/ArcPad_RefGuide_dec2007.pdf
34 |
35 |
36 | FoxPro 2.x:
37 | http://support.microsoft.com/kb/98743/en-us
38 | Data type:
39 | P Picture (foxpro/vfoxpro specific)
40 |
41 | Visual FoxPro:
42 | http://msdn.microsoft.com/en-us/library/d863bcf2%28v=vs.80%29.aspx
43 |
44 | especially this for table structure:
45 | http://msdn.microsoft.com/en-US/library/st4a0s68%28v=vs.80%29.aspx
46 | note however that the file type/magic number at offset 0 is incorrect.
47 | A community member amended these with correct numbers. See bottom of page
48 |
49 | Visual FoxPro 6 internal structures, _NULLFIELDS etc:
50 | http://www.dfpug.de/buecher/fundamentals/Hack6/S1C2.HTM
51 |
52 | Visual Foxpro 8 info about autoincrement:
53 | http://msdn.microsoft.com/en-us/library/aa976850%28v=VS.71%29.aspx
54 |
55 | Visual FoxPro 9 data types
56 | http://msdn.microsoft.com/en-US/library/ww305zh2%28v=vs.80%29.aspx
57 |
58 | Visual FoxPro 9 specific changes:
59 | http://foxcentral.net/microsoft/WhatsNewInVFP9_Chapter09.htm
60 | New data types:
61 | V Varchar/varchar binary (in Visual FoxPro 9) 1 byte up to 254 bytes.
62 | Same storage as char (padded spaces) but padding is removed on display
63 | W Blob (Visual FoxPro 9), 4 bytes in a table; stored in .fpt
64 | Q Varchar (binary) (in Visual Foxpro 9):
65 | accepts null, up to 254 characters (stored as padded with spaces), no code page translations
66 | note varchar (binary)<>varbinary
67 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/tdbf_l.pas:
--------------------------------------------------------------------------------
1 | { This file was automatically created by Lazarus. Do not edit!
2 | This source is only used to compile and install
3 | the package tdbf_l 0.0.
4 | }
5 |
6 | unit tdbf_l;
7 |
8 | interface
9 |
10 | uses
11 | dbf, dbf_reg, LazarusPackageIntf;
12 |
13 | implementation
14 |
15 | procedure Register;
16 | begin
17 | RegisterUnit('Dbf', @dbf_reg.Register);
18 | end;
19 |
20 | initialization
21 | RegisterPackage('tdbf_l', @Register)
22 | end.
23 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_fpc_322/testdbf.pp:
--------------------------------------------------------------------------------
1 | program dumpdb;
2 |
3 | {$i+}
4 |
5 | uses DB,Dbf,SysUtils;
6 |
7 | Procedure DumpTable (Const TN,FN : String);
8 |
9 | Var
10 | I,Count : longint;
11 | F : Text;
12 | Buf : Array[1..1024*4] of byte;
13 |
14 | begin
15 | Assign(F,FN);
16 | Rewrite(F);
17 | // SetTextBuf(F,Buf);
18 | Count := 0;
19 | With TDBF.Create(Nil) do
20 | begin
21 | TableName:=TN;
22 | Open;
23 | While not EOF do
24 | begin
25 | Inc(Count);
26 | For I:=0 to FieldCount-1 do
27 | With Fields[i] do
28 | Writeln(F,FieldName:20,' : ',AsString);
29 | Writeln(F,StringOfChar('=',72));
30 | Next;
31 | end;
32 | end;
33 | Writeln(F,'Dumped total of ',Count,' records.');
34 | Close(F);
35 | end;
36 |
37 | Var i : longint;
38 |
39 | begin
40 | If ParamCount<2 then
41 | begin
42 | Writeln('Usage: dumpdb tablename filename');
43 | Halt(1);
44 | end;
45 | DumpTable(Paramstr(1),Paramstr(2));
46 | end.
47 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf.dcr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_svn/dbf.dcr
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_cursor.pas:
--------------------------------------------------------------------------------
1 | unit dbf_cursor;
2 |
3 | interface
4 |
5 | {$I dbf_common.inc}
6 |
7 | uses
8 | SysUtils,
9 | Classes,
10 | dbf_pgfile,
11 | dbf_common;
12 |
13 | type
14 |
15 | //====================================================================
16 | TVirtualCursor = class(TObject)
17 | private
18 | FFile: TPagedFile;
19 |
20 | protected
21 | function GetPhysicalRecNo: Integer; virtual; abstract;
22 | function GetSequentialRecNo: TSequentialRecNo; virtual; abstract;
23 | function GetSequentialRecordCount: TSequentialRecNo; virtual; abstract;
24 | procedure SetPhysicalRecNo(Recno: Integer); virtual; abstract;
25 | procedure SetSequentialRecNo(Recno: TSequentialRecNo); virtual; abstract;
26 |
27 | public
28 | constructor Create(pFile: TPagedFile);
29 | destructor Destroy; override;
30 |
31 | function RecordSize: Integer;
32 |
33 | function Next: Boolean; virtual; abstract;
34 | function Prev: Boolean; virtual; abstract;
35 | procedure First; virtual; abstract;
36 | procedure Last; virtual; abstract;
37 |
38 | property PagedFile: TPagedFile read FFile;
39 | property PhysicalRecNo: Integer read GetPhysicalRecNo write SetPhysicalRecNo;
40 | property SequentialRecNo: TSequentialRecNo read GetSequentialRecNo write SetSequentialRecNo;
41 | property SequentialRecordCount: TSequentialRecNo read GetSequentialRecordCount;
42 | end;
43 |
44 | implementation
45 |
46 | constructor TVirtualCursor.Create(pFile: TPagedFile);
47 | begin
48 | FFile := pFile;
49 | end;
50 |
51 | destructor TVirtualCursor.Destroy; {override;}
52 | begin
53 | end;
54 |
55 | function TVirtualCursor.RecordSize : Integer;
56 | begin
57 | if FFile = nil then
58 | Result := 0
59 | else
60 | Result := FFile.RecordSize;
61 | end;
62 |
63 | end.
64 |
65 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_idxcur.pas:
--------------------------------------------------------------------------------
1 | unit dbf_idxcur;
2 |
3 | interface
4 |
5 | {$I dbf_common.inc}
6 |
7 | uses
8 | SysUtils,
9 | Classes,
10 | dbf_cursor,
11 | dbf_idxfile,
12 | dbf_prsdef,
13 | dbf_common;
14 |
15 | type
16 |
17 | //====================================================================
18 | //=== Index support
19 | //====================================================================
20 | TIndexCursor = class(TVirtualCursor)
21 | private
22 | FIndexFile: TIndexFile;
23 | protected
24 | function GetPhysicalRecNo: Integer; override;
25 | function GetSequentialRecNo: TSequentialRecNo; override;
26 | function GetSequentialRecordCount: TSequentialRecNo; override;
27 | procedure SetPhysicalRecNo(RecNo: Integer); override;
28 | procedure SetSequentialRecNo(RecNo: TSequentialRecNo); override;
29 |
30 | public
31 | constructor Create(DbfIndexFile: TIndexFile);
32 | destructor Destroy; override;
33 |
34 | function Next: Boolean; override;
35 | function Prev: Boolean; override;
36 | procedure First; override;
37 | procedure Last; override;
38 |
39 | procedure Insert(RecNo: Integer; Buffer: PAnsiChar);
40 | procedure Update(RecNo: Integer; PrevBuffer, NewBuffer: PAnsiChar);
41 |
42 | {$ifdef SUPPORT_VARIANTS}
43 | function VariantToBuffer(Key: Variant; ABuffer: PAnsiChar): TExpressionType;
44 | {$endif}
45 | function CheckUserKey(Key: PAnsiChar; StringBuf: PAnsiChar): PAnsiChar;
46 |
47 | property IndexFile: TIndexFile read FIndexFile;
48 | end;
49 |
50 | //====================================================================
51 | // TIndexCursor = class;
52 | //====================================================================
53 | PIndexPosInfo = ^TIndexPage;
54 |
55 | //====================================================================
56 | implementation
57 |
58 | uses
59 | dbf_ansistrings;
60 |
61 | //==========================================================
62 | //============ TIndexCursor
63 | //==========================================================
64 | constructor TIndexCursor.Create(DbfIndexFile: TIndexFile);
65 | begin
66 | inherited Create(DbfIndexFile);
67 |
68 | FIndexFile := DbfIndexFile;
69 | end;
70 |
71 | destructor TIndexCursor.Destroy; {override;}
72 | begin
73 | inherited Destroy;
74 | end;
75 |
76 | procedure TIndexCursor.Insert(RecNo: Integer; Buffer: PAnsiChar);
77 | begin
78 | TIndexFile(PagedFile).Insert(RecNo, {$IFDEF SUPPORT_TRECORDBUFFER}PByte{$ENDIF}(Buffer));
79 | // TODO SET RecNo and Key
80 | end;
81 |
82 | procedure TIndexCursor.Update(RecNo: Integer; PrevBuffer, NewBuffer: PAnsiChar);
83 | begin
84 | TIndexFile(PagedFile).Update(RecNo, {$IFDEF SUPPORT_TRECORDBUFFER}PByte{$ENDIF}(PrevBuffer), {$IFDEF SUPPORT_TRECORDBUFFER}PByte{$ENDIF}(NewBuffer));
85 | end;
86 |
87 | procedure TIndexCursor.First;
88 | begin
89 | TIndexFile(PagedFile).First;
90 | end;
91 |
92 | procedure TIndexCursor.Last;
93 | begin
94 | TIndexFile(PagedFile).Last;
95 | end;
96 |
97 | function TIndexCursor.Prev: Boolean;
98 | begin
99 | Result := TIndexFile(PagedFile).Prev;
100 | end;
101 |
102 | function TIndexCursor.Next: Boolean;
103 | begin
104 | Result := TIndexFile(PagedFile).Next;
105 | end;
106 |
107 | function TIndexCursor.GetPhysicalRecNo: Integer;
108 | begin
109 | Result := TIndexFile(PagedFile).PhysicalRecNo;
110 | end;
111 |
112 | procedure TIndexCursor.SetPhysicalRecNo(RecNo: Integer);
113 | begin
114 | TIndexFile(PagedFile).PhysicalRecNo := RecNo;
115 | end;
116 |
117 | function TIndexCursor.GetSequentialRecordCount: TSequentialRecNo;
118 | begin
119 | Result := TIndexFile(PagedFile).SequentialRecordCount;
120 | end;
121 |
122 | function TIndexCursor.GetSequentialRecNo: TSequentialRecNo;
123 | begin
124 | Result := TIndexFile(PagedFile).SequentialRecNo;
125 | end;
126 |
127 | procedure TIndexCursor.SetSequentialRecNo(RecNo: TSequentialRecNo);
128 | begin
129 | TIndexFile(PagedFile).SequentialRecNo := RecNo;
130 | end;
131 |
132 | {$ifdef SUPPORT_VARIANTS}
133 |
134 | function TIndexCursor.VariantToBuffer(Key: Variant; ABuffer: PAnsiChar): TExpressionType;
135 | // assumes ABuffer is large enough ie. at least max key size
136 | var
137 | currLen: Integer;
138 | begin
139 | if (TIndexFile(PagedFile).KeyType='N') then
140 | begin
141 | PDouble(ABuffer)^ := Key;
142 | if (TIndexFile(PagedFile).IndexVersion <> xBaseIII) then
143 | begin
144 | // make copy of userbcd to buffer
145 | Move(TIndexFile(PagedFile).PrepareKey({$IFDEF SUPPORT_TRECORDBUFFER}PByte{$ENDIF}(ABuffer), etFloat)[0], ABuffer[0], 11);
146 | end;
147 | Result := etInteger;
148 | end else begin
149 | dbfStrPLCopy(ABuffer, AnsiString(Key), TIndexFile(PagedFile).KeyLen); // PChar cast removed, AnsiString cast added
150 | // we have null-terminated string, pad with spaces if string too short
151 | currLen := dbfStrLen(ABuffer);
152 | FillChar(ABuffer[currLen], TIndexFile(PagedFile).KeyLen-currLen, ' ');
153 | Result := etString;
154 | end;
155 | end;
156 |
157 | {$endif}
158 |
159 | function TIndexCursor.CheckUserKey(Key: PAnsiChar; StringBuf: PAnsiChar): PAnsiChar;
160 | var
161 | keyLen, userLen: Integer;
162 | begin
163 | // default is to use key
164 | Result := Key;
165 | // if key is double, then no check
166 | if (TIndexFile(PagedFile).KeyType = 'N') then
167 | begin
168 | // nothing needs to be done
169 | end else begin
170 | // check if string long enough then no copying needed
171 | userLen := dbfStrLen(Key);
172 | keyLen := TIndexFile(PagedFile).KeyLen;
173 | if userLen < keyLen then
174 | begin
175 | // copy string
176 | Move(Key^, StringBuf[0], userLen);
177 | // add spaces to searchstring
178 | FillChar(StringBuf[userLen], keyLen - userLen, ' ');
179 | // set buffer to temporary buffer
180 | Result := StringBuf;
181 | end;
182 | end;
183 | end;
184 |
185 | end.
186 |
187 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_soundex.inc:
--------------------------------------------------------------------------------
1 | function Soundex(const aString: AnsiString): AnsiString;
2 | const
3 | soundextable:packed array['A'..'Z'] of AnsiChar = '.123.12..22455.12623.1.2.2';
4 | var
5 | SoundString: AnsiString;
6 | I1: Integer; // input
7 | I2: Integer; // output
8 | C2: AnsiChar;
9 | len: integer;
10 | begin
11 | len := Length(aString);
12 | result := '0000';
13 | if len > 0 then
14 | begin
15 | // find first non-blank char
16 | I1 := 0;
17 | repeat
18 | Inc(I1);
19 | C2 := UpCase(aString[I1]);
20 | until (I1 >= len) or (C2 <> ' ');
21 |
22 | // if first non-blank is not alphabetic, result is 0000
23 | if (C2 < 'A') or (C2 > 'Z') then
24 | exit;
25 |
26 | // calculate sound value for each remaining character
27 | Len := Len - I1 + 1;
28 | SetLength(SoundString, Len);
29 | Fillchar(SoundString[1], Len, '0');
30 | SoundString[1] := C2;
31 | for I2 := I1+1 to Length(astring) do
32 | begin
33 | C2 := UpCase(astring[I2]);
34 | if (C2 < 'A') or (C2 > 'Z') then
35 | break;
36 | SoundString[i2-i1+1] := SoundexTable[C2];
37 | end;
38 |
39 | // if adjacent chars have the same sound value, delete the second
40 | I1 := 2;
41 | repeat
42 | if I1 < Length(SoundString) then
43 | if SoundString[I1] = SoundString[I1+1] then
44 | Delete(SoundString, I1+1, 1)
45 | else
46 | Inc(I1);
47 | until I1 >= Length(SoundString);
48 |
49 | // result is 1st char followed by next 3 non-ignored chars padded to
50 | // right with '0', if necessary
51 | I1 := 1;
52 | I2 := 1;
53 | repeat
54 | if SoundString[I2] <> '.' then
55 | begin
56 | result[I1] := SoundString[I2];
57 | inc(I1);
58 | end;
59 | inc(I2);
60 | until (I1 > 4) or (I2 > Length(SoundString));
61 | end;
62 | end;
63 |
64 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_str.inc:
--------------------------------------------------------------------------------
1 | var
2 | STRING_FILE_NOT_FOUND: string;
3 |
4 | STRING_RECORD_LOCKED: string;
5 | STRING_READ_ERROR: string;
6 | STRING_WRITE_ERROR: string;
7 | STRING_WRITE_INDEX_ERROR: string;
8 | STRING_KEY_VIOLATION: string;
9 |
10 | STRING_INVALID_DBF_FILE: string;
11 | STRING_FIELD_TOO_LONG: string;
12 | STRING_INVALID_FIELD_COUNT: string;
13 | STRING_INVALID_FIELD_TYPE: string;
14 | STRING_INVALID_VCL_FIELD_TYPE: string;
15 |
16 | STRING_INVALID_INDEX_FILE: string;
17 | STRING_PARSER_UNKNOWN_FIELD: string;
18 | STRING_PARSER_INVALID_FIELDTYPE: string;
19 | STRING_INDEX_EXPRESSION_TOO_LONG: string;
20 | STRING_INVALID_INDEX_TYPE: string;
21 | STRING_CANNOT_OPEN_INDEX: string;
22 | STRING_TOO_MANY_INDEXES: string;
23 | STRING_INDEX_NOT_EXIST: string;
24 | STRING_NEED_EXCLUSIVE_ACCESS: string;
25 |
26 | STRING_PROGRESS_PACKINGRECORDS: string;
27 | STRING_PROGRESS_READINGRECORDS: string;
28 | STRING_PROGRESS_APPENDINGRECORDS: string;
29 | STRING_PROGRESS_SORTING_RECORDS: string;
30 | STRING_PROGRESS_WRITING_RECORDS: string;
31 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_str.pas:
--------------------------------------------------------------------------------
1 | unit dbf_str;
2 |
3 | { English }
4 |
5 | interface
6 |
7 | {$I dbf_common.inc}
8 | {$I dbf_str.inc}
9 |
10 | implementation
11 |
12 | initialization
13 |
14 | STRING_FILE_NOT_FOUND := 'Open: file not found: "%s".';
15 |
16 | STRING_RECORD_LOCKED := 'Record locked.';
17 | STRING_READ_ERROR := 'Error while reading occurred.';
18 | STRING_WRITE_ERROR := 'Error while writing occurred. (Disk full?)';
19 | STRING_WRITE_INDEX_ERROR := 'Error while writing occurred; indexes probably corrupted. (Disk full?)';
20 | STRING_KEY_VIOLATION := 'Key violation. (Key already present in file).'+#13+#10+
21 | 'Index: %s'+#13+#10+'Record=%d Key=%s.';
22 |
23 | STRING_INVALID_DBF_FILE := 'Invalid DBF file.';
24 | STRING_FIELD_TOO_LONG := 'Value is too long: %d characters (it can''t be more than %d).';
25 | STRING_INVALID_FIELD_COUNT := 'Invalid field count: %d (must be between 1 and 4095).';
26 | STRING_INVALID_FIELD_TYPE := 'Invalid field type ''%s'' for field ''%s''.';
27 | STRING_INVALID_VCL_FIELD_TYPE := 'Cannot create field "%s", VCL field type %x not supported by DBF.';
28 |
29 | STRING_INVALID_INDEX_FILE := 'Invalid index file.';
30 | STRING_PARSER_UNKNOWN_FIELD := 'Unknown field "%s".';
31 | STRING_PARSER_INVALID_FIELDTYPE := 'Invalid field type for field ''%s''.';
32 | STRING_INDEX_EXPRESSION_TOO_LONG := 'Index result for "%s" too long, >100 characters (%d).';
33 | STRING_INVALID_INDEX_TYPE := 'Invalid index type: can only be string or float.';
34 | STRING_CANNOT_OPEN_INDEX := 'Cannot open index: "%s".';
35 | STRING_TOO_MANY_INDEXES := 'Can not create index: too many indexes in file.';
36 | STRING_INDEX_NOT_EXIST := 'Index "%s" does not exist.';
37 | STRING_NEED_EXCLUSIVE_ACCESS := 'Exclusive access is required for this operation.';
38 |
39 | STRING_PROGRESS_PACKINGRECORDS := 'Packing records';
40 | STRING_PROGRESS_READINGRECORDS := 'Reading records';
41 | STRING_PROGRESS_APPENDINGRECORDS := 'Appending records';
42 | STRING_PROGRESS_SORTING_RECORDS := 'Sorting records';
43 | STRING_PROGRESS_WRITING_RECORDS := 'Writing records';
44 | end.
45 |
46 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_str_de.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_svn/dbf_str_de.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_str_es.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_svn/dbf_str_es.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_str_fr.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_svn/dbf_str_fr.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_str_ita.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_svn/dbf_str_ita.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_str_nl.pas:
--------------------------------------------------------------------------------
1 | unit dbf_str;
2 |
3 | { Dutch }
4 |
5 | interface
6 |
7 | {$I dbf_common.inc}
8 | {$I dbf_str.inc}
9 |
10 | implementation
11 |
12 | initialization
13 |
14 | STRING_FILE_NOT_FOUND := 'Openen: bestand niet gevonden: "%s"';
15 |
16 | STRING_RECORD_LOCKED := 'Record in gebruik.';
17 | STRING_READ_ERROR := 'Error tijdens lezen.';
18 | STRING_WRITE_ERROR := 'Error tijdens schrijven. (Disk vol?)';
19 | STRING_WRITE_INDEX_ERROR := 'Error tijdens schrijven; indexen waarschijnlijk beschadigd. (Disk vol?)';
20 | STRING_KEY_VIOLATION := 'Indexsleutel bestond al in bestand.'+#13+#10+
21 | 'Index: %s'+#13+#10+'Record=%d Sleutel=%s';
22 |
23 | STRING_INVALID_DBF_FILE := 'Ongeldig DBF bestand.';
24 | STRING_FIELD_TOO_LONG := 'Waarde is te lang: %d karakters (maximum is %d).';
25 | STRING_INVALID_FIELD_COUNT := 'Ongeldig aantal velden: %d (moet tussen 1 en 4095).';
26 | STRING_INVALID_FIELD_TYPE := 'Veldtype ''%s'' is ongeldig voor veld ''%s''.';
27 | STRING_INVALID_VCL_FIELD_TYPE := 'Veld "%s": VCL veldtype %x wordt niet ondersteund door DBF.';
28 |
29 | STRING_INVALID_INDEX_FILE := 'Ongeldig index bestand.';
30 | STRING_PARSER_UNKNOWN_FIELD := 'Onbekend veld "%s".';
31 | STRING_PARSER_INVALID_FIELDTYPE := 'Veldtype is ongeldig voor veld ''%s''.';
32 | STRING_INDEX_EXPRESSION_TOO_LONG := 'Index expressie resultaat "%s" is te lang, >100 karakters (%d).';
33 | STRING_INVALID_INDEX_TYPE := 'Ongeldig index type: kan alleen karakter of numeriek.';
34 | STRING_CANNOT_OPEN_INDEX := 'Openen index gefaald: "%s".';
35 | STRING_TOO_MANY_INDEXES := 'Toevoegen index onmogenlijk: te veel indexen in bestand.';
36 | STRING_INDEX_NOT_EXIST := 'Index "%s" bestaat niet.';
37 | STRING_NEED_EXCLUSIVE_ACCESS := 'Exclusieve toegang is vereist voor deze actie.';
38 |
39 | STRING_PROGRESS_PACKINGRECORDS := 'Packs records';
40 | STRING_PROGRESS_READINGRECORDS := 'Leest records';
41 | STRING_PROGRESS_APPENDINGRECORDS := 'Voegt records';
42 | STRING_PROGRESS_SORTING_RECORDS := 'Sorteert records';
43 | STRING_PROGRESS_WRITING_RECORDS := 'Schrijft records';
44 | end.
45 |
46 |
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_str_pl.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_svn/dbf_str_pl.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_str_pt.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_svn/dbf_str_pt.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_str_ru.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_svn/dbf_str_ru.pas
--------------------------------------------------------------------------------
/src/third-party/tdbf_svn/dbf_wtil.pas:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wp-xyz/MyDBFStudio/e9f7da9bf7961856f782a356d93e215c672386e1/src/third-party/tdbf_svn/dbf_wtil.pas
--------------------------------------------------------------------------------
/src/uaddalias.lfm:
--------------------------------------------------------------------------------
1 | object AddAlias: TAddAlias
2 | Left = 443
3 | Height = 147
4 | Top = 270
5 | Width = 383
6 | AutoSize = True
7 | BorderStyle = bsDialog
8 | Caption = 'Add Alias For Tables'
9 | ClientHeight = 147
10 | ClientWidth = 383
11 | Constraints.MinWidth = 360
12 | OnCloseQuery = FormCloseQuery
13 | OnCreate = FormCreate
14 | OnShow = FormShow
15 | Position = poMainFormCenter
16 | LCLVersion = '2.1.0.0'
17 | object BrowseBtn: TButton
18 | AnchorSideTop.Control = Path
19 | AnchorSideRight.Control = AName
20 | AnchorSideRight.Side = asrBottom
21 | Left = 336
22 | Height = 25
23 | Top = 73
24 | Width = 41
25 | Anchors = [akTop, akRight]
26 | AutoSize = True
27 | Caption = ' ... '
28 | OnClick = BrowseBtnClick
29 | TabOrder = 2
30 | end
31 | object OKBtn: TBitBtn
32 | AnchorSideTop.Control = CancelBtn
33 | AnchorSideRight.Control = CancelBtn
34 | Left = 227
35 | Height = 26
36 | Top = 108
37 | Width = 62
38 | Anchors = [akTop, akRight]
39 | AutoSize = True
40 | BorderSpacing.Right = 6
41 | Caption = '&OK'
42 | Default = True
43 | Images = CommonData.Images
44 | ImageIndex = 7
45 | OnClick = OKBtnClick
46 | TabOrder = 3
47 | end
48 | object CancelBtn: TBitBtn
49 | AnchorSideTop.Control = Path
50 | AnchorSideTop.Side = asrBottom
51 | AnchorSideRight.Control = Owner
52 | AnchorSideRight.Side = asrBottom
53 | Left = 295
54 | Height = 26
55 | Top = 108
56 | Width = 82
57 | Anchors = [akTop, akRight]
58 | AutoSize = True
59 | BorderSpacing.Top = 12
60 | BorderSpacing.Right = 6
61 | BorderSpacing.Bottom = 6
62 | Cancel = True
63 | Caption = 'Cancel'
64 | ModalResult = 2
65 | Images = CommonData.Images
66 | ImageIndex = 8
67 | OnClick = CancelBtnClick
68 | TabOrder = 4
69 | end
70 | object lblAliasName: TLabel
71 | AnchorSideLeft.Control = Owner
72 | AnchorSideTop.Control = Owner
73 | AnchorSideRight.Side = asrBottom
74 | Left = 6
75 | Height = 15
76 | Top = 6
77 | Width = 60
78 | BorderSpacing.Left = 6
79 | BorderSpacing.Top = 6
80 | Caption = 'Alias Name'
81 | ParentColor = False
82 | end
83 | object AName: TEdit
84 | AnchorSideLeft.Control = Owner
85 | AnchorSideTop.Control = lblAliasName
86 | AnchorSideTop.Side = asrBottom
87 | AnchorSideRight.Control = Owner
88 | AnchorSideRight.Side = asrBottom
89 | Left = 6
90 | Height = 23
91 | Top = 23
92 | Width = 371
93 | Anchors = [akTop, akLeft, akRight]
94 | BorderSpacing.Left = 6
95 | BorderSpacing.Top = 2
96 | BorderSpacing.Right = 6
97 | Constraints.MinWidth = 350
98 | MaxLength = 80
99 | TabOrder = 0
100 | end
101 | object lblPath: TLabel
102 | AnchorSideLeft.Control = lblAliasName
103 | AnchorSideTop.Control = AName
104 | AnchorSideTop.Side = asrBottom
105 | Left = 6
106 | Height = 15
107 | Top = 58
108 | Width = 24
109 | BorderSpacing.Top = 12
110 | Caption = 'Path'
111 | ParentColor = False
112 | end
113 | object Path: TEdit
114 | AnchorSideLeft.Control = lblPath
115 | AnchorSideTop.Control = lblPath
116 | AnchorSideTop.Side = asrBottom
117 | AnchorSideRight.Control = BrowseBtn
118 | Left = 6
119 | Height = 23
120 | Top = 73
121 | Width = 324
122 | Anchors = [akTop, akLeft, akRight]
123 | BorderSpacing.Right = 6
124 | TabOrder = 1
125 | end
126 | object SelDir: TSelectDirectoryDialog
127 | Title = 'Select a directory...'
128 | Options = [ofPathMustExist, ofEnableSizing, ofViewDetail]
129 | Left = 56
130 | Top = 56
131 | end
132 | end
133 |
--------------------------------------------------------------------------------
/src/uaddalias.pas:
--------------------------------------------------------------------------------
1 | unit uAddAlias;
2 |
3 | {$mode objfpc}{$H+}
4 |
5 | interface
6 |
7 | uses
8 | Classes, SysUtils, dbf, FileUtil, Forms, Controls, Graphics, Dialogs,
9 | ExtCtrls, StdCtrls, Buttons;
10 |
11 | type
12 |
13 | { TAddAlias }
14 |
15 | TAddAlias = class(TForm)
16 | AName: TEdit;
17 | CancelBtn: TBitBtn;
18 | lblAliasName: TLabel;
19 | lblPath: TLabel;
20 | OKBtn: TBitBtn;
21 | BrowseBtn: TButton;
22 | Path: TEdit;
23 | SelDir: TSelectDirectoryDialog;
24 | procedure CancelBtnClick(Sender: TObject);
25 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
26 | procedure FormCreate(Sender: TObject);
27 | procedure OKBtnClick(Sender: TObject);
28 | procedure BrowseBtnClick(Sender: TObject);
29 | procedure FormShow(Sender: TObject);
30 | private
31 | { private declarations }
32 | FAliasDB: TDbf;
33 | Function CheckAliasName(Val : String) : Boolean;
34 | Procedure InsertAlias;
35 | public
36 | { public declarations }
37 | property AliasDB: TDbf read FAliasDB;
38 | end;
39 |
40 | var
41 | AddAlias: TAddAlias;
42 |
43 | implementation
44 |
45 | {$R *.lfm}
46 |
47 | uses
48 | uUtils, uOptions;
49 |
50 | { TAddAlias }
51 |
52 | procedure TAddAlias.BrowseBtnClick(Sender: TObject);
53 | begin
54 | if SelDir.Execute then
55 | Path.Text := SelDir.FileName;
56 | end;
57 |
58 | function TAddAlias.CheckAliasName(Val: String): Boolean;
59 | begin
60 | Result := true;
61 |
62 | AliasDB.TableName := 'alias.dbf';
63 | AliasDB.FilePath := GetAliasDir;
64 | AliasDB.Open;
65 | AliasDB.Filter := 'ALIAS = ''' + Val + '''';
66 | if not AliasDB.IsEmpty then
67 | Result := false;
68 |
69 | AliasDB.Close;
70 | end;
71 |
72 | procedure TAddAlias.InsertAlias;
73 | begin
74 | FAliasDB.TableName := 'alias.dbf';
75 | FAliasDB.FilePath := GetAliasDir;
76 | FAliasDB.Open;
77 | FAliasDB.Insert;
78 | FAliasDB.FieldByName('ALIAS').AsString := AName.Text;
79 | FAliasDb.FieldByName('PATH').AsString := Path.Text;
80 | FAliasDb.Post;
81 | FAliasDB.Close;
82 | end;
83 |
84 | procedure TAddAlias.CancelBtnClick(Sender: TObject);
85 | begin
86 | Close;
87 | end;
88 |
89 | procedure TAddAlias.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
90 | begin
91 | if CanClose then
92 | Options.AddAliasWindow.ExtractFromForm(Self);
93 | end;
94 |
95 | procedure TAddAlias.FormCreate(Sender: TObject);
96 | begin
97 | FAliasDB := TDbf.Create(self);
98 | FAliasDB.Filtered := true;
99 | end;
100 |
101 | procedure TAddAlias.FormShow(Sender: TObject);
102 | begin
103 | OKBtn.Constraints.MinWidth := CancelBtn.Width;
104 | Options.AddAliasWindow.ApplyToForm(Self);
105 | end;
106 |
107 | procedure TAddAlias.OKBtnClick(Sender: TObject);
108 | begin
109 | if Trim(AName.Text) = '' then
110 | begin
111 | MessageDlg('You must provide an alias name.', mtError, [mbOK], 0);
112 | AName.SetFocus;
113 | exit;
114 | end;
115 |
116 | if Trim(Path.Text) = '' then
117 | begin
118 | MessageDlg('You must insert the tables path.', mtError, [mbOK], 0);
119 | Path.SetFocus;
120 | exit;
121 | end;
122 |
123 | if not DirectoryExists(Path.Text) then
124 | begin
125 | MessageDlg('The directory does not exist.', mtError, [mbOK], 0);
126 | Path.SetFocus;
127 | exit;
128 | end;
129 |
130 | if not CheckAliasName(AName.Text) then
131 | begin
132 | MessageDlg('The alias name alredy exists.', mtError, [mbOK], 0);
133 | AName.SetFocus;
134 | exit;
135 | end;
136 |
137 | try
138 | InsertAlias;
139 | Close;
140 | except
141 | on E: Exception do
142 | MessageDlg('Error while writing alias data:' + LineEnding + E.Message, mtError, [mbOK], 0);
143 | end;
144 | end;
145 |
146 | end.
147 |
148 |
--------------------------------------------------------------------------------
/src/uaddtables.lfm:
--------------------------------------------------------------------------------
1 | object AddTables: TAddTables
2 | AnchorSideRight.Side = asrBottom
3 | Left = 443
4 | Height = 327
5 | Top = 288
6 | Width = 399
7 | AutoSize = True
8 | BorderIcons = []
9 | Caption = 'Add Two Tables'
10 | ClientHeight = 327
11 | ClientWidth = 399
12 | OnCloseQuery = FormCloseQuery
13 | OnShow = FormShow
14 | Position = poMainFormCenter
15 | LCLVersion = '2.1.0.0'
16 | object GroupBox1: TGroupBox
17 | AnchorSideLeft.Control = Owner
18 | AnchorSideTop.Control = Owner
19 | AnchorSideRight.Control = Owner
20 | AnchorSideRight.Side = asrBottom
21 | Left = 6
22 | Height = 55
23 | Top = 6
24 | Width = 387
25 | Anchors = [akTop, akLeft, akRight]
26 | AutoSize = True
27 | BorderSpacing.Left = 6
28 | BorderSpacing.Top = 6
29 | BorderSpacing.Right = 6
30 | Caption = ' Select First Table... '
31 | ClientHeight = 35
32 | ClientWidth = 383
33 | TabOrder = 0
34 | object cbTable1: TComboBox
35 | AnchorSideLeft.Control = GroupBox1
36 | AnchorSideTop.Control = GroupBox1
37 | AnchorSideRight.Control = GroupBox1
38 | AnchorSideRight.Side = asrBottom
39 | Left = 6
40 | Height = 23
41 | Top = 6
42 | Width = 371
43 | Anchors = [akTop, akLeft, akRight]
44 | BorderSpacing.Around = 6
45 | DropDownCount = 24
46 | ItemHeight = 15
47 | Style = csDropDownList
48 | TabOrder = 0
49 | end
50 | end
51 | object GroupBox2: TGroupBox
52 | AnchorSideLeft.Control = Owner
53 | AnchorSideTop.Control = GroupBox1
54 | AnchorSideTop.Side = asrBottom
55 | AnchorSideRight.Control = Owner
56 | AnchorSideRight.Side = asrBottom
57 | Left = 6
58 | Height = 55
59 | Top = 73
60 | Width = 387
61 | Anchors = [akTop, akLeft, akRight]
62 | AutoSize = True
63 | BorderSpacing.Left = 6
64 | BorderSpacing.Top = 12
65 | BorderSpacing.Right = 6
66 | Caption = ' Select Second Table... '
67 | ClientHeight = 35
68 | ClientWidth = 383
69 | TabOrder = 1
70 | object cbTable2: TComboBox
71 | AnchorSideLeft.Control = GroupBox2
72 | AnchorSideTop.Control = GroupBox2
73 | AnchorSideRight.Control = GroupBox2
74 | AnchorSideRight.Side = asrBottom
75 | AnchorSideBottom.Control = GroupBox2
76 | AnchorSideBottom.Side = asrBottom
77 | Left = 6
78 | Height = 23
79 | Top = 6
80 | Width = 371
81 | Anchors = [akTop, akLeft, akRight]
82 | BorderSpacing.Around = 6
83 | DropDownCount = 24
84 | ItemHeight = 15
85 | Style = csDropDownList
86 | TabOrder = 0
87 | end
88 | end
89 | object rgTPri: TRadioGroup
90 | AnchorSideLeft.Control = Owner
91 | AnchorSideTop.Control = GroupBox2
92 | AnchorSideTop.Side = asrBottom
93 | AnchorSideRight.Control = Owner
94 | AnchorSideRight.Side = asrBottom
95 | Left = 6
96 | Height = 74
97 | Top = 140
98 | Width = 387
99 | Anchors = [akTop, akLeft, akRight]
100 | AutoFill = True
101 | AutoSize = True
102 | BorderSpacing.Left = 6
103 | BorderSpacing.Top = 12
104 | BorderSpacing.Right = 6
105 | Caption = ' Tables Priority '
106 | ChildSizing.LeftRightSpacing = 24
107 | ChildSizing.TopBottomSpacing = 6
108 | ChildSizing.VerticalSpacing = 4
109 | ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
110 | ChildSizing.EnlargeVertical = crsHomogenousChildResize
111 | ChildSizing.ShrinkHorizontal = crsScaleChilds
112 | ChildSizing.ShrinkVertical = crsScaleChilds
113 | ChildSizing.Layout = cclLeftToRightThenTopToBottom
114 | ChildSizing.ControlsPerLine = 1
115 | ClientHeight = 54
116 | ClientWidth = 383
117 | ItemIndex = 0
118 | Items.Strings = (
119 | 'Add First Table To Second Table'
120 | 'Add Second Table To First Table'
121 | )
122 | TabOrder = 2
123 | end
124 | object lblProgress: TLabel
125 | AnchorSideLeft.Control = Owner
126 | AnchorSideTop.Control = rgTPri
127 | AnchorSideTop.Side = asrBottom
128 | Left = 6
129 | Height = 15
130 | Top = 226
131 | Width = 45
132 | BorderSpacing.Left = 6
133 | BorderSpacing.Top = 12
134 | Caption = 'Progress'
135 | ParentColor = False
136 | end
137 | object pBar: TProgressBar
138 | AnchorSideLeft.Control = Owner
139 | AnchorSideTop.Control = lblProgress
140 | AnchorSideTop.Side = asrBottom
141 | AnchorSideRight.Control = Owner
142 | AnchorSideRight.Side = asrBottom
143 | Left = 6
144 | Height = 20
145 | Top = 243
146 | Width = 387
147 | Anchors = [akTop, akLeft, akRight]
148 | BorderSpacing.Left = 6
149 | BorderSpacing.Top = 2
150 | BorderSpacing.Right = 6
151 | TabOrder = 3
152 | end
153 | object StartBtn: TBitBtn
154 | AnchorSideTop.Control = CloseBtn
155 | AnchorSideRight.Control = CloseBtn
156 | Left = 242
157 | Height = 26
158 | Top = 275
159 | Width = 70
160 | Anchors = [akTop, akRight]
161 | AutoSize = True
162 | BorderSpacing.Right = 6
163 | Caption = '&Start'
164 | Default = True
165 | Images = CommonData.Images
166 | ImageIndex = 7
167 | OnClick = StartBtnClick
168 | TabOrder = 4
169 | end
170 | object CloseBtn: TBitBtn
171 | AnchorSideTop.Control = pBar
172 | AnchorSideTop.Side = asrBottom
173 | AnchorSideRight.Control = Owner
174 | AnchorSideRight.Side = asrBottom
175 | Left = 318
176 | Height = 26
177 | Top = 275
178 | Width = 75
179 | Anchors = [akTop, akRight]
180 | AutoSize = True
181 | BorderSpacing.Top = 12
182 | BorderSpacing.Right = 6
183 | BorderSpacing.Bottom = 6
184 | Caption = '&Close'
185 | Images = CommonData.Images
186 | ImageIndex = 37
187 | OnClick = CloseBtnClick
188 | TabOrder = 5
189 | end
190 | end
191 |
--------------------------------------------------------------------------------
/src/uaddtables.pas:
--------------------------------------------------------------------------------
1 | unit uAddTables;
2 |
3 | {$mode objfpc}{$H+}
4 |
5 | interface
6 |
7 | uses
8 | Classes, SysUtils, dbf, FileUtil, Forms, Controls, Graphics, Dialogs,
9 | StdCtrls, ExtCtrls, ComCtrls, Buttons;
10 |
11 | type
12 |
13 | { TAddTables }
14 |
15 | TAddTables = class(TForm)
16 | CloseBtn: TBitBtn;
17 | StartBtn: TBitBtn;
18 | cbTable1: TComboBox;
19 | cbTable2: TComboBox;
20 | GroupBox1: TGroupBox;
21 | GroupBox2: TGroupBox;
22 | lblProgress: TLabel;
23 | pBar: TProgressBar;
24 | rgTPri: TRadioGroup;
25 | procedure CloseBtnClick(Sender: TObject);
26 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
27 | procedure FormShow(Sender: TObject);
28 | procedure StartBtnClick(Sender: TObject);
29 | private
30 | { private declarations }
31 | FDbfTable1: TDbf;
32 | FDbfTable2: TDbf;
33 | Function Check_Table_Structures: Boolean;
34 | Procedure AddTable(D1, D2: TDbf);
35 | public
36 | { public declarations }
37 | end;
38 |
39 | var
40 | AddTables: TAddTables;
41 |
42 | implementation
43 |
44 | uses
45 | DB, Math,
46 | uMain, uTabForm, uDbfTable, uOptions, uUtils;
47 |
48 | {$R *.lfm}
49 |
50 | { TAddTables }
51 |
52 | procedure TAddTables.CloseBtnClick(Sender: TObject);
53 | begin
54 | Close;
55 | end;
56 |
57 | procedure TAddTables.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
58 | begin
59 | if CanClose then
60 | Options.AddTablesWindow.ExtractFromForm(Self);
61 | end;
62 |
63 | procedure TAddTables.StartBtnClick(Sender: TObject);
64 | var
65 | FT1, FT2 : TForm;
66 | IdxT1, IdxT2 : Integer;
67 | begin
68 | if cbTable1.Text = '' then
69 | begin
70 | MessageDlg('You MUST select a first table...', mtError, [mbOK], 0);
71 | cbTable1.SetFocus;
72 | Exit;
73 | end;
74 |
75 | if cbTable2.Text = '' then
76 | begin
77 | MessageDlg('You MUST select a second table...', mtError, [mbOK], 0);
78 | cbTable2.SetFocus;
79 | Exit;
80 | end;
81 |
82 | if cbTable1.Text = cbTable2.Text then
83 | begin
84 | MessageDlg('The tables must be different.', mtError, [mbOK], 0);
85 | Exit;
86 | end;
87 |
88 | IdxT1 := cbTable1.ItemIndex;
89 | IdxT2 := cbTable2.ItemIndex;
90 |
91 | FT1 := TTabForm(Main.WorkSite.Pages[IdxT1]).ParentForm;
92 | FT2 := TTabForm(Main.WorkSite.Pages[IdxT2]).ParentForm;
93 |
94 | FDbfTable1 := TDbfTable(FT1).DBTable;
95 | FDbfTable2 := TDbfTable(FT2).DBTable;
96 |
97 | if Check_Table_Structures then
98 | begin
99 | TDbfTable(FT1).DBGrid.BeginUpdate;
100 | TDbfTable(FT2).DBGrid.BeginUpdate;
101 | try
102 | if rgTPri.ItemIndex = 0 then
103 | AddTable(FDbfTable1, FDbfTable2)
104 | else
105 | AddTable(FDbfTable2, FDbfTable1);
106 | finally
107 | TDbfTable(fT1).DBGrid.EndUpdate(true);
108 | TDbfTable(fT2).DBGrid.EndUpdate(true);
109 | end;
110 | end;
111 | end;
112 |
113 | procedure TAddTables.FormShow(Sender: TObject);
114 | var
115 | Ind: Word;
116 | F: TDbfTable;
117 | begin
118 | StartBtn.Constraints.MinWidth := Max(StartBtn.Width, CloseBtn.Width);
119 | CloseBtn.Constraints.MinWidth := StartBtn.Constraints.MinWidth;
120 |
121 | Constraints.MinWidth := Width;
122 | Constraints.MinHeight := Height;
123 | Constraints.MaxHeight := Height;
124 |
125 | if Options.RememberWindowSizePosContent and (Options.AddTablesWindow.Width > 0) then
126 | begin
127 | AutoSize := false;
128 | Options.AddTablesWindow.ApplyToForm(self);
129 | end;
130 |
131 | for Ind := 0 To Main.WorkSite.PageCount - 1 do
132 | if (Main.WorkSite.Pages[Ind] is TTabForm) then
133 | begin
134 | if TTabForm(Main.WorkSite.Pages[Ind]).ParentForm is TDbfTable then
135 | begin
136 | F := TDbfTable(TTabForm(Main.WorkSite.Pages[Ind]).ParentForm);
137 | cbTable1.Items.Add(F.DBTable.FilePathFull + F.DBTable.TableName);
138 | cbTable2.Items.Add(F.DBTable.FilePathFull + F.DBTable.TableName);
139 | end;
140 | end;
141 | end;
142 |
143 | function TAddTables.Check_Table_Structures: Boolean;
144 | var
145 | Ind: Word;
146 | f1, f2: TField;
147 | begin
148 | Result := false;
149 |
150 | if FDbfTable1.Fields.Count <> FDbfTable2.Fields.Count then
151 | begin
152 | MessageDlg('The structure of the tables is different: Different field count.', mtError, [mbOK], 0);
153 | Exit;
154 | end;
155 |
156 | for Ind := 0 To FDbfTable1.Fields.Count - 1 do
157 | begin
158 | f1 := FDbfTable1.Fields[ind];
159 | f2 := FDbfTable2.Fields[ind];
160 | if f1.DataType <> f2.DataType then
161 | begin
162 | MessageDlg(
163 | 'The structure of the tables is different: ' +
164 | LineEnding +
165 | ' Field "' + f1.FieldName + '" of the 1st table is ' + FieldTypeAsString(f1.DataType, true) +
166 | LineEnding +
167 | ' Field "' + f2.FieldName + '" of the 2nd table is ' + FieldTypeAsString(f2.DataType, true),
168 | mtError, [mbOK], 0);
169 | exit;
170 | end;
171 | end;
172 |
173 | Result := true;
174 | end;
175 |
176 | procedure TAddTables.AddTable(D1, D2: TDbf);
177 | var
178 | ind: Integer;
179 | begin
180 | D1.First;
181 | D2.First;
182 |
183 | pBar.Min := 0;
184 | pBar.Max := D1.ExactRecordCount - 1;
185 | pBar.Position := 0;
186 |
187 | try
188 | while not D1.EOF do
189 | begin
190 | D2.Insert;
191 | for Ind := 0 To D1.Fields.Count - 1 Do
192 | D2.Fields[Ind].AsVariant := D1.Fields[Ind].AsVariant;
193 | D2.Post;
194 | pBar.Position := pBar.Position + 1;
195 | D1.Next;
196 | end;
197 |
198 | MessageDlg('Process completed!', mtInformation, [mbOK], 0);
199 | except
200 | on E:Exception do
201 | MessageDlg('Error while inserting fields:' + LineEnding + E.Message, mtError, [mbOK], 0);
202 | end;
203 |
204 | pBar.Position := 0;
205 | end;
206 |
207 | end.
208 |
209 |
--------------------------------------------------------------------------------
/src/udatamodule.pas:
--------------------------------------------------------------------------------
1 | unit uDatamodule;
2 |
3 | {$mode ObjFPC}{$H+}
4 |
5 | interface
6 |
7 | uses
8 | Classes, SysUtils, Controls;
9 |
10 | type
11 |
12 | { TCommonData }
13 |
14 | TCommonData = class(TDataModule)
15 | Images: TImageList; // Do not rearrange the first 10 icons, needed by DBNavigator at this place.
16 | private
17 |
18 | public
19 |
20 | end;
21 |
22 | var
23 | CommonData: TCommonData;
24 |
25 | implementation
26 |
27 | {$R *.lfm}
28 |
29 | end.
30 |
31 |
--------------------------------------------------------------------------------
/src/uexpdbf.lfm:
--------------------------------------------------------------------------------
1 | object ExpDBF: TExpDBF
2 | Left = 417
3 | Height = 372
4 | Top = 224
5 | Width = 441
6 | AutoSize = True
7 | BorderIcons = [biSystemMenu]
8 | Caption = 'Export Table To DBF Table'
9 | ClientHeight = 372
10 | ClientWidth = 441
11 | OnCloseQuery = FormCloseQuery
12 | OnShow = FormShow
13 | Position = poMainFormCenter
14 | LCLVersion = '2.3.0.0'
15 | object lblExportField: TLabel
16 | AnchorSideLeft.Control = Owner
17 | AnchorSideTop.Control = Owner
18 | Left = 6
19 | Height = 15
20 | Top = 6
21 | Width = 62
22 | BorderSpacing.Left = 6
23 | BorderSpacing.Top = 6
24 | Caption = 'Export Field'
25 | ParentColor = False
26 | end
27 | object clbFields: TCheckListBox
28 | AnchorSideLeft.Control = Owner
29 | AnchorSideTop.Control = lblExportField
30 | AnchorSideTop.Side = asrBottom
31 | AnchorSideRight.Control = ExportBtn
32 | AnchorSideBottom.Control = Owner
33 | AnchorSideBottom.Side = asrBottom
34 | Left = 6
35 | Height = 343
36 | Top = 23
37 | Width = 262
38 | Anchors = [akTop, akLeft, akRight, akBottom]
39 | BorderSpacing.Left = 6
40 | BorderSpacing.Top = 2
41 | BorderSpacing.Right = 6
42 | BorderSpacing.Bottom = 6
43 | Items.Strings = (
44 | ''
45 | )
46 | ItemHeight = 17
47 | PopupMenu = FieldsPopup
48 | TabOrder = 0
49 | Data = {
50 | 0100000000
51 | }
52 | end
53 | object TableType: TComboBox
54 | AnchorSideLeft.Control = ExportBtn
55 | AnchorSideTop.Control = lblTableType
56 | AnchorSideTop.Side = asrBottom
57 | AnchorSideRight.Control = Owner
58 | AnchorSideRight.Side = asrBottom
59 | Left = 274
60 | Height = 23
61 | Top = 23
62 | Width = 161
63 | Anchors = [akTop, akLeft, akRight]
64 | BorderSpacing.Top = 2
65 | BorderSpacing.Right = 6
66 | DropDownCount = 24
67 | ItemHeight = 15
68 | Items.Strings = (
69 | 'dBase III+'
70 | 'dBase IV'
71 | 'Visual dBase VII'
72 | 'FoxPro'
73 | 'Visual FoxPro'
74 | )
75 | Style = csDropDownList
76 | TabOrder = 1
77 | end
78 | object lblTableType: TLabel
79 | AnchorSideLeft.Control = TableType
80 | AnchorSideTop.Control = Owner
81 | Left = 274
82 | Height = 15
83 | Top = 6
84 | Width = 54
85 | BorderSpacing.Top = 6
86 | Caption = 'Table Type'
87 | ParentColor = False
88 | end
89 | object lblProgress: TLabel
90 | AnchorSideLeft.Control = pBar
91 | AnchorSideTop.Control = TableType
92 | AnchorSideTop.Side = asrBottom
93 | Left = 274
94 | Height = 15
95 | Top = 78
96 | Width = 45
97 | BorderSpacing.Top = 32
98 | Caption = 'Progress'
99 | ParentColor = False
100 | end
101 | object pBar: TProgressBar
102 | AnchorSideLeft.Control = ExportBtn
103 | AnchorSideTop.Control = lblProgress
104 | AnchorSideTop.Side = asrBottom
105 | AnchorSideRight.Control = Owner
106 | AnchorSideRight.Side = asrBottom
107 | Left = 274
108 | Height = 20
109 | Top = 95
110 | Width = 161
111 | Anchors = [akTop, akLeft, akRight]
112 | BorderSpacing.Top = 2
113 | BorderSpacing.Right = 6
114 | Step = 1
115 | TabOrder = 2
116 | end
117 | object ExportBtn: TBitBtn
118 | AnchorSideLeft.Side = asrBottom
119 | AnchorSideTop.Control = CloseBtn
120 | AnchorSideRight.Control = CloseBtn
121 | Left = 274
122 | Height = 26
123 | Top = 340
124 | Width = 80
125 | Anchors = [akTop, akRight]
126 | AutoSize = True
127 | BorderSpacing.Right = 6
128 | Caption = '&Export'
129 | Default = True
130 | Images = CommonData.Images
131 | ImageIndex = 7
132 | OnClick = ExportBtnClick
133 | TabOrder = 3
134 | end
135 | object CloseBtn: TBitBtn
136 | AnchorSideLeft.Side = asrBottom
137 | AnchorSideTop.Side = asrBottom
138 | AnchorSideRight.Control = Owner
139 | AnchorSideRight.Side = asrBottom
140 | AnchorSideBottom.Control = Owner
141 | AnchorSideBottom.Side = asrBottom
142 | Left = 360
143 | Height = 26
144 | Top = 340
145 | Width = 75
146 | Anchors = [akRight, akBottom]
147 | AutoSize = True
148 | BorderSpacing.Top = 32
149 | BorderSpacing.Right = 6
150 | BorderSpacing.Bottom = 6
151 | Caption = '&Close'
152 | Images = CommonData.Images
153 | ImageIndex = 37
154 | OnClick = CloseBtnClick
155 | TabOrder = 4
156 | end
157 | object SaveExp: TSaveDialog
158 | Title = 'Save as...'
159 | DefaultExt = '.dbf'
160 | Filter = 'DBF File|*.dbf|All Files|*.*'
161 | Options = [ofOverwritePrompt, ofPathMustExist, ofEnableSizing, ofViewDetail]
162 | Left = 60
163 | Top = 268
164 | end
165 | object FieldsPopup: TPopupMenu
166 | Left = 123
167 | Top = 120
168 | object mnuSelectAll: TMenuItem
169 | Caption = 'Select all'
170 | OnClick = mnuSelectAllClick
171 | end
172 | object mnuSelectNone: TMenuItem
173 | Caption = 'Select none'
174 | OnClick = mnuSelectNoneClick
175 | end
176 | end
177 | end
178 |
--------------------------------------------------------------------------------
/src/uexpxml.lfm:
--------------------------------------------------------------------------------
1 | object ExpXML: TExpXML
2 | Left = 375
3 | Height = 322
4 | Top = 225
5 | Width = 439
6 | AutoSize = True
7 | BorderIcons = [biSystemMenu]
8 | Caption = 'Export Table To XML File'
9 | ClientHeight = 322
10 | ClientWidth = 439
11 | OnCloseQuery = FormCloseQuery
12 | OnCreate = FormCreate
13 | OnShow = FormShow
14 | Position = poMainFormCenter
15 | LCLVersion = '2.3.0.0'
16 | object lblExportFields: TLabel
17 | AnchorSideLeft.Control = Owner
18 | AnchorSideTop.Control = Owner
19 | Left = 6
20 | Height = 15
21 | Top = 6
22 | Width = 67
23 | BorderSpacing.Left = 6
24 | BorderSpacing.Top = 6
25 | Caption = 'Export Fields'
26 | ParentColor = False
27 | end
28 | object clbFields: TCheckListBox
29 | AnchorSideLeft.Control = Owner
30 | AnchorSideTop.Control = lblExportFields
31 | AnchorSideTop.Side = asrBottom
32 | AnchorSideRight.Control = ExportBtn
33 | AnchorSideBottom.Control = Owner
34 | AnchorSideBottom.Side = asrBottom
35 | Left = 6
36 | Height = 293
37 | Top = 23
38 | Width = 260
39 | Anchors = [akTop, akLeft, akRight, akBottom]
40 | BorderSpacing.Left = 6
41 | BorderSpacing.Top = 2
42 | BorderSpacing.Right = 6
43 | BorderSpacing.Bottom = 6
44 | Items.Strings = (
45 | ''
46 | )
47 | ItemHeight = 17
48 | PopupMenu = FieldsPopup
49 | TabOrder = 0
50 | Data = {
51 | 0100000000
52 | }
53 | end
54 | object lblProgress: TLabel
55 | AnchorSideLeft.Control = clbFields
56 | AnchorSideLeft.Side = asrBottom
57 | AnchorSideTop.Control = Owner
58 | Left = 272
59 | Height = 15
60 | Top = 6
61 | Width = 45
62 | BorderSpacing.Top = 6
63 | Caption = 'Progress'
64 | ParentColor = False
65 | end
66 | object pBar: TProgressBar
67 | AnchorSideLeft.Control = clbFields
68 | AnchorSideLeft.Side = asrBottom
69 | AnchorSideTop.Control = lblProgress
70 | AnchorSideTop.Side = asrBottom
71 | AnchorSideRight.Control = Owner
72 | AnchorSideRight.Side = asrBottom
73 | Left = 272
74 | Height = 20
75 | Top = 23
76 | Width = 161
77 | Anchors = [akTop, akLeft, akRight]
78 | BorderSpacing.Top = 2
79 | BorderSpacing.Right = 6
80 | TabOrder = 1
81 | end
82 | object ExportBtn: TBitBtn
83 | AnchorSideLeft.Side = asrBottom
84 | AnchorSideTop.Control = pBar
85 | AnchorSideTop.Side = asrBottom
86 | AnchorSideRight.Control = CloseBtn
87 | AnchorSideBottom.Control = Owner
88 | AnchorSideBottom.Side = asrBottom
89 | Left = 272
90 | Height = 26
91 | Top = 290
92 | Width = 80
93 | Anchors = [akRight, akBottom]
94 | AutoSize = True
95 | BorderSpacing.Top = 32
96 | BorderSpacing.Bottom = 6
97 | Caption = '&Export'
98 | Default = True
99 | Images = CommonData.Images
100 | ImageIndex = 7
101 | OnClick = ExportBtnClick
102 | TabOrder = 2
103 | end
104 | object CloseBtn: TBitBtn
105 | AnchorSideLeft.Side = asrBottom
106 | AnchorSideRight.Control = Owner
107 | AnchorSideRight.Side = asrBottom
108 | AnchorSideBottom.Control = Owner
109 | AnchorSideBottom.Side = asrBottom
110 | Left = 358
111 | Height = 26
112 | Top = 290
113 | Width = 75
114 | Anchors = [akRight, akBottom]
115 | AutoSize = True
116 | BorderSpacing.Left = 6
117 | BorderSpacing.Top = 100
118 | BorderSpacing.Right = 6
119 | BorderSpacing.Bottom = 6
120 | Caption = '&Close'
121 | Images = CommonData.Images
122 | ImageIndex = 37
123 | OnClick = CloseBtnClick
124 | TabOrder = 3
125 | end
126 | object SaveExp: TSaveDialog
127 | Title = 'Save as...'
128 | DefaultExt = '.xml'
129 | Filter = 'XML File|*.xml|All Files|*.*'
130 | Options = [ofOverwritePrompt, ofPathMustExist, ofEnableSizing, ofViewDetail]
131 | Left = 112
132 | Top = 120
133 | end
134 | object FieldsPopup: TPopupMenu
135 | Left = 112
136 | Top = 64
137 | object mnuSelectAll: TMenuItem
138 | Caption = 'Select all'
139 | OnClick = mnuSelectAllClick
140 | end
141 | object mnuSelectNone: TMenuItem
142 | Caption = 'Select none'
143 | OnClick = mnuSelectNoneClick
144 | end
145 | end
146 | end
147 |
--------------------------------------------------------------------------------
/src/uidxtable.lfm:
--------------------------------------------------------------------------------
1 | object IdxTable: TIdxTable
2 | Left = 456
3 | Height = 301
4 | Top = 262
5 | Width = 479
6 | AutoSize = True
7 | BorderIcons = [biSystemMenu]
8 | Caption = 'Table Indexes'
9 | ClientHeight = 301
10 | ClientWidth = 479
11 | OnCloseQuery = FormCloseQuery
12 | OnCreate = FormCreate
13 | OnShow = FormShow
14 | Position = poMainFormCenter
15 | LCLVersion = '2.1.0.0'
16 | object IdxList: TListBox
17 | AnchorSideLeft.Control = Owner
18 | AnchorSideTop.Control = Owner
19 | AnchorSideRight.Control = CreateIndexBtn
20 | AnchorSideBottom.Control = Owner
21 | AnchorSideBottom.Side = asrBottom
22 | Left = 6
23 | Height = 289
24 | Top = 6
25 | Width = 268
26 | Anchors = [akTop, akLeft, akRight, akBottom]
27 | BorderSpacing.Around = 6
28 | ItemHeight = 0
29 | OnClick = IdxListClick
30 | TabOrder = 0
31 | end
32 | object cbOpt: TCheckGroup
33 | AnchorSideLeft.Control = IdxList
34 | AnchorSideLeft.Side = asrBottom
35 | AnchorSideTop.Control = SelField
36 | AnchorSideTop.Side = asrBottom
37 | AnchorSideRight.Control = Owner
38 | AnchorSideRight.Side = asrBottom
39 | Left = 280
40 | Height = 108
41 | Top = 58
42 | Width = 193
43 | Anchors = [akTop, akLeft, akRight]
44 | AutoFill = True
45 | AutoSize = True
46 | BorderSpacing.Top = 12
47 | BorderSpacing.Right = 6
48 | Caption = ' Options '
49 | ChildSizing.LeftRightSpacing = 16
50 | ChildSizing.TopBottomSpacing = 6
51 | ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
52 | ChildSizing.EnlargeVertical = crsHomogenousChildResize
53 | ChildSizing.ShrinkHorizontal = crsScaleChilds
54 | ChildSizing.ShrinkVertical = crsScaleChilds
55 | ChildSizing.Layout = cclLeftToRightThenTopToBottom
56 | ChildSizing.ControlsPerLine = 1
57 | ClientHeight = 88
58 | ClientWidth = 189
59 | Items.Strings = (
60 | 'Primary'
61 | 'Unique'
62 | 'Descending'
63 | 'Case Insensitive'
64 | )
65 | TabOrder = 2
66 | Data = {
67 | 0400000002020202
68 | }
69 | end
70 | object CreateIndexBtn: TBitBtn
71 | AnchorSideLeft.Side = asrBottom
72 | AnchorSideTop.Control = CloseBtn
73 | AnchorSideRight.Control = CloseBtn
74 | Left = 280
75 | Height = 26
76 | Top = 269
77 | Width = 112
78 | Anchors = [akTop, akRight]
79 | AutoSize = True
80 | BorderSpacing.Left = 6
81 | BorderSpacing.Right = 6
82 | BorderSpacing.Bottom = 6
83 | Caption = '&Create index'
84 | Default = True
85 | Images = CommonData.Images
86 | ImageIndex = 7
87 | OnClick = CreateIndexBtnClick
88 | TabOrder = 4
89 | end
90 | object CloseBtn: TBitBtn
91 | AnchorSideLeft.Control = CreateIndexBtn
92 | AnchorSideLeft.Side = asrBottom
93 | AnchorSideTop.Control = IdxName
94 | AnchorSideTop.Side = asrBottom
95 | AnchorSideRight.Control = Owner
96 | AnchorSideRight.Side = asrBottom
97 | AnchorSideBottom.Control = Owner
98 | AnchorSideBottom.Side = asrBottom
99 | Left = 398
100 | Height = 26
101 | Top = 269
102 | Width = 75
103 | Anchors = [akRight, akBottom]
104 | AutoSize = True
105 | BorderSpacing.Top = 32
106 | BorderSpacing.Right = 6
107 | BorderSpacing.Bottom = 6
108 | Caption = '&Close'
109 | Images = CommonData.Images
110 | ImageIndex = 37
111 | OnClick = CloseBtnClick
112 | TabOrder = 5
113 | end
114 | object lblSelField: TLabel
115 | AnchorSideLeft.Control = IdxList
116 | AnchorSideLeft.Side = asrBottom
117 | AnchorSideTop.Control = Owner
118 | Left = 280
119 | Height = 15
120 | Top = 6
121 | Width = 145
122 | BorderSpacing.Top = 6
123 | Caption = 'Selected Field or Expression'
124 | end
125 | object lblIndexName: TLabel
126 | AnchorSideLeft.Control = IdxList
127 | AnchorSideLeft.Side = asrBottom
128 | AnchorSideTop.Control = cbOpt
129 | AnchorSideTop.Side = asrBottom
130 | Left = 280
131 | Height = 15
132 | Top = 178
133 | Width = 64
134 | BorderSpacing.Top = 12
135 | Caption = 'Index Name'
136 | end
137 | object IdxName: TEdit
138 | AnchorSideLeft.Control = IdxList
139 | AnchorSideLeft.Side = asrBottom
140 | AnchorSideTop.Control = lblIndexName
141 | AnchorSideTop.Side = asrBottom
142 | AnchorSideRight.Control = Owner
143 | AnchorSideRight.Side = asrBottom
144 | Left = 280
145 | Height = 23
146 | Top = 195
147 | Width = 193
148 | Anchors = [akTop, akLeft, akRight]
149 | BorderSpacing.Top = 2
150 | BorderSpacing.Right = 6
151 | MaxLength = 10
152 | TabOrder = 3
153 | end
154 | object SelField: TEdit
155 | AnchorSideLeft.Control = IdxList
156 | AnchorSideLeft.Side = asrBottom
157 | AnchorSideTop.Control = lblSelField
158 | AnchorSideTop.Side = asrBottom
159 | AnchorSideRight.Control = Owner
160 | AnchorSideRight.Side = asrBottom
161 | Left = 280
162 | Height = 23
163 | Top = 23
164 | Width = 193
165 | Anchors = [akTop, akLeft, akRight]
166 | BorderSpacing.Top = 2
167 | BorderSpacing.Right = 6
168 | TabOrder = 1
169 | end
170 | end
171 |
--------------------------------------------------------------------------------
/src/uidxtable.pas:
--------------------------------------------------------------------------------
1 | unit uIdxTable;
2 |
3 | {$mode objfpc}{$H+}
4 |
5 | interface
6 |
7 | uses
8 | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
9 | ExtCtrls, Buttons;
10 |
11 | type
12 |
13 | { TIdxTable }
14 |
15 | TIdxTable = class(TForm)
16 | CloseBtn: TBitBtn;
17 | CreateIndexBtn: TBitBtn;
18 | cbOpt: TCheckGroup;
19 | IdxList: TListBox;
20 | IdxName: TEdit;
21 | lblIndexName: TLabel;
22 | lblSelField: TLabel;
23 | SelField: TEdit;
24 | procedure CloseBtnClick(Sender: TObject);
25 | procedure CreateIndexBtnClick(Sender: TObject);
26 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
27 | procedure FormCreate(Sender: TObject);
28 | procedure FormShow(Sender: TObject);
29 | procedure IdxListClick(Sender: TObject);
30 | private
31 | { private declarations }
32 | public
33 | { public declarations }
34 | New : Boolean;
35 | Ret : Boolean;
36 | Calling : TObject;
37 | end;
38 |
39 | var
40 | IdxTable: TIdxTable;
41 |
42 | implementation
43 |
44 | uses
45 | uNewTable, uRestructure, uOptions;
46 |
47 | {$R *.lfm}
48 |
49 | { TIdxTable }
50 |
51 | procedure TIdxTable.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
52 | begin
53 | if CanClose then
54 | Options.IndexTableWindow.ExtractFromForm(Self);
55 | end;
56 |
57 | procedure TIdxTable.FormCreate(Sender: TObject);
58 | begin
59 | Ret := False;
60 | end;
61 |
62 | procedure TIdxTable.FormShow(Sender: TObject);
63 | begin
64 | // CloseBtn.Constraints.MinWidth := Max(CloseBtn.Width, CreateIndexBtn.Width);
65 | // CreateIndexBtn.Constraints.MinWidth := CloseBtn.Constraints.MinWidth;
66 |
67 | Constraints.MinWidth := (CreateIndexBtn.Width + CloseBtn.Width + 4*CloseBtn.BorderSpacing.Right) * 2;
68 | Constraints.MinHeight := IdxName.Top + Idxname.Height +
69 | CloseBtn.BorderSpacing.Top + CloseBtn.Height + CloseBtn.BorderSpacing.Bottom;
70 |
71 | if Options.RememberWindowSizePosContent and (Options.IndexTableWindow.Width > 0) then
72 | begin
73 | AutoSize := false;
74 | Options.IndexTableWindow.ApplyToForm(Self);
75 | end;
76 | end;
77 |
78 | procedure TIdxTable.IdxListClick(Sender: TObject);
79 | begin
80 | SelField.Text := IdxList.Items[IdxList.ItemIndex];
81 | end;
82 |
83 | procedure TIdxTable.CreateIndexBtnClick(Sender: TObject);
84 | begin
85 | If Trim(IdxName.Text) = '' Then
86 | Begin
87 | ShowMessage('You MUST insert a Index Name or Expression!');
88 |
89 | IdxName.SetFocus;
90 |
91 | Exit;
92 | End;
93 |
94 | If Calling Is TRestructure Then
95 | Begin
96 | If New Then
97 | If Not Restructure.TestIndexName(IdxName.Text) Then
98 | Begin
99 | ShowMessage('Index name already exists!');
100 |
101 | IdxName.SetFocus;
102 |
103 | Exit;
104 | End;
105 | End
106 | Else
107 | If Calling Is TNewTable Then
108 | If New Then
109 | If Not NewTable.TestIndexName(IdxName.Text) Then
110 | Begin
111 | ShowMessage('Index name already exists!');
112 |
113 | IdxName.SetFocus;
114 |
115 | Exit;
116 | End;
117 |
118 | Ret := True;
119 |
120 | Close;
121 | end;
122 |
123 | procedure TIdxTable.CloseBtnClick(Sender: TObject);
124 | begin
125 | Close;
126 | end;
127 |
128 | end.
129 |
130 |
--------------------------------------------------------------------------------
/src/uinfo.lfm:
--------------------------------------------------------------------------------
1 | object Info: TInfo
2 | Left = 419
3 | Height = 567
4 | Top = 147
5 | Width = 468
6 | AutoSize = True
7 | BorderIcons = [biSystemMenu]
8 | BorderStyle = bsDialog
9 | Caption = 'Info'
10 | ClientHeight = 567
11 | ClientWidth = 468
12 | OnCreate = FormCreate
13 | Position = poMainFormCenter
14 | LCLVersion = '2.3.0.0'
15 | object CloseBtn: TBitBtn
16 | AnchorSideTop.Control = Bevel1
17 | AnchorSideRight.Control = Owner
18 | AnchorSideRight.Side = asrBottom
19 | AnchorSideBottom.Side = asrBottom
20 | Left = 385
21 | Height = 26
22 | Top = 491
23 | Width = 75
24 | Anchors = [akTop, akRight]
25 | AutoSize = True
26 | BorderSpacing.Around = 8
27 | Cancel = True
28 | Caption = '&Close'
29 | Default = True
30 | Images = CommonData.Images
31 | ImageIndex = 37
32 | OnClick = CloseBtnClick
33 | TabOrder = 0
34 | end
35 | object Bevel1: TBevel
36 | AnchorSideLeft.Control = Owner
37 | AnchorSideTop.Control = lblIcons8
38 | AnchorSideTop.Side = asrBottom
39 | AnchorSideRight.Control = Owner
40 | AnchorSideRight.Side = asrBottom
41 | Left = 6
42 | Height = 6
43 | Top = 483
44 | Width = 456
45 | Anchors = [akTop, akLeft, akRight]
46 | BorderSpacing.Left = 6
47 | BorderSpacing.Right = 6
48 | Shape = bsTopLine
49 | end
50 | object Label1: TLabel
51 | Left = 8
52 | Height = 90
53 | Top = 294
54 | Width = 452
55 | Align = alTop
56 | BorderSpacing.Left = 8
57 | BorderSpacing.Top = 8
58 | BorderSpacing.Right = 8
59 | Caption = 'MyDbfStudio is an administrative tool to create and manage dBase tables. It runs on Windows, Linux and other platforms supported by the Lazarus IDE.'#13#10' '#13#10'Autor: Calogiuri Enzo Antonio Aka Fog76'#13#10'Modifications in current port by W. Pamler'#13#10'Based on tDBF component by mdv and nashev:'
60 | ParentColor = False
61 | WordWrap = True
62 | end
63 | object lblIcons8: TLabel
64 | Cursor = crHandPoint
65 | Left = 24
66 | Height = 15
67 | Top = 460
68 | Width = 444
69 | Align = alTop
70 | BorderSpacing.Left = 24
71 | BorderSpacing.Bottom = 8
72 | Caption = 'https://icons8.com/icons/metro'
73 | Font.Color = clHighlight
74 | ParentColor = False
75 | ParentFont = False
76 | OnClick = URLLabelClick
77 | OnMouseEnter = URLLabelMouseEnter
78 | OnMouseLeave = URLLabelMouseLeave
79 | end
80 | object lblSourceForge: TLabel
81 | Cursor = crHandPoint
82 | Left = 16
83 | Height = 15
84 | Top = 384
85 | Width = 452
86 | Align = alTop
87 | BorderSpacing.Left = 16
88 | Caption = 'https://sourceforge.net/projects/tdbf/'
89 | Font.Color = clHighlight
90 | ParentColor = False
91 | ParentFont = False
92 | OnClick = URLLabelClick
93 | OnMouseEnter = URLLabelMouseEnter
94 | OnMouseLeave = URLLabelMouseLeave
95 | end
96 | object Label4: TLabel
97 | Left = 8
98 | Height = 45
99 | Top = 415
100 | Width = 452
101 | Align = alTop
102 | BorderSpacing.Left = 8
103 | BorderSpacing.Top = 16
104 | BorderSpacing.Right = 8
105 | Caption = 'License: GPL/LGPL'#13#10' '#13#10'Icons provided by icons8.com, style: Windows Metro,'
106 | end
107 | object ImgPanel: TPanel
108 | Left = 8
109 | Height = 278
110 | Top = 8
111 | Width = 452
112 | Align = alTop
113 | BorderSpacing.Around = 8
114 | BevelOuter = bvNone
115 | ClientHeight = 278
116 | ClientWidth = 452
117 | Color = clWindow
118 | ParentBackground = False
119 | ParentColor = False
120 | TabOrder = 1
121 | object Img: TImage
122 | Left = 0
123 | Height = 263
124 | Top = 0
125 | Width = 452
126 | Align = alClient
127 | Anchors = [akTop, akLeft, akRight]
128 | AutoSize = True
129 | Stretch = True
130 | end
131 | object Version: TLabel
132 | AnchorSideTop.Side = asrBottom
133 | Left = 6
134 | Height = 15
135 | Top = 263
136 | Width = 446
137 | Align = alBottom
138 | Anchors = [akLeft, akBottom]
139 | BorderSpacing.Left = 6
140 | Caption = 'Version12'
141 | Font.Style = [fsBold]
142 | ParentColor = False
143 | ParentFont = False
144 | end
145 | end
146 | end
147 |
--------------------------------------------------------------------------------
/src/uinfo.pas:
--------------------------------------------------------------------------------
1 | unit uInfo;
2 |
3 | {$mode objfpc}{$H+}
4 |
5 | interface
6 |
7 | uses
8 | Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
9 | ExtCtrls, StdCtrls, Buttons;
10 |
11 | type
12 |
13 | { TInfo }
14 |
15 | TInfo = class(TForm)
16 | Bevel1: TBevel;
17 | CloseBtn: TBitBtn;
18 | Img: TImage;
19 | Label1: TLabel;
20 | lblIcons8: TLabel;
21 | lblSourceForge: TLabel;
22 | Label4: TLabel;
23 | ImgPanel: TPanel;
24 | Version: TLabel;
25 | procedure CloseBtnClick(Sender: TObject);
26 | procedure FormCreate(Sender: TObject);
27 | procedure URLLabelClick(Sender: TObject);
28 | procedure URLLabelMouseEnter(Sender: TObject);
29 | procedure URLLabelMouseLeave(Sender: TObject);
30 | private
31 | { private declarations }
32 | public
33 | { public declarations }
34 | end;
35 |
36 | var
37 | Info: TInfo;
38 |
39 | implementation
40 |
41 | {$R *.lfm}
42 |
43 | uses
44 | InterfaceBase, LCLPlatformDef, LCLIntf, LCLType, uUtils;
45 |
46 | { TInfo }
47 |
48 | procedure TInfo.CloseBtnClick(Sender: TObject);
49 | begin
50 | Close;
51 | end;
52 |
53 | procedure TInfo.FormCreate(Sender: TObject);
54 | var
55 | OS, WS: String;
56 | begin
57 | OS := {$I %FPCTARGETOS%};
58 | WS := LCLPlatformDisplayNames[WidgetSet.LCLPlatform];
59 | Version.Caption := Format('Version: %s (%s, widgetset: %s)', [GetVersionStr, OS, WS]);
60 | Img.Picture.LoadFromResourceName(HINSTANCE, 'SPLASH', TPortableNetworkGraphic);
61 | Img.AutoSize := true;
62 | end;
63 |
64 | procedure TInfo.URLLabelClick(Sender: TObject);
65 | begin
66 | OpenURL((Sender as TLabel).Caption);
67 | end;
68 |
69 | procedure TInfo.URLLabelMouseEnter(Sender: TObject);
70 | begin
71 | (Sender as TControl).Font.Style := [fsUnderline];
72 | end;
73 |
74 | procedure TInfo.URLLabelMouseLeave(Sender: TObject);
75 | begin
76 | (Sender as TControl).Font.Style := [];
77 | end;
78 |
79 | end.
80 |
81 |
--------------------------------------------------------------------------------
/src/usetfv.pas:
--------------------------------------------------------------------------------
1 | unit uSetFV;
2 |
3 | {$mode objfpc}{$H+}
4 |
5 | interface
6 |
7 | uses
8 | Classes, SysUtils, dbf, FileUtil, Forms, Controls, Graphics, Dialogs,
9 | StdCtrls, ExtCtrls, Buttons;
10 |
11 | type
12 |
13 | { TSetFV }
14 |
15 | TSetFV = class(TForm)
16 | CloseBtn: TBitBtn;
17 | ConfirmBtn: TBitBtn;
18 | cbFirst: TComboBox;
19 | rgMode: TRadioGroup;
20 | cbOp: TComboBox;
21 | cbSecond: TComboBox;
22 | cbUseMathOperations: TCheckBox;
23 | FieldList: TListBox;
24 | gbMath: TGroupBox;
25 | gbSelField: TGroupBox;
26 | gbSetVal: TGroupBox;
27 | Label1: TLabel;
28 | Label2: TLabel;
29 | Label3: TLabel;
30 | SelField: TEdit;
31 | sSetVal: TEdit;
32 | procedure cbUseMathOperationsChange(Sender: TObject);
33 | procedure CloseBtnClick(Sender: TObject);
34 | procedure ConfirmBtnClick(Sender: TObject);
35 | procedure FieldListClick(Sender: TObject);
36 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
37 | procedure FormShow(Sender: TObject);
38 | private
39 | { private declarations }
40 | FSetTable: TDbf;
41 | public
42 | { public declarations }
43 | property SetTable: TDbf read FSetTable write FSetTable;
44 | end;
45 |
46 | var
47 | SetFV: TSetFV;
48 |
49 | implementation
50 |
51 | {$R *.lfm}
52 |
53 | uses
54 | DB, uOptions;
55 |
56 | { TSetFV }
57 |
58 | procedure TSetFV.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
59 | begin
60 | if CanClose then
61 | Options.SetFieldValueWindow.ExtractFromForm(Self);
62 | end;
63 |
64 | procedure TSetFV.FormShow(Sender: TObject);
65 | var
66 | Ind: Word;
67 | fieldName: STring;
68 | begin
69 | CloseBtn.Constraints.MinWidth := ConfirmBtn.Width;
70 |
71 | Options.SetFieldValueWindow.ApplyToForm(self);
72 |
73 | rgMode.ItemIndex := 0;
74 | gbMath.Enabled := False;
75 |
76 | FieldList.Clear;
77 | cbFirst.Clear;
78 | cbSecond.Clear;
79 |
80 | for Ind := 0 To SetTable.FieldDefs.Count - 1 do
81 | begin
82 | fieldName := SetTable.FieldDefs.Items[ind].Name;
83 | FieldList.Items.Add(fieldName);
84 | cbFirst.Items.Add(fieldName);
85 | cbSecond.Items.Add(fieldName);
86 | end;
87 | end;
88 |
89 | procedure TSetFV.cbUseMathOperationsChange(Sender: TObject);
90 | begin
91 | gbMath.Enabled := cbUseMathOperations.Checked;
92 | sSetVal.Enabled := Not cbUseMathOperations.Checked;
93 | end;
94 |
95 | procedure TSetFV.CloseBtnClick(Sender: TObject);
96 | begin
97 | Close;
98 | end;
99 |
100 | procedure TSetFV.ConfirmBtnClick(Sender: TObject);
101 | var
102 | Error: Boolean;
103 | lSelField: TField;
104 | lFirstField: TField;
105 | lSecondField: TField;
106 | begin
107 | if Trim(SelField.Text) = '' then
108 | begin
109 | MessageDlg('You must select a destination field...', mtError, [mbOK], 0);
110 | FieldList.SetFocus;
111 | exit;
112 | end;
113 |
114 | if not cbUseMathOperations.Checked then
115 | begin
116 | if Trim(sSetVal.Text) = '' then
117 | begin
118 | MessageDlg('You must insert a value to set...', mtError,[mbOK], 0);
119 | sSetVal.SetFocus;
120 | exit;
121 | end;
122 | end else
123 | begin
124 | if cbFirst.Text = '' then
125 | begin
126 | MessageDlg('You must select a first field in matemathical operation...', mtError, [mbOK], 0);
127 | cbFirst.SetFocus;
128 | exit;
129 | end;
130 |
131 | if cbSecond.Text = '' then
132 | begin
133 | MessageDlg('You must select a second field in matemathical operation...', mtError, [mbOK], 0);
134 | cbSecond.SetFocus;
135 | exit;
136 | end;
137 | end;
138 |
139 | if MessageDlg('Do you really want to set field values?',mtWarning,[mbok, mbCancel],0) <> mrOk then
140 | exit;
141 |
142 | Error := False;
143 | if rgMode.ItemIndex = 1 Then
144 | SetTable.Filter := '';
145 |
146 | SetTable.First;
147 | lSelField := SetTable.FieldByName(SelField.Text);
148 | if cbUseMathOperations.Checked then
149 | begin
150 | lFirstField := SetTable.FieldByName(cbFirst.Text);
151 | lSecondField := SetTable.FieldByName(cbSecond.Text);
152 | end;
153 | while not SetTable.EOF do
154 | begin
155 | if not cbUseMathOperations.Checked then
156 | begin
157 | try
158 | SetTable.Edit;
159 | lSelField.AsVariant := sSetVal.Text{%H-};
160 | SetTable.Post;
161 | except
162 | MessageDlg(
163 | 'Error while set value in table. Check if the value match width field type or size.',
164 | mtError, [mbOK], 0
165 | );
166 | Error := True;
167 | Break;
168 | end;
169 | end else
170 | begin
171 | try
172 | SetTable.Edit;
173 | case cbOp.ItemIndex of
174 | 0: lSelField.AsVariant := lFirstField.AsVariant + lSecondField.AsVariant;
175 | 1: lSelField.AsVariant := lFirstField.AsVariant - lSecondField.AsVariant;
176 | 2: lSelField.AsVariant := lFirstField.AsVariant * lSecondField.AsVariant;
177 | 3: lSelField.AsVariant := lfirstField.AsVariant / lSecondField.AsVariant;
178 | end;
179 | SetTable.Post;
180 | except
181 | MessageDlg(
182 | 'Error while set value in table. Check if the value match width field type or operation.',
183 | mtError, [mbOK], 0);
184 | Error := True;
185 | Break;
186 | end;
187 | end;
188 | SetTable.Next;
189 | end;
190 |
191 | if not Error then
192 | Close;
193 | end;
194 |
195 | procedure TSetFV.FieldListClick(Sender: TObject);
196 | begin
197 | SelField.Text := FieldList.Items[FieldList.ItemIndex];
198 | end;
199 |
200 | end.
201 |
202 |
--------------------------------------------------------------------------------
/src/usplash.lfm:
--------------------------------------------------------------------------------
1 | object Splash: TSplash
2 | Left = 477
3 | Height = 300
4 | Top = 327
5 | Width = 450
6 | AutoSize = True
7 | BorderIcons = []
8 | BorderStyle = bsNone
9 | Caption = 'MyDbf Studio'
10 | ClientHeight = 300
11 | ClientWidth = 450
12 | Color = clWindow
13 | OnCloseQuery = FormCloseQuery
14 | OnCreate = FormCreate
15 | OnShow = FormShow
16 | Position = poMainFormCenter
17 | LCLVersion = '2.3.0.0'
18 | Scaled = False
19 | object Img: TImage
20 | Left = 0
21 | Height = 281
22 | Top = 0
23 | Width = 450
24 | Align = alClient
25 | AutoSize = True
26 | end
27 | object Ver: TStaticText
28 | Left = 6
29 | Height = 16
30 | Top = 281
31 | Width = 444
32 | Align = alBottom
33 | Anchors = [akLeft, akBottom]
34 | AutoSize = True
35 | BorderSpacing.Left = 6
36 | BorderSpacing.Bottom = 3
37 | Caption = 'Version: '
38 | Color = clForm
39 | Font.Style = [fsBold]
40 | ParentFont = False
41 | ParentColor = False
42 | TabOrder = 0
43 | end
44 | object Timer1: TTimer
45 | Enabled = False
46 | Interval = 1500
47 | OnTimer = Timer1Timer
48 | Left = 216
49 | Top = 128
50 | end
51 | end
52 |
--------------------------------------------------------------------------------
/src/usplash.pas:
--------------------------------------------------------------------------------
1 | unit uSplash;
2 |
3 | {$mode objfpc}{$H+}
4 |
5 | interface
6 |
7 | uses
8 | Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
9 | ExtCtrls, StdCtrls;
10 |
11 | type
12 |
13 | { TSplash }
14 |
15 | TSplash = class(TForm)
16 | Img: TImage;
17 | Ver: TStaticText;
18 | Timer1: TTimer;
19 | procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
20 | procedure FormCreate(Sender: TObject);
21 | procedure FormShow(Sender: TObject);
22 | procedure Timer1Timer(Sender: TObject);
23 | private
24 | { private declarations }
25 | public
26 | { public declarations }
27 | end;
28 |
29 | var
30 | Splash: TSplash;
31 |
32 | implementation
33 |
34 | {$R *.lfm}
35 |
36 | uses
37 | uUtils;
38 |
39 | { TSplash }
40 |
41 | procedure TSplash.FormShow(Sender: TObject);
42 | begin
43 | Timer1.Enabled:=True;
44 | end;
45 |
46 | procedure TSplash.FormCloseQuery(Sender: TObject; var CanClose: boolean);
47 | begin
48 | if Timer1.Enabled Then
49 | CanClose:=False;
50 | end;
51 |
52 | procedure TSplash.FormCreate(Sender: TObject);
53 | begin
54 | Img.Picture.LoadFromResourceName(HINSTANCE, 'SPLASH', TPortableNetworkGraphic);
55 | Img.AutoSize := true;
56 | Ver.Caption := Ver.Caption + GetVersionStr;
57 | end;
58 |
59 | procedure TSplash.Timer1Timer(Sender: TObject);
60 | begin
61 | Timer1.Enabled:=False;
62 | Close;
63 | end;
64 |
65 |
66 | end.
67 |
68 |
--------------------------------------------------------------------------------
/src/usubtables.lfm:
--------------------------------------------------------------------------------
1 | object SubTables: TSubTables
2 | Left = 404
3 | Height = 308
4 | Top = 269
5 | Width = 321
6 | AutoSize = True
7 | BorderIcons = []
8 | Caption = 'Substract Two Tables'
9 | ClientHeight = 308
10 | ClientWidth = 321
11 | OnCloseQuery = FormCloseQuery
12 | OnShow = FormShow
13 | Position = poMainFormCenter
14 | LCLVersion = '2.1.0.0'
15 | object GroupBox1: TGroupBox
16 | AnchorSideLeft.Control = Owner
17 | AnchorSideTop.Control = Owner
18 | AnchorSideRight.Control = Owner
19 | AnchorSideRight.Side = asrBottom
20 | Left = 6
21 | Height = 55
22 | Top = 6
23 | Width = 309
24 | Anchors = [akTop, akLeft, akRight]
25 | AutoSize = True
26 | BorderSpacing.Left = 6
27 | BorderSpacing.Top = 6
28 | BorderSpacing.Right = 6
29 | Caption = ' Select First Table... '
30 | ClientHeight = 35
31 | ClientWidth = 305
32 | TabOrder = 0
33 | object cbTable1: TComboBox
34 | AnchorSideLeft.Control = GroupBox1
35 | AnchorSideTop.Control = GroupBox1
36 | AnchorSideRight.Control = GroupBox1
37 | AnchorSideRight.Side = asrBottom
38 | Left = 6
39 | Height = 23
40 | Top = 6
41 | Width = 293
42 | Anchors = [akTop, akLeft, akRight]
43 | BorderSpacing.Around = 6
44 | DropDownCount = 24
45 | ItemHeight = 15
46 | Style = csDropDownList
47 | TabOrder = 0
48 | end
49 | end
50 | object GroupBox2: TGroupBox
51 | AnchorSideLeft.Control = Owner
52 | AnchorSideTop.Control = GroupBox1
53 | AnchorSideTop.Side = asrBottom
54 | AnchorSideRight.Control = Owner
55 | AnchorSideRight.Side = asrBottom
56 | Left = 6
57 | Height = 55
58 | Top = 73
59 | Width = 309
60 | Anchors = [akTop, akLeft, akRight]
61 | AutoSize = True
62 | BorderSpacing.Left = 6
63 | BorderSpacing.Top = 12
64 | BorderSpacing.Right = 6
65 | Caption = ' Select Second Table... '
66 | ClientHeight = 35
67 | ClientWidth = 305
68 | TabOrder = 1
69 | object cbTable2: TComboBox
70 | AnchorSideLeft.Control = GroupBox2
71 | AnchorSideTop.Control = GroupBox2
72 | AnchorSideRight.Control = GroupBox2
73 | AnchorSideRight.Side = asrBottom
74 | Left = 6
75 | Height = 23
76 | Top = 6
77 | Width = 293
78 | Anchors = [akTop, akLeft, akRight]
79 | BorderSpacing.Around = 6
80 | DropDownCount = 24
81 | ItemHeight = 15
82 | Style = csDropDownList
83 | TabOrder = 0
84 | end
85 | end
86 | object rgTPri: TRadioGroup
87 | AnchorSideLeft.Control = Owner
88 | AnchorSideTop.Control = GroupBox2
89 | AnchorSideTop.Side = asrBottom
90 | AnchorSideRight.Control = Owner
91 | AnchorSideRight.Side = asrBottom
92 | Left = 6
93 | Height = 74
94 | Top = 140
95 | Width = 309
96 | Anchors = [akTop, akLeft, akRight]
97 | AutoFill = True
98 | AutoSize = True
99 | BorderSpacing.Left = 6
100 | BorderSpacing.Top = 12
101 | BorderSpacing.Right = 6
102 | Caption = ' Tables Priority '
103 | ChildSizing.LeftRightSpacing = 24
104 | ChildSizing.TopBottomSpacing = 6
105 | ChildSizing.VerticalSpacing = 4
106 | ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
107 | ChildSizing.EnlargeVertical = crsHomogenousChildResize
108 | ChildSizing.ShrinkHorizontal = crsScaleChilds
109 | ChildSizing.ShrinkVertical = crsScaleChilds
110 | ChildSizing.Layout = cclLeftToRightThenTopToBottom
111 | ChildSizing.ControlsPerLine = 1
112 | ClientHeight = 54
113 | ClientWidth = 305
114 | ItemIndex = 0
115 | Items.Strings = (
116 | 'Substract First Table From Second Table'
117 | 'Substract Second Table From First Table'
118 | )
119 | TabOrder = 2
120 | end
121 | object Label1: TLabel
122 | AnchorSideLeft.Control = Owner
123 | AnchorSideTop.Control = rgTPri
124 | AnchorSideTop.Side = asrBottom
125 | Left = 6
126 | Height = 15
127 | Top = 226
128 | Width = 45
129 | BorderSpacing.Left = 6
130 | BorderSpacing.Top = 12
131 | Caption = 'Progress'
132 | ParentColor = False
133 | end
134 | object pBar: TProgressBar
135 | AnchorSideLeft.Control = Owner
136 | AnchorSideTop.Control = Label1
137 | AnchorSideTop.Side = asrBottom
138 | AnchorSideRight.Control = Owner
139 | AnchorSideRight.Side = asrBottom
140 | Left = 6
141 | Height = 20
142 | Top = 243
143 | Width = 309
144 | Anchors = [akTop, akLeft, akRight]
145 | BorderSpacing.Left = 6
146 | BorderSpacing.Top = 2
147 | BorderSpacing.Right = 6
148 | TabOrder = 3
149 | end
150 | object StartBtn: TBitBtn
151 | AnchorSideTop.Control = CloseBtn
152 | AnchorSideRight.Control = CloseBtn
153 | Left = 164
154 | Height = 26
155 | Top = 275
156 | Width = 70
157 | Anchors = [akTop, akRight]
158 | AutoSize = True
159 | BorderSpacing.Right = 6
160 | Caption = '&Start'
161 | Default = True
162 | Images = CommonData.Images
163 | ImageIndex = 7
164 | OnClick = StartBtnClick
165 | TabOrder = 4
166 | end
167 | object CloseBtn: TBitBtn
168 | AnchorSideTop.Control = pBar
169 | AnchorSideTop.Side = asrBottom
170 | AnchorSideRight.Control = Owner
171 | AnchorSideRight.Side = asrBottom
172 | Left = 240
173 | Height = 26
174 | Top = 275
175 | Width = 75
176 | Anchors = [akTop, akRight]
177 | AutoSize = True
178 | BorderSpacing.Top = 12
179 | BorderSpacing.Right = 6
180 | BorderSpacing.Bottom = 6
181 | Caption = '&Close'
182 | Images = CommonData.Images
183 | ImageIndex = 37
184 | OnClick = CloseBtnClick
185 | TabOrder = 5
186 | end
187 | end
188 |
--------------------------------------------------------------------------------
/src/utabform.pas:
--------------------------------------------------------------------------------
1 | unit uTabForm;
2 |
3 | {$mode objfpc}{$H+}
4 |
5 | interface
6 |
7 | uses
8 | Classes, SysUtils, ComCtrls, Forms, Controls;
9 |
10 | Type
11 |
12 | { TTabForm }
13 |
14 | TTabForm = Class(TTabSheet)
15 | Private
16 | ParentPageControl : TPageControl;
17 |
18 | Procedure TSShow(Sender: TObject);
19 |
20 | Public
21 | ParentForm : TForm;
22 | Constructor Create(AOwner : TComponent); Override;
23 | Destructor Destroy; Override;
24 | Procedure AddFormToPageControl(MyForm : TForm);
25 | end;
26 |
27 | implementation
28 |
29 | { TTabForm }
30 |
31 | procedure TTabForm.TSShow(Sender: TObject);
32 | begin
33 | (Sender As TTabForm).PageControl.Color := (Sender As TTabForm).Color;
34 | end;
35 |
36 | constructor TTabForm.Create(AOwner: TComponent);
37 | begin
38 | ParentPageControl := TPageControl(AOwner);
39 | ParentForm := Nil;
40 |
41 | Inherited Create(AOwner);
42 | end;
43 |
44 | destructor TTabForm.Destroy;
45 | begin
46 | If Self.ParentForm <> Nil Then
47 | Begin
48 | Self.ParentForm.Release;
49 | Self.ParentForm := Nil;
50 | end;
51 |
52 | Inherited Destroy;
53 | end;
54 |
55 | procedure TTabForm.AddFormToPageControl(MyForm: TForm);
56 | Var ts : TTabForm;
57 | begin
58 | ts := TTabForm.Create(ParentPageControl);
59 | ts.ParentForm := MyForm;
60 |
61 | ts.PageControl := ParentPageControl;
62 | ts.ParentForm.Parent := ts;
63 | ts.ParentForm.Align := alClient;
64 | ts.ParentForm.BorderStyle := bsNone;
65 | ts.ParentForm.Visible := True;
66 | ts.Caption := ts.ParentForm.Caption;
67 | ts.Color := MyForm.Color;
68 | ts.PageControl.Color := MyForm.Color;
69 |
70 | ts.OnShow := @TSShow;
71 |
72 | ParentPageControl.ActivePage := ts;
73 | ParentPageControl.Visible := True;
74 | end;
75 |
76 | end.
77 |
78 |
--------------------------------------------------------------------------------
/src/utabslist.lfm:
--------------------------------------------------------------------------------
1 | object TabsList: TTabsList
2 | Left = 338
3 | Height = 395
4 | Top = 204
5 | Width = 664
6 | Caption = 'Tabs list'
7 | ClientHeight = 395
8 | ClientWidth = 664
9 | OnCloseQuery = FormCloseQuery
10 | OnCreate = FormCreate
11 | OnShow = FormShow
12 | Position = poMainFormCenter
13 | LCLVersion = '2.1.0.0'
14 | object CloseBtn: TBitBtn
15 | AnchorSideRight.Control = Owner
16 | AnchorSideRight.Side = asrBottom
17 | AnchorSideBottom.Control = Owner
18 | AnchorSideBottom.Side = asrBottom
19 | Left = 583
20 | Height = 26
21 | Top = 363
22 | Width = 75
23 | Anchors = [akRight, akBottom]
24 | AutoSize = True
25 | BorderSpacing.Around = 6
26 | Caption = '&Close'
27 | Images = CommonData.Images
28 | ImageIndex = 37
29 | OnClick = CloseBtnClick
30 | TabOrder = 4
31 | end
32 | object MoveUpBtn: TBitBtn
33 | AnchorSideLeft.Control = Owner
34 | AnchorSideBottom.Control = Owner
35 | AnchorSideBottom.Side = asrBottom
36 | Left = 6
37 | Height = 26
38 | Top = 363
39 | Width = 94
40 | Anchors = [akLeft, akBottom]
41 | AutoSize = True
42 | BorderSpacing.Around = 6
43 | Caption = 'Move Up'
44 | Images = CommonData.Images
45 | ImageIndex = 38
46 | OnClick = MoveUpBtnClick
47 | TabOrder = 0
48 | end
49 | object MoveDownBtn: TBitBtn
50 | AnchorSideLeft.Control = MoveUpBtn
51 | AnchorSideLeft.Side = asrBottom
52 | AnchorSideBottom.Control = Owner
53 | AnchorSideBottom.Side = asrBottom
54 | Left = 106
55 | Height = 26
56 | Top = 363
57 | Width = 110
58 | Anchors = [akLeft, akBottom]
59 | AutoSize = True
60 | BorderSpacing.Around = 6
61 | Caption = 'Move Down'
62 | Images = CommonData.Images
63 | ImageIndex = 39
64 | OnClick = MoveDownBtnClick
65 | TabOrder = 1
66 | end
67 | object GoToTabBtn: TBitBtn
68 | AnchorSideLeft.Control = MoveDownBtn
69 | AnchorSideLeft.Side = asrBottom
70 | AnchorSideBottom.Control = Owner
71 | AnchorSideBottom.Side = asrBottom
72 | Left = 222
73 | Height = 26
74 | Top = 363
75 | Width = 95
76 | Anchors = [akLeft, akBottom]
77 | AutoSize = True
78 | BorderSpacing.Around = 6
79 | Caption = 'Go to tab'
80 | Images = CommonData.Images
81 | ImageIndex = 7
82 | OnClick = GoToTabBtnClick
83 | TabOrder = 2
84 | end
85 | object CloseTabBtn: TBitBtn
86 | AnchorSideLeft.Control = GoToTabBtn
87 | AnchorSideLeft.Side = asrBottom
88 | AnchorSideBottom.Control = Owner
89 | AnchorSideBottom.Side = asrBottom
90 | Left = 323
91 | Height = 26
92 | Top = 363
93 | Width = 95
94 | Anchors = [akLeft, akBottom]
95 | AutoSize = True
96 | BorderSpacing.Around = 6
97 | Caption = 'Close tab'
98 | Images = CommonData.Images
99 | ImageIndex = 15
100 | OnClick = CloseTabBtnClick
101 | TabOrder = 3
102 | end
103 | object TabsGrid: TStringGrid
104 | AnchorSideLeft.Control = Owner
105 | AnchorSideTop.Control = Owner
106 | AnchorSideRight.Control = Owner
107 | AnchorSideRight.Side = asrBottom
108 | AnchorSideBottom.Control = CloseTabBtn
109 | Left = 6
110 | Height = 351
111 | Top = 6
112 | Width = 652
113 | Anchors = [akTop, akLeft, akRight, akBottom]
114 | AutoFillColumns = True
115 | BorderSpacing.Around = 6
116 | ColCount = 3
117 | Columns = <
118 | item
119 | Alignment = taRightJustify
120 | SizePriority = 0
121 | Title.Alignment = taRightJustify
122 | Title.Caption = '#'
123 | Width = 40
124 | end
125 | item
126 | SizePriority = 0
127 | Title.Caption = 'Caption'
128 | Width = 200
129 | end
130 | item
131 | Title.Caption = 'File'
132 | Width = 408
133 | end>
134 | FixedCols = 0
135 | MouseWheelOption = mwGrid
136 | Options = [goFixedVertLine, goFixedHorzLine, goHorzLine, goRangeSelect, goColSizing, goRowSelect, goThumbTracking, goSmoothScroll, goCellHints, goTruncCellHints]
137 | TabOrder = 5
138 | ColWidths = (
139 | 40
140 | 200
141 | 408
142 | )
143 | end
144 | end
145 |
--------------------------------------------------------------------------------
/src/utabslist.pas:
--------------------------------------------------------------------------------
1 | unit uTabsList;
2 |
3 | {$mode objfpc}{$H+}
4 |
5 | interface
6 |
7 | uses
8 | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
9 | Buttons, Grids;
10 |
11 | type
12 |
13 | { TTabsList }
14 |
15 | TTabsList = class(TForm)
16 | CloseBtn: TBitBtn;
17 | MoveUpBtn: TBitBtn;
18 | MoveDownBtn: TBitBtn;
19 | GoToTabBtn: TBitBtn;
20 | CloseTabBtn: TBitBtn;
21 | TabsGrid: TStringGrid;
22 | procedure CloseBtnClick(Sender: TObject);
23 | procedure CloseTabBtnClick(Sender: TObject);
24 | procedure FormCreate(Sender: TObject);
25 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
26 | procedure FormShow(Sender: TObject);
27 | procedure GoToTabBtnClick(Sender: TObject);
28 | procedure MoveUpBtnClick(Sender: TObject);
29 | procedure MoveDownBtnClick(Sender: TObject);
30 | private
31 | { private declarations }
32 | Procedure Load_Tabs;
33 | procedure UpdateCmds;
34 | public
35 | { public declarations }
36 | end;
37 |
38 | var
39 | TabsList: TTabsList;
40 |
41 | implementation
42 |
43 | uses
44 | uMain, uTabForm, uDbfTable, uOptions;
45 |
46 | {$R *.lfm}
47 |
48 | { TTabsList }
49 |
50 | procedure TTabsList.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
51 | begin
52 | if CanClose then
53 | Options.TabsListWindow.ExtractFromForm(Self);
54 | end;
55 |
56 | procedure TTabsList.FormShow(Sender: TObject);
57 | begin
58 | Options.TabsListWindow.ApplyToForm(self);
59 | Load_Tabs;
60 | UpdateCmds;
61 | end;
62 |
63 | procedure TTabsList.CloseBtnClick(Sender: TObject);
64 | begin
65 | Close;
66 | end;
67 |
68 | procedure TTabsList.FormCreate(Sender: TObject);
69 | begin
70 | if Options.UseAlternateColor then
71 | TabsGrid.AlternateColor := Options.AlternateColor
72 | else
73 | TabsGrid.AlternateColor := TabsGrid.Color;
74 | if Options.ShowGridLines then
75 | TabsGrid.Options := TabsGrid.Options + [goHorzLine]
76 | else
77 | TabsGrid.Options := TabsGrid.Options - [goHorzLine];
78 | TabsGrid.GridLineColor := Options.GridLineColor;
79 | end;
80 |
81 | procedure TTabsList.MoveUpBtnClick(Sender: TObject);
82 | var
83 | oldPos : Integer;
84 | begin
85 | if (TabsGrid.RowCount > TabsGrid.FixedRows + 1) and (TabsGrid.Row > TabsGrid.FixedRows) then
86 | begin
87 | oldPos := TabsGrid.Row - TabsGrid.FixedRows;
88 | Main.WorkSite.Pages[oldPos].PageIndex := oldPos - 1;
89 | Load_Tabs;
90 | TabsGrid.SetFocus;
91 | TabsGrid.Row := oldPos - 1 + TabsGrid.FixedRows;
92 | UpdateCmds;
93 | end;
94 | end;
95 |
96 | procedure TTabsList.MoveDownBtnClick(Sender: TObject);
97 | var
98 | oldPos: Integer;
99 | begin
100 | if (TabsGrid.RowCount > TabsGrid.FixedRows + 1) and (TabsGrid.Row < TabsGrid.RowCount - 1) then
101 | begin
102 | oldPos := TabsGrid.Row - TabsGrid.FixedRows;
103 | Main.WorkSite.Pages[oldPos].PageIndex := oldPos + 1;
104 | Load_Tabs;
105 | TabsGrid.SetFocus;
106 | TabsGrid.Row := oldPos + 1 + TabsGrid.FixedRows;
107 | UpdateCmds;
108 | end;
109 | end;
110 |
111 | procedure TTabsList.GoToTabBtnClick(Sender: TObject);
112 | begin
113 | if TabsGrid.Row >= TabsGrid.FixedRows then
114 | begin
115 | Main.WorkSite.TabIndex := TabsGrid.Row - TabsGrid.FixedRows;
116 | Close;
117 | end;
118 | end;
119 |
120 | procedure TTabsList.CloseTabBtnClick(Sender: TObject);
121 | begin
122 | if TabsGrid.Row >= TabsGrid.FixedRows then
123 | begin
124 | Main.WorkSite.TabIndex := TabsGrid.Row - TabsGrid.FixedRows;
125 | Main.WorkSite.Pages[Main.WorkSite.TabIndex].Free;
126 | Load_Tabs;
127 | UpdateCmds;
128 | end;
129 | end;
130 |
131 | procedure TTabsList.Load_Tabs;
132 | var
133 | ind: Integer;
134 | Frm: TForm;
135 | sFile: String;
136 | row: Integer;
137 | begin
138 | TabsGrid.BeginUpdate;
139 | try
140 | TabsGrid.RowCount := Main.WorkSite.PageCount + TabsGrid.FixedRows;
141 | if Main.Worksite.PageCount > 0 then
142 | begin
143 | row := TabsGrid.FixedRows;
144 | for ind := 0 to Main.WorkSite.PageCount - 1 do
145 | begin
146 | TabsGrid.Cells[0, row] := IntToStr(row);
147 | TabsGrid.Cells[1, row] := Main.WorkSite.Pages[ind].Caption;
148 | sFile := '';
149 | if (Main.WorkSite.Pages[ind] is TTabForm) then
150 | begin
151 | frm := TTabForm(Main.WorkSite.Pages[ind]).ParentForm;
152 | if frm is TDbfTable then
153 | with TDbfTable(frm) do
154 | sFile := DBTable.FilePathFull + DBTable.TableName;
155 | end;
156 | TabsGrid.Cells[2, row] := sFile;
157 | inc(row);
158 | end;
159 | TabsGrid.Row := Main.WorkSite.ActivePageIndex + TabsGrid.FixedRows;
160 | end;
161 | finally
162 | TabsGrid.EndUpdate;
163 | end;
164 | end;
165 |
166 | procedure TTabsList.UpdateCmds;
167 | var
168 | hasData: Boolean;
169 | begin
170 | hasData := TabsGrid.RowCount > TabsGrid.FixedRows;
171 | MoveUpBtn.Enabled := hasData and (TabsGrid.Row > TabsGrid.FixedRows);
172 | MoveDownBtn.Enabled := hasData and (TabsGrid.Row < TabsGrid.RowCount - 1);
173 | GoToTabBtn.Enabled := hasData and (TabsGrid.Row >= TabsGrid.FixedRows);
174 | CloseTabBtn.Enabled := hasData and (TabsGrid.Row >= TabsGrid.FixedRows);
175 | end;
176 |
177 | end.
178 |
179 |
--------------------------------------------------------------------------------