├── .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 | ![Screenshot](screenshots/MyDBFStudio_v0.6.0.png) 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 | 22 | 24 | 27 | 31 | 35 | 36 | 46 | 47 | 71 | 82 | 83 | 85 | 86 | 88 | image/svg+xml 89 | 91 | 92 | 93 | 94 | 95 | 99 | 105 | 109 | DBF 121 | 122 | 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 | --------------------------------------------------------------------------------