Idea 6 Item 131 Feat 8 Fix 14 Bug 81 Milestone 8 STATIONBASE, DESKTOP EDITION, DEVELOPMENT NOTES: ------------------------------------------------ TO DO: ======= [Item 112 (2021-11-07)] Create install packages: * Windows 64-bit * Create a .zip file structure * Create .zip file * Make available for Download - Linux 64-bit [Milestone 5 (2022-01-09)] == VERSION 1.00 == ROADMAP FOR NEXT MAJOR RELEASE: [Item 126 (2021-12-31)] Add change-detection to all fields on the Station Details screen: - Exit handler for each field, to compare with the orignal record - Routine to: - Set the Changed flag - If Station Record can be saved, then - Enable the Save button - Save resets the Changed flag and disables the save button - Reset resets the Changed flag flag and disables the save button - Back resets the Changed flag [Item 127 (2022-01-22)] Modifications to Station Record - Add Station Email field - Add Station Website link - Add Streaming link - Make it a live link - Duplicate and Modify the record specification - Duplicate and modify the DAOs - Modify the UI - One-time conversion routine [Item 101 (2021-02-27)] Make the Equipment Manager proper separate from the one in EquipSets Manager Make it accessible from the Settings Menu. Should be a relatively straightforward copy job. Check adjacent routines for any exit code. [Item 108 (2021-11-05)] Enable the Imports page - Add support for Radio Bands - Update the import routines = Thoroughly test the code [Idea 3 (2021-02-19)] Consider renaming Frequency and Power "Types" to "Multipliers" ("Mul"). [Item 36] Add a drop-down menu to the Home Screen. Add a right-click menu to the Home screen datagrid. In Progress. Ongoing. [Idea 6 (2022-01-09)] Advanced Search. - Hit the button; a window opens - Search individual fields - Have a memo box which lists queries: - [Field Name] = "value" - AND [Field Name] <> "value" - OR ( [Field Name] = "value" AND [Field Name] >= "value" ) - Query button dumps back to Home screen; custom search is conducted; results displayed [Idea 5 (2021-11-24)] Map display Start with simple Mercator type # Manipulable on all three axes Terminator Land Masses The basic math is easy enough; mapping stations should be relatively easy. Digitizing the world, and political outlines, will be tougher. #- Investigate GIS-type data sources. - Get an appropriately sized mercator world image [Feat 6 (2018-10-28)] Make some screens adjustable in size - Have to adjust onscreen elements accordingly - Memorize the screen choices. [Item 74 (2018-11-01)] Spruce up the pages; make them better-looking [Item 33 (2018-09-09)] Come up with help pages and a sneak to home [Feat 1 (2018-09-09)] Test feasibility of connecting to, say, mwlist.org for station idents or other data. [Feat 7 (2020-11-03)] Implement binary operations for all list-based items: - Start with a binary seek. - THOROUGHLY whiteboard the algorithms first. [Item 107 (2021-11-05)] Implement the [Delete Dataset] button on the Settings page. Double-confirm before deleting the dataset. [Item 109 (2021-11-05)] Enable the Search/Replace page - Add support for radio bands - Ensure, when replacing Locations or EquipSets, that stations also are updated - Thoroughly test code [Item 125 (2021-12-23)] Change frequency-handling in the main display - Background will alternate with frequency; white and green [Milestone 4 (2021-12-21)] == VERSION 1.50 == [Item 123 (2021-12-21)] Adopt the Pacifica Database Module. Pending availability. THIS WILL BE COMPLICATED. - Create a DAO layer to automate certain operations, like packing/unpacking station records. - Devise a set of routines to convert from the old databases to the new. - Switch over, one module at a time. - Perhaps write a separate conversion program. DEFERRED ITEMS: =============== [Feat 2 (2018-09-09)] Look into providing sunrise/sunset charts, distance calculations between points, SHELVED ITEMS: ============== [Item 118 (Long-Schedule) (2021-12-20)] Fix Geocoordinates: - Store as signed FP strings - One-time fixup routine: - For each station: - Get latitude and convert - Get longitude and convert - Recalculate distance - Repeat the whole thing for Locations [Idea 2 (2021-02-01)] Consider adding a 'fixup' button to the Station Details page - Upon pressing, then LastHeard date, and the Locations and EquipSets records are redone. - This is for after, for example, deleting the most-recent Reception Report, or changing the Location or EquipSet. [Item 73 (2018-11-01)] Go through the remaining pages and certify each as working fully and as expected in all ways. 2018-11-02: In progress. CustomColour, CustomColours, Home, Settings, StationDetails: * Added edit button functionality * Added delete button functionality [Fix 13 (2020-01-31)] When updating a Reception Report, try to update the corresponding log entry - Do not update the Log Entry. Only save if Reception Report record already exists OR - Search for specific Log Entry and update Probably leaning towards the latter [Item 34 (2018-09-09)] Acid test file compatibility with Online Edition. - Test StationBase Online -> Desktop - Test StationBase Desktop -> Online [Item 79 (2020-08-21)] Allow frequency to be a decimal value (up to three) for the frequuency - Field Frequency : Double becomes : QWord - Add new field to StationRec: char FreqType (F,K,M,G,T) This will affect a large number of data routines It will affect the Station Details screen. [Bug 52 (2020-10-22)] Killed 2020-10-30 Problems with Reception Reports: - Fields not cleared between accesses - Wrong default location shown - Wrong location stored [Bug 52 (2020-09-28)] Killed 2020-10-30 In Log Entry Details, default location and equipset are suspect. [Bug 49 (2020-09-25)] Killed 2020-10-30 Blue stations do not appear when highlighted, [Item 86 (2020-09-29)] Replace the indexing routines with one derived from the Binary Insert and Search pages bookmarked. SHELVED 2020-10-17 [Idea 1 (2018-10-22)] Implement write-throttling for databases. Won't save nearly as much time or W&T, but could be worth it. At some point. Shelved 2018-10-28 [Item 130 (2022-02-15)] Fix the stations database: - Iterate through the records, marking as deleted the duplicate station record (1330-WTRX) - Regenerate the freq-call-status index COMPLETED ITEMS: ================ * [Bug 81 (2022-04-10)] 2022-04-10 * Error in stats listing for Reception Reports by Date - Stations showing as LFreq-Call - Should be FreqMul-Call * Cleaned up all reports for formatting. Looking much better. May want to do something about certain reports to line up totals. * [Milestone 7 (2022-04-10)] 2022-04-10 == VERSION 1.00 Beta 7 == * [Milestone 8 (2022-04-05)] 2022-04-05 == VERSION 1.00 Beta 6 == * [Bug 82 (2022-04-05)] 2022-04-05 Access Violation when trying to run first stats report in the list * Investigate * Fixed * [Milestone 4 (2022-01-09)] == VERSION 1.00 Beta 5 == * [Item 131 (2022-03-07)] 2022=03-14 Add a reindexing facility for stations. * Rename the "Delete Subsets" page to "Data Maintenance" * New column of checkboxes for Reindexing * Add reindexing functions - Reindexing Stations takes a while. - Reindexing Reception Reports takes a while. - Reindexing Log Entries takes a while. * Solution: put up the Please Wait.. window and update progress * Tested good 2022-03-15 * [Milestone 6 (2022-02-15)] == VERSION 1.00 beta 4 == * [Item 128 (2022-02-15)] 2022-02-21 Audit pages for duplicate protection where necessary: * Mostly adding Name-field exit handlers (Mark when implemented and tested) * Locations: Location Name Tested. * Equipment Sets: ES Name * Equipment: EquipName * Networks: Abbreviation - Log Entries: Date and Time (search in the local list): NO - Reception Reorts: Date and Time (local stack): NO * Audit the indexing module to be sure that specific items (data, key#) are always used when deleting keys. * [Bug 80 (2022-02-15)] 2022-02-16 Replication as follows: - Duplicate (re-enter) an active station record - Two entries will appear in the index, with obviously differing data - Edit the second entry, changing the Active status - Two indentical entries will now appear, both inactive Believed to have been caused by improperly guarding against duplicate entries, and improperly updating index items. Theory on Mechanism (verified by code inspection): - First station created; legitimate index entry created - Second station created; legitimate index entry created - Second station updates Status; - Update key: - Find the first matching key and delete - Insert a new entry. - This leaves us with two index entries, both pointing to the same record--the new one. - This exactly matches the observed behaviour. Need more-strict duplicate-checking for stations: * If Frequency, Callsign or Active Status changes: * Check for existing index reference to the freq-call-active string * As a final check, when saving, check again to make sure there are no index references. * Investigate. Find out what's happening. I see two identical entries in the list; where do they come from? Working theory, backed by careful code analysis. Problem is updating or deleting an index item. * Tested fully 2022-02-16 * [Item 129 (2022-02-15)] 2022-02-16 Change the way that indexed items are updated and deleted. * Updating: * Ensure that the correct item is being updated! * Deleting: * Ensure that the correct item is being deleted! * Strings * Integers * Floats * Tested good 2022-02-16 * [Milestone 3 (2021-12-21)] == VERSION 1.00 Beta 3 == * [Bug 78 (2022-01-01)] The Networks list does not begin with a '(None)' Add one Realize that this means that the network index changes--be careful! * Going into Network Manager resets the network selection * Fixed Tested 2022-01-09 * [Bug 79 (2022-01-03)] 2022-01-03 CATEGORY: MAJOR This item has priority. Deleting a station does not quite work, if a station with the same callsign has already been deleted. Trace: Home.DeleteStation() calls IO.Station_Delete(with StationID) Seeks the StationID Calls Idx_Delete_Int(with StationID, RecNo) Calls Idx_Seek_Int(StationID) !!! This item may apply to all databases. Be very careful in documenting the fix. Investigate. Nothing appears wrong with the routines. Working conjecture: - Creating a second record with the same freq-call-active status created just one index entry - Deleting caused the wrong record to be deleted; or an entry to continue to appear. - Believe this will be corrected with a data reset. - In any case, the Fetch-Station-List routine has been modified now to reject any station without a valid StationID * [Item 116 (2021-12-20)] 2022-01-03 Straighten out behaviour of the Station Details screen: * Feature Changes; * Can save from screen and remain in screen * Before call: * Calling routine: * Sets the station record- * Sets NewStation * Calls StationDetails.Scatter() * Change all references to RecNo (<>,=) 0 to compare instead with NewStation * Scatter(): * Import most of the code from FormShow() * Sets RecNo * (Dis/En)ableRRGrid * FetchNetworkList() - Fetches Network List and matches it to the network in the station record * MatchNetworkById() (Matches the value in the Network Selector to the ID value) * Screen-show routine: * Does almost nothing, save for some housekeeping * On save: * If NewStation: * Get RecNo from Station_SaveUpdate() and record the value in the station record * EnableRReportsGrid * Do not exit from screen when saved * Set NewStation flag to FALSE * Delete the OriginalStation variable, which has no use * Updates to subsidiary screens will not affect entered data * Data must not be disturbed after entry. * Method: * Before visiting Network Manager: * Remember NetId of selected network * Temporarily assign NetId to Station record * FetchNetworksList() * Restore NetId in Station record * Reset button: * Calls Scatter() * Back button: * if NewStation then challenge the user: * 'Abandon this New Station record without saving?' So: - Study this first, and check on feasibility of implementation - The screen will not automatically scatter the data. This must be done in advance. - Code a routine: Scatter, to transfer values from the StationRec into the fields - Call scatter prior to entering page - Call scatter from the RESET button - Remove all scattering activity from EnterPage routine - Calls to subsidiary screens must refresh any data displayed or available for display. - Known for Networks (Networks Manager button) - Check for Locations and EquipSets - When leaving a screen with a new record, the user will be challenged if the station has not been saved. - Base this on the NewRecord flag - This flag should be set before entry. Its state may change before exit. - Once a new station is saved, the RRM will be made available. - Enable the buttons. - Reset the NewRecord flag All New Features tested 2022-01-03 * [Bug 77 (2021-12-25)] 2021-12-28 In StationDetails, the Network dropdown is not proprerly processed if a hand entry is attempted. - Currently this is done only at gather time, and it automatically rejects hand entries. * Change so that it attempts to match network entries * Also add case-insensitivity for this item. * Also ensure that this done when exiting the field. * 'No match' should yield a reset of the ItemIndex and of the text box. * This has now been done for ComboBox-exit * Do now for actual save * Tested good 2021-12-28 * [Item 125 (2021-12-27)] 2021-12-28 In the main display grid, add a single-click handler to clear the station-search data. * Perhaps, after one iteration through the station-search process, the search data could be cleared. * Tested good 2021-12-28 * [Milestone 4 (2021-12-23)] === VERSION 1.00 Beta 2 === * [Item 120 (2021-12-21)] 2021-12-23 Only allow an Equipment Item to be deleted IF it is not used by EquipSets More complicated due to having to translate equipment types var UCnt, I: LongInt; S: ShortString; UCnt := 0; if EquipSetsCnt > 0 then begin if (Equip.EquipType <> 255) then begin case Equip.EquipType of // 0: Antenna (Loop) 0, 1, 2, 3, 4, 5, 6: for I := 1 to EquipSetsCounter do with listEquipSets^[I] do if (EquipSetID <> 0) AND (AntennaId = EquipID) then Inc(UCnt); // 7: RF Amplifier 7: for I := 1 to EquipSetsCounter do with listEquipSets^[I] do if (EquipSetID <> 0) AND (rfAmpId = EquipID) then Inc(UCnt); // 8: Receiver 8: for I := 1 to EquipSetsCounter do with listEquipSets^[I] do if (EquipSetID <> 0) AND (ReceiverId = EquipID) then Inc(UCnt); // 9: Preamp 9: for I := 1 to EquipSetsCounter do with listEquipSets^[I] do if (EquipSetID <> 0) AND (PreampId = EquipID) then Inc(UCnt); // 10: Recorder 10: for I := 1 to EquipSetsCounter do with listEquipSets^[I] do if (EquipSetID <> 0) AND (RecorderId = EquipID) then Inc(UCnt); // 11: Headphones 11: for I := 1 to EquipSetsCounter do with listEquipSets^[I] do if (EquipSetID <> 0) AND (HeadphonesId = EquipID) then Inc(UCnt); // 12: Filter 12: for I := 1 to EquipSetsCounter do with listEquipSets^[I] do if (EquipSetID <> 0) AND (FilterId = EquipID) then Inc(UCnt); // 99: Other 99: for I := 1 to EquipSetsCounter do with listEquipSets^[I] do if (EquipSetID <> 0) AND (OtherId = EquipID) then Inc(UCnt); end; end; end; if UCnt > 0 then begin S := 'Cannot delete this Equipment Item, as is used by Equipment Set(s),'; ShowMessage(S); end else begin // Extant Code // end; * [Item 122 (2021-12-21)] 2021-12-22 Only allow a Equipment Set record to be deleted IF it is not used by RRs var OKDel: Boolean; UCnt: LongInt; I: LongInt; begin UCnt := 0; OKDel := TRUE; if RRsCnt > 0 then begin for I := 1 to RRsCnt do with listRRs^[I] do if (ReceptionID <> 0) AND (EquipSetID = EID) then Inc(UCnt); if UCnt > 0 then begin ShowMessage('Cannot delete this Location, as it is used in active Reception Reports'); OKDel := FALSE; end; end; if OKDel then begin // Extant Code // end; * [Item 117 (2021-12-20)] 2021-12-22 Only allow a Location record to be deleted IF it is not used by RRs UCnt := 0; OKDel := TRUE; if RRsCnt > 0 then begin for I := 1 to RRsCnt do with listRRs^[I] do if (ReceptionID <> 0) AND (LocID = (LID)) then Inc(UCnt); if UCnt > 0 then begin Dialog('Cannot delete this Location, as it is used in active Reception Reports'); OKDel := FALSE; end; end; if OKDel then begin // Extant Code // end; * [Item 119 (2021-12-21)] 2021-12-21 Only allow a Network to be deleted if it is not used by Stations. if StationsCnt > 0 then begin UCnt := 0; StCall := ''; for I := 1 to StationsCnt do with listStations^[I] do if (StationID <> 0) AND (NetID = (NetID)) then begin Inc(UCnt); if UCnt = 1 then begin if StationCallSign = '' then StCall := StationName else StCall := StationCallSign; StFreq := FreqVal; end; end; if UCnt > 0 then begin S := 'Cannot delete this network, as is used by '; if UCnt > 1 then S += 'a number of stations ('+FloatToStr(StFreq)+'-'+StCall+' and others.)' else S += 'a station ('FloatToStr(StFreq)+'-'+StCall+'.)'; Dialog(S); end else begin // Extant Code // end; end; [Bug 75 (2021-12-20)] The default Location or EquipSet can be lost. * Check on how defaults are handled. * When deleting a Location record, reset the default to TOL (if records), or 0 (if no records) * When saving the first Location record, establish the default Location ID So: * LocationsManager * LocationDetails * EquipSetsManager * EquipSetDetails * [Item 110 (2021-11-05)] Demmery Software website: Register a Domain and procure hosting StationBase Section * Update * [Item 111 (2021-11-07)] Create an install procedure and baseline installation: - Windows - Make a folder StationBase - Copy in StationBaseInstallation.txt - Copy in StationBase.exe and StationBase.ico - Make a folder StationBase\Data - Copy in SystemProperties.ini - Copy in ColourDefs.txt - Make a folder StationBase\Documents - Copy in StationBaseUserGuide.docx - Make a folder StationBase\Exports [The above will constitute a binary .zip file) User Instructions (Windows): - unZIP the contents of StationBase...zip to C:\StationBase - Create a Desktop Shortcut - Paste into menu bar - Linux * [Item 115 (2021-11-13)] 2021-11-13 Insert Copyright notice into the codebase. * [Item 113 (2021-11-07)] 2021-11-07 Set version to 1.0, for release * [Item 105 (2021-10-23)] 2021-11-10 - In Progress 2021-10-23 Author User Documentation - User's Guide - Technical Guide - Mention in the documentation that changing a Location's name will update the location name in all associated Reception Reports and Log Entries is updated. - Mention in the documentation that changing a Location's coordinates will update the Distance in all associated Reception Reports * [Milestone 2 (2021-11-10)] 2021-11-10 StationBase is now installed on the development computer All operations now will continue from that installation * [Fix 14 (2021-11-07)] 2021-11-07 StatsCenter: * Make filenames consistent [Item 114 (2021-11-07)] 2021-11-07 Final debug sweep - Eliminate enter/pop operations [Feat 4 (2018-09-19)] Make the frequency field fixed (internally) Make the frequency field hold a maximum of xxxxxxx.xxx (11 digits) Add the ability to specify the frequency type as "Hz,KHz,MHz,GHz" Store the frequency as the number of Hz. Store in a QWord [Feat 5 (2018-09-21)] Selectable bands - User-definable frequency ranges, and names - Default selection - Band selector in Home screen. [Item 88 (2020-11-28)] Accept yymmdd dates, yyyymmdd dates, and hhmm times in: - ReceptionReportDetails - LogEntryDetails - Simply base it on length: - D: 8 chars or 10 chars - T: 5 chars or 4 chars [Item 76 (2018-11-05)] When a Location's geocoordinates change, update all Reception Report distances from that Location Affecting at least: - LocationDetails - ReceptionReportDetails [Item 77 (2018-11-05)] When a Station's geocoordinates change, update all of its Reception Reports' Distances Will affect at least: - StationDetails - ReceptionReportDetails * [Item 71] Give the system a thorough Alpha Test. [Item 90 (2020-12-25)] Add support for radio bands: * Bands are defined in their own database, and will be as follows: - BandId: LongInt - Name: String30 - Comments: String30 - LowFreqVal: Double - LowFreqType: Byte - LowFreq: Int64 - HighFreqVal: Double - HighFreqType: Byte - HighFreq: Int64 - OldId: LongInt - RecNo: LongInt * Indexed on Name(S), Id(I), LowFreq(S) - Bands will be selectable in a ComboBox on the main screen. Stations will be filtered according to whether their frequency falls into the specified range. * Bands will be editable in Settings. A very simple Band Manager, and a simple Band Details page. * Code DAOs * Add support variables: * Core * Home * Add initialization routines: * Core * Add access to BM through Settings * Code Band Manager page - Del button handler still needs to be coded * Code Band Details page - Add support to Home Page - Test thoroughly - Add support to DataCenter - Add support to DeleteData - Add support to ImportCenter [Bug 58 (2021-01-12)] Catch typed-in items in combo boxes Do some testing, to see how to detect and handle This bug is extensive, and covers at least: * Station Frequency * Station Daytime Power * Station Nighttime Power * Note that Power values ignored should include zero * Reception Report Location * How to handle: if cbLoc.ItemIndex = -1 then begin if fval = '' then error if fval = '(None)' then begin CbLoc.ItemIndex := 0; end else begin if LocationsCnt > 0 then begin Found := FALSE Y := 1 X := Idx_Go_Top(lIdxN) while (X <> 0) AND (NOT Found) do begin LocRec := listLocations^[X] if Pos(fval, Name) > 0 then begin // Got One: cbLoc.ItemIndex := Y Found := TRUE end X := Idx_Next(lIdxN) Inc(Y) end if NOT Found then begin EM := 'Please select a location from the list'#13 PutErrorMsg(EM) end else ClrErrorMsg(EM) end end end * Reception Report Equipment Set * How to handle: Exactly the same as with Location. * Log Entry Frequency - Exactly like StationDetails.Frequency - Field exit - Dropdown exit * Log Entry Location - Exactly like RRDetails.Location - Dropdown exit * Log Entry Equipment Set - Exactly like RRDetails.EquipmentSet * Radio Band frequencies * Exactly like StationDetails.Frequency * Field exit * Dropdown exit - Home: Filter by Location (no error messages; just reset the values) - Home: Filter by Equipment Set (no error messages; just reset the values) - Home: Filter by Radio Band - StationDetails: Network Suggest something like: var T: ShortString; if CbElement.ItemIndex = -1 then begin T := cbElement.Text; if test for string equivalents ... end else begin AddErrMsg('Frequency-type can be typed as h, k, m, g, t; or select a value from the list.'); end; end; also test for empty selection, and set the source value to '0'. * [Item 106 (2021-10-28)] 2021-11-04 Final Operational sweep and logging cleanup Final Operational sweep - Anything that looks suspect - Anything that needs cleaned up on the code side Logging Cleanup - All screens * Home * Stats Center * Reception Report Details * Data Center * IO * NetworksManager * NetworkDetails * EquipSetDetails * EquipmentDetails * EquipmentSetManager * LogManager * Line_Index * LogEntryDetails * LocationsManager * DeleteData * Settings * CustomColours * BandsManager * LocationDetails * StationDetails * BandDetails * CustomColour Code/Program Review: * Settings + Delete Dataset * [Item 107 (2021-10-29)] (Shelved 2021-11-04) Delete Dataset function does not appear to be implemented Implement this function - Equivalent functionality exists in Delete Subsets page For now, disable the button and make it invisible. * Display software version and date on page. * Log Entry Details Ensure that the correct Location ID is being applied to entries. * Equipment Details * Ensure that Equipment Type is handled for manual entries * Frequency Band Details * Ensure that frequency types are handled for manual entries * Station Details * Ensure that lat/long types are handled for manual entries * Reception Report Details * Ensure that Location is handled for manual entries * Ensure that EquipSet is handled for manual entries * Log Manager * Ensure that Location is handled for manual entries * Add an OnEditingDone routine that searches for the text input * Had to adjust the way the value was being handled * Ensure that EquipSet is handled for manual entries * Add an OnEditingDone routine that searches for the text input * Adjust the way the value is handled * Log Entry Details * Ensure that Location, EquipSet, and FreqType are properly handled, and handled for manual entries * For candidate match, list FreqVal+FMag(FreqType) instead of Frequency * Just discovered a major problem with the way Locations and EquipSets are appended to the accum strings * Investigate further * It is as so. Correct this. * Data Center * Ensure that Locations, EquipSets, Radio Band and Format are handled for manual entries * Location Details * Ensure that when Location coordinates change, all Reception Report distances are updated. * Ensure that when Station coordinates change, all Reception Report distances are updated. * All [Add] or [New] buttons must test record numbers before proceeding. * This will affect: * Ensure that the maximums are set somewhere * Home * Custom Colours * Locations Manager * Equipment Sets Manager * Equipment Set Details * Frequency Bands Manager * Station Details * Reception Report Details [Save and New] * Also test LogEntries if cross-posting * Log Manager * Log Entry Details [Save/XPost] * [Save/New] * [Item 80 (2020-09-11)] 2021-10-28 New operational testing: Main Screen: * [Bug 70 (2021-04-27)] 2021-06-05 Main screen elements do not persist with station changes. Selections of Radio Band, etc., are ignored when the page refreshes. This will take some work: var Search Flag, Search String, Sequence Number, Match Found, Sequence Number Found, Partial Match Found - Unset Search flag - Clear combobox items - If RadioBandsCnt > 0 then - At the start of each loop through refeshing, consult the combobox index variable: - if !0 - Set Search Flag - Search String becomes combobox Text - Set Sequence Number to 1 - Scan the item-database, in indexed order. For each item: - Add the name to the combobox items - If the Search Flag is set, then: - If the text contents are an exact match: - Set the Match Found flag - Set the Sequence Number Found variable to the sequence number - Exit loop - Else: - If the text contents contain the search string - Set the Partial Match Found flag - Assign the sequence number to the Sequence Number Found variable - if (Sequence Number Found OR Partial Match Found): - Assign the Sequence Number Found variable to the ComboBox pointer * This has been successfully implemented and tested for Radio Bands. Now implement for: * Locations * Equipment Sets * Tested Successfully 2021-06-05. * [Item 102 (2021-03-01)] 2021-03-01 Implement this feature. * [Idea 4 (2021-02-20)] On the Home Screen, the station count should reflect the number of stations found. * Search * Filter by Location * Filter by EquipSet * [Bug 69 (2021-03-01)] 2021-03-01 Add "Filter by Frequency Band" to home page. Need to add code to: * FormActivate(): populating the combobox * GetList(); sorting out stations * combobox3Select() (new): ShowStations() * Show Active Only * Add * [2020-11-26] Station Count not updating on main screen. * Edit * [Idea 5 (2021-02-20)] (2021-08-10) Add four new variables to the main unit: * CurrStn_Freq * CurrStn_Call * CurrStn_Active * CurrStn_City * Each time the station list is reconstituted, search for those variables; * If match found: * Set the main grid's cursor // - Else clear the variables * When a station is opened: * Store the station's details to the search variables * On save, update the variables in the main page. * When a station is created: * On save, update the variables in the main page. // - When otherwise going off-page: // - Update the variables for the station at the cursor * Tested * Del * [Item 89 (2020-12-10)] Code handler for the Station-Delete button * Delete station record * Delete reception reports (Done automatically) - Station Details: * [2020-12-25] If frequency value entered, combobox is only initialized to Hz. * [2020-11-28] Appears to be some difficulty with the Network on entry; showing one past the actual selection * [2020-11-28] Network ComboBox is not cleared between refreshes * [2020-11-26] Station Count is twice what it should be. Believed fixed 2020-11-26, by supressing an Inc operation in Stations__InsertList(). * [2020-11-07] Network is recorded properly, but incorrectly presented at page entry. Fixed 2020-11-07. * [2020-11-07] Initial last-heard date is not set when crossposted * [2020-11-11] Reception Report Manager needs to be disabled with a new station record * [2020-11-11] Form not setting focus at entry. * Network Manager * R button * Back * Save - Reception Reports Manager: - Add * [2020-11-28] Equipment Set and Location are not being recorded in the station record. * [2020-11-14] EquipSet recorded wrongly * [2020-11-14] Location not displayed properly on entry - Reception Report Details: * Check on saving existing entries. Right now, they're duplicated. * [2020-11-15] Focus not set on entry - [Item 98 (2021-02-16)] Implement this feature * [Bug 68 (2021-02-25)] R button not functional Implement this feature * Location Manager: * [2020-11-15] RunError(201) on exit. ReceptionReportDetails.pas:651. Fixed potential for same in EquipSets Manager. * EquipSet Manager * Save * Save and New [2020-11-17] Second record does not appear to be saved * Consider changing this to a save/exit, followed by a macro to add again in Station Details Implemented 2020-11-26 * Back * [2020-11-25] Upon save, the station record is not updated. * Almost there, but need to update the parent form's Station record. * Edit * [2020-11-15] DClick not functional * Delete * Settings * Locations Manager * Add * Edit * Dclick * Del * Default * Location Details * Back * Save/Back * Reset * EquipSets Manager * Back * New * Edit * DClick * Delete * Default * EquipSet Details * Error message prevents saving. Fix with ErrCnt. Believe fixed 2020-11-02. * Reset focus field on entry * Back * Save/Back * Equipment Manager * Add * Edit * DClick * Delete * Select * Equipment Details * Repaired can't-save bug. It is introduced because the routines check on Length(S). Introducing an ErrCnt variable, and updating the save button accordingly, fixes it. * Reset focus field on entry * Back * Save * Network Manager * Back * Add * Edit * DClick * Delete * Network Details * Remember to reset the focus on entry * Back: Issue no action * Save/Back * Radio Bands Manager * Add * Edit * DClick * [Item 91 (2021-02-14)] 2021-02-15 Implement this feature * Delete * [Item 92 (2021-02-15)] Implement this feature * Simply delete radio band and refresh list * Radio Band Details * Save * Back * Delete Dataset * Edit/Save Operator information * Save * Back * Log Manager * List does not seem to be maintained in correct order. May have to reset the databases. - That fixed it. * Filter by Location * Filter by EquipSet * Back * Search * New * Edit * Delete [] does not delete * [Bug 55 (2020-11-18)] 2020-11-19 Deletions are not working properly in mid-list. Deleting items from indexes should no longer involve adjusting record numbers. Believe fixed by commenting-out the offending sections. Will have to clear all databases. * Log Entry Details: * Location Manager * EquipSet Manager * Quick Find * R * XPost * Save * Save/New * Back * [Item 99 (2021-02-16)] Corrected Code required for: * Date * Time * Frequency * Location * Equipment Set * Stats Center: * Stations by political division and subdivision * Stations by location: Exception at StatsCenter, Line 885. I kind of see what the problem is; it's looking for old-style location markers. * [Bug 59 (2021-02-07)] 2021-02-07 Exception when generating listing of stations by location Examining stations' location string for 'LxxL'; empty string. Convert to the new way. * Stations by EquipSet * [Bug 60 (2021-02-07)] 2021-02-08 Exception when generating listing of stations by Equipment Set Examining stations' EquipSets string for 'ExxE'; empty string. Convert to the new way. * Stations by Network * Stations by DFH * [Bug 61 (2021-02-09)] 2021-02-09 Exception generating list of stations by DFH in StatsCenter.418 * [Bug 62 (2021-02-09)] 2021-02-09 Exception generating list of stations by DFH in StatsCenter.491 * [Bug 63 (2021-02-09)] 2021-02-11 Date First Heard apparently not being recorded in station records * Fixed in ReceptionReportDetails.Save() * Fix stations database Sneak routine at startup For each valid Station: For each valid ReceptionReport: if Date < Station.FirstHeard then Station.FirstHeard := Date end end * [Bug 71 (2021-10-12)] 2021-10-12 Many dates are being missed Sorted it out. (1) Insertion-point variables not being intialized; (2) Bug in insertion routine Tested good 2021-10-12 * RRs by distance: Still some issues. Investigate sorting mechanism. (Working for now) * [Bug 64 (2021-02-15)] 2021-02-15 Distance information not being saved in Reception Reports Implement this * [Item 93 (2021-02-15)] 2021-02-15 Fix the RR's database For each Reception Report: Fetch Station Get Lat and Long Fetch Location Get Lat and Long Calculate distance Update record * [Feat 8 (2021-10-12)] 2021-10-22 * Add Radio Band selector to the Stats Center page Add selected band to each routine's station selector * Stations By Political Division * Stations by Location * Stations by Equipment Set * Stations by Network * Stations by Date First Heard * Reception Reports by Distance * Reception Reports by Date * Reception Reports by Hour * Log Entries by Date * Log Entries by Hour All tested good * RRs by date: Working for now * RRs by hour * Log Entries by date * Log Entries by hour - Data Center * [Bug 74 (2021-10-27)] (2021-10-27) Find a way to filter out (None) entries Find a way to filter out nulls in lists, etc. '(None)' entries are fine. Filtered out ophaned power values, Converted Locations and ES lists to strings of #Id#Id#Id * [Item 104 (2021-10-23)] 2021-10-23 Create new routines to encode strings for output; catch (', "). Convert to HTML entities Convert all output routines to use encoding and quoting with all strings (where appropriate): * Stations * Locations * Equipment Sets * Equipment Items * Networks * Radio Bands * Reception Reports * Log Entries * [Bug 72 (2021-10-23)] 2021-10-23 Running stats, exiting the page, and attempting to access stats again, gives an exception - Clear the memo window when leaving the page Tested good 2021-10-23 * Station Listing * Text * Condensed * CSV * XML * Condensed * Reception Reports Listing * Text * Condensed * CSV * XML * Condensed * Log Listing * Text * Condensed * CSV * XML * Condensed * [Bug 65 (2021-02-16)] 2021-02-19 Corrected Code required for: * for Locations * for Equipment Sets * Format * [Item 100 (2021-02-20)] 2021-10-23 Add support for radio bands - ComboBox right below "for Equipment Sets" Add code in station-selection routine * Start Date * End Date * for Locations * for Equipment Sets * Format * Locations * Text * Condensed * CSV * XML * Condensed * Equipment Sets * Text * Condensed * CSV * XML * Condensed * Equipment * Text * Condensed * CSV * XML * Condensed * Networks * Text * Condensed * CSV * XML * Condensed * Radio Bands * Text * Condensed * CSV * XML * Condensed * [Item 94 (2021-02-16)] 2021-10-23 Implement Radio Bands listings * Modification required to Data Center screen * Modification required for some listing and output types * for Radio Band * {Item 103 {2021-10-22)] Implement this feature * Format * Condensed format * Back * Submit - Import Center: - Locations - Browse - Import - Networks - Browse - Import - Equipment Items - Browse - Import - Stations - Browse - Import - Reception Reports - Browse - Import - Log Entries - Browse - Import - Radio Bands - Browse - Import [Item 95 (2021-02-16)] Implement this feature * Have to add elements to the page - Unique Records Only - Back - Done * Delete subsets * [Bug 73 (2021-10-26)] 2021-10-26 Fix reference to "Export-Data Screen" to "Data Center". * Networks * Locations * Equipment * Equipment sets * Stations * Reception Reports * Log Entries * Radio Bands * [Item 96 (2021-02-16)] 2021-02-25 Implement this feature - Have to add elements to the page * Back * Submit - Search/Replace - Networks - Search - Replace - Equipment - Search - Replace - Equipment Sets - Search - Replace - Locations - Search - Replace [Bug 67 (2021-02-16)] Corrected Code required for: - Start Date - End Date (note correction) - for Locations - for Equipment Sets - Back * [Item 101 (2021-02-25)] [Idea 4 (2021-02-25)] For now, disable the import/export functions. * Disable all Data Center controls, except for "Delete Subsets" - Next release * [Fix 12 (2021-01-29)] 2021-01-31 Add additional date/time formats support * Date: YYYY-MM-DD, plus YY-MM-DD, YYYYMMDD, YYMMDD How to do: function ValidateNumberString(NS: ShortString): Boolean; var R: Boolean; X: Byte; begin R := TRUE; if Length(Trim(NS)) = 0 then R := FALSE else begin X := 1; while (X <= Length(NS)) AND (R) do begin if Pos(NS[X], '0123456789') < 1 then R := FALSE; Inc(X); end; end; Result := R; end; // First, intuit the format of the value, and then extract the Y, M, D strings // - Correct if Y value is two digits; (> 59 ='19' else '20') if Length(FV) = 10 then begin if fVal[5] <> '-' then Error := TRUE else begin if fVal[7] <> '-' then Error := TRUE else begin if ValidateNumberString(fVal) then begin YS := Copy(fVal, 1, 4); MS := Copy(fVal, 5, 2); DS := Copy(fVal, 7, 2); end else Error := TRUE; end; end; end else if Length(fVal) = 8 then begin if fVal[3] = '-' then begin Delete{fVal, 3, 1); if fVal[5] = '-' then Delete(fVal, 5, 1); Delete(fVal, 5, 1); if ValidateNumberString(fVal) then begin YS := Copy(fVal, 1, 2); MS := Copy(fVal, 3, 2); DS := Copy(fVal, 5, 2); YY := StrToInt(fVal); if YY > 59 then YS := '19'+YS else YS := '20'+YS; end else Error := TRUE; end else Error := TRUE; end else begin if ValidateNumberString(fVal) then begin YS := Copy(fVal, 1, 4); MS := Copy(fVal, 5, 2); DS := Copy(fVal, 7, 2); end else Error := TRUE; end; end else if Length(fVal) = 6 then begin if ValidateNumberString(fVal) then begin YS := Copy(fVal, 1, 2); MS := Copy(fVal, 3, 2); DS := Copy(fVal, 5, 2); YY := StrToInt(fVal); if YY > 59 then YS := '19'+YS else YS := '20'+YS; end else Error := TRUE; end else begin Error := TRUE; end if NOT Error then begin YY := StrToInt(YS); if (YY < 1900) OR (YY > 2100) then Error := TRUE else begin MM := StrToInt(MS); if (MM < 1) OR (MM > 12) then Error := TRUE else begin DD := StrToInt(DS); if (DD < 1) OR (DD > DaysInMonth(YY, MM)) then Error := TRUE end; end; end; EM := 'Please enter a valid date from 1900-01-01 to 2099-12-31'; if Error then begin PutErrorMsg(EM); end else begin ClrErrorMsg(EM); end; - Time: HH:MM(5), plus H:MM(4), HHMM(4), HMM(3) This Fix will affect: - ReceptionReportDetails: *Date, *Time - LogEntryDetails: *Date, *Time * [Fix 111 (2021-01-23)] 2021-01-24 Redo the Stations Freq+Call index: (Sneak routine, one-time) - Empty existing index - For each valid database record: - Re-index the Freq+Active+Value key * [Bug 57 (2020-12-26)] 2020-12-26 The database *Save() routines leave the ID value untouched. This has mostly been solved, by tracking the ID counter with the ID, but it will not be accurate if the list ends with one or more deleted entries. [Item 90 (2020-12-10)] Add fields: * Station.FreqVal: Double * Station.FreqType: Byte * Station.DaytimePowerVal: Double * Station.DaytimePowerType: Byte * Station.NighttimePowerVal: Double * Station.NighttimePowerType: Byte * Station.Frequency becomes Int64 * Station.DaytimePower becomes Int64 * Station.NighttimePower becomes Int64 * Delete the PsaPower value and fields - Official values are calculated from (-Val*-Type(magnitude)) * Build a NewStation object to accommodate these values * Code new init routines for NewStations. * Build DAO routines for the NewStation database * Try to transfer to the new database * First backup files * Sneak routine in Main * Comment-out the old station stuff, in several places * DAO routines (incl. headers) * Models * Core * Home * Comment out station_init() and fellows, and replace with NewStation_Init*() * Rename the NewStation IO routines to Station* * Ensure that all index calls are using s*.idx * Clean up Home - initializations, etc. * Add the new fields, and remove the unused, on the appropriate screens * Add/modify appropriate handlers onscreen * Adjust the indexing for stations, to accommodate the new values * Adjust other display routines to handle the new value types * StationDetails * ReceptionReportDetails * [2020-12-14] Remove station data from RRD screen. * LogEntry * Frequency field * Do a last sweep for any freq* or Power* terms being handled, and correct; all units. - Rename the new database and indices, delete old - Test * Decide on station-identification format: 16 chars+Active Flag (1 char)+StationCallsign (max. 10 chars) - Fuck. Going to have to do this for the log, also Frequency can be maximum of 9,999,999,999,999,999 Simply append the callsign to the frequency and pad out = 9,999,999,999,999,999ACFRA * Create Model. * Define in Core. * Establish definite record size for NewLog * Add to Home. * Build DAOs * Majority in place. Create Save routine based on Station_Save(). Add elements to screen, code handlers, clean up code: * LogEntryDetails * LogManager * Official establishment: max. length of frequency fragment is 16 characters. * Fixed latent bug where getList() routines were using *Cnt as a reference; changed to *Counter - Rename logs files, etc. - Comment-out all old Log DAOs and support variables. * Will need to do one reindexing, of station Freq+Active+Callsign index (forgot to add Active) * Conversions completed successfully 2020-12-19 * [Fix 10 (2020-11-29)] Get Location and Equipment-set encoding straightened out: * Think the simplest thing is just to add and search for chr(LocId) This will affect other routines as we get to them * [Bug 56 (2020-11-24)] 2020-11-25 ComboBoxes must be handled differently. An ItemIndex of -1 may be returned. Check for all instances of ItemIndex, and ensure that the tests are appropiate. * [Item 87 (2020-10-17)] 2020-10-19 Replace all binary-based insert and seek routines with linear ones. This is a step backward. Get the app running properly, then experiment binary stuff, with small data, in a separate project. Routines affected: StatsCenter.InsertSortList1(); StatsCenter.InsertSortList2(); Line_Index.Idx_Index_Int(); Line_Index.Idx_Index_Float(); Line_Index.Idx_Index_String(); Line_Index.Idx_Seek_Int(); Line_Index.Idx_Seek_Float(); Line_Index.Idx_Seek_String(); IO.InsertColourDef(); IO.SeekCustomColour(); * [Fix 9 (2020-10-30)] 2020-10-30 Apply latest fixes to all DAO components: - _SaveUpdate: Follow the exmaple of Location_: (EquipSets, Equipment, Station, ReceptionReport, LogEntry) - __InsertList: Don't set Cnt at the end: EquipSets, Equipment, Station, ReceptionReport, LogEntry - _Delete: Change compare of RecNo-to-...Cnt to ...Counter: EquipSets, Equipment, Station, ReceptionReport, LogEntry * [Bug 54 (2020-10-27)] 2020-10-30 Location record count problems. Reading +1 on reality. Almost solved. Multiple steps required for each table type - _SaveUpdate: Follow the exmaple of Location_ - __InsertList: Don't set Cnt at the end Now cannot delete after deleting once. Believe fixed with change in _Delete by comparing RecNo to ...Counter This bug has finally been fixed, 2020-10-30 * [Bug 53 (2020-10-24)] 2020-10-27 All problems fixed. Problems with Location Details - Latitude and Longitude not calculated properly for decimal degrees Code a replacement for DeconstructCoords() that translates properly. Routines: fn DeconstructCoords: Translates internal coords string to signed decimal fn ConstructCoords: Translates from field values to internal coords string fn TranslateCoords: Translates from signed decimal value to internal coords string p BreakOutCoords: Breaks out coordinates fields from an internal coords string Coord values also not saved properly Decimal value is not calculated on entry * [Item 85 (2020-09-28)] Log Entry Detials: Cross-Post button should also post the log entry and exit. The button should be retitled: XPost/Save -* [Bug 48 (2020-09-25)] 2020-09-28 In Settings screen, Save does not work. Not so. It simply doesn't exit the page. Consider adding an alert to the effect that your settings have been saved. Done. * [Bug 52 (2020-09-27)] 2020-09-27 Log Entry details: Save causes crash when saving existing entry. * [Bug 51 (2020-09-27)] 2020-09-27 Attempting to access a log entry leads to a crash. * [Bug 50 (2020-09-25)] 2020-09-27 Reception Reports are not being cross-posted to the log. This is because it is not implemented yet. * [Item 83 (2020-09-25)] Implement distance calculations in ReceptionReportDetails. * [Item 84 (2020-09-26)] Introduce a new function Idx_RecNo(Handle, PosNo): LongInt; Returns the RecNo for the PosNo'th position in the index. Use this to directly translate between selections/requests from lists, and actual record numbers. * [Item 85 (2020-09-26)] In Station Details, make RR Manager disabled with new station. Check with each station access. * [Bug 47 (2020-09-19)] 2020-09-24 Entering, then editing, a station (at least when stn. list is empty), then saving again, saves a copy of the station record. The latest work on the DAOs has rectified this problem. [Item 75 (2018-11-05)] Add search and replace screen In progress 2018-11-05. * Create screen and entry vector * Add form initialization handlers * Add service handlers for sundry buttons * Add service hanlders for S/R functions: * Networks - in Stations * Equipment - in Equipment Sets * Equipment Sets - in Log Entries, Reception Reports, Stations * Locations - in Log Entries, Reception Reports, Stations Implemented 2018-11-05. To be tested once there is a stable dataset. [Bug 27 (2018-12-07)] Locations Manager Delete button does not appear to work Fixed after a lot of work. A number of things fixed, including where to truncate the file on deleting. Testing 2018-12-08 [Bug 28] Added location does not persist after restart. Problem with Line_Index.Write_Index(); believe fixed 2019-01-09. [Bug 29 (2019-01-09)] When editing, changes to location name are not propagated to RRs or LEs. This must be rectified. Fixed 2019-01-09. [Bug 30 (2019-01-23)] Save/Back button in ES Details causes crash - Believe related to double-disposing SLE - Think fixed 2019-01-23 [Item 77 (2018-11-06)] Terminated 2020-05 Operational Testing: Round One - Go through every option and test it. - Just note bugs MAIN SCREEN: * Add * Edit - Dclick - Del * [2020-12-08] Exception generated when trying to filter All fixed now. Will have to regenerate everything afterward. * Filter by Location: Passed * Filter by Equipment Set: Passed * Filter by Active: Passed * [Bug 31: Indexing seems hosed. Replacing with linear indexing for now.] 2019-11-09 Indexing still kinda hosed after import, but indexes are correct. * LOG: * Filter by Location: Passed * Filter by Equipment Set: Passed * Search: Passed * Add: Passed * Edit: Pass * Delete: Pass * LOG ENTRY DETAILS: * Back: Passed * Save: Pass * Save/New: Passed * Reset: Passed * XPost: Passed - DATA CENTRE: - IMPORT DATA: - Locations * Text * CSV - XML - Networks * Text * CSV - XML - Equipment * Text * CSV - XML - Equipment Sets * Text * CSV - XML - Stations * Text * CSV - XML - Reception Reports * Text * CSV - XML - Log Entries * Text * CSV - XML * DELETE DATA: * Locations: Pass * Equipment: Pass * Equipment Sets: Pass * Stations: Pass * Reception Reports: Pass * Log Entries: Passed - SETTINGS: * Custom Colours: * Add Colour: pass * Edit colour: pass * Delete colour: pass * Back: pass * Save: pass * Locations: * Manager * Add * Edit * Delete * Location Details: * Fields editable: * R[eset] button * [Save] button * [Back] button * Pop-up warning if changes pending - Equipment Sets: - Manager * Add * Edit / Double-Click * Delete * [Bug 30 (2018-11-15): last element repeated in index after deletion of last element] * [Cancel: Bug has disappeared after retrieving and logging a function result.] - Equipment Set Details * EquipSet Name: Editable * Back button * Save button * Equipment Manager - Add - Edit / Double-Click - Delete * Select * [Bug 46 (2020-09-19)] Inserting a string into an index can cause an endless loop at the list's end. How to fix: Look at clues. Maybe allow JD to be reduced to zero, following which it's selected. * [Item 82 (2020-09-22)] Make changes to database routines: - RecNo is assigned from the database counter. - Deleted records are simply marked as deleted (RecNo 0). Deleted records are stored and loaded. - Indexed lists do not contain deleted records. - In order not to access deleted records, it will be necessary to access data only via the indices (within reason). - This will be a fairly major change. Extensive testing will be required. - A database-pack procedure will be needed for all databases. Skip deleted records, then re-index. * Begun making changes in _SaveUpdate: Location, Network, EquipSet, Equipment, Station, ReceptionReport, LogEntry * Make changes to _DeleteList: Location, Network, EquipSet, Equipment, Station, ReceptionReport, LogEntry * Make changes to _InsertList to use the correct counter: Location, Network, EquipSet, Equipment, Station, ReceptionReport, LogEntry - It will be neccsary to keep a third indicator, to assign Ids. This number continues to increment. Further study will be needed in order to determine where best to store this value. - It has been decided that the incrementing Id number will be stored in the database header. That means significant changes. It must be noted that the database was originally designed with a header size of 15 bytes; this will have to be increased to 17 bytes, to accommodate the new header. Luckily, this can easily be changed with a global search/replace. * Add new value for each database type in Core: * Make changes to _createdb() to accommodate the new value: * Make changes to _opendb() to accommodate the new value: * Change _write_header() to accommodate the new value: * Change _saveupdate() to use the new value: * Add _put() routine to write a single database entry. * Change _delete() to use the proper values: * Change _DeleteAll() to use the proper values": *Note*: Not necessary, as the incrementing ID counter should only reset to zero on database creation. * Change _UpdateList() to use the proper values: Not necessary. * Change _InsertList() to use the new values: * Change _Get() to insert the recno and make use of the proper variables. * Change _ReadRaw() to insert the recno and make use of the proper variables. * Do a global search-and-replace on all instances of "+15". Add a pack routine for each database type Check through the code for other places where tweaking may be necessary. * [Bug 45 (2020-09-18)] 2020-09-18 In Station Details screen, Save button remains disabled after changes made * [Bug 44 (2020-09-16)] 2020-09-18 In Station Details screen, latitude and longitude decimal values are incorrectly presented Corrected. Values are cross-calculated after each change to a field. * [Item 81 (2020-09-16)] 2020-09-17 Equipment Set Details: need clear button for each selectable entry. * [Bug 42 (2020-09-16)] 2020-09-16 Log Entry does not automatically save station. D'uh, this is by design. * [Bug 41 (2020-09-16)] 2020-09-16 Log Entry Details: Callsign, City, Observations fields only accept numerics * [Bug 40 (2020-09-12)] 2020-09-13 In Network Details, edits are not saved. * [Bug 39 (2020-09-11)] 2020-09-12 Networks Manager displays one less than the actual number of networks. On further investigation, this appears to be an indexing issue. Fixed for strings, by adding a test for X in the jump section. Copy to all other index types * Int * Float May have just cracked the indexing bug * [Bug 38 (2020-09-11)] 2020-09-11 Equipment Set Details screen: fields remain locked Shelved: fields are meant to be protected. Use the [Select[ button. * [Bug 37 (2020-09-10)] 2020-09-10 In Location Details: - lat/long values are retained - impossible to save on second access. Fixed 2020-09-10 * [Bug 36 (2020-09-06)] 2020-09-10 Location Details screen muffs up the coordinates - Believe it's because of the decimal - Fixed after mucj effort 2020-09-10 * [Bug 35 (2020-09-06)] 2020-09-06 Exception loading LocationsDB after adding new location. Item is not being saved to the indices. * [Bug 34 (2020-09-06)] 2020-09-06 Location Details screen return wrong sign for latitudes. * [Bug 33 (2020-09-06)] 2020-09-06 Exception when saving a new Locations entry. Fixed. Tested 2020-09-06. * [Bug 32 (2020-09-06)] 2020-09-06 In the Location Details screen, a decimal cannot enetred into the seconds field. Fixed. Tested 2020-09-06. 2018-09-03: [Item 1] Put together a Models unit with all the data records used in StationBase - Station ReceptionReport Log Location EquipSet Equipment Network 2018-09-04 [Item 2] Get the indexing unit ready for prime time. Use a deliberate, stepwise coding method. Completed 2018-09-03 [Item 3] Rough out the Main Screen, so we have something for everything else to hang onto. In Progress. [Item 6] Build Settings Page. Implement Operator model. [Item 7] IO Module: implement read/write Operator. Call procedure at start of program. 2018-09-05: [Item 10] Integrate Locations indexing [Item 11] Introduce logger 2018-09-06: [Item 5] Begin working on the I/O. Test at every step. Goal is full indexed reading and writing of all data records. 2018-09-07: [Item 13] Build Location Details page, including event handlers - Get everything tickety-boo before closing this item [Item 14 (2018-09-06)] Add support for latitude and longitude decimal versions - Always calculate when entering the page - Accept direct-entry of values - Validate and convert [Item 9] Write IO section for Locations 2018-09-09: [Item 8] Build Locations Manager - Get everything fully implemented and working properly before closing this item [Item 23] Add RecNo to most indexing calls No, don't. Add to Delete. [Item 15 (2018-09-07)] Build Networks Manager [Item 17 (2018-09-07)] Build Network Details page and services [Item 16 (2018-09-07)] Write IO section for Networks [Item 35 (2018-09-09)] Modify record-save/update routines to seek the passed Id value, and update or create a new record accordingly. Any time the passed Id value exceeds the record-creation counter, the counter is updated to the Id's value, and all successive records created from RecNo=0 will start at the next value for ItemId. - Retrofit to IO.Location_SaveUpdate(), IO.Network_SaveUpdate() Test passed 2018-09-09. 2018-09-10: [Item 37] Commit the project to Subversion [Item 21 (2018-09-07)] Write IO Section for EquipSets [Item 22 (2018-09-07)] Write IO Section for Equipment 2018-09-11: [Item 18 (2018-09-07)] Build EquipSets Manager In Progress. [Item 19 (2018-09-07)] Build EquipSet Details / Equipment Manager In Progress. [Item 20 (2018-09-07)] Build Equipment Details In Progress. 2018-09-13: [Item 38 (2018-09-11)] Write IO section for Stations 2018-09-19: [Fix 3 (2018-09-19)] Don't forget to close all open files and exit gracefully. Implemented 2018-09-19. [Item 49 (2018-09-19)] Code station-display routines [Fix 5] Propagate changes to Idx_Delete_String() to the other two types Done and tested 2018-09-19. [Fix 4] For now: index the frequency as a string of 'xxxxxx530.xxx' KHz Implemented 2018-09-19. [Item 39 (2018-09-11)] Build Station Details / Reception Report Manager screen In Progress Station Details part now functioning. Need to link all buttons to events. * Need to get station-save and station-display running. [Item 44 (2018-09-11)] Write IO section for Reception Reports Get RR Manager working in Station Details 2018-09-20: [Item 48 (2018-09-18)] * Build Reception Report Details screen * Validation code * Link it to the Station Details screen * Link to events Don't worry about crossposting to logs, for now Completed 2018-09-20. [Item 12 (2018-09-06)] Add in SystemProperties. Assign properties for such things as quotas. Properties Tracked: maximumStationRecords=5000 maximumLogEntries=50000 maximumReceptionReports=50000 maximumReceptionReportsPerStation=100 maximumLocations=100 maximumEquipsets=100 maximumPiecesEquipment=100 maximumNetworkRecords=1000 Done 2018-09-20. [Item 43 (2018-09-11)] Write IO section for Log Entries Completed 2018-09-20. 2018-09-25: [Item 41 (2018-09-11)] Build Log Manager screen Make it functional Completed and tested 2018-09-25. [Item 42 (2018-09-11)] Build Log Details screen Make it functional Don't forget crossposting on save Completed and tested 2018-09-25. 2018-09-26: [Item 53 (2018-09-25)] Modify the Operator record - Add parameter: LogsCnt : LongInt; * Modify the read and write routines. * Make sure all counts are updated where counts change [Item 54 (2018-09-26)] Add a Delete_All() function to all IO function groupings. Implemented 2018-09-26 2018-09-27: [Item 52] Add an additional parameter, RA : Boolean, to some of the database calls. If True: - Use the Regular database and auxiliary variables - Use the Alternate database and auxiliary variables 2018-09-27: Done. Just need a consistency check now. Done for now. Test with Importing module. [Fix 6] When emptying-out a database, be sure to reset the record-creation counter to zero. All fixed up 2018-09-27. 2018-09-28: [Item 51 (2018-09-20)] Retrofit quota-checking to all screens. In Progress. Stations RRs LEs Locs EqSets Equip Nets. [Item 55 (2018-09-28)] Add CreateDB, OpenDB, CloseDB routines to IO, for all categories. Implemented 2018-09-28. Test with onging development. 2018-10-03: [Item 56 (2018-09-30)] Problem with memory errors when opening indexes. Clean up and regularize memory useage in the I/O unit. When to (de)allocate Completed 2018-10-03. Tested by being able to run. 2018-10-04: [Item 57] Data creation-counters are being improperly updated. - Create New Core counter variables for each AltDB identity - In each I/O category's: - CreateDB function: - Zero the correct counter variable according to RA - Write the zeroed count variable twice, instead of the counter. - OpenDB() function: - Read it to the right counter according to RA - WriteHeader() procedure: - Write out the proper counter according to RA - SaveUpdate() procedure: - Declare a xCx variable (Word) - Assign := xCounter or AltxCnt, according to RA - Replace xCounter in calculation block - Update the counter variables according to RA, before WriteHeader() - Locations - Networks - EquipSets - Equipment - Stations - Reception Reports - Log Entries Tested on Locations 2018-10-03. 2018-10-06: [Item 58 (2018-10-04)] Modify indexing routines to allow for reclamation of closed slots. (Ie IndexCnt always := #SlotsUsed) Done and tested 2018-10-06. 2018-10-12: [Bug 1] lIdxId.txt is still named lIdxID.txt. Rename and problems solved. Fixed and tested 2018-10-12. [Item 59 (2018-10-12)] Straighten out, for once and for all, how items and subsidiary items are to be found. Retrofit to existing routines Test the fuck out of it Tested for Locations. Tested for Networks. Tested for Equipment. To boot, solved that memory problem. Again. 2018-10-13: [Bug 2 (2018-10-13)] the wrong index is sometimes referenced. check all indexes in the I/O unit. Done 2018-10-13. Fixed 2 instances. Also fixed a read being done instead of a write (EquipSets__WriteHeader()), causing only 1 record to appear 2018-10-16: [Item 27 (2018-09-09)] Build Data Import Page and Services - Three file formats each selection - Don't forget networks Preprocess Ids so that items are ready for immediate transfer Import Strategy: - Import to temporary files. Add DBCreate routines; expand parameters to some to allow various files to be used. - On commit, copy the entries to the operational files, setting OldId to 0; index, add to the list, then delete the temporary files. Importing rules: If Unique then: - Seek(RecordId, Reg) If exists - Skip record Else: - RecordId as is; OldId = RecordId - AddRec(Alt) Else: - OldId = RecordId; RecordId automatic - AddRec(Alt) Subsidiary links: - SeekName(Name, Alt) If found - Use AltItem Else: - SeekName(Name, Reg) If found - Use RegItem Else: - Broken link * Don't forget to set OldId to Zero when finalizing imports. * Retrofit these revised rules to exist categories - Locations - Networks - Equipment - Equipment Sets - Stations How to get out of a hassle with indexing things like altName, RegOldId * Specific seeking routines that scan linearly through the list. * Will need two for each category: SeekAltName() and SeekRegOldId() Seven categories, three file formats - Locations (done 2018-10-04) * Text * CSV * XML - Networks * Text * CSV * XML - Equipment * Text * CSV * XML - Equipment Sets * Text * CSV * XML - Stations * Text * CSV * XML - Reception Reports * Text * CSV * XML - Log Entries * Text * CSV * XML In Progress. Notes: this has been a disastrous endeavour. I've spent most of my time tracking down and fixing bugs resulting (apparently) from my neglecting to initialize pointers, using the wrong index, specifying the wrong filename, and other niggling errors. More planning will be necessary for the final portions of this program, which is already larger than most I have worked on. Fixed a bug in Station_SaveUpdate (not all indices being populated) Fixed station colour display (phew!) Fixed bug in SplitItems() for documentation: If you import with Unique off: - All found records are assigned a new ID value (the primary key used to search for them and link them together). - Auxiliary links (such as Reception Reports->Stations, ->Equipment Sets and ->Locations): StationBase tries to match them by a search for name in both newly-imported records and the main database. If you import with Unique On: - Only those records which do not exist in the database (based on a search for ID) will be imported. Their IDs will be preserved. - Auxiliary links: StationBase tries to match them to newly-imported and existing records, based on a search for ID. Therefore: - If you want to import records into empty databases, import them as a set (do all your imports before hitting the [Done] button), with Unique On. - If you want to add records, some of which may exist in the database already, import with Unique On. - If you want to add records based on existing data in the databases (i.e. Updates), import with Unique Off. - If you want to add import records which do not already exist, import with Unique On. For resolving subsidiary links, I've tried very hard to make these routines intelligent and to behave as expected. Just remember that when importing with Unique On, StationBase expects to find subsidary links through searches for ID, so they must exist or be in the import set. When importing with Unique Off, StationBase searches for item names instead, on the presumption that ID numbers have changed. Either way, there's a good chance your data will get through unscathed. One way to determine this is through the "Broken Links" count. I may, in future, provide a way to log these items or otherwise inspect them. Fixed bug in Station Details so that RR's are again spooled off to a temporary list [Item 60 (2018-10-12)] Gedankenexperimenten reveal a bug. Record number from a seek is only in agreement with the list-array in the primary index. Here's the solution: When reading lists, read sequentially from record 1; no indexing Access in sorted order only through the index Now, the natural order of records will always agree with the contents of the listItems - The RecNo field of each record is now no longer used. Will require some tweaks to the I/O.GetList() routines and the grid-display routines--this is not trivial, but absolutely necessary Implemented and tested for Locations. Implemented and tested for Networks. Implemented and tested for Equipment. Implemented and tested for EquipSets. Implemented and tested for Stations. Implemented and tested for Reception Reports. Implemented and tested for Log Entries. [Item 62 (2018-10-15)] Implement binary search in the indexing module - it's not difficult. It needs it. In progress 2018-10-16. * Implemented, exhaustively tested, and debugged, for Indexing ints. * Implemented, exhaustively tested, and debugged, for Indexing floats. * Implemented, exhaustively tested, and debugged, for Indexing strings. * Implemented and tested for Seek Ints, Seek Floats, Seek Strings. * Implemented for Delete Ints, Delete Floats, Delete Strings Completed 2018-10-16. SHELVED ITEM: [Item 45 (2018-09-11)] Retrofit crossposting to Reception Report Details Add quota-checking 2018-10-21: [Bug 3 (2018-10-21)] Stations import is assinging the wrong field to Network. Yep; assigning Name instead of Abbreviation. Easily fixed. Fixed 2018-10-21. No need to test. [Bug 6 (2018-10-21)] There appears to be a bug with limits in the idx_index_* routines Fixed and tested 2018-10-21 [Bug 5 (2018-10-21)] There appears to be a bug with result assignment from seek routines. Semantic, but should be fixed. Fixed and tested 2018-10-21 [Bug 4 (2018-10-21)] Appears to be a bug in the _SeekOldId()-type routines, where the value of X is improperly handled. Fixed and tested 2018-10-21. 2018-10-22: [Item 64 (2018-10-22)] Add some kind of write-throttling, at least for the indices, when loading multiple objects. Follow up with a Write_Index() Implemented 2018-10-22. 2018-10-23: [Item 26 (2018-09-09)] Build Data Export Page and Services - Get everything working - Three file formats each selection In Progress. * Stations * Text * CSV * XML * Reception Reports * Text * CSV * XML - This far to 2018-10-22. Going well now; exorcising more bugs. * Log Listings * Text * CSV * XML * Locations Listings * Text * CSV * XML * Equipment Sets Listings * Text * CSV * XML * Equipment Listings * Text * CSV * XML - Networks Listings * Text * CSV * XML [Item 50 (2018-09-20)] Got some issues to solve with buttons on the Reception Report Details and Log Entry Details screens Try this: if Crossposting Specified: [Save] [Save and New] If not: [Save] [Save and New] If not posted: [Crosspost] Negated 2018-10-23 [Item 64 (2018-10-23)] Tighten up on import-read-file stuff. Make sure they're all set to work. Done 2018-10-23, [Item 63 (2018-10-16)] Retrofit quota respect to import routines Implemented 2018-10-23. [Item 61 (2018-10-15)] Remove automatic Log Entry crossposting. Now, four buttons on Log Entry Details screen. [Back] [Save] [XPost] [Save and New] <- XPOST is controlled by Posted flag Save-and-New: Saves and remains on the page XPost: Cross-posts entry Save: Saves and exits the page If the crosspost violates quotas, pop up a message to that effect Save and New: Saves and re-enters the page Remove variable from Settings page. Completed 2018-10-23. [Item 65 (2018-10-23)] Finish Log Entry details--get everything working Added change detection and offering to save at back Added a Quick Find box which updates on typing in callsign Log Entry screen is completed, 2018-10-23. [Item 65 (2018-10-23)] Add a station-finder combobox to the Log Entry Details screen; see Screen Mockups. As user types in fCallSign, the box updates according to the frequency and callsign entered. Selecting an entry from the combobox populates the fFreq and fCallSign fields with the station's data. [Item 66 (2018-10-23)] Finish Log Manager--get everthing working Got search field working. Got all combo boxes working. Added popup menu to String Grid 2018-10-24 [Item 53 (2018-09-26)] Add additional Operator Properties: - FirstLogDate - updated whenever log entries are generated - LastLogDate - updated whenever log entries are generated - FirstRRDate - updated whenever RRs are generated - LastRRDate - updated whenever RRs are generated - Best done, I think, in the Log Entry IO routines Add new system property - refreshDatesAtStartup - Refresh the above properties (from the database) on startup - Implement refreshing - New variable, same name, in core Add properties to Settings screen - Date-picker method. Done and tested 2018-10-24. [Fix 2 (2018-09-17)] When updating an item, check if its name has changed. If so, update the textual references to it. * Equipment: Update in EquipSets * EquipSets: Update in RRs, Log Entries * Locations: Update in RRs, Log Entries * Networks: Update in Stations * Stations: Update in Reception Reports Do these in the I/O Module Done 2018-10-24 [Fix 1 2018-09-12)] When deleting an item, automatically delete any references to it. I know that'll take a bit of work, but absolutely worth it. * Equipment: Unlink from EquipSets * EquipSets: Unlink from RRs, Log Entries, and Stations * Locations: Unlink from RRs, Log Entries, and Stations * Stations: Delete all associated RRs Done 2018-10-24 2018-10-25 [Feat 3 (2018-09-19)] Look into providing a table of custom colors for various countries. Colour the stations' entries in the Home screen. [Feat 5] Implement the countries-custom-colors feature - Will need: - Country name - Foreground colour definition - Created Custom Colours page All functions are working - Created Custom Colour page All functions are working 2018-10-26 [Item 67 (2018-10-24)] Get all functions working on the Location Details page Revamped the error system Added event handlers Added change-detection system Added reset button Get all functions working on the Location Manager page Added some niceties around editing Added delete routine 2018-10-28 [Item 68 (2018-10-24)] - Get all functions working on the Equipment Set manager page - Added separate list for display - Fixed a bug with Indexing Ints and propagated it to the other two kinds - Fixed another bug with seeking. Bugs are left over from the conversion to binary search. Get all functions working on the Equipment Set Details page - Added error messages box. [Item 69 (2018-10-24)] Get all functions working on the Equipment Details page [Item 70 (2810-10-24)] Get all functions working on the Network Manager page - Added close button click handler Get all functions working on the Network Details page - Added close button click handler - Did makeover with split ilst - Added change detection [Item 24 (2018-09-09)] Build services for home page - Hook in * Locations and EquipSets - Activate Filtering - Activate Searching - Added in split list and FirstLoop processing Completed 2018-10-27 [Item 28 (2018-09-09)] Build Data Delete Page and Services - All data types, including networks Completed 2018-10-28. V 0.87d-pa 2018-11-01: [Item 25 (2018-09-09)] Build Stats Page and Services * Defined two kinds of sort records * Build a sorted-insert routine for the first type * Sorted by alpha (ascending) Built and tested 2018-10-29 * Sorted by count (descending) built and tested 2018-10-30 V 0.87c * Build a sorted-insert routine for the second type Built and tested 2018-10-30. V 0.87e * Got save function working - Build stats generators: * Stations by Political Division V 0.87g * Stations by Location - As far as can be tested V 0.87i * Stations by Equipment Set V 0.87k * Stations by Network V 0.87m * Stations by Date First Heard V 0.87o * Longest Distances V 0.87q * Reception Reports by Date * Reception Reports by Hour V 0.87s * Log Entries by Date * Log Entries by Hour [Item 72 (2018-11-01)] * Add a clock to the Log Entry Details screen * Add a clock to the Reception Report Details screen V 0.88 2018-11-02: [Item 74 (2018-11-02)] Add a reset button to the CustomColour screen. - Will need to add handler * Fixed a bug with close handling-if Changes, save dialog was showing twice. * Fixed bugs to do with colour handling. 2018-11-06: [Bug 8 (2018-11-06)] Entries meant for the top of the list are being posted to the bottom, on descending-order indexes Believe I had a sign wrong. Checking. Tested 2018-11-06. [Bug 7 (2018-11-05)] Reception Reports Add is not working: - Accesses RR Details screen - Click save: screen exits - Reception Report has not been added Looks like a case of specific values not having been initialized prior to entry to the RR Dets page. Testing a prospective fix now. Fixed 2018-11-06. [Bug 9 (2018-11-06)] - InsertList() routines need only to tack a new record onto the end of a list. - UpdateList() and DeleteList() routines also need to be modified - cut out all the record-finding stuff - Definitely; and use seek - Also, move _DeleteList() before record deletion in _Delete(), so that the list can be properly updated. Implemented 2018-11-06. To be tested by normal operations: * Locations * Equipment * Equipment Sets * Networks * Stations * Reception Reports * Log Entries [Bug 10 (2018-11-06)] lIdxId.idx getting renamed to lIdxID.idx Temp. fix in place for now; renames it in Init() 2018-11-06 V 0.88e-pa 2018-11-07: [Bug 14 (2018-11-07)] Saving a Log Entry edit does not yield an updated log list in the Manager The changes, however, are saved. Fixed and tested 2018-11-07. [Bug 15 (2018-11-07)] Log Entry delete is not working in the Log Manager The Log Entry, however, is delete in the database. Fixed 2018-11-07. [Bug 12 (2018-11-07)] Saving a Log Entry causes it to appear at the end of the list. Fixed 2018-11-07 [Bug 11 (2018-11-07)] Log Entries for the latest date are being inserted into the second position in the index. Fixed and tested 2018-11-07 [Bug 13 (2018-11-07)] Add Log Entry crashing on save. IO, Line 6631 Fixed and tested 2018-11-07 2018-11-08: [Bug 16 (2018-11-08)] Add Colour is crashing with the message "$" is not a valid integer CustomColor:81 Field not being properly initialized. Fixed 2018-11-08. 2018-11-12: [Bug 17 (2018-11-12)] On the Import screen, the Unique flag cannot be selected after the first file selection - Make this item locked after the first _import_ Fixed and Tested 2018-11-12. [Fix 7 (2018-11-12)] Import screen requires 'Please Wait...' message. Implemented 2018-11-12 [Fix 8 (2018-11-12)] Clear out the Locations and EquipSets strings on station import - Add them during Reception Report import finalization (update station records' strings) Done 2018-11-12. 2018-11-13: [Bug 21 (2018-11-12)] Empty entries are being generated for the string indices. Fixed 2018-11-13. [Bug 18 (2018-11-12)] Far too many station broken links on integrated file import. Appears to be a case of wrong index use. Fixed and tested 2018-11-12. [Bug 19 (2018-11-12)] Far too many Log Entry broken links on integrated file import. Fixed and tested 2018-11-12 [Bug 20 (2018-11-12)] Far too many Reception Report broken links on integrated file import. Fixed and tested 2018-11-12 V0.88g-pa 2018-11-14: [Bug 22 (2018-11-14)] Importing stations as a text file yields 1 or 2 records. Fixed 2018-11-14. [Bug 23 (2018-11-14)] Adding to the list of colours causing endless loop during prep before Custom Colours Manager Problem was with SeekCustomColour and bounds handling Fixed and tested 2018-11-14. 2018-12-07: [Bug 23 (2018-12-07)] Locations Manager screen Operations are not affecting the correct item Check the button handlers. Also the setup code. Was still on the old system. Added split list and count; think it's fixed. Testing 2018-12-07. Resolved 2018-12-07. [Bug 25 (2018-12-07)] When editing, the [Save] button is finding duplicates. It shouldn't. Believe wasn't checking for whether the record was new. Think fixed now. Testing 2018-12-07. Resolved 2018-12-07. [Bug 26 (2018-12-07)] Locations Manager view not updating after edit Changes made while editing do not immediately show up Believe fixed 2018-12-07. Resolved 2018-12-07. 2019-01-07: [Bug 24 (2018-12-07)] Default Location constantly being reset, every time a location is added. Fixed 2018-01-19 2019-11-27: * [Item 78 (2018-12-08)] 2019-11-27 Propagate change in location_delete to all delete routines