├── NewsItems ├── CurrentItemNumber.txt ├── Images │ ├── AddPEMs.png │ ├── ThorMenu.png │ ├── Tweet10a.png │ ├── Tweet10b.png │ ├── Tweet10c.png │ ├── Tweet10d.png │ ├── Tweet10e.png │ ├── Tweet11a.png │ ├── Tweet11b.png │ ├── Tweet11c.png │ ├── Tweet11d.png │ ├── Tweet13a.png │ ├── Tweet13b.png │ ├── Tweet13c.png │ ├── Tweet13d.png │ ├── Tweet13e.png │ ├── Tweet14a.png │ ├── Tweet14b.png │ ├── Tweet14c.png │ ├── Tweet14d.png │ ├── Tweet14e.png │ ├── Tweet14f.png │ ├── Tweet14g.png │ ├── Tweet14h.png │ ├── Tweet14i.png │ ├── Tweet15b.png │ ├── Tweet15c.png │ ├── Tweet15d.png │ ├── Tweet15e.png │ ├── Tweet15f.png │ ├── Tweet15g.png │ ├── Tweet15h.png │ ├── Tweet15i.png │ ├── Tweet15j.png │ ├── Tweet15k.png │ ├── Tweet15l.png │ ├── Tweet15m.png │ ├── Tweet15n.png │ ├── Tweet16a.png │ ├── Tweet16b.png │ ├── Tweet16c.png │ ├── Tweet18a.png │ ├── Tweet19a.png │ ├── Tweet19b.png │ ├── Tweet19c.png │ ├── Tweet19d.png │ ├── Tweet20a.png │ ├── Tweet20b.png │ ├── Tweet20c.png │ ├── Tweet20d.png │ ├── Tweet20e.png │ ├── Tweet21a.png │ ├── Tweet21b.png │ ├── Tweet21c.png │ ├── Tweet22a.png │ ├── Tweet22b.png │ ├── Tweet22c.png │ ├── Tweet22d.png │ ├── Tweet23a.png │ ├── Tweet23b.png │ ├── Tweet23c.png │ ├── Tweet24a.png │ ├── Tweet24b.png │ ├── Tweet24c.png │ ├── Tweet24d.png │ ├── Tweet24e.png │ ├── Tweet25a.png │ ├── Tweet25b.png │ ├── Tweet25c.png │ ├── Tweet25d.png │ ├── Tweet25e.png │ ├── Tweet26a.png │ ├── Tweet27a.png │ ├── Tweet2a.png │ ├── Tweet2b.png │ ├── Tweet3a.png │ ├── Tweet5a.png │ ├── Tweet6a.png │ ├── Tweet7a.png │ ├── Tweet7b.png │ ├── Tweet7c.png │ ├── Tweet8a.png │ ├── Tweet9a.png │ ├── Tweet9b.png │ ├── Tweet9c.png │ ├── Tweet9d.png │ ├── Tweet9e.png │ ├── ISXAddPEMs.png │ ├── Thor_forums.png │ ├── ThorMenuItem.png │ ├── Item_47_crsrStar.png │ ├── Item_47_goKTrack.png │ ├── Item_47_loTable.png │ ├── Item_47_oNAVSQL.png │ ├── Item_51_Issues.png │ ├── Thor_community.png │ ├── GitHubCustomIssues.png │ ├── GitHubProjectIssue.png │ ├── GitHubProjectWatch.png │ ├── QuickAccessInstall.png │ ├── QuickAccessSample.png │ ├── Thor_configuration.png │ ├── Item_47_loTableSample.png │ ├── Item_47_oAppDotoAdmin.png │ ├── Item_47_oAppDotoStar.png │ ├── Item_47_oNAVSQLSample.png │ ├── Item_51_ThorHomePages.png │ ├── Item_51_ThorMenuPad.jpg │ ├── Item_51_ThorMenuPad.png │ ├── QuickAccessLauncher.png │ ├── Thor_SNAGHTML39362d.png │ ├── Thor_SNAGHTMLf389404.png │ ├── Thor_SNAGHTMLf3b4e2e.png │ ├── Tweet10_foxcodeplus.png │ ├── Tweet9_vfpxprojects.png │ ├── item_47_loStarDotData.png │ ├── HiddenConextMenuSample.png │ ├── Item_47_GoToDefinition.png │ ├── Item_47_crsrStarSample.png │ ├── Item_47_goKTrackExample.png │ ├── Thor_news_image_thumb_4.png │ ├── Thor_news_image_thumb_5.png │ ├── Item_46_ExecuteSelection.png │ ├── Item_47_SampleAliasTable.png │ ├── Thor_News_SNAGHTML1f93281e.png │ ├── Thor_News_SNAGHTML3cdc777.png │ ├── vfpxpoweredby_alternative.gif │ ├── Item_47_loTableStarDotoData.png │ ├── QuickAccessGoToTablesFolder.png │ └── Thor_News_SNAGHTMLf871ea8_thumb1_thumb_2.png ├── Item_04.md ├── Item_09.md ├── Item_14.md ├── Item_44.md ├── Item_03.md ├── Item_01.md ├── Item_38.md ├── Item_07.md ├── Item_05.md ├── Item_12.md ├── Item_45.md ├── Item_13.md ├── Item_06.md ├── Item_18.md ├── Item_10.md ├── Item_17.md ├── Item_41.md ├── Item_08.md ├── Tweet_02.md ├── Item_46.md ├── Item_51.md ├── Tweet_05.md ├── Tweet_08.md ├── Item_43.md ├── Tweet_09.md ├── Tweet_01.md ├── Tweet_23.md ├── Tweet_06.md ├── Tweet_04.md ├── Item_49.md ├── Tweet_13.md ├── Tweet_26.md ├── Item_48.md ├── Item_42.md ├── Tweet_17.md ├── Item_52.md ├── Tweet_07.md ├── Tweet_12.md ├── Tweet_16.md ├── Item_50.md ├── Thor_videos.md ├── Tweet_27.md ├── Tweet_11.md ├── Tweet_22.md ├── Tweet_18.md ├── Tweet_03.md ├── Archives.md ├── Tweet_14.md ├── Tweet_19.md ├── Item_53.md ├── Tweet_15.md ├── Tweet_10.md ├── FirstPage.md ├── Tweet_20.md ├── Item_47.md ├── Tweet_21.md ├── Tweet_24.md ├── Tweet_25.md └── Old Items.md ├── .github ├── vfpxpoweredby_alternative.gif ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md └── CONTRIBUTING.md ├── .gitignore └── README.md /NewsItems/CurrentItemNumber.txt: -------------------------------------------------------------------------------- 1 | Thor News Version = 53 -------------------------------------------------------------------------------- /NewsItems/Images/AddPEMs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/AddPEMs.png -------------------------------------------------------------------------------- /NewsItems/Images/ThorMenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/ThorMenu.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet10a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet10a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet10b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet10b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet10c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet10c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet10d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet10d.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet10e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet10e.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet11a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet11a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet11b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet11b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet11c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet11c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet11d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet11d.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet13a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet13a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet13b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet13b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet13c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet13c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet13d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet13d.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet13e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet13e.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet14a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet14a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet14b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet14b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet14c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet14c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet14d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet14d.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet14e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet14e.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet14f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet14f.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet14g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet14g.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet14h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet14h.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet14i.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet14i.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet15b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet15b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet15c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet15c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet15d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet15d.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet15e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet15e.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet15f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet15f.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet15g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet15g.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet15h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet15h.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet15i.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet15i.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet15j.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet15j.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet15k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet15k.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet15l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet15l.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet15m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet15m.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet15n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet15n.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet16a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet16a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet16b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet16b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet16c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet16c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet18a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet18a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet19a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet19a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet19b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet19b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet19c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet19c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet19d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet19d.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet20a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet20a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet20b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet20b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet20c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet20c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet20d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet20d.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet20e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet20e.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet21a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet21a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet21b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet21b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet21c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet21c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet22a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet22a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet22b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet22b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet22c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet22c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet22d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet22d.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet23a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet23a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet23b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet23b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet23c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet23c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet24a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet24a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet24b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet24b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet24c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet24c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet24d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet24d.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet24e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet24e.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet25a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet25a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet25b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet25b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet25c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet25c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet25d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet25d.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet25e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet25e.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet26a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet26a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet27a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet27a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet2a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet2a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet2b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet2b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet3a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet3a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet5a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet5a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet6a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet6a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet7a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet7a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet7b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet7b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet7c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet7c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet8a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet8a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet9a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet9a.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet9b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet9b.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet9c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet9c.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet9d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet9d.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet9e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet9e.png -------------------------------------------------------------------------------- /NewsItems/Images/ISXAddPEMs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/ISXAddPEMs.png -------------------------------------------------------------------------------- /NewsItems/Images/Thor_forums.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Thor_forums.png -------------------------------------------------------------------------------- /NewsItems/Images/ThorMenuItem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/ThorMenuItem.png -------------------------------------------------------------------------------- /.github/vfpxpoweredby_alternative.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/.github/vfpxpoweredby_alternative.gif -------------------------------------------------------------------------------- /NewsItems/Images/Item_47_crsrStar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_47_crsrStar.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_47_goKTrack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_47_goKTrack.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_47_loTable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_47_loTable.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_47_oNAVSQL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_47_oNAVSQL.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_51_Issues.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_51_Issues.png -------------------------------------------------------------------------------- /NewsItems/Images/Thor_community.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Thor_community.png -------------------------------------------------------------------------------- /NewsItems/Images/GitHubCustomIssues.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/GitHubCustomIssues.png -------------------------------------------------------------------------------- /NewsItems/Images/GitHubProjectIssue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/GitHubProjectIssue.png -------------------------------------------------------------------------------- /NewsItems/Images/GitHubProjectWatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/GitHubProjectWatch.png -------------------------------------------------------------------------------- /NewsItems/Images/QuickAccessInstall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/QuickAccessInstall.png -------------------------------------------------------------------------------- /NewsItems/Images/QuickAccessSample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/QuickAccessSample.png -------------------------------------------------------------------------------- /NewsItems/Images/Thor_configuration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Thor_configuration.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_47_loTableSample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_47_loTableSample.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_47_oAppDotoAdmin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_47_oAppDotoAdmin.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_47_oAppDotoStar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_47_oAppDotoStar.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_47_oNAVSQLSample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_47_oNAVSQLSample.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_51_ThorHomePages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_51_ThorHomePages.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_51_ThorMenuPad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_51_ThorMenuPad.jpg -------------------------------------------------------------------------------- /NewsItems/Images/Item_51_ThorMenuPad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_51_ThorMenuPad.png -------------------------------------------------------------------------------- /NewsItems/Images/QuickAccessLauncher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/QuickAccessLauncher.png -------------------------------------------------------------------------------- /NewsItems/Images/Thor_SNAGHTML39362d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Thor_SNAGHTML39362d.png -------------------------------------------------------------------------------- /NewsItems/Images/Thor_SNAGHTMLf389404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Thor_SNAGHTMLf389404.png -------------------------------------------------------------------------------- /NewsItems/Images/Thor_SNAGHTMLf3b4e2e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Thor_SNAGHTMLf3b4e2e.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet10_foxcodeplus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet10_foxcodeplus.png -------------------------------------------------------------------------------- /NewsItems/Images/Tweet9_vfpxprojects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Tweet9_vfpxprojects.png -------------------------------------------------------------------------------- /NewsItems/Images/item_47_loStarDotData.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/item_47_loStarDotData.png -------------------------------------------------------------------------------- /NewsItems/Images/HiddenConextMenuSample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/HiddenConextMenuSample.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_47_GoToDefinition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_47_GoToDefinition.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_47_crsrStarSample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_47_crsrStarSample.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_47_goKTrackExample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_47_goKTrackExample.png -------------------------------------------------------------------------------- /NewsItems/Images/Thor_news_image_thumb_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Thor_news_image_thumb_4.png -------------------------------------------------------------------------------- /NewsItems/Images/Thor_news_image_thumb_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Thor_news_image_thumb_5.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_46_ExecuteSelection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_46_ExecuteSelection.png -------------------------------------------------------------------------------- /NewsItems/Images/Item_47_SampleAliasTable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_47_SampleAliasTable.png -------------------------------------------------------------------------------- /NewsItems/Images/Thor_News_SNAGHTML1f93281e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Thor_News_SNAGHTML1f93281e.png -------------------------------------------------------------------------------- /NewsItems/Images/Thor_News_SNAGHTML3cdc777.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Thor_News_SNAGHTML3cdc777.png -------------------------------------------------------------------------------- /NewsItems/Images/vfpxpoweredby_alternative.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/vfpxpoweredby_alternative.gif -------------------------------------------------------------------------------- /NewsItems/Images/Item_47_loTableStarDotoData.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Item_47_loTableStarDotoData.png -------------------------------------------------------------------------------- /NewsItems/Images/QuickAccessGoToTablesFolder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/QuickAccessGoToTablesFolder.png -------------------------------------------------------------------------------- /NewsItems/Images/Thor_News_SNAGHTMLf871ea8_thumb1_thumb_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VFPX/ThorNews/main/NewsItems/Images/Thor_News_SNAGHTMLf871ea8_thumb1_thumb_2.png -------------------------------------------------------------------------------- /NewsItems/Item_04.md: -------------------------------------------------------------------------------- 1 | 2 | Data Explorer is now a Thor tool 3 | --- 4 | 5 | #### #4, 2012-09-09 6 | Data Explorer 3 is now available as a Thor Tool. This means that you can choose to access it by hot key by assigning the hot key in the Thor configuration form. 7 | 8 | ![](Images/Thor_News_SNAGHTML1f93281e.png) 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # use glob syntax. 2 | syntax: glob 3 | 4 | # VFP generated files 5 | *.err 6 | *.ERR 7 | *.mpr 8 | *.MPR 9 | 10 | # VFP compiled files 11 | *.fxp 12 | *.FXP 13 | *.mpx 14 | *.MPX 15 | *.qpx 16 | *.QPX 17 | 18 | # VFP backup files 19 | *.bak 20 | *.BAK 21 | *.tbk 22 | *.TBK 23 | 24 | # Misc backup files 25 | *.orig 26 | *.ORIG 27 | *.save 28 | *.SAVE 29 | *.zip 30 | *.ZIP 31 | -------------------------------------------------------------------------------- /NewsItems/Item_09.md: -------------------------------------------------------------------------------- 1 | Easy access to all VFPX home pages 2 | --- 3 | 4 | ### #9, 2012-10-06 5 | 6 | 7 | Thor now provides ready access to the home pages for all VFPX projects, available from the Thor menu pad. 8 | 9 | ![](Images/Tweet9_vfpxprojects.png) 10 | --- 11 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 12 | 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## 📝 Provide a description of the new feature 11 | 12 | _What is the expected behavior of the proposed feature? What is the scenario this would be used?_ 13 | 14 | --- 15 | 16 | If you'd like to see this feature implemented, add a 👍 reaction to this post. 17 | -------------------------------------------------------------------------------- /NewsItems/Item_14.md: -------------------------------------------------------------------------------- 1 | Thor videos available from Thor menu 2 | --- 3 | 4 | #### #14, 2013-01-16 5 | 6 | 7 | There are already a number of videos explaining features of Thor and there are more to come. Follow the link from the Thor menu to the list of all Thor videos. 8 | 9 | ![](Images/Thor_news_image_thumb_4.png) 10 | 11 | --- 12 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 13 | 14 | -------------------------------------------------------------------------------- /NewsItems/Item_44.md: -------------------------------------------------------------------------------- 1 | **FoxTabs Enhancements** 2 | --- 3 | 4 | ### #44, 2023-01-06 5 | 6 | There are some recent enhancements to [FoxTabs](https://github.com/VFPX/FoxTabs). 7 | 8 | * BindWinEvent was extracted to a separate repository, and some fixes were applied. 9 | * Fixed compatibility issues with PEM Editor (some tabs had no label). 10 | * Improved window type detection and tab icons. 11 | 12 | 13 | --- 14 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 15 | -------------------------------------------------------------------------------- /NewsItems/Item_03.md: -------------------------------------------------------------------------------- 1 | New VFPX Projects: Dynamic Forms & Data Explorer 2 | --- 3 | 4 | #### #3, 2012-09-04 5 | Two new VFPX projects have been created in the last few days and are available from Check For Updates: 6 | 7 | * [Dynamic Forms](https://github.com/mattslay/DynamicForms) 8 | * [Data Explorer 3](https://github.com/rschummer/DataExplorer) 9 | 10 | After downloading, you can use the Thor menu pad in the system menu to open the folder in which these components are installed: 11 | 12 | ![](Images/Tweet10_foxcodeplus.png) 13 | -------------------------------------------------------------------------------- /NewsItems/Item_01.md: -------------------------------------------------------------------------------- 1 | 2 | Introducing Thor News. 3 | --- 4 | 5 | #### #1, 2012-08-25 6 | 7 | This is the first installment of the Thor News, which will notify you of changes and updates to Thor. It will also, from time to time, explore some of the more interesting tools found in Thor. 8 | 9 | The latest news will be brought to you: 10 | 11 | * each time that you run Check For Updates 12 | * once a week when you execute RunThor. 13 | 14 | You can change these settings in the Thor Configuration form: 15 | 16 | ![](Images/Thor_configuration.png) 17 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## 📝 Provide detailed reproduction steps (if any) 11 | 12 | 1. … 13 | 2. … 14 | 3. … 15 | 16 | ### ✔️ Expected result 17 | 18 | _What is the expected result of the above steps?_ 19 | 20 | ### ❌ Actual result 21 | 22 | _What is the actual result of the above steps?_ 23 | 24 | ## 📷 Screenshots 25 | 26 | _Are there any useful screenshots? WinKey+Shift+S and then just paste them directly into the form_ 27 | -------------------------------------------------------------------------------- /NewsItems/Item_38.md: -------------------------------------------------------------------------------- 1 | New VFPX Projects - VFP Runtime Installers and StripeX 2 | --- 3 | 4 | #### #38, 2014-12-17 5 | 6 | 7 | Two new projects have been added to VFPX and are available from Check For Updates. 8 | 9 | * [VFP Runtime Installers](https://github.com/VFPX/VFPRuntimeInstallers) contains the runtime installers for VFP versions 6 thru 9 (since they are no longer available from Microsoft’s website) 10 | * [StripeX](http://github.com/VFPX/StripeX) is a wrapper class for working with Stripe.com. 11 | 12 | --- 13 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 14 | 15 | -------------------------------------------------------------------------------- /NewsItems/Item_07.md: -------------------------------------------------------------------------------- 1 | All VFPX projects can be downloaded from Thor 2 | --- 3 | 4 | ### #7, 2012-09-19 5 | 6 | The current version of all VFPX projects can now be downloaded directly from Check For Updates. 7 | 8 | The projects listed in Check For Updates are listed alphabetically within these five groups: 9 | 1. Projects that you have already downloaded for which there is a more current version. (see #4) 10 | 1. Projects that you have not downloaded which have had updates in the last three months 11 | 1. All other projects that you have not downloaded 12 | 1. Projects that you have already downloaded and which are current 13 | 1. All projects marked as “never update”. This takes precedence over any of the categories above. 14 | 15 | --- 16 | -------------------------------------------------------------------------------- /NewsItems/Item_05.md: -------------------------------------------------------------------------------- 1 | IntellisenseX released 2 | --- 3 | 4 | #### #5, 2012-09-10 5 | *IntellisenseX* refers to a suite of Thor Tools that provide functionality similar to native Intellisense. These tools display lists of available variable names, field names, or members (properties, events, methods, and objects) while you type code, just like Intellisense. However, they cover those areas that Intellisense forgot (such as the list of field names in a table when editing in a code window) and provide new capabilities, available through customization, such as displaying the list of field names in an SQL table, as shown below. For a full description, see the [IntellisenseX Home Page.](https://github.com/VFPX/IntelliSenseX) 6 | 7 | ![](Images/Thor_News_SNAGHTMLf871ea8_thumb1_thumb_2.png) 8 | 9 | -------------------------------------------------------------------------------- /NewsItems/Item_12.md: -------------------------------------------------------------------------------- 1 | Thor menus provide access to Discussion Forums and Change Logs 2 | --- 3 | 4 | #### #12, 2012-11-16 5 | 6 | 7 | The Thor menu has been changed to provide access to a number of related Discussion Forums. 8 | 9 | These forums are the preferred form of communication about these tools, rather than private emails, or using the Universal Thread, Foxite, or any other on-line forums. 10 | 11 | ![](Images/Thor_forums.png) 12 | 13 | 14 | Change logs for the various tools and components of Thor are now available, as well as a link to the never ending list of Thor ERs. 15 | 16 | ![](Images/Thor_news_image_thumb_5.png) 17 | 18 | --- 19 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 20 | 21 | -------------------------------------------------------------------------------- /NewsItems/Item_45.md: -------------------------------------------------------------------------------- 1 | **Class Browser Enhancements** 2 | --- 3 | 4 | ### #45, 2023-01-13 5 | 6 | There are two recent enhancements to [Class Browser](https://github.com/VFPX/ClassBrowser). 7 | 8 | * If Thor is active, adds classes and class libraries opened into VFP's MRU lists 9 | * Thor tool "Install Class Browser" installs/uninstalls this new version of Class Browser. 10 | 11 | Many Thor tools, including PEMEditor, GoFish and Go To Definitions, update VFP's native MRU lists. 12 | 13 | To get to the MRU lists without going to the command window, use the Thor tool "MRUs", best accessed if assigned to a hot key. 14 | 15 | ![](../Images/Thor_MRUs.png) 16 | 17 | 18 | --- 19 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 20 | -------------------------------------------------------------------------------- /NewsItems/Item_13.md: -------------------------------------------------------------------------------- 1 | Thor's Tool Launcher: The one tool you *must* use 2 | --- 3 | 4 | #### #13, 2013-01-05 5 | 6 | 7 | Thor’s Tool Launcher uses a simple screen that allows you to browse through all the Thor tools by keyword, to read their descriptions or visit their home pages, to set their options, and, most importantly, to run them. It also helps you to organize the tools that you use most to make them easily accessible. 8 | 9 | Thor suffers from an over-abundance of tools – there are so many that it may seem impossible to find which tools are of interest to you. The Tool Launcher simplifies that search. 10 | 11 | Watch [this short video](http://youtu.be/2ttBR9vQqew) (7:57) to learn all about it. 12 | 13 | --- 14 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 15 | 16 | -------------------------------------------------------------------------------- /NewsItems/Item_06.md: -------------------------------------------------------------------------------- 1 | Use the Thor discussion group for comments, suggestions, bug reports, etc. 2 | --- 3 | 4 | #### #6, 2012-09-16 5 | 6 | Use the “Community / Discussions” menu item in the Thor menu pad to send comments, suggestions, bug reports, and so on to the [Thor Discussion Group](http://groups.google.com/group/FoxProThor). You are invited to become a member of the group so that you can see what is going on in the land of Thor. 7 | 8 | ![](Images/Thor_community.png) 9 | 10 | Two things of note: 11 | 12 | * You can email discussion questions (with screenshots) directly to: 13 | 14 | [foxproThor@googlegroups.com](mailto:foxproThor@googlegroups.com) 15 | 16 | *When reporting bugs, please provide as much information as possible, including screenshots. Any information you can provide (such as an image of the debugger, etc.) will be greatly appreciated. 17 | -------------------------------------------------------------------------------- /NewsItems/Item_18.md: -------------------------------------------------------------------------------- 1 | 2 | Thor Version 1.40 released: Thor ToolBar 3 | --- 4 | 5 | #### #18, 2013-08-26 6 | 7 | 8 | Added the Thor ToolBar. Tools may be added to the Toolbar may using the checkbox shown in the Thor Configuration form, below (and also available in the Tool Launcher.) TBL 9 | 10 | ![](Images/Thor_SNAGHTMLf389404.png) 11 | 12 | When you add a tool to the Thor Toolbar, you can select a caption for the tool or select an image to represent it. In the sample below, abbreviated captions are used. 13 | 14 | ![](Images/Thor_SNAGHTMLf3b4e2e.png) 15 | 16 | The toolbar’s size, positioning, and docking, persist from one session to the next. (Truth be told, persisting the docking has been problematic.) 17 | 18 | --- 19 | 20 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 21 | 22 | -------------------------------------------------------------------------------- /NewsItems/Item_10.md: -------------------------------------------------------------------------------- 1 | New VFPX Project: FoxcodePlus 2 | --- 3 | 4 | #### #10, 2012-10-14 5 | 6 | 7 | The new VFPX project [FoxcodePlus (Beta 1)](https://github.com/VFPX/FoxcodePlus) is available from Check For Updates. 8 | 9 | This project is ***not*** related to IntellisenseX, another VFPX project, although both provide Intellisense enhancements. FoxCodePlus provides a wider range of features and includes some of the features provided by IntellisenseX. Although not yet tested, it appears that the two may be used concurrently. 10 | 11 | After downloading (which includes both the code and documentation), you can use the Thor menu pad in the system menu to open the folder in which these components are installed: 12 | 13 | ![](Images/Tweet10_foxcodeplus.png) 14 | --- 15 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 16 | 17 | -------------------------------------------------------------------------------- /NewsItems/Item_17.md: -------------------------------------------------------------------------------- 1 | 2 | New VFPX Project: Finder 3 | --- 4 | 5 | #### #17, 2013-06-23 6 | 7 | 8 | The new VFPX project *Finder* is a powerful search tool to find forms and classes. It searches either a project or folder (with sub-folders) for names of files or classes. 9 | 10 | Files or classes can be opened by double-clicking and there are numerous other options available from the context menu for rows in the grid. 11 | 12 | When Class Search is used, the classes found can be dragged/dropped onto forms or classes being edited. 13 | 14 | See the [Finder Home Page](https://github.com/VFPX/Finder) and watch the [Finder introductory video](https://www.youtube.com/watch?v=uL4a9gsCLlk) (11:25). 15 | 16 | ![](Images/Thor_News_SNAGHTML3cdc777.png) 17 | 18 | --- 19 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 20 | 21 | 22 | -------------------------------------------------------------------------------- /NewsItems/Item_41.md: -------------------------------------------------------------------------------- 1 | New VFPX Projects - ThemedTitleBar and VFP 9 SP2 Hotfix 3 Download] 2 | --- 3 | 4 | #### #41, 2015-01-12 5 | 6 | 7 | Two new projects have been added to VFPX and are available from Check For Updates. 8 | 9 | * [ThemedTitleBar](https://github.com/VFPX/ThemedTitleBar) -- The TitleBar of a VFP form displayed ‘In Screen’ or ‘In Top-Level Form’ looks a bit outdated nowadays, at least running in Win8 and compared to Office 2013 or Visual Studio 2013. The goal of this project is to provide a modern drop-in replacement for the default TitleBar, requiring no code changes to existing forms. 10 | * [VFP 9 SP2 Hotfix 3 Download](https://github.com/VFPX/VFP9SP2Hotfix3) is the most recent hotfix for VFP 9 SP2. The hotfix includes all three hotfixes released for VFP 9 SP2 11 | 12 | --- 13 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 14 | 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ThorNews 2 | 3 | Version 1 Released 2023-04-06 4 | 5 | 6 | ## Introduction 7 | 8 | This simple project contains all of the Thor News items. There are three files of interest: 9 | 1. The most recent news item (named 'Item_NNN.md'), where NNN is assign sequentially. 10 | 2. The text file containing the number of the most recent new item ('CurrentItemNumber.txt') 11 | 3. The list of all news items, with links to them ('Archives.md') 12 | 13 | News Items are accessed two different ways: 14 | 1. Each time Check For Updates ("CFU") is run, it checks for to see if there is a new item; if so, it opens it. 15 | 2. From the Thor menu in the system menu: 16 | 17 | ![](NewsItems/Images/ThorMenuItem.png) 18 | 19 | 20 | 21 | --- 22 | ### **[News Archives ](NewsItems/Archives.md)** 23 | 24 | ### **[Thor Videos ](NewsItems/Thor_videos.md)** 25 | 26 | ### **[VFPX Home Page ](http://vfpx.org)** 27 | 28 | --- 29 | 30 | ## Helping with this project 31 | See [How to contribute to ThorNews](.github/CONTRIBUTING.md) for details on how to help with this project. 32 | 33 | Last changed: _2023-04-07_ 34 | 35 | ![Picture](./NewsItems/Images/vfpxpoweredby_alternative.gif) 36 | -------------------------------------------------------------------------------- /NewsItems/Item_08.md: -------------------------------------------------------------------------------- 1 | New VFPX project: IntellisenseX 2 | --- 3 | 4 | #### #8, 2012-09-30 5 | 6 | IntellisenseX has been released as a VFPX project. 7 | 8 | *IntellisenseX* refers to a suite of Thor Tools that provide functionality similar to native Intellisense. These tools display lists of available variable names, field names, or members (properties, events, methods, and objects) while you type code, just like Intellisense. However, they cover those areas that Intellisense forgot (such as the list of field names in a table when editing in a code window) and provide8ew capabilities, available through customization, such as displaying the list of field names in an SQL table. 9 | 10 | Visit the [IntellisenseX home page](https://github.com/VFPX/IntelliSenseX) and also watch the [Intellisense training videos](https://github.com/VFPX/IntelliSenseX#videos). 11 | 12 | IntellisenseX is available from Check For Updates. 13 | 14 | All VFPX projects can be downloaded from Thor. 15 | 16 | --- 17 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 18 | 19 | -------------------------------------------------------------------------------- /NewsItems/Tweet_02.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #2: Set Object Size and Position 2 | === 3 | 4 | This week's Thor TWEeT is **Set Object Size and Position.** 5 | 6 | This tool provides enhanced capabilities to the Format menu pad in the FoxPro system menu, shown here: 7 | 8 | ![](Images/Tweet2a.png) 9 | 10 | **Set Object Size and Position** displays a form that includes all of the features from the Format menu, except for Snap to Grid and Set Grid Scale. In addition, 11 | 12 | * there are controls to change the top/left/height/width of the currently selected control(s), either one pixel at a time or by a specified step size. 13 | * vertical and horizontal spacing may be changed either one pixel at a time or by a specified step size. 14 | * there's an un-do button to reverse any changes made since the form received focus. 15 | 16 | The form's size and position is persistent from one use to another. The form is also dockable, and the six containers re-arrange themselves as the width of the form changes, allowing for various desirable docking combinations.  17 | 18 | ![](Images/Tweet2b.png) 19 | 20 | Thanks to Cathy Knight for the concept and design. 21 | 22 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 23 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to contribute to ThorNews 2 | 3 | ## Bug report? 4 | - Please check [issues](https://github.com/VFPX/ThorNews/issues) if the bug is reported 5 | - If you're unable to find an open issue addressing the problem, open a new one. Be sure to include a title and clear description, as much relevant information as possible, and a code sample or an executable test case demonstrating the expected behavior that is not occurring. 6 | 7 | ## New version 8 | Here are the steps to updating to a new version: 9 | 10 | 1. Create a fork at github 11 | - See this [guide](https://www.dataschool.io/how-to-contribute-on-github/) for setting up and using a fork 12 | 2. Make whatever changes are necessary. 13 | --- 14 | 15 | 3. Increment the new version number in _NewsItems\CurrentItemNumber.txt_. 16 | 1. Create the new item as _NewsItems\Item_NN.txt_, keeping the very top and the very bottom of the new item consistent with previous items; we suggest copying the latest item and then editing the main part of it that applies to the new item. 17 | 1. In _NewsItems\Archives.md_, add in a link to the new item at the very top, again being consistent with the layout of earlier items. 18 | --- 19 | 6. Commit 20 | 1. Push to your fork 21 | 1. Create a pull request 22 | 23 | 24 | ---- 25 | Last changed: _2023/04/02_ ![Picture](vfpxpoweredby_alternative.gif) 26 | -------------------------------------------------------------------------------- /NewsItems/Item_46.md: -------------------------------------------------------------------------------- 1 | **Two New Thor Tools: "Execute Selected Text" and "Highlight Current Statement"** 2 | --- 3 | 4 | ### #46, 2023-01-20 5 | 6 | #### Tool "Execute Selected Text" #### 7 | 8 | This tool is an extension of the familiar option in the context menu when editing code: 9 | 10 | ![](Images/Item_46_ExecuteSelection.png) 11 | 12 | The tool provides three new features: 13 | 14 | 1. If NO text is selected, the entire (possibly multiple line) statement is highlighted and executed. The cursor can be anywhere in any line of the statement. In other words, click somewhere in the statement and run the tool to execute the statement. 15 | 16 | 1. All defined constants will work (instead of failing as they do when using the context menu). That means all defined constants from #Define or #Include directives as well as the include files from VCXs and SCXs. Note, for example, the use of CR in the image above. 17 | 18 | 1. A plug-in is provided for you to handle the selected text; you might save it in the clipboard or some history file. 19 | 20 | In addition, since this is a Thor tool, a hot key can be assigned to it, replacing the slightly more cumbersome use of the context menu. 21 | 22 | #### Tool "Highlight Current Statement" #### 23 | 24 | This tool is used to highlight an entire (possibly multiple line) statement. The cursor can be anywhere in any line of the statement. Just as described above, click somewhere in the statement and run the tool to highlight the statement. 25 | 26 | --- 27 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 28 | -------------------------------------------------------------------------------- /NewsItems/Item_51.md: -------------------------------------------------------------------------------- 1 | 2 | # Thor News 3 | 4 | **Bug Reports and Suggestions** 5 | --- 6 | 7 | ### #51, 2023-08-19 8 | 9 | ### Reporting bugs, making suggestions or other comments 10 | 11 | Your thoughts, comments, suggestions, and bug reports are all welcomed; we want to hear what could be done to improve these tools as well as what is not working correctly. 12 | 13 | The standard way to do this is on the issue page in GitHub for the tool in question. (If it’s unclear to you which GitHub page to go to, your best bet is to use the page for Thor Repository.) 14 | 15 | #### When reporting a bug, please provide as much information as possible. 16 | Please imagine what you, as a developer, would like to receive when notified of an error. If possible, please provide screenshot(s) of the following: 17 | * The error message itself 18 | * Windows from the debugger: 19 | * Trace 20 | * Code Stack 21 | * Locals 22 | 23 | #### Not familiar with GitHub? 24 | If GitHub is not familiar territory, follow these steps: 25 | 26 | 1. From the Thor menu pad, execute “Project Home Pages” 27 | 28 | ![](Images/Item_51_ThorMenuPad.png) 29 | 30 | 2. From the form that shows the home pages for all VFPX projects, click on the home page of the project for your comment (or Thor Repository, if unsure). 31 | 32 | ![](Images/Item_51_ThorHomePages.png) 33 | 34 | 3. Click on the Issues button on the home page: 35 | 36 | Figure 7. Click on the Issues button. 37 | 38 | ![](Images/Item_51_Issues.png) 39 | --- 40 | 41 | ### **[News Archives ](Archives.md)** 42 | 43 | ### **[Thor Videos ](Thor_videos.md)** 44 | 45 | ### **[VFPX Home Page ](http://vfpx.org)** 46 | 47 | --- 48 | 49 | ![Picture](Images/vfpxpoweredby_alternative.gif) 50 | -------------------------------------------------------------------------------- /NewsItems/Tweet_05.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #5: _Object and Collection Inspector_ 2 | === 3 | 4 | When working with Objects and Collections, it doesn't take long to realize that there's no easy way to view the structure or properties of an Object or browse the contents of a Collection. 5 | 6 | The Watch window in the Debugger is a fair way to view an Object, of course, but there is simply nothing for viewing Collections. 7 | 8 | To fill this void, Tamar created the **Object and Collection Inspector** (which you may already have seen described elsewhere). 9 | 10 | Now the **Object and Collection Inspector** is a Thor tool, with considerable enhancement. As show below, it displays a TreeView showing all the children for an object, or the items in a collection, with the values for all the properties shown on the right.  Double-clicking a property opens a zoom box for editing its values. 11 | 12 | ![](Images/Tweet5a.png) 13 | 14 | Run this tool as follows: 15 | 16 | * In a code window or the command window, click on the name of an object or collection and then call the tool. 17 | * Or, place the mouse over an object in an executing form, or a form or class being edited in the IDE, and call the tool. 18 | * Or, if a form or class is being edited, call the tool to inspect the currently selected object (that is, the one shown in the Property Sheet). 19 | * Otherwise, call the tool to paste text into the command window so that you can supply the name of the object or collection 20 | 21 | **NOTE**: Unfortunately, because of the way this tool is invoked, it doesn't work from the Thor Tool Bar. 22 | 23 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 24 | -------------------------------------------------------------------------------- /NewsItems/Tweet_08.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #8: Creating Properties and Methods (Part 3) 2 | === 3 | 4 | This is the third and last in a series of TWEeTs showcasing the various ways that you can create properties and methods. 5 | 6 | There is one more Thor tool that creates methods: **Extract to Method**. 7 | 8 | Use this tool when you have a block of method code (from a VCX or SCX) that you want to remove from the current code window and save into a new method. 9 | 10 | The steps to do so are simple: 11 | 12 | * Highlight the lines of code you want to extract and move 13 | * Invoke tool **Extract to Method**. 14 | 15 | This pops up a form where you can enter the name of the method to be created: 16 | 17 | ![](Images/Tweet8a.png) 18 | 19 | When you click “Apply”, the following steps are performed: 20 | 21 | 1. The new method is created. 22 | 2. The code window for the new method is opened 23 | 3. The code you had highlighted in the original method is pasted into the new code window. 24 | 4. The highlighted code is removed from the original code window. 25 | 5. A reference to the new method is pasted into the original code window. 26 | 27 | Note as well the comments in the form that comes up: 28 | 29 | * You can specify a result for your created method; the last line of the method returns that result and that result is also assigned in the original code window. 30 | * You can specify parameters to your created method;  an LParameters statement is inserted at the beginning of the new code window and the parameters are used in the call in the original code window. 31 | 32 | **Extract to Method** works in code windows from VCXs and SCXs, but not PRGs. 33 | 34 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). -------------------------------------------------------------------------------- /NewsItems/Item_43.md: -------------------------------------------------------------------------------- 1 | **[Object Explorer](https://github.com/VFPX/ObjectExplorer) Enhancements** 2 | --- 3 | 4 | ### #43, 2022-12-26 5 | 6 | [Object Explorer](https://github.com/VFPX/ObjectExplorer), one of the most recent projects added to VFPX, is a tool that allows you to explore objects, collections, and array properties in both production and in your IDE. You can invoke Object Explorer at any time by hovering over any object in a form and using a hot key, and Object Explorer will open for that object and the form it belongs to. 7 | 8 | The Object Explorer form presents a navigable treeview on the left and the members of the selected node in the grid on the right. 9 | 10 | ![](../Images/ObjectExplorerNews43.png) 11 | 12 | The recently added new features include: 13 | 14 | * Double-click on a row in the grid to edit the value of the property. 15 | * Double-click on an array property to fill the grid with all the array elements, which can then be edited. 16 | * Handling of Favorites: 17 | * Right-click on a row to bring up context menu where you can indicate whether that the property is a Favorite. 18 | * Checkboxes on the bottom indicate how Favorites are to be used. 19 | * In the IDE, right-click on a node in the TreeView to assign that node into a public variable. 20 | * You will be prompted for the name of the public variable. 21 | * The name will be remembered for re-use. 22 | * The public variable is released when Object Explorer closes. 23 | * Once a name has been assigned, each time that you open Object Explorer the public variable will be assigned with the value of the object being explored. 24 | 25 | Note the "Browse" button that appears on the bottom line if OE can determine the alias of a table from properties _RecordSource_ or _cAlias_. 26 | 27 | --- 28 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 29 | -------------------------------------------------------------------------------- /NewsItems/Tweet_09.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #9: Extract to Variable and Extract to Constant 2 | === 3 | 4 | In [last week's TWEeT](Tweet_08.md), I showed how you can highlight a block of text from a code window and save it into a new method. 5 | 6 | There are two other closely related tools: 7 | 8 | * **Extract to Variable** 9 | * **Extract to Constant** 10 | 11 | Use **Extract to Variable** to replace text in a line of code with a reference to a local variable, such as in this example where `laFileList[lnJ, 1]` is referenced a couple of times: 12 | 13 | ![](Images/Tweet9a.png) 14 | 15 | The form that pops up allows you to enter the name of the new variable, whether all occurrences of the string are to be replaced (if not, only the highlighted one will be), and whether tool ‘Create Locals’ should be run to add this new variable to your LOCAL statements. 16 | 17 | ![](Images/Tweet9b.png) 18 | 19 | The modified code looks like this: 20 | 21 | ![](Images/Tweet9c.png) 22 | 23 | **Extract to Constant** works in a similar fashion, except that it creates a #Define statement either at the top of the current code window or in any of the #Include files that apply to the code window: 24 | 25 | ![](Images/Tweet9d.png) 26 | 27 | I find that these three related tools, **Extract to Method / Variable / Constant**, to be of considerable value but I do not use any one of them often enough to assign hot keys to each of them.  Instead, I use a  [Popup Menu](../Thor_create_popup_menu.md), which I bring up by using a single hot key (I have chosen Ctrl+E, for “Extract”). 28 | 29 | ![](Images/Tweet9e.png) 30 | 31 | There is a Thor tool to create this popup menu and a number of others.  Just execute **Create Sample menus** once and a number of menus will be created; see the first page of the Thor Configuration screen. 32 | 33 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 34 | -------------------------------------------------------------------------------- /NewsItems/Tweet_01.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #1: 2 | === 3 | 4 | ### [PEM Editor](https://github.com/VFPX/PEMEditor), [GoFish](https://github.com/mattslay/GoFish), and Replace code window context menu items 5 | 6 | While at SW Fox, I realized that many of the tools from Thor aren't being used because there are simply so many of them. It seems that there might be wider usage if they were properly introduced, at a more relaxed pace. 7 | 8 | Thus, I will be describing one tool a week in something I will refer to as TWeeTs (**T**his **W**eek's **E**xc**e**ptional **T**ools). 9 | 10 | I will take the easy way out this week, noting two tools that (ahem) you should not do without:  [PEM Editor](https://github.com/VFPX/PEMEditor) and [GoFish](https://github.com/mattslay/GoFish). 11 | 12 | I think that not much needs to be said about these two since their acceptance has been almost universal. (Except this: if you're not using them, you are really missing out) 13 | 14 | There is a related Thor tool you should be aware of, a tool with a rather cumbersome name: **Replace code window context menu items**. 15 | 16 | This tool updates the _FoxRef system variable so that two options in the context menu in a code window use Thor tools instead: 17 | 18 |       Option "View Definition"       uses **Go To Definition** (I will describe this tool in another TWeeT) 19 | 20 |       Option "Look up Reference" uses **GoFish** 21 | 22 | This will not affect the use of Code References from the VFP Tools Menu. (To be honest, even though I am the Project Manager in VFPX for Code References, I have not used Code References in years, as I use [GoFish](https://github.com/mattslay/GoFish) instead.) 23 | 24 | **Replace code window context menu items** only needs to be executed once in each IDE session. The recommended way to do this is to check "Run at StartUp" on the Tool Definitions page. 25 | 26 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). -------------------------------------------------------------------------------- /NewsItems/Tweet_23.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #23: Buffer overrun detected! 2 | === 3 | 4 | There is a nasty error, “Buffer overrun”, that be-devils a small number of users of PEM Editor and IntellisenseX: 5 | 6 | ![](Images/Tweet23a.png) 7 | 8 | This error is a close cousin of the better known C5 error: it blows your FoxPro session away and all un-saved changes are lost. Unlike C5, though, there is no hint in the _vfp9err.log_ file. 9 | 10 | When this error was first reported back in 2009, the cause was unknown, although it was learned that the error only occurred for some specific classes (always occurring for these classes). Furthermore, it was determined that the error was reproducible outside of PEM Editor, like this: 11 | 12 | ![](Images/Tweet23b.png) 13 | 14 | A work-around was added to PEM Editor, wherein this call to AMembers was avoided for classes whose names were found in a table created for this use.  While cumbersome, this solution was better than nothing. 15 | 16 | Recently, I encountered this problem for the first time in my own code and was able to identify the root cause of the problem.  Curiously, it happens because of the innocuous code shown here: 17 | 18 | ![](Images/Tweet23c.png) 19 | 20 | After some testing (and getting blown out of FoxPro many times), I was able to learn that the problem has to do with the length of the LParameters statement.  The limit is 255 characters (not a surprise) but the character count includes all the white space, semi-colons, carriage returns and line feeds. When I modified that statement to fit all on one line, removing all the extra unneeded space, the error evaporated. 21 | 22 | I was contacted by Tore Bleken this past week about these Buffer Overun problems in classes based on classes of FoxInCloud.  He has reported that changing the LParameters statements in the parent classes cured the problem. 23 | 24 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 25 | -------------------------------------------------------------------------------- /NewsItems/Tweet_06.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #6: Creating Properties and Methods (Part 1) 2 | === 3 | 4 | Thor provides quite a range of tools to create new properties and methods.  5 | 6 | There are a couple of common tools that use familiar techniques for creating new properties and methods:  7 | 8 | * **[PEM Editor](https://github.com/VFPX/PEMEditor)** (about which no more will be said) 9 | * **Add Property/Method**, the diminutive offspring of **[PEM Editor](https://github.com/VFPX/PEMEditor)**, which uses this simple form: 10 | 11 | ![](Images/Tweet6a.png) 12 | 13 | Both of these tools offer features not available from the standard New Property and New Method: 14 | 15 | * The form is modeless and you can easily switch between adding properties and methods. 16 | * MemberData is automatically updated if the name contains any uppercase characters. 17 | * If you are creating a new property: 18 | * There is an option to set the initial value of the property based on the first character of the property name (‘c’ = Character, ‘n’ = Numeric, etc). Default = ON 19 | * You can create a [Plug-In](../Thor_add_plugins.md) to use some other method for assigning the initial values (such as using the second character) 20 | * If you are creating a new method: 21 | * You can open it immediately for editing. 22 | * You can create a [Plug-In](../Thor_add_plugins.md) that will populate the header of the newly created method. 23 | 24 | When you use either of these tools, you are following the long-established two-step pattern where the process of creating the new property/method is distinct from using a reference to it. 25 | 26 | In next week's TWEeT on this topic, I will demonstrate tools that establish a new pattern: you can create a property or method as you refer to it. Using these tools tends to provide less interruption to your programming flow, as you can create new properties and methods "on the fly". 27 | 28 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 29 | -------------------------------------------------------------------------------- /NewsItems/Tweet_04.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #4: Insert full name of object under mouse 2 | === 3 | 4 | This week's TWEeT is **Insert full name of object under mouse** (the longer the tool name, the narrower it's focus) 5 | 6 | This tool simplifies the task of inserting a reference to another object in the same form or class you are editing (VCXs / SCXs only). 7 | 8 | The directions are simple: 9 | 10 | 1. Place the cursor where you want the reference to be inserted in your code window. The focus must be on this method. 11 | 2. Move the mouse over the object you want to refer to. 12 | 3. Use the hot key you have assigned to **Insert full name of object under mouse.** 13 | 14 | Two important parts of this to keep in mind: 15 | 16 | 1. The focus must on the code window, not the form or class you are editing. 17 | 2. This tool ***only works by using a hot key***, since it reads what is under the mouse when you execute it. 18 | 19 | You may have problems with remembering so many hot keys (at least I do), particularly for tools like this that you might not be using with great regularity.  The way that I handle this is to add the tool to the [Thor Tool Bar](https://groups.google.com/forum/?fromgroups#!searchin/FoxProThor/toolbar/foxprothor/DvZMXuxIEwM/3NK3XnAFyqsJ). When I need it, the tooltip shows me the hot key. 20 | 21 | This tool also works at run time. Place the cursor into the Command Window (instead of a code window) and the tool will paste into it a reference to the object under the mouse in an executing form.   22 | 23 | There is a closely related tool named **Inspect properties of object under mouse** (written by Andy Kramek) that also works at run time. Run this tool the same way and it pops up a MessageBox that displays the major properties of the object under the mouse. 24 | 25 | Thor provides a neat tool for browsing the contents of objects and collections, **Object and Collection Inspector** -- more on that in next week's TWEeT. 26 | 27 | _Tool written by Bernard Bout_ 28 | 29 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 30 | -------------------------------------------------------------------------------- /NewsItems/Item_49.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | # Thor News 5 | 6 | **Got Comments, Suggestions, or Bug Reports?** 7 | --- 8 | 9 | ### #49, 2023-04-08 10 | 11 | Do you know where to go if you have questions, comments or bug reports for Thor or any of the projects available from Thor? 12 | 13 | > For many years we posted issues or comments on the Thor or GoFish Google Groups forums. However, those forums have been deprecated. The preferred location now is the Issue tabs in the GitHub repository for the project your issue relates to. 14 | 15 | Thor provides two different ways to get to the GitHub repository for a project, both available from the Thor menu: 16 | 17 | ![](Images/ThorMenu.png) 18 | 19 | 1. Item "VFPX Home Page" takes you to the VFPX home page ( http://vfpx.org ). The Projects page there is the most used page; it lists the projects alphabetically (providing a link to the home page for it) and has separate columns for a brief description, category, and status. This list also includes many VFPX projects that are not available from Thor's Check For Updates as well as some other VFP open-source projects that aren’t considered to be part of VFPX. 20 | 21 | 2. Item "Project Home Pages" opens up a form listing all projects that Thor can download along with their status; the project name is a link to the home page. 22 | 23 | To add or review issues for a project, click on "Issues" at the upper left of the project home page: 24 | 25 | ![](Images/GitHubProjectIssue.png) 26 | 27 | You're encouraged to watch activity for projects you're interested in. Click on "Watch" at the upper right of the home page. You'll receive notifications via email, enabling you to learn more from the comments of others. 28 | 29 | ![](Images/GitHubProjectWatch.png) 30 | 31 | You can also consider using the "Custom" option to filter which events you are interested in. 32 | 33 | ![](Images/GitHubCustomIssues.png) 34 | 35 | 36 | 37 | --- 38 | 39 | ### **[News Archives ](Archives.md)** 40 | 41 | ### **[Thor Videos ](Thor_videos.md)** 42 | 43 | ### **[VFPX Home Page ](http://vfpx.org)** 44 | 45 | --- 46 | 47 | ![Picture](Images/vfpxpoweredby_alternative.gif) 48 | -------------------------------------------------------------------------------- /NewsItems/Tweet_13.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #13: New (hidden) IntellisenseX Feature 2 | === 3 | 4 | In a previous TWEeT ([IntellisenseX: Field Names from SQL Server Tables](Tweet_10.md)), I demonstrated how you can make some features of IntellisenseX active if you create a SELECT statement in sort of an inside-out fashion – that is, if you create your FROM and JOIN phrases first before referencing any fields. There is another feature that becomes available when you do so (one that you are unlikely to discover without being told of its existence). 5 | 6 | Consider this simple example: 7 | 8 | ![](Images/Tweet13a.png) 9 | 10 | Once you have already specified the table you are selecting from, IntellisenseX provides a simple way to select from the fields in that table – just invoke IntellisenseX as you always do, by pressing the dot (or [hot key](Tweet_12.md)). 11 | 12 | ![](Images/Tweet13b.png) 13 | 14 | When you have specified any JOINs, the dropdown list shows all fields from all tables, as shown below (where the list has been scrolled so you can see some fields from each table). 15 | 16 | ![](Images/Tweet13c.png) 17 | 18 | _Note the ‘;’ that was necessary on the first line – IntellisenseX looks backward through your code to determine the entire statement you are working on, recognizing line continuations. Without that ‘;’ after SELECT, IntellisenseX would not recognize this as part of a SELECT statement at all._ 19 | 20 | If you use the “Match anywhere” option (see “IntellisenseX” on the Options page in the Thor Configuration screen), the list will filter as you begin typing a field name: 21 | 22 | ![](Images/Tweet13d.png) 23 | 24 | This new IntellisenseX feature 25 | 26 | * works for both VFP tables (as shown) and SQL Server Tables. (See  [IntellisenseX: Field Names from SQL Server Tables](Tweet_10.md)) 27 | * works for references to field names anywhere in SELECT statements, as long as the tables have been referenced in the FROM and JOIN phrases. 28 | * works for table-aliases 29 | 30 | ![](Images/Tweet13e.png) 31 | 32 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 33 | -------------------------------------------------------------------------------- /NewsItems/Tweet_26.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #26: Three New Thor Tools 2 | === 3 | 4 | Three new tools have been added recently to the Thor Repository. 5 | 6 | * _[Split a Procedure File](#T1)_ 7 | * _[Find Buffer Overrun Threats](#T2)_ 8 | * _[Compress Parameters List](#T3)_ 9 | 10 | ### Split a Procedure File 11 | 12 | The tool _Split a Procedure File_ splits out all procedures and functions from a PRG file into separate PRG files.  13 | 14 | It first prompts for the name of the procedure file and then for the folder in which the new PRGs are to be created. 15 | 16 | Note that this creates new PRGs for procedures and functions, but does nothing for classes. 17 | 18 | Thanks to Tamar Granor for this contribution. 19 | 20 | ### Find Buffer Overrun Threats 21 | 22 | As described in [TWEeT #23: Buffer Overruns](Tweet_23.md), you may encounter buffer overrun errors when using PEM Editor or IntellisensesX on some forms and classes.  This unusual error, which blows away your session like a C5 error, is caused by long Parameter or LParameter statements. 23 | 24 | The tool _Find Buffer Overrun Threats_ searches a project or folder with sub-folders for statements which might cause buffer overrun errors. Note the use of the word “might”; it is difficult to pin down the exact case where these errors occur, as the rules are different in PRGs than in VCXs and are affected by internal comments. 25 | 26 | The result from running this tool is a cursor, shown using _Super Browse_. 27 | 28 | ![](Images/Tweet26a.png) 29 | 30 | To test whether any of the threats identified in the cursor will actually generate a buffer overrun, run the following: 31 | 32 | ```foxpro 33 | oObject = Newobject(‘yourclass’, ‘yourclasslib’, 0) 34 | 35 | ?Amembers(laArray, oObject, 3) 36 | ``` 37 | 38 | ### Compress Parameters List 39 | 40 | Use tool _Compress Parameters List_ to fix any long Parameters lists that are causing buffer overrun errors. 41 | 42 | Navigate to the problem code, highlight the entire parameters statement, and run this tool.  It will remove all un-necessary characters from the statement (including spaces, tabs, CRs, LFs, semi-colons, and end-of-line comments.) 43 | 44 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#%21forum/FoxProThor). -------------------------------------------------------------------------------- /NewsItems/Item_48.md: -------------------------------------------------------------------------------- 1 | **Go To Definition Enhancements** 2 | --- 3 | 4 | ### #48, 2023-02-05 5 | 6 | This new VFPX project is a completely refactored version of the original Go To Definition (GTD). The code was created before we had Thor, so it was embedded into the older PEMEditor App. This, along with the fact that GTD evolved incrementally over a long period of time, made it a prime candidate for refactoring. GTD is now a standalone tool, simplifying the tasks of updating or documenting. All of the original features of GTD should work as they have always had, with the following enhancements: 7 | 8 | * [IntellisenseX (ISX)](https://github.com/VFPX/IntelliSenseX) provides dropdown lists for PEMs (properties, events, and methods) for objects referenced in code. GTD now uses ISX in two new ways: 9 | * If ISX can provide a dropdown list of PEMs for an object, then using GTD will open the definition of that object. 10 | * In addition, GTD will open an object's definition and associated method code if you use GTD on a method from the object. 11 | 12 | > This is especially useful for objects described in the "Hidden gems" section in [Thor News Item 47](Item_47.md) 13 | 14 | * GTD now creates bookmarks each time it is used, one placed where GTD was invoked and one at its destination (if in a code window). Two Thor tools work with these bookmarks 15 | * **Cycle Bookmarks** takes you through all your current bookmarks. 16 | * **Add/Remove BookMark** will add a bookmark at the current location if there isn't one there or remove the current bookmark if there is. 17 | 18 | > Bookmarks are defined by the window (not its contents) and the cursor position in that window. They are automatically removed when the window is closed. Also, they may be out of sync if the code in the window above the bookmark cursor position has been modified. 19 | 20 | * If you use GTD on the name of an object that actually exists (other than in the SCX or VCX you are editing), GTD will open **Object Explorer**. An example (although not a very useful one), would be to use GTD on _Screen. 21 | * GTD would seemingly have nothing to do if the active window is not a code window (the form or class you are edititing, the Property Window, Class Browser, PEM Editor, etc) or if the cursor is in white space in a code window. In these cases, the "Add new PEM" window is opened. 22 | 23 | -------------------------------------------------------------------------------- /NewsItems/Item_42.md: -------------------------------------------------------------------------------- 1 | **New Thor Tools and [SuperBrowse](..\Thor_superbrowse.md) Enhancements** 2 | --- 3 | 4 | ### #42, 2015-11-30 5 | 6 | A number of new Thor tools are available in the Thor Repository. 7 | 8 | * 'Toggle tabs in pageframe' – It can be quite difficult (OK, cumbersome) to navigate between pages of a pageframe when the tabs are not visible.  Use this tools to toggle the tabs in the current pageframe. 9 | * 'Compare text in two windows' – Use your favorite compare tool to compare the code from two different code windows without exiting FoxPro, as follows: 10 | * Select one text window 11 | * Execute this tool (hot key is recommended) 12 | * Select a second text window 13 | * Execute this tool again 14 |     -- and the contents of the two windows will be compared 15 | 16 | > **Required:**  Thor cannot guess your favorite compare tool, so you must modify the Plug-In so that Thor can call it. The default code for the Plug-in calls Beyond Compare (_personal note: highly recommended!)_ and must be modified to fit your environment. 17 | 18 | * Three new tools for [VFP2Text](http://pfsolutions-mi.com/Product/VFP2Text), a add-on from Frank Perez, Jr. for Beyond Compare, that allow direct comparison of VCXs and SCXs 19 | * 'Download VFP2Text for Beyond Compare V3' 20 | * 'Download VFP2Text for Beyond Compare V4' 21 | * 'VFP2Text Home Page' 22 | 23 | There have been some enhancements to **[SuperBrowse](..\Thor_superbrowse.md)** as well: 24 | 25 | * As it can be quite cumbersome switching between Expression and Value in the filter box, you can now overwrite the current setting as follows: 26 | * To select Value, use a trailing ‘$’ 27 | * To select Expression, use a leading ‘=’ 28 | * "Value" filters on all selected fields or, if none, all character fields. 29 | * Double-clicking a row (to edit using Dynamic Forms) brings up a read-only form if the table is read-only. 30 | * A new setting allows leading characters from memo fields to be displayed instead of "Memo". 31 | * Double-clicking a memo fields brings up that field alone for editing. 32 | * There are a number of new plug-ins: 33 | * Format field picker -- create alternative formats to those provided on the first page ("Picker") to conform to your own preferences 34 | * Bind column events -- bind events in the grid columns to this class 35 | * Grid context menu -- create context menus for the cells in the grid 36 | 37 | 38 | --- 39 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 40 | -------------------------------------------------------------------------------- /NewsItems/Tweet_17.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #17: Using Local Aliases in IntellisenseX 2 | === 3 | 4 | In an earlier TWEeT about [Aliases for VFP Tables](Tweet_15.md), there was a brief and dismissive discussion about Local Aliases.  However, they provide some worthwhile features that are worth discussing. 5 | 6 | Local Aliases are like LOCAL statements (`"Local name as class of classlib”`) in two ways: 7 | 8 | * they provide an annotation to your code so that IntellisenseX can provide a drop-down list. 9 | * they apply only to the current method or procedure. 10 | 11 | There are three equivalent ways to define Local Aliases: 12 | 13 | * `**{{** SomeAlias = What-It-Stand-For **}}**`                  … in any comment 14 | * `***#Alias** SomeAlias = What-It-Stand-For`    … at the beginning of a line 15 | * `**&&#Alias** SomeAlias = What-It-Stand-For`         … at the end of a line 16 | 17 | > _(The bold text above must be entered exactly as is, with no intervening spaces.)_ 18 | 19 | > **Note: Bowing to popular demand, the first of the statements above (the one with the double curly braces) applies to the *entire* PRG, not merely the Procedure or Function in which it lives.** 20 | 21 | `“What-It-Stands-For”` can be any one of a number of things, referring to either tables or objects. 22 | 23 | * A table, cursor, or view name 24 | * The full or relative path name to a table 25 | * The name of an SQL table 26 | * A reference to class from a class library; thus,  `"{{ loObject == {class, classlibrary} }}` “ 27 | * A reference to an object; thus,  “`{{ loObject == Thisform.oParts}}` “ 28 | * An executable expression that returns an object or the name of an table, cursor, or view. This executable must start with an “=”; thus, something like “`{{ loObject = = MyGetObject(‘Parts’)}}` “.  (Note the double ‘=’ signs.) 29 | 30 | One handy use of this occurs with variables created using the SCATTER NAME command.  31 | 32 | ```foxpro 33 | Select MyTable 34 | 35 | Scatter Name loObject && {{ loObject = MyTable }} 36 | ``` 37 | 38 | This provides the dropdown list for the table MyTable when the properties of loObject are referenced. 39 | 40 | Note also that `“SomeAlias”` can also refer to compound names, such as `This.oMainObj` or `This.oMainObj.oData`; the substitution rules work the same way. 41 | 42 | This TWEeT has addressed Local Aliases; the earlier TWEeT on [the Alias Dictionary](Tweet_15.md) addressed global aliases; and an upcoming TWEet will address Aliases that apply to an entire form or class (both VCX and PRG-based). 43 | 44 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). -------------------------------------------------------------------------------- /NewsItems/Item_52.md: -------------------------------------------------------------------------------- 1 | 2 | # Thor News 3 | 4 | **Quick Access Menu** 5 | --- 6 | 7 | ### #52, 2023-09-02 8 | 9 | The Quick Access Menu is a personal list of favorite tools, developed over time, in the dev shop where Jim Nelson and Steve Howie work. 10 | 11 | It is installed by Thor tool "Install Quick Access Menu" and provides easy access to a host of the most used Thor tools, all accessible from one place. The tools are grouped into convenient categories that make them easy to find and make it easy to find related tools. 12 | 13 | The Quick Access Menu is accessed from either the system menu pad (as shown below) or from a user-assigned hot key. 14 | 15 | ![](Images/QuickAccessSample.png) 16 | 17 | ### Installing the “Quick Access Menu” 18 | 19 | To install the Quick Access menu, run the Thor Launcher: 20 | 21 | ![](Images/QuickAccessLauncher.png) 22 | 23 | Enter "Install Quick" in the filter box, and then double-click on "Install Quick Access Menu" 24 | 25 | ![](Images/QuickAccessInstall.png) 26 | 27 | Doing so will: 28 | * Create a backup of all Thor tables involved in case there is need to restore to the previous state. If this is needed, see the following section. 29 | * Create the "Quick Access" menu pad in the system menu. 30 | * Assign a hot key so that the same menu can be accessed as a pop-up, if desired. 31 | * Assign hot keys to the most common tools. This will NOT change any existing hot key assignments - tools already having hot keys will not be changed and no hot key in use will be re-assigned. 32 | 33 | Installing this is a one-time event. There will not be any updates to it, so the Quick Access menu can re-configured as desired by using the Thor Configuration Form (Alt+F12). Using it will enable you to: 34 | * Change the name of the system menu pad (or remove it). 35 | * Change the hot key used to access it. 36 | * Add, rename, or remove sub-menus. 37 | * Add, rename, or remove tools used in sub-menus. 38 | * Add, change, or remove hot keys assigned to sub-menus and tools. 39 | 40 | ### Un-installing the "Quick Access Menu" 41 | 42 | When "Quick Access Menu" is installed, a new sub-folder is created in Thor's Tables folder with copies of all the files in that folder. 43 | 44 | To un-install, copy all the files from that sub-folder back into the Tables folder. 45 | 46 | *Be aware that this will reverse all changes made in Thor since the backup was created, including menus, hot keys, and other Thor settings. In other words, it best to make this determination without any other intervening work in Thor.* 47 | 48 | The Tables folder can be opened here: 49 | 50 | ![](Images/QuickAccessGoToTablesFolder.png) 51 | 52 | --- 53 | 54 | ### **[News Archives ](Archives.md)** 55 | 56 | ### **[Thor Videos ](Thor_videos.md)** 57 | 58 | ### **[VFPX Home Page ](http://vfpx.org)** 59 | 60 | --- 61 | 62 | ![Picture](Images/vfpxpoweredby_alternative.gif) 63 | -------------------------------------------------------------------------------- /NewsItems/Tweet_07.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #7: Creating Properties and Methods (Part 2) 2 | === 3 | 4 | [Last week's TWEeT](Tweet_06.md) discussed the familiar way of creating properties and methods, a two-step process where their creation and reference are done independently. 5 | 6 | There’s a different pattern available where you can create properties and methods at the same time that you refer to them. 7 | 8 | To do so, create a reference in a code window to the to-be-created property or method (leaving the cursor immediately after the name) 9 | 10 | ![](Images/Tweet7a.png) 11 | 12 | and then call tool **Go To Definition**. This opens the form for adding new properties and methods: 13 | 14 | ![](Images/Tweet7b.png) 15 | 16 | When creating methods, you can also choose to create the LParameters list at the same time: 17 | 18 | ![](Images/Tweet7c.png) 19 | 20 | Note that there is no requirement that you call **Go To Definition** immediately.  You can come back at any time after writing the code to create the property or method.  Just click anywhere in the name (although if you want to create the LParameters list, you need to click after the right parenthesis) and then call **Go To Definition.** 21 | 22 | A couple of comments on this: 23 | 24 | * I highly recommend trying this technique.  It is highly addictive. This is my tool of choice for creating properties and methods. For all the time I have spent in creating [PEM Editor](https://github.com/VFPX/PEMEditor), I *rarely* use it to create properties and methods. 25 | * This is only one of great features from **Go To Definition**.  There will be more on it another day, in its own TWEeT. 26 | 27 | Form properties can also be referenced by other properties, such as ControlSource and RecordSource. If you use [PEM Editor](https://github.com/VFPX/PEMEditor) to edit the ControlSource or RecordSource properties, you will automatically be given the opportunity to create a new property when you click Save. 28 | 29 | For all of these uses, the following features (not available from standard New Property and New Method) are available: 30 | 31 | * MemberData is automatically updated if the name contains any uppercase characters. 32 | * If you are creating a new property: 33 | * There is an option to set the initial value of the property based on the first character of the property name (‘c’ = Character, ‘n’ = Numeric, etc). Default = ON 34 | * You can create a [Plug-In](../Thor_add_plugins.md) to use some other method for assigning the initial values (such as using the second character) 35 | * If you are creating a new method: 36 | * You can open it immediately for editing. 37 | * You can create a [Plug-In](../Thor_add_plugins.md) that will populate the header of the newly created method.  38 | 39 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 40 | -------------------------------------------------------------------------------- /NewsItems/Tweet_12.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #12: IntellisenseX by Dot or by Hot Key? 2 | === 3 | 4 | There are two different ways that you can invoke [IntellisenseX](https://github.com/VFPX/IntelliSenseX): 5 | 6 | * Tool **IntellisenseX by Dot** is a toggle that turns on/turns off the use of IntellisenseX. When turned on, IntellisenseX is invoked every time you press the dot (the period). 7 | * Tool **IntellisenseX by HotKey** causes IntellisenseX to be invoked only when you press the hot key you have assigned to it. You press the hot key when you want IntellisenseX (and it supplies the dot for you) 8 | 9 | Watch this video:  [“IntellisenseX by Dot” vs “IntellisenseX by Hot Key”](http://www.youtube.com/watch?v=71psd6RH2Ls&hd=1&rel=0) (3:29) 10 | 11 | **IntellisenseX by Dot** is the “natural” way to invoke IntellisenseX, as it mimics the way native Intellisense works. There are some minor issues with it, however, including the following: 12 | 13 | * The selection box may be slow in coming up, particularly when listing properties and methods for an object. (This may be addressed to some degree with the release of an upcoming suite of tools “Custom Keyword List”.) 14 | * It may stumble over itself a little when you enter any of .T., .F., or .NULL. This can be avoided by typing slower, but nobody wants to do that. 15 | * It uses a timer that fires every second, which can cause annoying behavior in the debugger. The timer is absolutely essential since **IntellisenseX by Dot** must be disabled when the focus is not on a code window 16 | 17 | All of these issues can be overcome by using **IntellisenseX by HotKey** instead, each time you want to invoke IntellisenseX.  However, besides learning to use a different key than dot to invoke Intellisense, there is another drawback as well – as you will see in upcoming TWEeTs, there are features available from IntellisenseX not provided by native Intellisense. These will come as a pleasant surprise if using **IntellisenseX by Dot** (the selection box will simply appear when you press the dot). The solution is to use **Intellisense by HotKey** when you’d like it if IntellisenseX were available (even if you know native Intellisense will do nothing). 18 | 19 | #### Other features from IntellisenseX by Hot Key 20 | 21 | There are two features that are only available from **IntellisenseX by HotKey:** 22 | 23 | * If you enter the name of a DBC following by a ‘!’ and then use **IntellisenseX by HotKey**, the selection box lists all tables and views in that DBC.  (If the database is already open, you need not enter the DBC name). This list, curiously, also include files from the Data Environment of a form being edited. 24 | * If you enter a ‘*’ followed by **IntellisenseX by HotKey**, the selection box lists all tables in the current folder and the path. 25 | 26 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 27 | -------------------------------------------------------------------------------- /NewsItems/Tweet_16.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #16: Custom Keyword List for Field Names 2 | === 3 | 4 | The new feature of Custom Keyword List for field names has been shown in a number of images in earlier TWEeTs (including the one below, from [IntellisenseX: Aliases for VFP Tables](Tweet_11.md)), without ever being described. 5 | 6 | ![](Images/Tweet16a.png) 7 | 8 | Did you notice that some of the field names use upper case(“Field_Type”, e.g.,) in the middle? The Custom Keyword List allows you to define the case that is to be used for field names. 9 | 10 | #### How is this done? 11 | 12 | Thor maintains a table of **global** definitions of field names (and for other names, but that is addressed in another TWEeT, [Custom Keyword List - all other names](Tweet_19.md)).  The table has a single field, containing the field names as you want them to be represented.  You can open the table for editing by using Thor tool **Browse Custom Keyword List**, although that’s not a very convenient way to go about building the table. 13 | 14 | Instead, there are a number of Thor tools you can use: 15 | 16 | * **Add highlighted word** – adds the currently highlighted word to the KCL.  If the word is already in the list, the highlighted word replaces it. 17 | * **Add field names from current table** – opens separate forms for words that are new to the list or might replace existing words on the list. You can edit the values in the “New Value” column (but you can’t change the spelling, only which letters are upper case). 18 | 19 | ![](Images/Tweet16b.png) 20 | 21 | * [**SuperBrowse**](../Thor_superbrowse.md) – if you mark the checkbox under the list of field names, that list becomes editable, allowing you to change which letters are to be upper case. Simply click on any field name and edit it so that it appears as you would like it to.  Any field name that you change is posted immediately to the Custom Keyword List and will be used any time this field name is referenced for *any* table, not just the current one. (No, you *can't* modify the structure of the file this way -- all you can change is which characters are upper case.) 22 | 23 | ![](Images/Tweet16c.png) 24 | 25 | * **Add all words from folder or project** – This is the big papa of them all, as it adds all names (not only field names) from all your code to the KCL. Once processing is complete (which may take a few minutes), it brings up the same two forms as shown above under **Add field names from current table.** (Just with a lot more entries).  This is described in more detail in [Custom Keyword List - all other names](Tweet_19.md). 26 | 27 | #### Where are these field names in the Custom Keyword List used? 28 | 29 | These field names from the Custom Keyword List are used every place in IntellisenseX where tables are referenced (and for both VFP Tables and SQL Server Tables) and as show in SuperBrowse, above. 30 | 31 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 32 | -------------------------------------------------------------------------------- /NewsItems/Item_50.md: -------------------------------------------------------------------------------- 1 | 2 | # Thor News 3 | 4 | **More Go To Definition Enhancements** 5 | --- 6 | 7 | ### #50, 2023-04-15 8 | 9 | #### Searching for variable assignments 10 | 11 | **GTD**, when used on a variable name, will find the statement where the variable was last assigned (or index assigned), as long as it's in the same procedure. Repeated uses of **GTD** when used on the same variable name will take you through all places where the variable is assigned. This is much like using Ctrl-F, searching backwards for 'whole word', but ignoring statements that reference but do not assign the variable. 12 | 13 | #### Searching for cursor creation 14 | 15 | **GTD**, when used on a cursor name, will locate the `Into Cursor` or `Create Cursor` statement where the cursor was created, as long as it's in the same procedure. 16 | 17 | #### Resolving Name Conflicts 18 | 19 | In some cases, a name being searched for may not be unique. You might, for instance have a table named "Admin", as well as a form, report, class, and class library of the same name. **GTD** will stop searching after the first one it finds. 20 | 21 | Such conflicts can be avoided in those instances where the name you are searching for is part of a statement that uses VFP Keywords. You can point **GTD** in the right direction by clicking on the first keyword in statements like these: 22 | - DO Admin 23 | - DO FORM Admin 24 | - REPORT FORM Admin 25 | - NEWOBJECT (Admin, 'Admin.vcx') 26 | - CREATEOBJECT (Admin) 27 | - LOCAL loObject as Admin of 'Admin.vcx' 28 | - DEFINE CLASS classname as Admin of 'Admin.vcx' 29 | 30 | Note that you can open the class library in the examples above by clicking on the file extension or by highlighting the entire file name (with or without quotes). 31 | 32 | #### Creating Properties and Methods 33 | 34 | **GTD** provides a number of different ways to add PEMs to a form or class that is being edited: 35 | * `Thisform.newpropertyormethod` 36 | * `Thisform.NewMethod(param1, param2, ...)` && this works if you click immediately after the right parenthesis. The method is created with the supplied parameters. 37 | * **GTD** when the cursor is in white space in a code window (that is, not on a word) 38 | * **GTD** when not in code window (the form or class being edited, the command window, property window, project manager, and so on) 39 | 40 | ![](Images/AddPEMs.png) 41 | 42 | **GTD** also works in conjunction with [IntelliSenseX](https://github.com/VFPX/IntelliSenseX). When you have entered the name of the new property or method, you can use **GTD** directly to go the form for adding the property or method. 43 | 44 | ![](Images/ISXAddPEMs.png) 45 | 46 | 47 | --- 48 | 49 | ### **[GoToDefinition Home Page ](https://github.com/VFPX/GoToDefinition)** 50 | 51 | ### **[News Archives ](Archives.md)** 52 | 53 | ### **[Thor Videos ](Thor_videos.md)** 54 | 55 | ### **[VFPX Home Page ](http://vfpx.org)** 56 | 57 | --- 58 | 59 | ![Picture](Images/vfpxpoweredby_alternative.gif) 60 | -------------------------------------------------------------------------------- /NewsItems/Thor_videos.md: -------------------------------------------------------------------------------- 1 | 2 | * [**Videos by Category**](#VideosByCategory) 3 | * [**Videos by Date**](#VideosByDate) 4 | * [**Upcoming Videos**](#UpcomingVideos) 5 | 6 | ## Videos by Category 7 | 8 | ### Thor 9 | 10 | * [Using Tool Launcher](http://youtu.be/2ttBR9vQqew) (7:57) 11 | * [50 Ways to Run a Thor Tool](http://youtu.be/ZaBR5J9riQk) (14:39) 12 | 13 | 14 | 15 | ### [GoFish 4](https://github.com/mattslay/GoFish) 16 | 17 | * [GoFish - Code Search Tool](https://www.youtube.com/watch?v=0MdpWyPnfus) (12:13) 18 | 19 | ### [IntellisenseX](https://github.com/VFPX/IntelliSenseX) 20 | 21 | 1. [Getting started](http://bit.ly/Q3izOd) (5:23) 22 | 2. [Using and configuring the dropdown box](http://bit.ly/SmMeQw) (4:01) 23 | 3. [Fields from tables](http://www.youtube.com/watch?v=lPmFwa4WeJ8&hd=1&rel=0) (9:29) 24 | 4. [Properties and methods from objects](http://www.youtube.com/watch?v=9TUvouhSU6Y&hd=1&rel=0) (5:14) 25 | 5. [Indirect table and object references and the Alias directive](http://www.youtube.com/watch?v=4lv4FoU2XEA&hd=1&rel=0) (3:51) 26 | 6. [Variables (LOCAL and otherwise) list](http://bit.ly/P73dWr) (5:28) 27 | 7. [Constants (#Defines) list](http://bit.ly/SmM9fA) (3:18) 28 | 8. [Setting ControlSource in PEM Editor](http://bit.ly/Rj9zpQ) (2:25) 29 | 9. [Known issues](http://bit.ly/SRSzE6) (7:00) 30 | 10. [“IntellisenseX by Dot” vs “IntellisenseX by Hot Key”](http://www.youtube.com/watch?v=71psd6RH2Ls&hd=1&rel=0) (3:29) 31 | 11. [Managing Plug-Ins: OpenTable and Intellisense](http://www.youtube.com/watch?v=UGyqlInAfvc&hd=1&rel=0) (5:34) 32 | 33 | ### [Finder](https://github.com/VFPX/Finder) 34 | 35 | 1. [Finder introduction](http://youtu.be/uL4a9gsCLlk) (11:25) 36 | 37 | ## Videos by Date 38 | 39 | 1. 2013-06-21 [Finder introduction](http://youtu.be/uL4a9gsCLlk) (11:25) 40 | 1. 2013-03-31 [50 Ways to Run a Thor Tool](http://youtu.be/ZaBR5J9riQk) (14:39) 41 | 1. 2012-12-31 [Using Tool Launcher](http://youtu.be/2ttBR9vQqew) (7:57) 42 | 1. 2012-09-30 [Getting started](http://bit.ly/Q3izOd) (5:23) 43 | 1. 2012-09-30 [Using and configuring the dropdown box](http://bit.ly/SmMeQw) (4:01) 44 | 1. 2012-09-30 [Fields from tables](http://www.youtube.com/watch?v=lPmFwa4WeJ8&hd=1&rel=0) (9:29) 45 | 1. 2012-09-30 [Properties and methods from objects](http://www.youtube.com/watch?v=9TUvouhSU6Y&hd=1&rel=0) (5:14) 46 | 1. 2012-09-30 [Indirect table and object references and the Alias directive](http://www.youtube.com/watch?v=4lv4FoU2XEA&hd=1&rel=0) (3:51) 47 | 1. 2012-09-30 [Variables (LOCAL and otherwise) list](http://bit.ly/P73dWr) (5:28) 48 | 1. 2012-09-30 [Constants (#Defines) list](http://bit.ly/SmM9fA) (3:18) 49 | 1. 2012-09-30 [Setting ControlSource in PEM Editor](http://bit.ly/Rj9zpQ) (2:25) 50 | 1. 2012-09-30 [Known issues](http://bit.ly/SRSzE6) (7:00) 51 | 1. 2012-09-30 [“IntellisenseX by Dot” vs “IntellisenseX by Hot Key”](http://www.youtube.com/watch?v=71psd6RH2Ls&hd=1&rel=0) (3:29) 52 | 1. 2012-09-30 [Managing Plug-Ins: OpenTable and Intellisense](http://www.youtube.com/watch?v=UGyqlInAfvc&hd=1&rel=0) (5:34) 53 | 1. 2012-09-26 [GoFish - Code Search Tool](https://www.youtube.com/watch?v=0MdpWyPnfus) (12:13) 54 | 55 | -------------------------------------------------------------------------------- /NewsItems/Tweet_27.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #27: Go To Definition 2 | === 3 | 4 | _Go To Definition_ is one of the most useful Thor tools at the same time as being one of the easiest to use.  If it had been brought into existence as a separate VFPX project instead of simply coming along with PEM Editor and then Thor, it would certainly have achieved the much wider recognition and use that it deserves. 5 | 6 | It allows you to point to any user-defined name in your code, and go to (that is, display and/or edit) its definition. It can also be used to create new methods and properties in a form or class. 7 | 8 | The mechanics are simple: 9 | 10 | 1. Click on the name (right before the name, inside, or just after). 11 | 2. Run _Go To Definition_. (_Suggestion: use a convenient hot key; I use F12)_ 12 | 13 | This table lists all the different types of names that can be searched for: 14 | 15 | Type of Name|Action taken 16 | ---|--- 17 | Method or event|Opens up the method for editing; if there is no local non-default code, also opens up a txt file containing all the inherited code for the method. 18 | Object|Selects that object, if possible, for display in PEM Editor and property window.  There are some conditions where this fails: If the object is hidden beyond other objects or not otherwise visible or if it is on a different page of a pageframe. 19 | Property|Same as selecting an object, but also tries to select that property in the PEM Editor grid.  This only works if the PEM Editor form is open, and may also fail based on the filters in effect in the grid. 20 | DODEFAULT|Opens up a txt file containing all the inherited code for the method. 21 | PRG|Opens the PRG. 22 | Procedure or Function in a PRG|Opens the PRG and highlights the start of the PROC or FUNC 23 | Constant (#Define …)|Opens the #Include file, and highlights the constant 24 | Form|Opens the form 25 | Report|Opens the report 26 | Fully highlighted file name|Opens the file for editing; should work for all file extensions. 27 | Class Name|Opens the class, whether it is in a VCX or PRG 28 | CREATEOBJECT or NEWOBJECT|Opens the class, whether it is in a VCX or PRG 29 | LOCAL loObject as someclass of somelibrary|Opens the class (when you click on “LOCAL”) 30 | {{ loObject = { someclass, someclasslibrary } }}|Opens the class (when you click on “loObject”) 31 | Define Class xxx as xxxParent (of xxxLibrary)|Opens the parent class xxx Parent (when you click on “Define”) 32 | 33 | If the search is to be conducted looking in file(s) other than the form or class being edited, the files in the active project, if any are searched; if there is no active project, then all files in the path are searched. 34 | 35 | #### Creating New Properties and Methods 36 | 37 | _Go To Definition_ can also be used to create new properties and methods. Simply call Go To Definition when the cursor is in the name of a potential new property or method and the form for creating new properties or methods is opened. 38 | 39 | ![](Images/Tweet27a.png) 40 | 41 | _Personal note: I rely heavily on this tool. In fact, I use it to create most of my new properties and methods, rarely using PEM Editor for that purpose any more._ 42 | 43 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 44 | -------------------------------------------------------------------------------- /NewsItems/Tweet_11.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #11: IntellisenseX: Aliases for VFP Tables 2 | === 3 | 4 | Last week’s [TWEeT #10](Tweet_10.md) demonstrated that IntellisenseX recognizes aliases for tables used within SELECT statements. 5 | 6 | IntellisenseX now also recognizes aliases used for VFP tables, in three different varieties: 7 | 8 | * In procedures where the table is opened using either USE or by a UDF. 9 | * Where the alias is a constant alias used throughout an application and can be opened by a [Plug-In](../Thor_add_plugins.md). 10 | * By specifying an special directive in your code that identifies the file that an alias refers to 11 | 12 | **Procedures where the table is opened using either USE or by a UDF** 13 | 14 | IntellisenseX now recognizes aliases of tables opened by USE (when referenced in the same procedure). This happens automatically and is not dependent on the order of the phrases in the USE command. 15 | 16 | ![](Images/Tweet11a.png) 17 | 18 | Similarly, IntellisenseX recognizes aliases of tables opened by a UDF as long as the name of the table and its alias are passed as parameters to the UDF. In the following example, the UDF `UseTable` is called with the first parameter being the name of the table and the third being the alias. 19 | 20 | ![](Images/Tweet11b.png) 21 | 22 | In order for this to work, you must record the name of your UDF, etc., in the Thor Configuration form: 23 | 24 | 1. Open the Thor Configuration form 25 | 2. Go to the Options page 26 | 3. Click on “Table Aliases” on the left 27 | 4. Fill in the name of the UDF and the positions in the parameter list for the name of the table and the alias. 28 | 29 | ![](Images/Tweet11c.png) 30 | 31 | #### Where the alias is a constant alias used throughout an application 32 | 33 | IntellisenseX also supports the case where an alias refers to the same table throughout an application. 34 | 35 | _In my own environment, tables are never referred to by name. They are always opened by a UDF (called with the alias), which uses a meta-table to determine the name and folder for the table. Thus the alias name can always be used to open the table._ 36 | 37 | This is handled by creating the [Plug-In](Thor_add_plugins.md) “OpenTable”. This plug-in works very simply – it is called with a single parameter, the (potential) alias. 38 | 39 | If that alias can be used to open the desired table, do so, and return the alias as a result; if not, return a logical or empty result 40 | 41 | All of this work is done in the (originally empty) procedure OpenMyTable.  Just modify to fit your own environment. 42 | 43 | #### Directives to specify the table than an alias refers to. 44 | 45 | This last alternative is the least satisfying – you can add directives in you code to indicate the table than an alias refers to.  You might use this, for instance, where a table is opened in one procedure or method and referenced in another. 46 | 47 | There are two (very similar) directives: 48 | 49 | *#Alias SomeAlias = MyTable  … at the beginning of a line 50 | &&#Alias SomeAlias = MyTable  … at the end of a line 51 | 52 | For instance, 53 | 54 | ![](Images/Tweet11d.png) 55 | 56 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 57 | -------------------------------------------------------------------------------- /NewsItems/Tweet_22.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #22: Related [IntellisenseX](https://github.com/VFPX/IntelliSenseX) Tools 2 | === 3 | 4 | There are a number of Thor tools other than [_IntellisenseX_](https://github.com/VFPX/IntelliSenseX) that provide dropdown lists of names to select from.  These are not the familiar lists that native FoxPro Intellisense provides (member names or field names), but rather other lists that make sense in your FoxPro IDE.  These lists are not activated by pressing the dot (like IntellisenseX), so you will need to access them another way (by assigning a hot key or by adding them to the Thor toolbar or a menu) 5 | 6 | These tools can be found using the Tool [Launcher](../Thor_launcher.md): 7 | 8 | ![](Images/Tweet22a.png) 9 | 10 | The dropdown lists provided by these tools are: 11 | 12 | * _AutoComplete_ – All names referenced in the current procedure, except for VFP Keywords. Thus, variables, field names, table names and aliases, procedures, objects, property and method names, and so on 13 | * _Dropdown Constants List –_ All constants defined in the current procedure (#Define statements) as well as all constants defined in referenced #Include statements. 14 | * _Dropdown Procedures List –_ All procedures and functions referenced in either the current project (if there is one open) or the current path. 15 | * _Dropdown Table Names –_ All tables in the current path. 16 | * _DBC Tables by ! –_ All tables found in a DBC. 17 | 18 | All of these tools work essentially the same way. When you invoke them, you get a dropdown list that you can select from, just as when you select from dropdown lists created by IntellisenseX. The following example demonstrates a use of _AutoComplete_, showing all the names referenced in this procedure. 19 | 20 | ![](Images/Tweet22b.png) 21 | 22 | You can also begin typing part of the name before invoking the tool, such as in this example where “Temp” was entered before invoking _AutoComplete_. 23 | 24 | ![](Images/Tweet22c.png) 25 | 26 | Finally, if you type in enough of a name to uniquely identify it (such as “New” in this example, which matches only “lcNewSourceFile”), the match is pasted in immediately without even showing the pop-up.  When this becomes familiar, it is extremely handy, reducing both keystrokes and keying errors. 27 | 28 | There are a few things to note about each of these tools: 29 | 30 | * _AutoComplete_ – has its own plug-in to allow you to change the names that are displayed or their order. (My personal version of this recognizes my convention for naming tables and cursors). 31 | * _Dropdown Constants List –_ The dropdown list shows not only the names of matching defined constants, but also their values and any comment on the same line.  Furthermore, the matching is also done against the comments as well. For instance, in the example below, entering “nisst” matches all the entries that have “NISStatus” (a field name) in the comment. 32 | 33 | ![](Images/Tweet22d.png) 34 | 35 | * _Dropdown Procedures List –_ shows the names of procedures and functions, but not their parameters. Though that was the original intent,  including the parameters caused it to be so slow it was worthless.  Even as it is, without parameters, it can be very slow. 36 | * _Dropdown Table Names –_ has its own plug-in to search in different folders, etc. 37 | * _DBC Tables by ! –_ This one is not quite like the others, as it assigns an On Key Label for when you enter the ‘!’. Thus, you can only use this tool that way (not from menus or the Thor Toolbar, for instance) 38 | 39 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 40 | -------------------------------------------------------------------------------- /NewsItems/Tweet_18.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #18: IntellisenseX for Nested Objects 2 | === 3 | 4 | [IntellisenseX](https://github.com/VFPX/IntelliSenseX) provides dropdown lists for nested objects. These dropdown list are available throughout an entire form or class, as shown in this example: 5 | 6 | ![](Images/Tweet18a.png) 7 | 8 | The key to making this work is to define a property that can used by IntellisenseX to determine the dropdown list.  9 | 10 | The name of the property is the name of the nested property (“oParts” in the example above) with “_Def” added as a suffix. 11 | 12 | The value of the property is basically the same as used for Local Aliases (which apply only to the current procedure; see [Using Local Aliases in IntellisenseX](Tweet_17.md)) or for Global Aliases (which apply everywhere; see [the Alias Dictionary](Tweet_15.md)). It can be any one of a number of things, referring to either tables or objects. 13 | 14 | * A table, cursor, or view name 15 | * The full or relative path name to a table 16 | * The name of an SQL table 17 | * A reference to class from a class library; thus,  “`{class, classlibrary}`“  _See note below for Forms and VCX classes._ 18 | * A reference to class using the same syntax as the LOCAL command; thus,  “`Local loPAL as PAL of BO_PAL.VCX`“ 19 | * A reference to an object; thus,  “`Thisform.oParts` “ 20 | * An executable expression that returns an object or the name of an table, cursor, or view. This executable must start with an “=”; thus, something like “`= MyGetObject(‘Parts’)` “.  _See note below for Forms and VCX classes._ 21 | 22 | > _An unexpected problem arises when when using the Property Sheet or PEM Editor to set the values for the two items noted above – values inside curly braces are converted to dates, and values beginning with an = sign are saved as expressions. To avoid these issues, prefix the values with && – thus:_ 23 | > 24 | > * “`&& {class, classlibrary}`“ 25 | > * “`&& = MyGetObject(‘Parts’)` “ 26 | 27 | This table shows a number of different values that can be used for the value of the “_Def” property: 28 | 29 | Value|Description 30 | ---|--- 31 | “PartsList”|The name of a table in the path, in the Data Environment of a form, in an open DBC, in the MRU list for tables, or the name of a table in a SQL Server database. It can also be opened by the plug-in “Open Table”. 32 | “..\Tables\PartsList”|The absolute or relative path to a table. 33 | “{NISDetailsForm, NIS.VCX}”|A class in a VCX or PRG 34 | “Local loPAL as PAL of BO_PAL.PRG”|An alternative way to reference a class. This syntax was chosen so that you can copy the LOCAL command directly from a line of code. 35 | “ = GetBusinessObject(‘TableName’)”|A call to your own UDF that returns an object; used, for instance, if you use a factory to return objects instead of direct references. 36 | 37 | Nested objects may take any of a number of forms, including: 38 | 39 | * `ThisForm.oBusObj` 40 | * `This.oData` 41 | * `This.oPartsList.oData` 42 | * `This.oBusObj.oPartsList.oData` 43 | 44 | Nested objects may appear in forms, VCX-based classes, and PRG-based classes and there can be multiple levels of nesting. 45 | 46 | This TWEeT has addressed Aliases that apply to an entire form or class (both VCX and PRG-based).  Earlier TWEeTs have addressed [Local Aliases](Tweet_17.md) and [the Alias Dictionary](Tweet_15.md) addressed global aliases. 47 | 48 | An upcoming TWEeT will describe plug-ins that be used to handle cases that these features do not. 49 | 50 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 51 | -------------------------------------------------------------------------------- /NewsItems/Tweet_03.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #3: Remember MRUs? 2 | === 3 | 4 | Remember when you used to live in the Command Window and you would use MRU lists for opening forms, files, classes, etc?   5 | 6 | When you began relying on other tools, like the Project Manager and Class Browser, you couldn't use MRU lists anymore, though, since these other tools did not update the MRU lists, nor were MRUs made available any way other than from the Command Window. 7 | 8 | But now it's time to resume using MRUs since Thor tools resurrect them, maintaining them and providing new ways to access them. 9 | 10 | First of all, all Thor tools, most notably **[GoFish](https://github.com/mattslay/GoFish), [Finder](https://github.com/VFPX/Finder)**, and **[PEM Editor](https://github.com/VFPX/PEMEditor)**, but also all other Thor tools that open files, always update the appropriate MRU list when opening a file (whether form, class, table, report, etc.). In addition, they provide two other features: 11 | 12 | * They maintain a new MRU list for all *class libraries* that are opened. 13 | * They open each file using the same case for the file name as is found on disk, so that the case of file names is not changed. 14 | 15 | > _Note: It might seem that this would not help you if you open files from the Project Manager or Class Browser, but there are simple modifications you can make to both to achieve the same effect as all other Thor tools,  See the end of this message._ 16 | 17 | The main Thor tool for access MRU lists is called simply **MRUs**, and it displays a pop-up menu of all the different MRU lists (including, at the top, the list unique to Thor, of MRU class libraries.) 18 | 19 | ![](Images/Tweet3a.png) 20 | 21 | There are a number of other Thor tools that access these same MRU lists: 22 | 23 | * **MRU class libraries** -- provides a list of only the MRU class libraries (the first item from the menu shown above) 24 | * **HackCX4 from MRU forms or classes** -- creates a popup menu showing the MRU for forms and class libraries so that they can be they can be opened by HackCX4, (Requires separate installation of HackCX4 from [WhiteLightComputing](http://www.whitelightcomputing.com/prodhackcxpro.htm)) 25 | * [Finder](https://github.com/VFPX/Finder) -- lists are available by right-clicking on either the "File Search" or "Class Search" buttons atop the screen. 26 | * [PEM Editor](https://github.com/VFPX/PEMEditor) -- lists are available from the "Open File" button atop the screen. 27 | 28 | There are also two Thor tools that are slightly mis-named, as they really refer to most-recently-*changed* classes and files, based on timestamps rather than MRU lists. Note that **Finder** can also be used to find most-recently-changed classes and files 29 | 30 | * **MRU classes in this project** - note that this uses the internal timestamp within a VCX for when a class was last updated, rather than the timestamp of the VCX file itself. 31 | * **MRU files in this project** 32 | 33 | ***Updating MRU lists from the Project Manager or Class Browser*** 34 | 35 | Thor provides files you can install so that files opened from the Project Manager or Class Browser will update your MRU lists appropriately. These files are found in folder Thor\Tools\Samples. 36 | 37 | > _Note: The MRU lists are updated only if you have run Thor. If you haven't, Project Manager and Class Browser will still work normally._ 38 | 39 | * To change Project Manager, use the code from class BaseProjectHook of BaseProjectHooks.VCX 40 | * If you are not using ProjectHooks, modify the project to use this class (I recommend copying the class library to some other folder) 41 | * If you are already using ProjectHooks, simply copy the code from the only method in the class into your project hook file. 42 | * To change Class Browser, copy the file Browser.APP into the home folder for FoxPro -- Home(1) 43 | 44 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 45 | 46 | -------------------------------------------------------------------------------- /NewsItems/Archives.md: -------------------------------------------------------------------------------- 1 | 2 | # Thor News Archives 3 | 4 | **[2023-09-16 : The Hidden Context menu ](Item_53.md)** 5 | 6 | **[2023-09-02 : Quick Access Menu ](Item_52.md)** 7 | 8 | **[2023-08-19 : Bug Reports and Suggestions ](Item_51.md)** 9 | 10 | **[2023-04-15 : More Go To Definition Enhancements ](Item_50.md)** 11 | 12 | **[2023-04-08 : Got Comments, Suggestions, or Bug Reports? ](Item_49.md)** 13 | 14 | **[2023-02-04 : Go To Definition Enhancements ](Item_48.md)** 15 | 16 | **[2023-01-27 : IntelliSenseX Enhancements ](Item_47.md)** 17 | 18 | **[2023-01-20 : Two New Thor Tools: "Execute Selected Text" and "Highlight Current Statement" ](Item_46.md)** 19 | 20 | **[2023-01-13 : Class Browser Enhancements](Item_45.md)** 21 | 22 | **[2023-01-06 : FoxTabs Enhancements](Item_44.md)** 23 | 24 | **[2022-12-26 : Object Explorer Enhancements](Item_43.md)** 25 | 26 | **[2015-11-30 : New Thor Tools and SuperBrowse Enhancements](Item_42.md)** 27 | 28 | **[2015-01-12 : New VFPX Projects - ThemedTitleBar and VFP 9 SP2 Hotfix 3 Download](Item_41.md)** 29 | 30 | **[2014-01-04 : Go To Definition](Tweet_27.md)** 31 | 32 | **[2014-12-22 : Three New Thor Tools](Tweet_26.md)** 33 | 34 | **[2014-12-17 : New VFPX Projects - VFP Runtime Installers and StripeX](Item_38.md)** 35 | 36 | **[2014-11-30 : Five New Thor Tools for FoxBin2PRG](Tweet_25.md)** 37 | 38 | **[2014-11-25 : Nine New Thor Tools](Tweet_24.md)** 39 | 40 | **[2014-11-17 : Buffer Overrun Detected!](Tweet_23.md)** 41 | 42 | **[2014-06-11 : Related IntellisenseX Tools](Tweet_22.md)** 43 | 44 | **[2014-06-04 : Advanced Features: Plug-Ins for IntellisenseX](Tweet_21.md)** 45 | 46 | **[2014-05-29 : Quick Start Guide to IntellisenseX](Tweet_20.md)** 47 | 48 | **[2014-05-21 : Deficiencies in IntellisenseX (and how to avoid them) … The Custom Keyword List](Tweet_19.md)** 49 | 50 | **[2014-05-10 : IntellisenseX for Nested Objects](Tweet_18.md)** 51 | 52 | **[2014-04-29 : Using Local Aliases in IntellisenseX](Tweet_17.md)** 53 | 54 | **[2014-03-03 : Custom Keyword List for Field Names](Tweet_16.md)** 55 | 56 | **[2014-02-24 : IntellisenseX and the Alias Dictionary](Tweet_15.md)** 57 | 58 | **[2014-02-17 : IntellisenseX for Objects](Tweet_14.md)** 59 | 60 | **[2014-02-10 : New (hidden) IntellisenseX Feature](Tweet_13.md)** 61 | 62 | **[2014-02-03 : IntellisenseX by Dot or by Hot Key?](Tweet_12.md)** 63 | 64 | **[2014-01-27 : IntellisenseX: Aliases for VFP Tables](Tweet_11.md)** 65 | 66 | **[2014-01-20 : IntellisenseX: Field Names from SQL Server Tables](Tweet_10.md)** 67 | 68 | **[2014-01-13 : Extract to Variable and Extract to Constant](Tweet_09.md)** 69 | 70 | **[2014-01-05 : Creating Properties and Methods (#3)](Tweet_08.md)** 71 | 72 | **[2013-12-18 : Creating Properties and Methods (#2)](Tweet_07.md)** 73 | 74 | **[2013-08-26 : Thor Version 1.40 released: Thor ToolBar](Item_18.md)** 75 | 76 | **[2013-06-23 : New VFPX Project: Finder](Item_17.md)** 77 | 78 | **[2012-01-16 : Thor videos available from Thor menu](Item_14.md)** 79 | 80 | **[2012-01-05 : Thor's Tool Launcher: The one tool you must use](Item_13.md)** 81 | 82 | **[2012-11-16 : Thor menus provide access to Discussion Forums and Change Logs](Item_12.md)** 83 | 84 | **[2012-10-14 : New VFPX Project: FoxcodePlus](Item_10.md)** 85 | 86 | **[2012-10-06 : Easy access to all VFPX home pages](Item_09.md)** 87 | 88 | **[2012-09-30 : New VFPX project: IntellisenseX](Item_08.md)** 89 | 90 | **[2012-09-19 : All VFPX projects can be downloaded from Thor](Item_07.md)** 91 | 92 | **[2012-09-16 : Use the Thor discussion group](Item_06.md)** 93 | 94 | **[2012-09-10 : IntellisenseX released](Item_05.md)** 95 | 96 | **[2012-09-09 : Data Explorer is now a Thor tool](Item_04.md)** 97 | 98 | **[2012-09-04 : New VFPX Projects: Dynamic Forms & Data Explorer](Item_03.md)** 99 | 100 | **[2012-08-25 : Introducing Thor News](Item_01.md)** 101 | 102 | --- 103 | 104 | ![Picture](Images/vfpxpoweredby_alternative.gif) 105 | -------------------------------------------------------------------------------- /NewsItems/Tweet_14.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #14: IntellisenseX for Objects 2 | === 3 | 4 | IntellisenseX provides dropdown lists of properties, events, and methods (PEMs), similar to what is provided by default Intellisense, for all the cases provided by default Intellisense as well quite a few other cases as well. 5 | 6 | This TWEeT addresses the following topics about IntellisenseX for Objects 7 | 8 | * In SCXs and VCXs 9 | * In PRG-based classes 10 | * Ctrl-Enter to paste in parameters list 11 | * Inside WITH/ENDWITH structures 12 | * In LOCAL Statements 13 | * After NEWOBJECT or  CREATEOBJECT 14 | * After UDFs that create objects 15 | * With loObject 16 | * Using the Custom Keyword List 17 | 18 | #### In SCXs and VCXs 19 | 20 | In SCXs and VCXs, IntellisenseX provides a drop down list for objects referenced by THISFORM or THIS that is very similar to that given my default Intellisense: 21 | 22 | ![](Images/Tweet14a.png) 23 | 24 | 25 | #### In PRG-based classes 26 | 27 | IntellisenseX provides drop down lists for THIS and WITH THIS inside PRG-based classes. 28 | 29 | ![](Images/Tweet14b.png) 30 | 31 | On the options page on the Thor Configuration form you can indicate the level of detail you want to see (either custom properties and methods in this class only, or all inherited properties and methods) 32 | 33 | ![](Images/Tweet14c.png) 34 | 35 | #### Ctrl-Enter to paste in parameters list 36 | 37 | As can be seen, the display has a second column, showing the parameters list for methods and events. 38 | 39 | If you select an item from the list and press Ctrl+Enter, the parameters list will be inserted into your code, as shown below. This is not necessary when default Intellisense provides the Quick Info window for parameters but is of considerable value for the cases (described below) where IntellisenseX provides assistance where default Intellisense does not. 40 | 41 | ![](Images/Tweet14d.png) 42 | 43 | #### Inside WITH/ENDWITH structures 44 | 45 | IntellisenseX provides drop down lists inside WITH/ENDWITH structures for a variety of cases not supported by default Intellisense, including WITH THISFORM, WITH THIS.PARENT, and embedded WITHs. 46 | 47 | ![](Images/Tweet14e.png) 48 | 49 | #### In LOCAL Statements 50 | 51 | IntellisenseX now recognizes objects identified in LOCAL statements (as default Intellisense does). 52 | 53 | ![](Images/Tweet14f.png) 54 | 55 | #### After NEWOBJECT or  CREATEOBJECT 56 | 57 | IntellisenseX also recognizes objects created by NEWOBJECT or CREATEOBJECT even if there is no corresponding LOCAL statement. This can be quite handy when first writing a procedure. 58 | 59 | ![](Images/Tweet14g.png) 60 | 61 | #### After UDFs that create objects 62 | 63 | IntellisenseX also provides a [Plug-In](../Thor_add_plugins.md) (named “NewObject”) that allows it to recognize when you have called a UDF that creates an object. In the example below, my personal use of the plug-in allows Intellisense to recognize my use of a UDF named NewSessionObject (which happens to use the same parameters as NEWOBJECT, but this is not necessary). 64 | 65 | For specifics of the use of this Plug-in, see [IntellisenseX Customization](Tweet_18.md). 66 | 67 | ![](Images/Tweet14h.png) 68 | 69 | #### With loObject 70 | 71 | Finally, when you have objects defined by any of the examples noted above, IntellisenseX will work on that object when referenced after WITH, as shown below. 72 | 73 | ![](Images/Tweet14i.png) 74 | 75 | #### Using the Custom Keyword List 76 | 77 | The default behavior from IntellisenseX when presenting names of properties, methods and events in SCXs and VCXs is to use _MemberData to use the correct case for presenting the names. This can be quite slow. 78 | 79 | For PRG-based classes, the default behavior is to use the correct case from custom properties and methods in the class, and upper case for all inherited properties and methods. 80 | 81 | As an alternative, you can create a [Custom Keyword List](Tweet_16.md), a global table used by IntellisenseX and other Thor tools. This table contains a list of all the “keywords” (field names, property names, object names, and any other kind of name) for which you want to indicate how the case of the name should be presented. (For example, see  “CalcMainSummary” in the example directly above.)  This provides a consistent way for handing the case of the names throughout your applications. 82 | 83 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 84 | -------------------------------------------------------------------------------- /NewsItems/Tweet_19.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #19: Deficiencies in [IntellisenseX](https://github.com/VFPX/IntelliSenseX) 2 | === 3 | 4 | ### (and how to avoid them) 5 | 6 | ### … The Custom Keyword List … 7 | 8 | The most serious problem with IntellisenseX is that it is SO SLOW when getting the list of properties and methods in a VCX or SCX.  The process of getting the correct case for names in a VCX/SCX, requiring parsing MemberData in parent class(es), takes more time than anybody would be willing to wait each time you enter THISFORM followed by a dot. 9 | 10 | There is a similar problem when working in PRG-based classes where the parent class is anything other than a FoxPro base class. There is no good way to obtain the correct case for inherited names (PRG-based classes don’t even use MemberData), so all inherited custom names end up in lower case. 11 | 12 | The remedy for these two problems is the same – the Custom Keyword List.  This is just a simple table with the list of all words from your programming universe, where each word is saved with the mixture of upper/lower case that you prefer. This table can be created easily, updated automatically, and applied to any block of code.  Not only does this eliminate the problems mentioned above, it ensures that your words are always used consistently (same upper/lower case). 13 | 14 | #### Getting Started 15 | 16 | First, create the Custom Keyword List by running Thor Tool _Add all words from folder or project._ (You can find all the tools referenced here by filtering on “Custom Keyword” in the Thor Launcher.) 17 | 18 | ![](Images/Tweet19a.png) 19 | 20 | This tool will run for a few minutes as it scours an entire folder or project for all programming words.  Eventually, a form will come up showing you the list of all words in found. You can do some editing of the list, but for starters the suggestion is to simply save everything. 21 | 22 | Next, go to the options page for IntellisenseX in the Thor Configuration form to select the settings such that IntellisenseX will use the Custom Keyword List. 23 | 24 | ![](Images/Tweet19b.png) 25 | 26 | Finally, mark these checkboxes for option “Add all words in code window” as well, so that new words you create going forward, including properties and methods created by [PEM Editor](https://github.com/VFPX/PEMEditor) or any of its related tools, are automatically added to the Custom Keyword List. Do so even if you don’t used BeautifyX (but more on that in a bit). 27 | 28 | ![](Images/Tweet19c.png) 29 | 30 | After performing these three steps, you’re on your way. 31 | 32 | #### Updating the Custom Keyword List Programmatically 33 | 34 | You can programmatically add words to this list at any time by using any of the following Thor tools: 35 | 36 | * _Add all words from folder or project_ 37 | * _Add all words in code window_ 38 | * _Add PEMS from current class or form_ 39 | * _Add fields names from current table_ 40 | 41 | If there are any new words encountered, a form opens for you to approve the new words; if there are any words found that conflict with words already in the table, a separate form opens for you to select which you want to use. 42 | 43 | ![](Images/Tweet19d.png) 44 | 45 | #### What does “Locked” mean? 46 | 47 | Some words may have inconsistent usages – “Openexcelfile” or “OpenExcelfile” or “OpenExcelFile” or ?  Marking a word as “Locked” indicates that that is your preferred usage and you will never be asked about possible conflicts again. 48 | 49 | #### Updating the Custom Keyword List Manually 50 | 51 | You can  use the tool _Add highlighted word_ to add or update a word directly to the Custom Keyword List (this also marks it as Locked – your preferred usage). 52 | 53 | You can also open the table with tool _Browse Custom Keyword List_ and make any modifications as needed. This table is found in your “My Tools” folder. 54 | 55 | ```foxpro 56 | _Screen.cThorFolder + 'Tools\My Tools\KeywordList.DBF' 57 | ``` 58 | 59 | 60 | #### Using BeautifyX 61 | 62 | If you’re not already using Thor tool BeautifyX all the time, it’s time to change.  It provides a wide range of features and you can choose which ones work for you – but some of them them definitely will. 63 | 64 | The options include 65 | 66 | * Apply native Beautify 67 | * Provide consistent spacing around operators and commas, align semi-colons, indentation for continuation lines 68 | * Highly customizable formatting for SQL-SELECT, SQL-UPDATE, SQL-DELETE, and REPLACE statements, (conditionally within TEXT / ENDTEXT structures) 69 | * Run Thor tool “Create Locals’ 70 | * Add MDots 71 | * Check for RETURNs between WITH/ENDWITH (these create latent C5 errors) 72 | * Apply Custom Keyword List 73 | * Add words to Custom Keyword List. 74 | 75 | Make it your practice to use BeautifyX on all the code you write. 76 | 77 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 78 | -------------------------------------------------------------------------------- /NewsItems/Item_53.md: -------------------------------------------------------------------------------- 1 | 2 | # Thor News 3 | 4 | **The Hidden Context menu** 5 | --- 6 | 7 | ### #53, 2023-09-16 8 | 9 | ### Why a context menu for individual Thor Tools? 10 | One of the difficulties working with Thor, a sprawling application that's more than a dozen years old, is how to find the documentation for any its many tools (now numbering close to 200). Until now, Thor has not provided a consistent or reliable way to do so. 11 | 12 | A context menu, applicable to a single Thor tool, has been developed to address this issue. The context menu provides direct access to the available documentation for the tool, as well as a host of other features applicable to the tool, including how to best report bugs and make suggestions, assign hot keys, and so on. 13 | 14 | The context menu is available for all menu items that appear in *any* menu created by Thor, including those in “Thor Tools”, "Quick Access Menu", any others in the system menu pad, and any custom pop-up menus. It is called the Hidden Context Menu because, as you will see, it is not accessed the usual way by right-clicking on an item. 15 | 16 | ### Using the hidden context menu 17 | Normally, the only thing you can do with items that appear in a FoxPro menu is to choose one of the items to execute. You can do so by 18 | * clicking on an item 19 | * using the access key for an item (the underlined character) 20 | * or navigating to the item and pressing [Enter] 21 | 22 | FoxPro does not provide any mechanism for creating a context menu for the items in a menu, so using right-click on a menu item has no effect. 23 | 24 | However, Thor provides context menus for all menu items that appear in *any* menu created by Thor, including those in “Thor Tools”, "Quick Access Menu", any others in the system menu pad, and any custom pop-up menus. 25 | 26 | This context menu is accessed by pressing the shift key when selecting an item from a menu. To be clear, you can access the context menu for an item in any Thor menu by **holding down the shift key** and 27 | * clicking on an item 28 | * using the access key for an item (the underlined character) 29 | * or navigating to the item and pressing [Enter] 30 | 31 | The context menu contains items that relate specifically to the selected tool. While all of these features are available elsewhere in Thor, they are concentrated here to make them all visible and readily accessible in a single place. 32 | 33 | Here's a sample context menu. Note that some of the items shown here might not appear, depending on the tool selected. 34 | 35 | ![](Images/HiddenConextMenuSample.png) 36 | 37 | #### Help 38 | This option displays the available documentation for the selected tool. Many tools will take you to the web page for that tool and the remainder will use a simple form. 39 | 40 | 41 | #### Bug Reports / Suggestions 42 | This option opens the issue page in GitHub for the project that the tool belongs to so that you can report bugs, add suggestions, or read and comment on any current issues. 43 | 44 | #### Options 45 | Opens the Options tab on the [Thor Configuration Form (Alt+F12)](https://github.com/VFPX/Thor/blob/master/Docs/Thor_help.md) for this tool. 46 | 47 | #### Plug-Ins 48 | Opens the Plug-Ins management form, showing only those plug-ins that apply to this tool. 49 | 50 | #### Assign (or Re-Assign) Hot Key 51 | Allows you to assign the hot key for this tool. 52 | 53 | #### Clear Hot Key 54 | Allows you to remove the hot key assigned to this tool. 55 | 56 | #### Favorite 57 | Toggles whether the tool is a Favorite. Favorites appear in bold in Thor menus (Thor Tools, Quick Access or any others) and also in the second page of the Thor Launcher. 58 | 59 | #### Start Up 60 | Toggles whether the tool is run when you start Thor. There are very few tools for which this makes sense; PEM Editor and IntellisenseX, but few others. 61 | 62 | #### Tool Bar 63 | Allows you to control whether the tool appears in the Thor toolbar and the caption used if it is to appear. Tool bar items appear in alphabetical order. 64 | 65 | #### View Published Version (Read-Only) 66 | Opens the PRG for the tool in read-only mode. You are prevented from modifying this PRG because later Check For Updates will wipe out any changes you make. Use the next option instead. 67 | 68 | #### Create Custom Version 69 | This opens a copy of the published PRG so that you can modify it for your own needs. By default, it will be saved in Thor’s “My Tools” folder, although you can save it in any folder in your path. Thor uses the custom version, if available, instead of the published version. 70 | 71 | ### Using Ctrl key to go directly to Help 72 | 73 | If you are interested in help for a tool, you can bypass the hidden menu by using the Ctrl key instead of the Shift key, by using either: 74 | * Ctrl + Click 75 | * or Ctrl + [Enter] 76 | 77 | 78 | --- 79 | 80 | ### **[News Archives ](Archives.md)** 81 | 82 | ### **[Thor Videos ](Thor_videos.md)** 83 | 84 | ### **[VFPX Home Page ](http://vfpx.org)** 85 | 86 | --- 87 | 88 | ![Picture](Images/vfpxpoweredby_alternative.gif) 89 | -------------------------------------------------------------------------------- /NewsItems/Tweet_15.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #15:  The Alias Dictionary 2 | === 3 | 4 | There have been some improvements in the handling of table aliases since the earlier TWEet on [IntellisenseX: Aliases for VFP Tables](Tweet_11.md). 5 | 6 | The difficulty in what was described there is that the solutions do not go far enough.  The first example shows that IntellisenseX recognizes aliases create by USE statements: 7 | 8 | ![](Images/Tweet11a.png) 9 | 10 | But this alias is only recognized by IntellisenseX within the same procedure as the USE statement. If this table were opened in the LOAD event of a form, the alias would be available there – and in no other methods. 11 | 12 | And the #Alias directive has the same limitation – to be of value, it must be inserted into every single method referencing the table. 13 | 14 | The solution offered by the _Alias Dictionary_ is that there is a table (maintained by Thor) that contains **global**> definitions of tables (or objects – but we will get to that later on). 15 | 16 | You can add records to this table by executing Thor tool **Browse Table/Object Alias List**, which does exactly that – it opens a browse window where you can add records (or edit existing records), like this: 17 | 18 | ![](Images/Tweet15b.png) 19 | 20 | Henceforward, whenever you enter “SomeAlias” and invoke IntellisenseX as you always do, by pressing the dot (or [hot key](Tweet_12.md)), it will open table “PartsListFields”. 21 | 22 | >Note well: This is truly a *global* definition for “SomeAlias”. It is not relative to the current form, class, folder, project, or application, or anything else. 23 | 24 | For the table name you can enter also enter full path or relative paths. 25 | 26 | ![](Images/Tweet15c.png) 27 | 28 | As noted earlier, you can also add entries to this table that correspond to global objects. To do this, you can enter “=” followed by an executable expression in the Table field. 29 | 30 | ![](Images/Tweet15d.png) 31 | 32 | There are a few points of interest worth noting: 33 | 34 | * NewObject() is used in this example, instead of CreateObject(), because NewObject() accepts a third parameter of zero so that the INIT method does not fire. 35 | * If CreateObject() would in fact return the correct object, you can supply an empty (‘’) second parameter to NewObject(). 36 | 37 | There are two alternatives that can be used instead of calling NewObject(): 38 | 39 | * You can copy a LOCAL statement and paste it directly into the table. 40 | * You can enclose the class name and class library name in curly braces, such as **{ClassName,ClassLib.VCX}.** The class library name is optional if CreateObject() would in fact return the correct object. 41 | 42 | ![](Images/Tweet15e.png) 43 | 44 | Actually, *any* executable expression (preceded by '”=”) will work, as long as the result is one of these: 45 | 46 | * an object 47 | * the alias of an open table 48 | * the alias of a table that Thor can open 49 | * an object containing an array named ‘aList’. This array may have up to three columns and the contents of the array will populate the drop down list. 50 | 51 | #### Nested Objects in the Alias Field 52 | 53 | The alias field may also contain references to nested objects.  Consider, for instance, the sample below, where oData is actually understood to be populated (at run time) by a Scatter from the Jobs table. 54 | 55 | ![](Images/Tweet15f.png) 56 | 57 | This is achieved by the entry shown below. 58 | 59 | ![](Images/Tweet15g.png) 60 | 61 | All of the discussion above describing the various combinations that can be used in the Table field apply equally well when using a nested object in the alias field.  Below we have the the definition of “oApp.oAdmin” so that it will present the list of properties from the Admin object defined in the Table field. (Note that any of the values in the Table field for “dataAdmin”, “dataAdmin2”, or “dataAdmin3” would have worked just as well.) 62 | 63 | ![](Images/Tweet15h.png) 64 | 65 | #### Wildcards in the Alias Field 66 | 67 | You can also use a single “*” as a wildcard in the Alias field. 68 | 69 | ![](Images/Tweet15i.png) 70 | 71 | This allows you to see the PEMs for the this particular object any time that it is referenced, regardless of the parent object that owns it. 72 | 73 | Finally, the characters that the wildcard represents can be used in the Table field; simply use <*> (as shown below) 74 | 75 | ![](Images/Tweet15j.png) 76 | 77 | Thus, in this example, “*” replaces the text “PartsList”, so the fields from the PartsList table are displayed. 78 | 79 | ![](Images/Tweet15k.png) 80 | 81 | And similarly for the Customer table …. 82 | 83 | ![](Images/Tweet15l.png) 84 | 85 | If you happen to name your objects consistently, you can pass the extracted text as a parameter to your own UDF, which should return the object as a result. (Note the necessary use of quote marks around <*>.) 86 | 87 | ![](Images/Tweet15m.png) 88 | 89 | The following shows how ‘PartsList’ is passed as a parameter to my UDF “MyLookerUpper”, which returns the object for ‘PartsList’ as a result. As noted before, UDF “MyLookerUpper” should call NewObject() with a third parameter of zero so that its INIT does not execute. 90 | 91 | ![](Images/Tweet15n.png) 92 | 93 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 94 | -------------------------------------------------------------------------------- /NewsItems/Tweet_10.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #10: IntellisenseX: Field Names from SQL Server Tables 2 | --- 3 | 4 | [IntellisenseX](https://github.com/VFPX/IntelliSenseX) now supplies field names from your SQL Server tables, as shown in the following example: 5 | 6 | ![](Images/Tweet10a.png) 7 | 8 | What your are seeing is a dropdown list of field names from an SQL table named “Terms”. It may occur to you that this looks exactly like the list from a VFP table.  You would be completely correct, as IntellisenseX now gives you field lists from ***both*** FoxPro tables and SQL Tables, and both are accessed the same way. 9 | 10 | You need follow only a few steps  to activate this: 11 | 12 | 1. Open the Thor Configuration form 13 | 2. Go to the Options page 14 | 3. Click on “Opening Tables” on the left 15 | 4. Enter your connection string on the right 16 | 17 | ![](Images/Tweet10b.png) 18 | 19 | If you read no further, you have all you need to know to get started using IntellisenseX on SQL tables; what remains in this article is a discussion of the finer points. 20 | 21 | #### [IntellisenseX](https://github.com/VFPX/IntelliSenseX) recognizes aliases within an SQL statement 22 | 23 | As shown below, aliases within an SQL statement are handled as desired. 24 | 25 | ![](Images/Tweet10c.png) 26 | 27 | But something unexpected will occur because you will probably refer to the aliases in the list of fields, at the beginning of your SQL statement, before you have specified the aliases. The way around this is to create your statement in sort of an inside-out fashion – that is, create your FROM and JOIN phrases first (or, at least as much of them as necessary to create the aliases) and then you’ll have the IntellisenseX support when specifying the field list. 28 | 29 | ![](Images/Tweet10d.png) 30 | 31 | See also the example further on showing how to access aliases in a plain VFP Select statement (that is, not within a Text/EndText structure). 32 | 33 | #### How does this work, anyway? 34 | 35 | When you invoke IntellisenseX, it goes through a lot of hoops to determine whether the name immediately before the dot could refer to an object or an open table/cursor/view. If none of those apply, it then tries to do you a favor and open the table/view for you. (This has been true from day one). 36 | 37 | What has been added is that if you supply a connection string (as previously noted), it will also try to read at least the structure from your SQL table. In doing so, it creates a cursor (with “_SQL4ISX_” prefixed to the name of your SQL table) which can be used by IntellisenseX. (See also the discussion below about how this applies to other tools, such as [**SuperBrowse**](../Thor_superbrowse.md).) 38 | 39 | #### What is that “SQL Dictionary” referred to on the options page? 40 | 41 | 42 | An alternative method to using a connection string (which accesses the table each time) is to create a local VFP table with a list of all fields from all your SQL tables.  The statement below creates a table with the desired structure.  (You can expand the first two character fields as needed.)  To create the entries in this table, you can use SQLTables() to get a list of all tables and SQLColumns() on each table to get the list of fields. 43 | 44 | ```foxpro 45 | Create Table MySQLTableName ( ; 46 | XTABNAME     C(40),       ; 47 | FIELD_NAME   C(30),       ; 48 | FIELD_TYPE   C(1),        ; 49 | FIELD_LEN    N(3),        ; 50 | FIELD_DEC    N(3)) 51 | ``` 52 | 53 | 54 | #### What if a single connection string is not enough? 55 | 56 | There is no provision currently to make it easy to switch between different SQL databases, which would  require multiple connection strings. However, it is possible to change the connection string programmatically, by executing the following: 57 | 58 | Execscript(_Screen.cThorDispatcher, 'Set Option=', 'Connection String', 'Opening Tables', NewConnectionString) 59 | 60 | and this could be used in a Thor tool to select which database to read from. 61 | 62 | #### Does any of this apply to other tools? 63 | 64 | There are a number of other tools (most notable [**Super Browse**](Thor_superbrowse.md)) which use the same sub-routine for opening tables as is used by IntellisenseX. Thus, if you use Super Browse to help you create a list of fields for an SQL statement, you can click on the name of the table (be it a VFP table or SQL table) and execute Super Browse and away you will go. 65 | 66 | #### How do you use aliases in SELECT statements not inside a Text/EndText structure? 67 | 68 | The strategy for using IntellisenseX to provide field names for aliases in a SELECT statement (as explained above) is the same when not inside a Text/EndText structure , but with one additional consideration. 69 | 70 | Inside a Text/EndText structure, the end of the statement is clearly identified by the keyword “EndText”. In a plain VFP statement, however, there is no such clear ending, so IntellisenseX must rely on the use of the semi-colon to show continuation lines. Thus, the rule that is followed is that the line where you are typing is assumed to have a semi-colon (because you haven’t gotten to the end of the line yet) and the SELECT statement continues through the following lines until one is reached that does not end in a semi-colon. 71 | 72 | ![](Images/Tweet10e.png) 73 | 74 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 75 | -------------------------------------------------------------------------------- /NewsItems/FirstPage.md: -------------------------------------------------------------------------------- 1 | 2 | # Thor News 3 | 4 | **Go To Definition Enhancements** 5 | --- 6 | 7 | ### #49, 2023-04-09 8 | 9 | This new VFPX project is a completely refactored version of the original Go To Definition (GTD). The code was created before we had Thor, so it was embedded into the older PEMEditor App. This, along with the fact that GTD evolved incrementally over a long period of time, made it a prime candidate for refactoring. GTD is now a standalone tool, simplifying the tasks of updating or documenting. All of the original features of GTD should work as they have always had, with the following enhancements: 10 | 11 | * [IntelliSenseX (ISX)](https://github.com/VFPX/IntelliSenseX) provides dropdown lists for PEMs (properties, events, and methods) for objects referenced in code. GTD now uses ISX in two new ways: 12 | * If ISX can provide a dropdown list of PEMs for an object, then using GTD will open the definition of that object. 13 | * In addition, GTD will open an object's definition and associated method code if you use GTD on a method from the object. 14 | 15 | > This is especially useful for objects described in the "Hidden gems" section in [Thor News Item 47](Item_47.md). 16 | 17 | 18 | * GTD now creates bookmarks each time it is used, one placed where GTD was invoked and one at its destination (if in a code window). Two Thor tools work with these bookmarks 19 | * **Cycle Bookmarks** takes you through all your current bookmarks. 20 | * **Add/Remove BookMark** will add a bookmark at the current location if there isn't one there or remove the current bookmark if there is. 21 | 22 | > Bookmarks are defined by the window (not its contents) and the cursor position in that window. They are automatically removed when the window is closed. Also, they may be out of sync if the code in the window above the bookmark cursor position has been modified. 23 | 24 | * If you use GTD on the name of an object that actually exists (other than in the SCX or VCX you are editing), GTD will open **Object Explorer**. An example (although not a very useful one), would be to use GTD on _Screen. 25 | * GTD would seemingly have nothing to do if the active window is not a code window (the form or class you are edititing, the Property Window, Class Browser, PEM Editor, etc) or if the cursor is in white space in a code window. In these cases, the "Add new PEM" window is opened. 26 | 27 | --- 28 | 29 | ### **[News Archives ](Archives.md)** 30 | 31 | ### **[Thor Videos ](Thor_videos.md)** 32 | 33 | See also 34 | 35 | * [Thor Videos](Thor_videos.md) 36 | 37 | --- 38 | 39 | Headlines History 40 | --- 41 | 42 | **[2023-04-09 : Further Go To Definition Enhancements ](Item_49.md)** 43 | 44 | **[2023-02-04 : Go To Definition Enhancements ](Item_48.md)** 45 | 46 | **[2023-01-27 : IntelliSenseX Enhancements ](Item_47.md)** 47 | 48 | **[2023-01-20 : Two New Thor Tools: "Execute Selected Text" and "Highlight Current Statement" ](Item_46.md)** 49 | 50 | **[2023-01-13 : Class Browser Enhancements](Item_45.md)** 51 | 52 | **[2023-01-06 : FoxTabs Enhancements](Item_44.md)** 53 | 54 | **[2022-12-26 : Object Explorer Enhancements](Item_43.md)** 55 | 56 | **[2015-11-30 : New Thor Tools and SuperBrowse Enhancements](Item_42.md)** 57 | 58 | **[2015-01-12 : New VFPX Projects - ThemedTitleBar and VFP 9 SP2 Hotfix 3 Download](Item_41.md)** 59 | 60 | **[2014-01-04 : Go To Definition](Tweet_27.md)** 61 | 62 | **[2014-12-22 : Three New Thor Tools](Tweet_26.md)** 63 | 64 | **[2014-12-17 : New VFPX Projects - VFP Runtime Installers and StripeX](Item_38.md)** 65 | 66 | **[2014-11-30 : Five New Thor Tools for FoxBin2PRG](Tweet_25.md)** 67 | 68 | **[2014-11-25 : Nine New Thor Tools](Tweet_24.md)** 69 | 70 | **[2014-11-17 : Buffer Overrun Detected!](Tweet_23.md)** 71 | 72 | **[2014-06-11 : Related IntellisenseX Tools](Tweet_22.md)** 73 | 74 | **[2014-06-04 : Advanced Features: Plug-Ins for IntellisenseX](Tweet_21.md)** 75 | 76 | **[2014-05-29 : Quick Start Guide to IntellisenseX](Tweet_20.md)** 77 | 78 | **[2014-05-21 : Deficiencies in IntellisenseX (and how to avoid them) … The Custom Keyword List](Tweet_19.md)** 79 | 80 | **[2014-05-10 : IntellisenseX for Nested Objects](Tweet_18.md)** 81 | 82 | **[2014-04-29 : Using Local Aliases in IntellisenseX](Tweet_17.md)** 83 | 84 | **[2014-03-03 : Custom Keyword List for Field Names](Tweet_16.md)** 85 | 86 | **[2014-02-24 : IntellisenseX and the Alias Dictionary](Tweet_15.md)** 87 | 88 | **[2014-02-17 : IntellisenseX for Objects](Tweet_14.md)** 89 | 90 | **[2014-02-10 : New (hidden) IntellisenseX Feature](Tweet_13.md)** 91 | 92 | **[2014-02-03 : IntellisenseX by Dot or by Hot Key?](Tweet_12.md)** 93 | 94 | **[2014-01-27 : IntellisenseX: Aliases for VFP Tables](Tweet_11.md)** 95 | 96 | **[2014-01-20 : IntellisenseX: Field Names from SQL Server Tables](Tweet_10.md)** 97 | 98 | **[2014-01-13 : Extract to Variable and Extract to Constant](Tweet_09.md)** 99 | 100 | **[2014-01-05 : Creating Properties and Methods (#3)](Tweet_08.md)** 101 | 102 | **[2013-12-18 : Creating Properties and Methods (#2)](Tweet_07.md)** 103 | 104 | **[2013-08-26 : Thor Version 1.40 released: Thor ToolBar](Item_18.md)** 105 | 106 | **[2013-06-23 : New VFPX Project: Finder](Item_17.md)** 107 | 108 | **[2012-01-16 : Thor videos available from Thor menu](Item_14.md)** 109 | 110 | **[2012-01-05 : Thor's Tool Launcher: The one tool you must use](Item_13.md)** 111 | 112 | **[2012-11-16 : Thor menus provide access to Discussion Forums and Change Logs](Item_12.md)** 113 | 114 | **[2012-10-14 : New VFPX Project: FoxcodePlus](Item_10.md)** 115 | 116 | **[2012-10-06 : Easy access to all VFPX home pages](Item_09.md)** 117 | 118 | **[2012-09-30 : New VFPX project: IntellisenseX](Item_08.md)** 119 | 120 | **[2012-09-19 : All VFPX projects can be downloaded from Thor](Item_07.md)** 121 | 122 | **[2012-09-16 : Use the Thor discussion group](Item_06.md)** 123 | 124 | **[2012-09-10 : IntellisenseX released](Item_05.md)** 125 | 126 | **[2012-09-09 : Data Explorer is now a Thor tool](Item_04.md)** 127 | 128 | **[2012-09-04 : New VFPX Projects: Dynamic Forms & Data Explorer](Item_03.md)** 129 | 130 | **[2012-08-25 : Introducing Thor News](Item_01.md)** 131 | 132 | --- 133 | 134 | 135 | Last changed: _2023-04-03_ ![Picture](Images/vfpxpoweredby_alternative.gif) 136 | -------------------------------------------------------------------------------- /NewsItems/Tweet_20.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #20: Quick Start Guide to [IntellisenseX](https://github.com/VFPX/IntelliSenseX) 2 | === 3 | 4 | When I began writing TWEeTs about [IntellisenseX](https://github.com/VFPX/IntelliSenseX) (back in **January!**), I could never have guessed that the topic would not be exhausted by now. But writing those TWEeTs engendered discussions and new ideas, so that much of what was described in the most recent TWEeTs was not even imagined back then. 5 | 6 | In re-reading those TWEeTS, one glaring omission jumped out at me – they explain how IntellisenseX works and how you can customize it, but they never touched on the first step – how to get started in the first place.  So here we go. 7 | 8 | #### Getting started with [IntellisenseX](https://github.com/VFPX/IntelliSenseX) 9 | 10 | There are only a few steps to getting IntellisenseX up and running to provide a number of extensions to native FoxPro Intellisense.  Once set up, you will find that using the dot (whether after object references or table references) produces the helpful dropdown list in a lot of different places that instantly feel natural. There are also some further customizations you can make, most quite minor, that allow IntellisenseX to provide its assistance in a number of quite surprising ways. 11 | 12 | To get started, open Tool Launcher, enter “IntellisenseX” in the filter box, and then click on the tool “IntellisenseX – by Dot” in the TreeView on the left. 13 | 14 | Check off “Run at startup”. This will cause IntellisenseX to be enabled each time you start Thor in your IDE.  (The tool “IntellisenseX – by Dot” is actually a toggle, enabling/disabling IntellisenseX; however the occasions where it was desirable to have it disabled have been eradicated, so it can be turned on and left on.) 15 | 16 | Then, click on the Options link to open the  IntellisenseX options page in the Thor Configuration form. 17 | 18 | ![](Images/Tweet20a.png) 19 | 20 | On the first page of the IntellisenseX pageframe (“**Filtering**”), select the three options indicated below.  The first two combine to form one of the sweet enhancements of IntellisenseX – the dropdown list is filtered as you type to show only matching entries and the matches can be anywhere in the each row, not just to the leading characters. 21 | 22 | ![](Images/Tweet20b.png) 23 | 24 | The second page (“**Fields**”), controls how field names are displayed in drop down lists. I suggest setting the first two options as shown here and setting the third (“case for field names”) according to your own style. There is further customization available, to be addressed later. 25 | 26 | ![](Images/Tweet20c.png) 27 | 28 | The third page (“**Objects**”) determines when IntellisenseX displays the drop down lists for objects in a visual class (THISFORM or THIS) or PRG-based class.  Originally, you will want to use the default FoxPro Intellisense for SCXs and VCXs.  Without some additional configuration, IntellisenseX is simply too ponderously slow for objects in SCXs and VCXs.  However, once you have created your Custom Keyword List (see TWEeTs  [#19: Deficiencies in IntellisenseX (and how to avoid them) … The Custom Keyword List](Tweet_19.md)), you will want to select the second option (IntellisenseX). 29 | 30 | ![](Images/Tweet20d.png) 31 | 32 | The fourth and last page (“**Display**”) controls the display of the dropdown list used in IntellinsenseX. Be careful not to set the Display Count too large as you can get undesirable behavior if the dropdown list can’t fit either above or below the current screen position.  This setting should not matter too much, however, as you become familiar with IntellisenseX, since the filtering (set on the first page) will rapidly reduce your list to only a few entries. 33 | 34 | ![](Images/Tweet20e.png) 35 | 36 | Having set these few options, you have enough to begin using IntellisenseX.  There are a number of features immediately available for you to take advantage of, described in earlier TWEeTs: 37 | 38 | * IntellisenseX recognizes aliases for VFP tables created a number of different ways.  See [#11 IntellisenseX: Aliases for VFP Tables](Tweet_11.md). 39 | * A unique IntellisenseX feature provides a drop-down list for all fields in all tables referenced in FROM and JOIN statements in SQL statements. See  [#13 New (hidden) IntellisenseX Feature](Tweet_13.md). 40 | * IntellisenseX recognizes objects referenced in code in a variety of formats and provides dropdown lists for them (including the familiar native LOCAL … AS … command).  See [#14 IntellisenseX for Objects](Tweet_14.md). 41 | 42 | In addition, a number of other significant enhancements are available after some further configuration. 43 | 44 | * Creating the “Custom Keyword List” eliminates the problem in referencing objects in VCXs and SCXs (noted earlier in the description of the “**Objects**” page) and creates a uniform list of words used throughout your applications (overriding the select of field names described above in the “**Fields**” page). See TWEeTs  [#19: Deficiencies in IntellisenseX (and how to avoid them) … The Custom Keyword List](Tweet_19.md) and [#16 Cuord Listom Keywst for Field Names](Tweet_16.md). 45 | * You can obtain the list of field names from your SQL Server tables when creating SQL statements (including those within TEXT/ENDTEXT blocks).  See [#10 IntellisenseX: Field names from SQL Server Tables](Tweet_10.md). 46 | * You can create local aliases for table or object names that apply throughout a specific procedure (these have the same scope as local variables).  See [#17: Using Local Aliases in IntellisenseX](Tweet_17.md) .  (See also note below.) 47 | * You can create global aliases for table or object names that apply throughout all  your applications, using the _Alias Dictionary_ (a free table)   See [#15 The Alias Dictionary](Tweet_15.md).  (See also note below.) 48 | * You can create aliases that apply within a form or class, creating dropdown lists for nested objects, such as “This.oBusObj” and “This.oBusObj.oData”and “This.oBusObj.oJobs.oData”.  See [#18: IntellisenseX for Nested Objects](Tweet_18.md).  (See also note below.) 49 | 50 | _Note:_ IntellisenseX treats tables (whether VFP tables or SQL Server tables) merely as a special type of object, one where each member has a data type and (possibly) width.  Thus, in all cases where you read “object” in any of the references above, understand that the object could be an actual VFP object or the fields referenced in a table. The references to “oData” in the last bullet point above can actually be references to the field names related to a business object. 51 | 52 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 53 | -------------------------------------------------------------------------------- /NewsItems/Item_47.md: -------------------------------------------------------------------------------- 1 | **IntellisenseX: New Thor Tools and Hidden Gems** 2 | --- 3 | 4 | ### #47, 2023-01-27 5 | 6 | #### New Thor Tools 7 | The list of Thor tools that use the IntellisenseX dropdown listbox has been greatly expanded. Like all Thor tools, you can make them accessible by assigning a hot key, adding them to a pop-up menu, or any of the other options that Thor provides for executing a tool. 8 | 9 | | Thor Tool | Description | 10 | | --- | ----------- | 11 | | Dropdown Procedures List | List of all PRGs and procedures/functions defined in PRGs found in "Set Procedure to"| 12 | | Dropdown Constants List | List of all defined constants created by #Define or #Include statements | 13 | | Dropdown Table Names | List of all tables in the path| 14 | | Dropdown Intellisense scripts | List of native Intellisense custom scripts| 15 | | AutoComplete | List of all names used in code window (or what is highlighted there)| 16 | | Dropdown Form Names in Active Project | List of all form names in the Active Project| 17 | | Dropdown Report Names in Active Project | List of all report names in the Active Project| 18 | | Dropdown Aliases | List of all aliases used in current data session 19 | | DBC Tables by !| Assigns hot key ! so that typing in the name of a database followed by ! gives a popup of the names of the tables and views in the database.| 20 | 21 | #### Hidden Gems #### 22 | Thor tool **Browse Alias Dictionary** provides some very powerful and almost universally overlooked features for getting dropdowns of business objects and data objects. IntellisenseX provides many features for getting dropdown lists of what are essentially local objects; this is documented elsewhere and available simply by using IntellisenseX. The Alias Dictionary extends that by recognizing objects that are more "universal" throughout an application. 23 | 24 | Here's an example of the Alias Dictionary that we'll use to demonstrate some of the power that is available. 25 | 26 | ![](Images/Item_47_SampleAliasTable.png) 27 | 28 | ##### Business Object Examples 29 | 30 | * Example #1 is that of an object that is referenced globally in code. Here's the definition in the table for one such object named goKTrack: 31 | 32 | ![](Images/Item_47_goKTrack.png) 33 | 34 | The field _Table_ above contains the definition of the class for goKTrack. The curly braces indicate a class definition where the name of the class and the class library are separated by a comma. _(Note: to obtain the contents of the dropdown, the class is instantiated using NewObject, but the Init does not fire.)_ 35 | 36 | ![](Images/Item_47_goKTrackExample.png) 37 | 38 | * Example #2 is much like #1, except that the Alias is actually a compound name (i.e., with dots): 39 | 40 | ![](Images/Item_47_oAppDotoAdmin.png) 41 | 42 | * Example #3 is a generalized version of #2, using wildcards in both the _Alias_ and the the _Table_ fields. The wildcard in the _Table_ field is replaced with whatever matches the wildcard in the _Alias_ field. Thus, this would cover example #2 as well as handling similar objects like _oApp.oUser_ and any other objects contained in _oApp_. 43 | 44 | ![](Images/Item_47_oAppDotoStar.png) 45 | 46 | * Example #4 handles a different issue, where an object can be referenced with different (yet very similar) names. 47 | 48 | - `ThisForm.oNAVSQL` 49 | - `This.oNAVSQL` 50 | - `loNAVSQL` 51 | - `toNAVSQL` 52 | 53 | ![](Images/Item_47_oNAVSQL.png) 54 | 55 | 56 | ![](Images/Item_47_oNAVSQLSample.png) 57 | 58 | * Example #5 is a variant of #3. In this case, the wildcard is interpreted as a table name and passed to a UDF that returns the business object for that table. _(Note: The class should be instantiated using NewObject with a third parameter of 0 so that the Init does not fire.)_ 59 | 60 | ![](Images/Item_47_loTable.png) 61 | 62 | In this case, the _Table_ field contains an executable expression, indicated by the leading 63 | '='. 64 | 65 | ![](Images/Item_47_loTableSample.png) 66 | 67 | ##### Other Examples 68 | 69 | * Example #6 is a continuation of #5, where the business object contains a data object. 70 | 71 | ![](Images/item_47_loStarDotData.png) 72 | 73 | In this case, the _Table_ field contains just the wildcard (assumed to be the file name) 74 | 75 | ![](Images/Item_47_loTableStarDotoData.png) 76 | 77 | * Example #7 handles the case where you have a cursor selected from a table and the cursor name contains the name of the source table. 78 | 79 | ![](Images/Item_47_crsrStar.png) 80 | 81 | ![](Images/Item_47_crsrStarSample.png) 82 | 83 | #### Updates and corrections 84 | 85 | * New: 86 | * New keystrokes: 87 | * **Ctrl+Enter** is a special case that applies when the dropdown list is a list of properties and methods. The second column in the dropdown gives the parameter list, if available. This keystroke selects the current item from the dropdown and pastes the parameter list into edit window as well. 88 | * **Ctrl+C** copies the contents of the second visible column into the clipboard. 89 | * **Ctrl+Z** closes the popup and leaves the text already entered as is, whether it matches anything in the dropdown or not. 90 | * Dropdown box is resizable. 91 | 92 | * Fixed: 93 | * Previously, pressing a dot to cause the dropdown would cause garbage results when the character immediately following is a valid name character. (This would occur, for instance, if entering a table name and dot before an existing field reference.) The dot is now ignored. 94 | * When using the dropdown box for other uses (defined constants, procedures, etc), clicking anywhere in the name before invoking the dropdown moves the cursor to the end of the name and works normally. 95 | * Dropdown box now uses the option for maximum number of items to display. 96 | * Dropdown box shrinks to fit in the VFP screen if necessary. 97 | 98 | ##### Interconnection with GoToDefinition 99 | 100 | It has only been very recently explicitly recognized that there is a very close logical connection between IntellisenseX and GoToDefinition, namely that if IntellisenseX can provide a dropdown list for an object, then GoToDefinition should also be able to work on that object. 101 | 102 | Thus, you will find, in a soon to be released update to GoToDefinition (Feb. 2023), 103 | in all of the cases documented here and all other uses of IntellisenseX, if you can use IntellisenseX on an object, you can also use GoToDefinition on that object. 104 | 105 | This new update to GoToDefinition will take this one step further, related to methods of these objects. Using GoToDefinition on the method will go to that object and the indicated method. 106 | 107 | ![](Images/Item_47_GoToDefinition.png) 108 | 109 | Will modify the class for _goTrack_ and open method _AddCursorToResult_ 110 | 111 | --- 112 | See also [Thor News](../Thor_news.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 113 | -------------------------------------------------------------------------------- /NewsItems/Tweet_21.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #21: Advanced Features: Plug-Ins for [IntellisenseX](https://github.com/VFPX/IntelliSenseX) 2 | === 3 | 4 | There are five [Plug-Ins](../Thor_add_plugins.md) that provide the last type of customization available for [IntellisenseX](https://github.com/VFPX/IntelliSenseX).  Even though they may seem quite obscure at first, they can each provide quite powerful enhancements, far beyond what you might first expect.  Some personal examples are provided to illustrate how they can be used (although these examples are certainly not the only way they can be used). 5 | 6 | To access them, follow these steps: 7 | 8 | 1. Open Tool Launcher 9 | 2. Enter “IntellisenseX” in the filter box 10 | 3. Click on the tool “IntellisenseX – by Dot” in the TreeView on the left. 11 | 4. Click on the Plug-Ins link to open the Plug-Ins Form. 12 | 13 | ![](Images/Tweet21a.png) 14 | 15 | The Plug-Ins form (when accessed this way) shows only those Plug-Ins that apply to IntellisenseX: 16 | 17 | ![](Images/Tweet21b.png) 18 | 19 | There is no natural order to these Plug-Ins (there really is no relationship between them), so they are explored in the order in which they appear in the form, which is alphabetical. Note, however, that for some of them their usage has changed over time, so the names are not necessarily clear explanations of what they do. 20 | 21 | Each of the plug-ins contain comments that explain (or, at least, should explain) the parameters that are passed in and the form of the result. Thus, the explanations here address the general concepts of their usage. 22 | 23 | It can be very helpful to think of these plug-ins as event handlers.  Until you are quite familiar with the use of IntellisenseX, their relevance may be hard to see, just as the relevance of many event handlers for a FoxPro object may be hard to see at first.  Eventually, though, you may come across a situation where IntellisenseX does not provide a dropdown, but you can imagine it would be possible to do so. At that time, search through the list of plug-ins to see which might apply, open it up and dig through the sample code. 24 | 25 | You need not be concerned about when a plug-in is called, just as you are not concerned about when an event handler fires. The plug-in will be called when it is appropriate. 26 | 27 | #### “Data Objects” Plug-In 28 | 29 | This plug-in allows you to identify an object (or table) referenced in some form of nested usage, such as: 30 | 31 | * This.oCustomers 32 | * ThisForm.oBusObj 33 | * ThisForm.oBusObj.oData 34 | * Thisform.oJob.oCustomers.oData 35 | * loJob.oData 36 | 37 | The plug-in is called when IntellisenseX has been able to resolve part of the name (“Thisform” or “Thisform.oBusObj” e.g.,) into a real object but not the member name (“oData” or “oParts”, e.g.) and is called with the object (in a unique structure – see the comments) and the member name as parameters.  The Plug-In can return the appropriate object or table reference, if appropriate. 38 | 39 | Expanding on the previous bullet points: 40 | 41 | * This.oCustomers – if a consistent naming conventions is used for objects (such as “oCustomers” here), the plug-in could take the characters after the “o” and see if there is a business object to handle that name, returning that object. 42 | * ThisForm.oBusObj – similar to the previous item, but the plug-in could look for an property (“cAlias”, e.g.,) that identifies the table for the business object being referenced. 43 | * ThisForm.oBusObj.oData – similar to the previous item, but instead of returning the business object being referenced, returns the alias referred to in the property (“cAlias”), causing the drop down to show the fields from that table. 44 | * Thisform.oJob.oCustomers.oData – the plug-in may be called multiple times to obtain a single dropdown list; in this case, first to resolve “Thisform.oJob”, then “Thisform.oJob.oCustomers”, and finally “Thisform.oJob.oCustomers.oData”. This is transparent to you, however. 45 | * loJob.oData – can provide the dropdown list of fields from the loJob table – if loJob can already have been resolved into an object. That can be done by the next Plug-In, “IntellisenseX”. 46 | 47 | #### “IntellisenseX” Plug-In 48 | 49 | This plug-in allows you to identify an object (or table) based on the entire text that precedes the dot that you entered. That entire text is passed in as a parameter.  50 | 51 | This plug-in is closely related to the “Data Objects” plug-in, and is called in all cases where the “Data Objects” plug-in was unable to return a usable result. The difference between the two is the parameters that are passed in. 52 | 53 | But it can also handle getting “loJob” as a parameter (in this case, the “Data Objects” plug-in is not called).  If “loJob” can be resolved into an object by this plug-in, there will be a dropdown list for loJob. 54 | 55 | This plug-in is also called by PEM Editor when you are setting the values of properties, allowing you to get dropdown lists for tables of data objects when setting a ControlSource. 56 | 57 | #### “New Object” Plug-In 58 | 59 | Use this plug-in when you use a UDF to create objects, instead of NEWOBJECT() or CREATEOBJECT().  In the example below, my personal use of the plug-in allows Intellisense to recognize my use of a UDF named NewSessionObject (which happens to use the same parameters as NEWOBJECT, but this is not necessary). 60 | 61 | ![](Images/Tweet21c.png) 62 | 63 | #### “Open Table” Plug-In 64 | 65 | When IntellisenseX encounters a single (non-nested) name before the dot, it checks whether the name corresponds to an existing alias, or (optionally) the name a of table in your SQL Server database, or the name of a file in the path, in the Data Environment or an open DBC, or (optionally) in the MRU list. All of this is handled by the default version of this plug-in. 66 | 67 | The plug-in is called with the potential table name as its parameter. In my universe, all table names and the folders they are found in are themselves stored in a table, where the alias is used as a key to the table. These tables are only opened by a single UDF which takes the alias as a parameter. My personal version of this plug-in calls this UDF to open the table. 68 | 69 | There are examples of other uses in the comments in the code. 70 | 71 | #### “Spell Field Names” Plug-In 72 | 73 | This plug-in has been essentially superseded by the [Custom Keyword List](Tweet_19.md), but can be used in cases where the Custom Keyword List is not used, is insufficient, or there are other rules for field names (such as project or customer specific rules). 74 | 75 | ******Other IntellisenseX tools****** 76 | 77 | There are a number of other IntellisenseX-related tools that show up in the Tool Launcher when you filter by “IntellisenseX”.  These tools use the same framework developed to give the dropdown lists when you press a dot, but provide other features that are activated differently.  They will be described in the next TWEeT. 78 | 79 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 80 | -------------------------------------------------------------------------------- /NewsItems/Tweet_24.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #24: New Thor Tools 2 | === 3 | 4 | There are nine new tools that have been added in the last month to the Thor Repository: 5 | 6 | * _[Pack VCXs, SCXs, etc. from a project or folder](#T1)_ 7 | * _[Hack Intellisense](#T2)_ 8 | * _[Dropdown Intellisense Scripts](#T3)_ 9 | * _[Keyboard Macro Expansion](#T4)_ 10 | * _[Create SQL Data Dictionary](#T5)_ 11 | * _[Browse SQL Data Dictionary](#T5)_ 12 | * _[MRU Tables](#T9)_ 13 | * _[Toggle PEM Editor Event Handler](#T8)_ 14 | * _[Toggle Debugger](#T7)_ 15 | 16 | ### Pack VCXs, SCXs, etc. from a project or folder 17 | 18 | The new tool _Pack VCXs, SCXs, etc. from a project or folder_ prompts for a project/folder and then packs all the X-files found in that project/folder. 19 | 20 | You can bypass the prompts by invoking the Thor procedure directly: 21 | 22 | [1]  To pack files in the current project: 23 | 24 | ```foxpro 25 | lcOption = ExecScript(_Screen.cThorDispatcher, 'Thor_Proc_PackProject', .T.) 26 | ``` 27 | 28 | [2]  To pack files in a specific project: 29 | 30 | ```foxpro 31 | lcOption = ExecScript(_Screen.cThorDispatcher, 'Thor_Proc_PackProject', cProjectName) 32 | ``` 33 | 34 | [3]  To pack files in a specific folder: 35 | 36 | ```foxpro 37 | lcOption = ExecScript(_Screen.cThorDispatcher, 'Thor_Proc_PackProject', cFolderName) 38 | ``` 39 | 40 | 41 | ### Hack Intellisense 42 | 43 | The new tool _Hack Intellisense_ provides an extremely usable alternative to the native Intellisense Manager (shown below) for working with your custom Intellisense scripts. 44 | 45 | ![](Images/Tweet24a.png) 46 | 47 | I always found the Intellisense Manager page to be remarkably opaque, to the point where I simply gave up trying to add any new scripts to it.  48 | 49 | The tool _Hack Intellisense_ provides a different UI to update your FoxCode table, making everything much clearer. It also provides a number of niceties, including: 50 | 51 | * Filtering by text or type of script (I suggest trying "User" filter) 52 | * Sorting 53 | * Buttons to duplicate or remove a script. 54 | * Buffering of your changes, so that you can commit or revert as desired 55 | * Backing up of your FoxCode table. 56 | * Customizable signature 57 | * "Edit" and "Test" buttons for your more intricate code (in field "data") 58 | 59 | ![](Images/Tweet24b.png) 60 | 61 | In the short time that this tool has been available, I have already found that I am taking advantage of these custom scripts much more frequently. 62 | 63 | There are also plans of enhancing _Hack Intellisense_ to facilitate sharing of scripts that we have each created over time. I will keep you posted of any developments. 64 | 65 | Note also a related tool, _DropDown Intellisense Scripts_, announced last week, which helps you find and use scripts you have created without using this form. 66 | 67 | _Hack Intellisense_ was written by Rick Schummer, with some tweaks by Todd Landrum and myself. 68 | 69 | ### Dropdown Intellisense Scripts 70 | 71 | Announcing a new tool, _Dropdown Intellisense Scripts_, to help you find and use Intellisense scripts created using the Intellisense Manager or the new tool _Hack Intellisense_ . 72 | 73 | This tool works like a number of other "Dropdown" tools as part of IntellisenseX.  It provides a drop-down list of all of the native Intellisense scripts (including any you have added).   74 | 75 | The filtering applies not only to the script abbreviation ("TGO" in the example below) but also its description (if any).  76 | 77 | Selecting any item from the list will cause that item to be expanded, just as normal Intellisense would have expanded it. 78 | 79 | There's also a new wrinkle here -- this works anywhere in a text line, unlike normal Intellisense, which only works at the beginning of a line. 80 | 81 | ![](Images/Tweet24c.png) 82 | 83 | ### Keyboard Macro Expansion 84 | 85 | The new tool _Keyboard Macro Expansion_ is an extension to native Intellisense. Native Intellisense expands custom scripts, but only at the beginning of a line of code in the command window or code window. 86 | 87 | Thus, when I type **TGO** (one of my custom Intellisense scripts) into the command window and follow it by a space, it is expanded by Intellisense to: 88 | 89 | ```foxpro 90 | ExecScript(_Screen.cThorDispatcher, 'Get Option=', 'KEY', 'TOOL') 91 | ``` 92 | 93 | The new tool _Keyboard Macro Expansion_ also expands Intellinsense scripts, but is not limited to doing so at the beginning of a line. 94 | 95 | If I enter the following: 96 | 97 | ```foxpro 98 | lcOption = TGO 99 | ``` 100 | 101 | and then call this new tool (which I have assigned to the hot key Ctrl+I), it expands to: 102 | 103 | ```foxpro 104 | lcOption = ExecScript(_Screen.cThorDispatcher, 'Get Option=', 'KEY', 'TOOL') 105 | ``` 106 | (This works by reading the same definitions from the FoxCode table as used by native Intellisense.) 107 | 108 | There is a second extension, provided in the plug-in for  _Keyboard Macro Expansion_ (see [Plug-Ins](../Thor_add_plugins.md)). The plug-in provides an alternative to the FoxCode table so that you can programmatically evaluate the word that is to be substituted for and replace it as desired.  The sample code in the plug-in demonstrates how 109 | 110 | ```foxpro 111 | loAnything 112 | ``` 113 | becomes 114 | 115 | ```foxpro 116 | Local loAnything as Anything of Anything.prg 117 | ``` 118 | ### Create SQL Data Dictionary 119 | 120 | ### Browse SQL Data Dictionary 121 | 122 | IntellisenseX and Super Browse can both access field names from SQL Tables, as described in  [Thor TWEeT 10](Tweet_10.md). 123 | 124 | The natural way to access these field names is to use a connection string to access the SQL Server database. 125 | 126 | Alternatively, you can create an  [SQL Dictionary](Tweet_10.md#SQLDictionary) that contains the names of all tables and their fields, and IntellisenseX will use those field names even if the SQL database is not available. 127 | 128 | 129 | The name of the SQL Data Dictionary is entered in the Thor configuration form (and note the typo!) 130 | 131 | ![](Images/Tweet24d.png) 132 | 133 | ### MRU Tables 134 | 135 | The new tool _MRU Tables_ provides a dropdown list of MRU tables; the selected table is opened with _Super Browse._ 136 | 137 | Note that all Thor tools that open tables (including _Super Browse_, _Go To Definition_, and others) add any table that they open to the system MRU list for tables 138 | 139 | This MRU dropdown list is also available from the right-click context menu of the “File Search” command button in _Finder_. 140 | 141 | ![](Images/Tweet24e.png) 142 | 143 | ### Toggle PEM Editor Event Handler 144 | 145 | PEM Editor, if open, provides design time event handing. The most familiar use is evaluating the Anchor properties when resizing controls so that a form or class resizes as it would at run time. See the PEM Editor help file for more on this. 146 | 147 | ### Toggle Debugger 148 | 149 | Nothing magic about this one, other than it’s handy to have a single tool that is available on a hot key. 150 | 151 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 152 | -------------------------------------------------------------------------------- /NewsItems/Tweet_25.md: -------------------------------------------------------------------------------- 1 | Thor TWEeT #25: Five New Thor Tools for FoxBin2PRG 2 | === 3 | 4 | There are five new tools in the Thor Repository for working with FoxBin2PRG. 5 | 6 | Four of these tools provide different ways for converting the binary files (“X” files) in a project to their corresponding text files or going the other direction, from the text files to the binary files: 7 | 8 | * _[Convert all binary files to text files](#T1)_ 9 | * _[Convert files with changed internal timestamps](#T2)_ 10 | * _[Convert most recently changed binary files](#T3)_ 11 | * _[Generate binary files from all text files](#T4)_ 12 | 13 | Each of these tools are project-related, as they use the active project, if there is one, or else prompt for the name of the project to work on. 14 | 15 | The other tool creates “SendTo” shortcuts in Explorer so that you can convert to/from text files while working in Explorer. 16 | 17 | * _[Create/Edit FoxBin2Prg "SendTo" shortcuts](#T5)_ 18 | 19 | All of these tools assume that you have downloaded and installed FoxBin2PRG.  This works automatically if you have used Thor’s Check For Updates to download it, as they know exactly where to look for it. Otherwise, you can modify the [Plug-In](../Thor_add_plugins.md) “Get FoxBin2PRG Folder” to point to the folder where you have installed FoxBin2PRG. 20 | 21 | ![](Images/Tweet25a.png) 22 | 23 | Thanks to Mike Potjer, who wrote three of these tools, which inspired the creation of the other two which are based on the file and internal timestamps. 24 | 25 | ### Convert all binary files to text files 26 | 27 | The tool _Convert all binary files to text files_ converts a VFP .PJX file, and all the binary files in the project, to their FoxBin2Prg text format.  This conversion is done through the FoxBin2Prg.EXE, so all your FoxBin2Prg configuration settings will be respected. 28 | 29 | For large projects, this may take a while, so there is a progress bar to demonstrate that it is awake. 30 | 31 | You can run this tool programmatically as well. 32 | 33 | ```foxpro 34 | ExecScript(_Screen.cThorDispatcher, ‘Thor_Tool_Repository_FoxBin2PrgConvertProjectToText’) 35 | ``` 36 | 37 | ### Convert files with changed internal timestamps 38 | 39 | The tool _Convert files with changed internal timestamps_ converts all binary files where the internal timestamps in the rows of the binary file have changed. These timestamps are changed when you use any of the designers (Form, Class, Report, and so on) or when you make replacements using GoFish, so the effect is that the conversion is only performed for the small number of files you have changed since the last time this tool was run. 40 | 41 | This effect is achieved by setting the timestamp on the each text file to match the most recent timestamp on any of the rows in the corresponding binary file. 42 | 43 | This tool can be dramatically faster than _Convert all binary files to text files_ for those projects where most files are not being changed. (For example, it takes about 40 seconds to run _Convert all binary files to text files_ for my largest project, only 2 or 3 seconds to run this tool when I have only changed a handful of files.) 44 | 45 | Note, however, if you hack a file, whether by HackCX or manually, the text file may not be automatically created, as the internal timestamps in the rows of the binary file will not have changed.  There are a number of ways you can correct for this 46 | 47 | * Use tool _Convert most recently changed binary files_ (below). 48 | * Open the binary file in its Designer, make a slight modification to it, and save it. 49 | * Erase the text file manually. 50 | 51 | You can run this tool programmatically as well. 52 | 53 | ```foxpro 54 | ExecScript(_Screen.cThorDispatcher, ‘Thor_Tool_Repository_OptimizedFoxBin2PrgConvertProjectToText’) 55 | ``` 56 | 57 | ### Convert most recently changed binary files 58 | 59 | The tool _Convert most recently changed binary files_ converts the most recently changed external timestamp (such as you see in Explorer).   You can indicate the definition of “most recently changed” to be based either on the number files to change or the number of days since they have changed: 60 | 61 | ![](Images/Tweet25b.png) 62 | 63 | This tool was originally created as a solution to the problem noted above where text files might not be re-created for binary files that have been hacked, but there is no particular reason that this is its only usage. 64 | 65 | You can run this tool programmatically as well. 66 | 67 | ```foxpro 68 | ExecScript(_Screen.cThorDispatcher, ‘Thor_Tool_Repository_ConvertMostRecentToText’) 69 | ``` 70 | 71 | ### Generate binary files from all text files 72 | 73 | The tool _Generate binary files from all text files_ works in the other direction, creating binary files from the text files.  74 | 75 | This tool currently assumes you are using the PJ2 extension for your project text file, but this easy enough to change via a constant in the tool code.  Perhaps in the future the tool can be enhanced to get the extension from an option setting or by reading FoxBin2Prg configuration settings.  All other extensions are handled according to the FoxBin2Prg configuration settings.  76 | 77 | There are limitations with this tool due to the way VFP leaves VCX files in memory, and thus it will try to execute `Clear All`, which is only possible when called from a menu or via hotkey.  The tool will still run from the Tool Launcher or the Thor toolbar, but you will get a warning, and under certain conditions FoxBin2Prg might give you an error message and not regenerate your .VCX files. 78 | 79 | You can run this tool programmatically as well. 80 | 81 | ```foxpro 82 | ExecScript(_Screen.cThorDispatcher, ‘Thor_Tool_Repository_FoxBin2PrgConvertTextToProject’) 83 | ``` 84 | 85 | ### Create/Edit FoxBin2Prg "SendTo" shortcuts 86 | 87 | The tool _Create/Edit FoxBin2Prg "SendTo" shortcuts_ displays a dialog that makes it easy to setup or remove Windows "Send to" shortcuts for the VB scripts included with FoxBin2Prg.  If you already manually created shortcuts in the standard user "Send to" folder, this tool should find them and allow you to edit them. 88 | 89 | ![](Images/Tweet25c.png) 90 | 91 | 1. A default name for the shortcut is displayed in a textbox, allowing you to edit the name directly in this form.  TAB out of the textbox when you finish editing the name, then either 92 | 2. Click the Create button to add the shortcut, if it doesn't already exist, or 93 | 3. Click the Save button to update the name if the shortcut already exists. 94 | 95 | ![](Images/Tweet25d.png) 96 | 97 | After clicking the Create button, 98 | 99 | 1. The caption will change to Edit, allowing you to edit any other settings of the shortcut, and 100 | 2. The shortcut will now appear under the "Send to" context menu in Windows Explorer. 101 | 102 | The Edit button opens the Windows file properties dialog, where you can edit any settings of the shortcut. 103 | 104 | ![](Images/Tweet25e.png) 105 | 106 | The Remove button simply deletes the shortcut, moving it to the recycle bin.  There is a non-visual class in the Thor_Tool_FoxBin2PrgCreateShortcuts.PRG which performs all the real work of this tool, so if you want to create your own version of the tool with a different interface, or no interface at all, it should be pretty easy to do.  There is some code commented out in the .PRG which demonstrates creating all the shortcuts programmatically. 107 | 108 | See also [History of all Thor TWEeTs](../TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#%21forum/FoxProThor). 109 | -------------------------------------------------------------------------------- /NewsItems/Old Items.md: -------------------------------------------------------------------------------- 1 | ![](Images/Thor.png)![](Images/Thor_news.png) 2 | 3 | Tool manager for FoxPro 4 | === 5 | [Thor Forum](http://groups.google.com/group/FoxProThor) 6 | 7 | [Thor Videos](Thor_videos.md) 8 | 9 | [Thor TWEeTs](TWEeTs.md) 10 | 11 | ![](Images/Thor_greenline.png) 12 | 13 | **New Thor Tools and [SuperBrowse](Thor_superbrowse.md) Enhancements** 14 | --- 15 | 16 | ### #42, 2015-11-30 17 | 18 | A number of new Thor tools are available in the Thor Repository. 19 | 20 | * 'Toggle tabs in pageframe' – It can be quite difficult (OK, cumbersome) to navigate between pages of a pageframe when the tabs are not visible.  Use this tools to toggle the tabs in the current pageframe. 21 | * 'Compare text in two windows' – Use your favorite compare tool to compare the code from two different code windows without exiting FoxPro, as follows: 22 | * Select one text window 23 | * Execute this tool (hot key is recommended) 24 | * Select a second text window 25 | * Execute this tool again 26 |     -- and the contents of the two windows will be compared 27 | 28 | > **Required:**  Thor cannot guess your favorite compare tool, so you must modify the Plug-In so that Thor can call it. The default code for the Plug-in calls Beyond Compare (_personal note: highly recommended!)_ and must be modified to fit your environment. 29 | 30 | * Three new tools for [VFP2Text](http://pfsolutions-mi.com/Product/VFP2Text), a add-on from Frank Perez, Jr. for Beyond Compare, that allow direct comparison of VCXs and SCXs 31 | * 'Download VFP2Text for Beyond Compare V3' 32 | * 'Download VFP2Text for Beyond Compare V4' 33 | * 'VFP2Text Home Page' 34 | 35 | There have been some enhancements to **[SuperBrowse](Thor_superbrowse.md)** as well: 36 | 37 | * As it can be quite cumbersome switching between Expression and Value in the filter box, you can now overwrite the current setting as follows: 38 | * To select Value, use a trailing ‘$’ 39 | * To select Expression, use a leading ‘=’ 40 | * "Value" filters on all selected fields or, if none, all character fields. 41 | * Double-clicking a row (to edit using Dynamic Forms) brings up a read-only form if the table is read-only. 42 | * A new setting allows leading characters from memo fields to be displayed instead of "Memo". 43 | * Double-clicking a memo fields brings up that field alone for editing. 44 | * There are a number of new plug-ins: 45 | * Format field picker -- create alternative formats to those provided on the first page ("Picker") to conform to your own preferences 46 | * Bind column events -- bind events in the grid columns to this class 47 | * Grid context menu -- create context menus for the cells in the grid 48 | 49 | See also [History of all Thor TWEeTs](TWEeTs.md) and [the Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 50 | 51 | --- 52 | 53 | Previous headlines 54 | --- 55 | 56 | **[2015-01-12 : Two New Projects added to VFPX](News_Items\Item_41.md)** 57 | 58 | **[2014-01-04 : Go To Definition](TWEeTs\Tweet_27.md)** 59 | 60 | **[2014-12-22 : Three New Thor Tools](TWEeTs\Tweet_26.md)** 61 | 62 | **[#38, 2014-12-17 Two New Projects added to VFPX](#Headline38)** 63 | 64 | **[#37, 2014-11-30 TWEeT #25: Five New Thor Tools for FoxBin2PRG](TWEeTs\Tweet_25.md)** 65 | 66 | **[#36, 2014-11-25 TWEeT #24: Nine New Thor Tools](TWEeTs\Tweet_24.md)** 67 | 68 | **[#35, 2014-11-17 TWEeT #23: Buffer Overrun Detected!](TWEeTs\Tweet_23.md)** 69 | 70 | **[#34, 2014-06-11 TWEeT #22: Related IntellisenseX Tools](TWEeTs\Tweet_22.md)** 71 | 72 | **[#33, 2014-06-04 TWEeT #21: Advanced Features: Plug-Ins for IntellisenseX](TWEeTs\Tweet_21.md)** 73 | 74 | **[#32, 2014-05-29 TWEeT #20: Quick Start Guide to IntellisenseX](TWEeTs\Tweet_20.md)** 75 | 76 | **[#31, 2014-05-21 TWEeT #19: Deficiencies in IntellisenseX (and how to avoid them) … The Custom Keyword List](TWEeTs\Tweet_19.md)** 77 | 78 | **[#30, 2014-05-10 TWEeT #18: IntellisenseX for Nested Objects](TWEeTs\Tweet_18.md)** 79 | 80 | **[#29, 2014-04-29 TWEeT #17: Using Local Aliases in IntellisenseX](TWEeTs\Tweet_17.md)** 81 | 82 | **[#28, 2014-03-03 TWEeT #16: Custom Keyword List for Field Names](TWEeTs\Tweet_16.md)** 83 | 84 | **[#27, 2014-02-24 TWEeT #15: IntellisenseX and the Alias Dictionary](TWEeTs\Tweet_15.md)** 85 | 86 | **[#26, 2014-02-17 TWEeT #14: IntellisenseX for Objects](TWEeTs\Tweet_14.md)** 87 | 88 | **[#25, 2014-02-10 TWEeT #13: New (hidden) IntellisenseX Feature](TWEeTs\Tweet_13.md)** 89 | 90 | **[#24, 2014-02-03 TWEeT #12: IntellisenseX by Dot or by Hot Key?](TWEeTs\Tweet_12.md)** 91 | 92 | **[#23, 2014-01-27 TWEeT #11: IntellisenseX: Aliases for VFP Tables](TWEeTs\Tweet_11.md)** 93 | 94 | **[#22, 2014-01-20 TWEeT #10: IntellisenseX: Field Names from SQL Server Tables](TWEeTs\Tweet_10.md)** 95 | 96 | **[#21, 2014-01-13 TWEeT #9: Extract to Variable and Extract to Constant](TWEeTs\Tweet_09.md)** 97 | 98 | **[#20, 2014-01-05 TWEeT #8: Creating Properties and Methods (#3)](TWEeTs\Tweet_08.md)** 99 | 100 | **[#19, 2013-12-18 TWEeT #7: Creating Properties and Methods (#2)](TWEeTs\Tweet_07.md)** 101 | 102 | **[#18, 2013-08-26 Thor Version 1.40 released: Thor ToolBar](#Headline18)** 103 | 104 | **[#17, 2013-06-23 New VFPX Project: Finder](#Headline17)** 105 | 106 | **[#16, 2013-03-31 New Video: 50 Ways to Run a Thor Tool](#Headline16)** 107 | 108 | **[#15, 2012-03-05 New Thor Tool: AutoComplete](#Headline15)** 109 | 110 | **[#14, 2012-01-16 Thor videos available from Thor menu](#Headline14)** 111 | 112 | **[#13, 2012-01-05 Thor's Tool Launcher: The one tool you must use](#Headline13)** 113 | 114 | **[#12, 2012-11-16 Thor menus provide access to Discussion Forums and Change Logs](#Headline12)** 115 | 116 | **[#11, 2012-11-10 Online FoxPro Users Group (OFUG) created](#Headline11)** 117 | 118 | **[#10, 2012-10-14 New VFPX Project: FoxcodePlus](#Headline10)** 119 | 120 | **[#9, 2012-10-06 Easy access to all VFPX home pages](#Headline9)** 121 | 122 | **[#8, 2012-09-30 IntellisenseX released as a VFPX project](#Headline8)** 123 | 124 | **[#7, 2012-09-19 All VFPX projects can be downloaded from Thor](#Headline7)** 125 | 126 | **[#6, 2012-09-16 Use the Thor discussion group](#Headline6)** 127 | 128 | **[#5, 2012-09-10 IntellisenseX released](#Headline5)** 129 | 130 | **[#4, 2012-09-09 Data Explorer is now a Thor tool](#Headline4)** 131 | 132 | **[#3, 2012-09-04 New VFPX Projects: Dynamic Forms & Data Explorer](#Headline3)** 133 | 134 | **[#2, 2012-08-30 Join the Thor Beta discussion group](#Headline2)** 135 | 136 | **[#1, 2012-08-25: Introducing Thor News](#Headline1)** 137 | 138 | --- 139 | 140 | Two New Projects added to VFPX 141 | --- 142 | 143 | #### #41, 2015-01-12 144 | 145 | 146 | Two new projects have been added to VFPX and are available from Check For Updates. 147 | 148 | * [ThemedTitleBar](https://github.com/VFPX/ThemedTitleBar) -- The TitleBar of a VFP form displayed ‘In Screen’ or ‘In Top-Level Form’ looks a bit outdated nowadays, at least running in Win8 and compared to Office 2013 or Visual Studio 2013. The goal of this project is to provide a modern drop-in replacement for the default TitleBar, requiring no code changes to existing forms. 149 | * [VFP 9 SP2 Hotfix 3 Download](https://github.com/VFPX/VFP9SP2Hotfix3) is the most recent hotfix for VFP 9 SP2. The hotfix includes all three hotfixes released for VFP 9 SP2 150 | 151 | 152 | See also [History of all Thor TWEeTs](TWEeTs.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 153 | 154 | Two New Projects added to VFPX 155 | --- 156 | 157 | #### #38, 2014-12-17 158 | 159 | 160 | Two new projects have been added to VFPX and are available from Check For Updates. 161 | 162 | [VFP Runtime Installers](https://github.com/VFPX/VFPRuntimeInstallers) contains the runtime installers for VFP versions 6 thru 9 (since they are no longer available from Microsoft’s website) 163 | [StripeX](http://github.com/VFPX/StripeX) is a wrapper class for working with Stripe.com. 164 | 165 | 166 | See also [History of all Thor TWEeTs](TWEeTs.md) and the [Thor Forum](https://groups.google.com/forum/?fromgroups#!forum/FoxProThor). 167 | 168 | --- 169 | 170 | Thor Version 1.40 released: Thor ToolBar 171 | --- 172 | 173 | #### #18, 2013-08-26 174 | 175 | 176 | Added the Thor ToolBar. Tools may be added to the Toolbar may using the checkbox shown in the Thor Configuration form, below (and also available in the Tool Launcher.) TBL 177 | 178 | ![](Images/Thor_SNAGHTMLf389404.png) 179 | 180 | When you add a tool to the Thor Toolbar, you can select a caption for the tool or select an image to represent it. In the sample below, abbreviated captions are used. 181 | 182 | ![](Images/Thor_SNAGHTMLf3b4e2e.png) 183 | 184 | The toolbar’s size, positioning, and docking, persist from one session to the next. (Truth be told, persisting the docking has been problematic.) 185 | 186 | --- 187 | 188 | New VFPX Project: Finder 189 | --- 190 | 191 | #### #17, 2013-06-23 192 | 193 | 194 | The new VFPX project *Finder* is a powerful search tool to find forms and classes. It searches either a project or folder (with sub-folders) for names of files or classes. 195 | 196 | Files or classes can be opened by double-clicking and there are numerous other options available from the context menu for rows in the grid. 197 | 198 | When Class Search is used, the classes found can be dragged/dropped onto forms or classes being edited. 199 | 200 | See the [Finder Home Page](https://github.com/VFPX/Finder) and watch the [Finder introductory video](http://www.youtube.com/watch?v=uL4a9gsCLlk&feature=youtu.be) (11:25). 201 | 202 | ![](Images/Thor_News_SNAGHTML3cdc777.png) 203 | 204 | --- 205 | 206 | Thor videos available from Thor menu 207 | --- 208 | 209 | #### #14, 2013-01-16 210 | 211 | 212 | There are already a number of videos explaining features of Thor and there are more to come. Follow the link from the Thor menu to the list of all Thor videos. 213 | 214 | ![](Images/Thor_news_image_thumb_4.png) 215 | 216 | --- 217 | 218 | Thor's Tool Launcher: The one tool you *must* use 219 | --- 220 | 221 | #### #13, 2013-01-05 222 | 223 | 224 | Thor’s Tool Launcher uses a simple screen that allows you to browse through all the Thor tools by keyword, to read their descriptions or visit their home pages, to set their options, and, most importantly, to run them. It also helps you to organize the tools that you use most to make them easily accessible. 225 | 226 | Thor suffers from an over-abundance of tools – there are so many that it may seem impossible to find 12ich tools are of interest to you. The Tool Launcher simplifies that search. 227 | 228 | Watch [this short video](http://youtu.be/2ttBR9vQqew) (7:57) to learn all about it. 229 | 230 | --- 231 | 232 | Thor menus provide access to Discussion Forums and Change Logs 233 | --- 234 | 235 | #### #12, 2012-11-16 236 | 237 | 238 | The Thor menu has been changed to provide access to a number of related Discussion Forums. 239 | 240 | These forums are the preferred form of communication about these tools, rather than private emails, or using the Universal Thread, Foxite, or any other on-line forums. 241 | 242 | ![](Images/Thor_forums.png) 243 | 244 | 245 | Change logs for the various tools and components of Thor are now available, as well as a link to the never ending list of Thor ERs. 246 | 247 | ![](Images/Thor_news_image_thumb_5.png) 248 | 249 | --- 250 | 251 | Online FoxPro Users Group (OFUG) created 252 | --- 253 | 254 | #### #11, 2012-11-10 255 | 256 | 257 | A new Online Foxpro User Group is starting up. For more information, join the Google group at[ https://groups.google.com/forum/?fromgroups#!forum/ofug](https://groups.google.com/forum/?fromgroups#!forum/ofug). 258 | 259 | Meetings will be held the 3rd Tuesday of each month at 8:30 Eastern Standard Time via GotoMeeting.com or equivalent. 260 | 261 | Details about how to join the meeting will be published on the group forum (see link above) immediately before the me1ting is to start. 262 | 263 | We intend to record the meeting and make it available on-line for those unable to attend. 264 | 265 | Next Meeting: Tuesday, November 20th, 8:30 PM Eastern Time (0130 UTC Wednesday, November 21) 266 | 267 | Presenters: 268 | 269 | Matt Slay - Dynamic Forms 270 | Jim Nelson - PEM Editor and related tools 271 | 272 | --- 273 | 274 | New VFPX Project: FoxcodePlus 275 | --- 276 | 277 | #### #10, 2012-10-14 278 | 279 | 280 | The new VFPX project [FoxcodePlus (Beta 1)](https://github.com/VFPX/FoxcodePlus) is available from Check For Updates. 281 | 282 | This project is ***not*** related to IntellisenseX, another VFPX project, although both provide Intellisense enhancements. FoxCodePlus provides a wider range of features and includes some of the features provided by IntellisenseX. Although not yet tested, it appears that the two may be used concurrently. 283 | 284 | After downloading (which includes both the code and documentation), you can use the Thor menu pad in the system menu to 10en the folder in which these components are installed: 285 | 286 | ![](Images/Tweet10_foxcodeplus.png) 287 | 288 | --- 289 | 290 | Easy access to all VFPX home pages 291 | --- 292 | 293 | #### #9, 2012-10-06 294 | 295 | 296 | Thor now provides ready access to the home pages for all VFPX projects, available from the Thor menu pad. 297 | 298 | ![](Images/Tweet9_vfpxp9jects.png) 299 | 300 | --- 301 | 302 | IntellisenseX released as a VFPX project 303 | --- 304 | 305 | #### #8, 2012-09-30 306 | 307 | IntellisenseX has been released as a VFPX project. 308 | 309 | *IntellisenseX* refers to a suite of Thor Tools that provide functionality similar to native Intellisense. These tools display lists of available variable names, field names, or members (properties, events, methods, and objects) while you type code, just like Intellisense. However, they cover those areas that Intellisense forgot (such as the list of field names in a table when editing in a code window) and provide8ew capabilities, available through customization, such as displaying the list of field names in an SQL table. 310 | 311 | Visit the [IntellisenseX home page](https://github.com/VFPX/IntelliSenseX) and also watch the [Intellisense training videos](https://github.com/VFPX/IntelliSenseX#videos). 312 | 313 | IntellisenseX is available from Check For Updates. 314 | 315 | All VFPX projects can be downloaded from Thor 316 | --- 317 | 318 | #### #7, 2012-09-19 319 | 320 | The current version of all VFPX projects can now be downloaded directly from Check For Updates. 321 | 322 | The projects listed in Check For Updates are listed alphabetically within these five groups:71. Projects that you have already downloaded for which there is a more current version. (see #4) 323 | 1. Projects that you have not downloaded which have had updates in the last three months 324 | 1. All other projects that you have not downloaded 325 | 1. Projects that you have already downloaded and which are current 326 | 1. All projects marked as “never update”. This takes precedence over any of the categories above. 327 | 328 | --- 329 | 330 | Use the Thor discussion group for comments, suggestions, bug reports, etc. 331 | --- 332 | 333 | #### #6, 2012-09-16 334 | 335 | Use the “Community / Discussions” menu item in the Thor menu pad to send comments, suggestions, bug reports, and so on to the [Thor Discussion Group](http://groups.google.com/group/FoxProThor). You are invited to become a member of the group so that you can see what is going on in the land of Thor. 336 | 337 | ![](Images/Thor_community.png) 338 | 339 | Two things of note: 340 | 341 | * You can email discussion questions (with screenshots) directly to: 342 | 343 | [foxproThor@googlegroups.com](mailto:foxproThor@googlegroups.com) 344 | 345 | *When reporting bugs, please provide as much information as possible, including screenshots. Any information you can provide (such as an image of the debugger, etc.) will be greatly appreciated. 346 | 347 | --- 348 | 349 | IntellisenseX released 350 | --- 351 | 352 | #### #5, 2012-09-10 353 | *IntellisenseX* refers to a suite of Thor Tools that provide functionality similar to native Intellisense. These tools display lists of available variable names, field names, or members (properties, events, methods, and objects) while you type code, just like Intellisense. However, they cover those areas that Intellisense forgot (such as the list of field names in a table when editing in a code window) and provide new capabilities, available through customization, such as displaying the list of field names in an SQL table, as shown below. For a full description, see the [IntellisenseX Home Page.](https://github.com/VFPX/IntelliSenseX) 354 | 355 | ![](Images/Thor_News_SNAGHTMLf871ea8_thumb1_thumb_2.png) 356 | 357 | --- 358 | 359 | Data Explorer is now a Thor tool 360 | --- 361 | 362 | #### #4, 2012-09-09 363 | Data Explorer 3 is now available as a Thor Tool. This means that you can choose to access it by hot key by assigning the hot key in the Thor configuration form. 364 | 365 | ![](Images/Thor_News_SNAGHTML1f93281e.png) 366 | 367 | --- 368 | 369 | New VFPX Projects: Dynamic Forms & Data Explorer 370 | --- 371 | 372 | #### #3, 2012-09-04 373 | Two new VFPX projects have been created in the last few days and are available from Check For Updates: 374 | 375 | * [Dynamic Forms](https://github.com/mattslay/DynamicForms) 376 | * [Data Explorer 3](https://github.com/rschummer/DataExplorer) 377 | 378 | After downloading, you can use the Thor menu pad in the system menu to open the folder in which these components are installed: 379 | 380 | ![](Images/Tweet10_foxcodeplus.png) 381 | 382 | --- 383 | 384 | Join the Thor Beta discussion group. 385 | --- 386 | 387 | #### #2, 2012-08-30 388 | 389 | **The [Thor Beta discussion group](https://groups.google.com/forum/#!forum/foxprothorBeta)** is intended for discussions of features currently under development for Beta versions of Thor, the Thor Repository, and PEM Editor. 390 | 391 | All other Thor issues should be directed to the [Thor discussion group](https://groups.google.com/forum/#!forum/foxprothor). 392 | 393 | To use the Beta version for Thor, download [Thor Repository Beta Updater.Zip](http://vfpxrepository.com/dl/thorupdate/Tools/Thor_Repository/Beta/Thor_Update_Thor_RepositoryBeta.zip) and unzip it into this sub-folder of the folder where you have installed Thor: **Thor\Tools\Updates\My Updates** 394 | 395 | Thereafter, you will see a record for "Thor Repository Beta" when you run "Check For Updates". 396 | 397 | --- 398 | 399 | Introducing Thor News. 400 | --- 401 | 402 | #### #1, 2012-08-25 403 | 404 | This is the first installment of the Thor News, which will notify you of changes and updates to Thor. It will also, from time to time, explore some of the more interesting tools found in Thor. 405 | 406 | The latest news will be brought to you: 407 | 408 | * each time that you run Check For Updates 409 | * once a week when you execute RunThor. 410 | 411 | You can change these settings in the Thor Configuration form: 412 | 413 | ![](Images/Thor_configuration.png) 414 | --------------------------------------------------------------------------------