Jump to content

Gary Mugford

Members
  • Content Count

    39
  • Joined

  • Last visited

Community Reputation

1 Neutral

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Gary Mugford

    keyboard shortcut for activating the code editor

    I didn't realize fully that you were looking for FREE key combos, not a solution to having a key combo FOR the purpose of going to the editor. My apologies. I STILL think it would be interesting if you found a way to USE KEYLOCK, if it's been disabled for it's express purpose. It's the most unused key on my keyboard. I'll leave the rest of my answer in place because it does deal with the actual mouse/trackball experience I have. The weird thing, is that it was a need to learn to program in AutoHotKey exercise that got me looking into my OWN tab-switcher in XE7. In reality, I have my left hand on the keyboard and my right (the dominant one) on my very, very, very old Microsoft Trackball Explorer. It's one of life's GREAT tragedies that I was writing the operations software with a company that got bought up by a big concern from the States. All new software (meaning I was a goner) and, as it turns out, new hardware, orphaning TWELVE Trackball Explorers. I could have had them all. They ended up being THROWN OUT IN THE GARBAGE. Double and Triple Sigh. That was last century. My TE gives every bit of evidence it will die and there's not a reasonably good trackball on the market with mostly thumb action on buttons and the scroll wheel and a BIG ball under the fingers. I've bought just about every thing Logitech has produced and their first, the long skinny one, would be the winner if it had a scroll wheel. THAT invention was still years off. I've got pens and trackballs and a couple of lazer mice. Every time the TE gunks up and I clean up the positioning pins and put the wiped off ball back, I get that little bit of relief I didn't kill it on the cleaning table. But it WILL die eventually. I plan to be buried with it.
  2. Stefan et al, I am an old fogey who generally keeps programming in a style you'd recognize as Mostly 80's Enlightened. Problem is, it's thirty/fourty years later and Delphi has moved on. I've spent some effort this spring trying to get into Interfaces. Read Nick Hodges' first book, browsed through the second and stare blank-faced at the third on my reading list. I'm getting maybe half and that's actually a tribute to Nick. I'm the old dog trying to learn new tricks. This thread has hammered away at global vars and singletons. And I can't see my way around them. At startup, my apps normally load a record called Globals. In there, the user info gets stored, as it's referred by a lot of code. Plus program settings and other miscellany. I DID have them as UserName, UserShortCode, UserSecurityLevel, but graduated (apparently, barely) to Globals.UserName, Globals.UserShortCode, etc. Now, I am looking at an interface approach. I have a date pair that comes from ranging requests in many reports and queries. The interface I'm fooling around with, in a completely separate unit, would lead to DateRange.Date1, DateRange.Date2, DateRange.DateSpan, DateRange.Date1Str, DateRange.Date1EasyRead, etc. There's more. A bunch of properties that I have logged using a Date in any fashion. My idea is to do all these transformations and have them done and ready when I need to create an interface, populate it with either two copies of the same date or the two actual dates, and then use a property immediately. I plan to dispose of the interface if no longer needed, but occasionally to keep it around while the form (say, the Report Manager) is active. This plan looks dodgy from what I've read here. I'm TRYING to look at this from other angles, but I still come back to global vars to hold items of interest, whether straight old-fashioned variables, record contents or interfaces. Can you point me in the right direction? Thank you for your patience. GM And I apologize for semi-hijacking this thread
  3. Wish I was, although it sits in the component library. I use the TfcDBTreeView from Woll2Woll's First Class components in my mapping module. It runs off a self-referential database that has Key, UltimateParent and Parent fields to create the TreeView. The Object itself is dead simple: object tvMap: TfcDBTreeView Left = 4 Top = 27 Width = 367 Height = 518 BorderStyle = bsSingle TabOrder = 1 DataSources = 'SourceRoot;SourceNodes' DisplayFields.Strings = ( '"Key" [Desc] "Desc" [Op] "Operator"' 'Uses "Errors" "Key" [Grade] "Grade"') LevelIndent = 19 end Nothing there that VT can't duplicate and you've already done it for your datasets. Now, as for the code ... Again, dead simple and maybe not sophisticated for your stuff, but it works as a self=referential tree exactly as I NEED it to be. procedure TFrmMap2.tvMapUserExpand(TreeView: TfcDBCustomTreeView; Node: TfcDBTreeNode); var qChild: TQuery; sourceChild: TDatasource; begin if (node.level + 1) < tvMap.displayfields.count then exit; { Create new detail paramaterized query } sourceChild := TDatasource.create(self); sourceChild.name := 'ChildDataSource' + inttostr(node.level + 1); qChild := TQuery.create(self); sourceChild.dataset := qChild; with qChild do begin qChild.sql.assign(qNodes.sql); qChild.databasename := qNodes.databasename; if lastds = nil then qChild.datasource := SourceNodes else qChild.datasource := lastDS; qChild.active := true; end; with tvMap do begin DataSources := DataSources + ';' + sourceChild.name; displayfields.add(displayfields[displayfields.count - 1]); lastDS := sourceChild; end end; procedure TFrmMap2.tvMapCalcNodeAttributes( TreeView: TfcDBCustomTreeView; Node: TfcDBTreeNode); begin { Determine if expand button should be displayed by using a lookup table } node.haschildren := TblLU.Locate('Parent', node.dataset.fieldbyname('Key').asstring, []); // node.haschildren := // TblLU.Locate('Parent Index', // node.dataset.fieldbyname('index').asstring, []); end; procedure TFrmMap2.tvMapChange(TreeView: TfcDBCustomTreeView; Node: TfcDBTreeNode); begin { Synchronize table bound to edit controls } if node.DataSet = qRoot then begin TblView.active := false; end else begin TblView.active := true; TblView.locate('Parent;Key', varArrayOf([node.dataset.fieldbyname('Parent').asstring, node.dataset.fieldbyname('Key').asstring]), []); end; end; procedure TFrmMap2.TbLViewAfterPost(DataSet: TDataSet); begin qNodes.active := false; qNodes.active := true; Application.ProcessMessages; end; Now, I HOPE I didn't induce any errors into the code trying to anonymize it. But you can see it's a minimum of code and I get the ability using the hierarchy fields to keep me functional. In my case, a Key has a Parent and that Parent, somewhere UP the line has an UltimateParent. This allows me the ability to move things around. Adapting it to YOUR case, I'd see the UltimateParent being FiledTo or somesuch thing. The Parent being some combination of Examined with Contents. And Key, of course, would be your document by title. The rest of the fields would be displayed by a Record View to the right or bottom of your tree or wherever. I would then write your text search routines to bring up unanalyzed documents by type and then keyword analysis. Throw in whatever else your AI deems as important in descending order of importance. Then scroll to your heart's delight, although technically, if all the AI has been well-written, the guess is that you scroll and read, one at a time. OVER-SIMPLIFYING by a lot, I know. But Peter is right when it comes to the viability of scrolling through the kind of list. I don't know HOW you decide to stop and read, but it HAS to be quantifiable. So says the guy who's never seen the code or the data. For which I apologize for my hubris. Wish you well in getting REAL help here. GM
  4. Ahhhh, I understand better. I thought it was more along the lines of something I do in a different milieu, which is to track essay submissions for a prof that I'm an occasional Bridge partner with. So, the random names of the essays he's looking for fall into, I remember it was two semesters ago and it was Joe or maybe John, writing on murders or maybe attempted murders of journalists in one of the ex Soviet Union republics. THAT I can narrow down. Yours, not so much. I assume there's a boolean field that marks a document as examined. Is there a facility to convert the PDF to a text document so you can index the words, or is it a truly examine them one at a time situation? And after examination, do you rename the file, discard it or leave it as is with a descriptor field? Feels like this might be a legal evidence app. As bad as OCR is with bad scans, there should STILL be a way to prioritize the ORDER of examination to maximize the time taken looking at them. Even if the KEY WORDS (I CONFESS) fails to be OCR'd correctly, the surrounding text might hit your eventual ordering algorithm. I've seen some impressive results with OCR these days with a little training. Eighty percent on a bad page I though virtually unreadable. And even the fabled 99 percent still has an error every line and a half. Somewhere in between, let's call it 90 percent, means an organizational improvement of, well, 90 percent. Worth the time to seek out the PDF conversion libraries and write yourself something for the computers to do overnight and on long weekends. Now, if there's nothing automatic out there (I've seen lots of apps, many of which CAN operate on command lines) then the labour/result graph might be wrong. But looking at 30K badly scanned PDFs makes my eyes bleed just thinking about it. Lots of luck, GM
  5. Mark, I ran into your problem in a different way a while back. I had a huge jumble of data buried in a memo field and needed a way to surface it, while having my user mumble those hated words, "I'll know it when I see it." What I did was say, "What will it look like?" And he described a title that might have this word or that word, a date from roughly this six month period and some other attributes. In other words, he DID have a list of parameters, however vague. So, I wrote what I hope was a smart filter that gave him fields for his 'descriptions', allowed there to be ANDs and ORs in EACH of those fields and a button to FILTER. From millions of records, he often ended up with the exact one. But if not, it was within a screenfull's worth of data. Using a 'filter' set that you process AI-like with a button push running a SQL query, could be a solution. Setting up the VT off that returned dataset might save you a lot of fidgety work. The task is to turn vague descriptors into actual query WHERE parameters. Yes, that will mean User Education but the time spent doing that, saving time scrolling, should be a win-win. Think more GOOGLE and less YOUTUBE Cat Videos. Not that I would EVER be caught watching kittens. I think you're letting the user off the hook. They/He know more about the thing they are searching for than they are telling you. I've done away with 'scrolling grids' in my latest version of my big project. Since I tentpole around one specific field in just about all databases in the project, it's easier for me to do that. But it was a hard decision to abandon the grid that showed just the few fields that were keys somewhere in the design. I watched users ALWAYS go to Ctrl-F to find what they were looking for. Then, when they DID decide to traverse the grid, it was rarely more than a single Next/Prev click. So, I just abandoned the grid entirely, put the Find buttons (there's an Again button) between two one-record movement buttons and that was it. In the menu, there's a popup for a grid CENTRED around the current record. And I've seen it used. Twice. I actually had a counter and kept track of how often the menu item ran. BREAKING myself of how I WORKED, which was scroll and scan frequently, into USER MODE where search and work was the mode, only took 25 years. All of this blather might not directly address your issue. It all centres around that user's inability/ability to at least reduce the total returned dataset by some. I know when I go spelunking to find data, it's always the LAST ONE I LOOK AT. Murphy's tenth law, I believe. I just can't imagine having it be the thirty THOUSANDTH thing I looked at!!!
  6. Gary Mugford

    Get UserID from LogIn form at startup.

    Sage advice. I've been through SOME puzzles coping with DPR manipulation by the IDE. It's why I keep a commented complete copy of the code that resembles my sample, PLUS having the DPR in my versioning software from AJC. Because of long term comfort, I've continued to do it, but like many things (including my change in database backbone), maybe it's time to do things the way the professionals do. The thought that my way of DPR manipulation might have crept into the issue I've had with BDE and Windows 10, prompted me to ask about the comment in TPersistent. Thanks, GM
  7. Gary Mugford

    Get UserID from LogIn form at startup.

    Remy, Ian et al, Oddly enough, within the last few days, Larry Hengen at TPersistent also raised this issue, but in the course of doing the blog, he said, " Any long time Delphi user knows that messing with the generated DPR code in Delphi can cause all sorts of grief later when Delphi tries to auto create forms and add units to the uses clause." I've long 'fooled' around with the DPR in my programming, which might only further prove my lack of bonafides. I've noticed a noisome habit of the IDE to play around with the lines I use to create my data modules, eliminating the indentations. But I correct them. Add other data modules. Correct them again. and so on and so on. I haven't found anything grievous to this point. What am I missing? Oh, and obviously, I have to fess up to still using Delphi 7. Here's the 'annoyance' in action. I've obfuscated some of the stuff for the obvious reasons ... begin Application.Initialize; // 3/14/2003 6:06:12 PM ED: Moved this from main form create gmSetPrivateDir; session.addPassword('STILLLEARNIN'); // NOT the password Application.Title := 'SYS:2011'; DlgLogin2 := TDlgLogin2.create(nil); with DlgLogin2 do begin TblPw.DatabaseName := 'SYS'; TblPW.TableName := 'NotAPasswordDatabase'; TblPW.Active := true; showmodal; if ModalResult = 1 then begin // create main form and data modules Application.CreateForm(TFrmMain, FrmMain); Application.CreateForm(TdMain, dMain); // always resets to col 1 Application.CreateForm(TdLU, dLU); // always resets to col 1 Application.CreateForm(TdmRep, dmRep); // always resets to col 1 Application.CreateForm(TFrmHistorySearch, FrmHistorySearch); // always resets to col 1 Globals.Version := '2011.8.8.'; // always resets to col 1 Globals.UserName := DlgLogin2.TblPW.FieldByName('User').asString; Globals.DEB := DlgLogin2.TblPW.FieldByName('MiniID').asString; Globals.RandomDateNum := CreateRandomNumDateInt64(0); if Globals.DEB = '' then Globals.DEB := 'UNK'; Globals.SecLevel := DlgLogin2.TblPw.FieldByName('SecLevel').asInteger; //----------Security Levels--------Enable/Disable Menus--------------------- FrmMain.mManager.Enabled := (Globals.SecLevel >= 80); FrmMain.mExecutive.Enabled := (Globals.SecLevel >= 90); FrmMain.mProgrammer.Enabled := (Globals.SecLevel >= 100); FrmMain.mODefaults.Enabled := (Globals.SecLevel >= 80); FrmMain.mOEditCustomer.Enabled := (Globals.SecLevel >= 75); FrmMain.mOSuperCusEd.Enabled := FrmMainOT6.mOEditCustomer.Enabled; FrmMain.mEDupePart.Enabled := (Globals.SecLevel >= 80); //---------------------------------------------------------- txt := gmPrinterName(False); FrmMain.StatusBar.Panels[3].text := txt; txt := uppercase(txt); if (pos('HP',txt) + pos('LEX',txt) + pos('XRX',txt) + pos('XEROX',txt) + pos('SAMS',txt) + pos('KINGS',txt) + pos('PDF',txt) + pos('BROTHER',txt) = 0) then ShowDlgOops('WARNING: You''re default printer is not on ' +'the standard printer list. This could be because ' +'you are signing on from a computer that you have ' +'no prior account with and the list of default ' +'printers has not been installed. Be aware of this ' +'when trying to print. You might have to switch ' +'printers or contact me to get printers ' +'installed'); FrmMain.StatusBar.Panels[4].text := Globals.DEB + ' / ' + intToStr(Globals.SecLevel); DlgLogin2.free; dMain.mTblPW.close; Application.Run; end else DlgLogin2.free; end; end. As you can see, the lines right after main forms createForm line always revert to flush left. I space them over, save the DPR and the next time I go to edit it, they are right back where they started from. Finally, I stopped worrying about it. I have a Globals record that is brought in through a unit specifically designed for it, that I can share around all the apps. DEB stands for DataEnteredBy and is a short indicator of the full name. SecLevel is Security Level and it's on a 30-100 gradiant with me being the only 100 and the Boss being a 99. The minions fall somewhere short of that depending on oversight capability. I make menus appear to people who have the title. I check for printers because in doing so, I also check to see whether they've signed in from a fully-setup account in the process. Guess that's about it. I know it's not artful and WHO knows whether it breaks down in newer versions of Delphi. But what is the grief? Thanks, GM
  8. Gary Mugford

    Blast from the past: BDE and Win10 W/S

    Jobo, Turns out I HAVE been to Karsruhe, but I don't remember it. My mother enjoyed the day trip there and so did Dad, apparently. My only vague memory is of fun in Madurodam in The Netherlands. Your best wishes SEEM to be having some success, so keep 'em crossed. Thanks for that. NO drama on Monday. None on Friday of last week too. Another respite like this, and maybe we can declare the problem curbed, maybe even eliminated. Steps taken in no scientific method, so I don't know what had the best effect ... Confirmed all Paradox databases were Level 7. SIX databases provided by customers proved to be Level 5. I also made the Block size 32768 on all tables, about 20 were various sizes less than 32768 but none of them were approaching their record limits Had the registry setting suggested by Uwe Raabe added to the server. Went through EVERY table object in ALL applications and confirmed that dbiSaveChanges(tbl.Handle); was in the AfterPost event. Confirmed a clean bill of health. Switched the alias used to use UNC notation rather than direct mapping. Previously, had changed the shortcut of the apps on the Win10 workstations to run the program (whichever one it was) in Windows 7 emulation mode. I'm not sure if the microburst disconnection article prompted any changes by The Hardware Guy. But obviously mission critical if those disconnections are why we are running into Index Out of Date. Do I believe I have found the secret mix to make BDE behave under Windows 10? No. Slow it down? Maybe. And as long as good-hearted helpers are keeping their fingers crossed, maybe an intolerable situation with a deadline of yesterday, or the day before, or last year or last decade, becomes something to concentrate on getting a good replacement out, rather than A QUICK replacement. Thanks to all. GM
  9. Gary Mugford

    Blast from the past: BDE and Win10 W/S

    Jobo, Despite being Canadian, I actually spent my first five years in Baden-Baden, where my Dad was stationed with the RCAF. In fact, the middle brother in the family was born there. My first words were in German. Don't retain nearly enough of it, but I do treasure what little shared background we have. And if I have somehow given you the indication that I'm not appreciative of the time others have spent (including you) in trying to help me, then I have done you a disservice. I do, very much, appreciate help. Do I get defensive and/or proprietary over my work ... yeah, guilty. Some things I do were once cutting edge. Not any more, but in my prime, auto-auditing was considered a good thing in offices with a fair number of my client companies. I did look at doing a direct port of the systems software at the client's but the business model of the company had changed over the years. The Boss had adopted many Japanese production principles. As I mentioned, we're mostly a same day or, at worst, next day kind of producer. The original software was designed around three-week lead times. Those don't exist any more. The fields for LeadTime and LeadTimeRawMat and LeadTimeProd are three unused wastages of database space any more. Still, the lure of pushing a few buttons and having Delphi Parser do the port certainly enticed me enough to buy a year's licence. But there's no such thing as a free lunch and the fact that I used third-party DCU libraries and Paradox, made doing the port AND switching database backbone beyond the capabilities of Parser (a NIFTY product with great support). I had actually STARTED re-writes in 2009 and again in 2012, getting as far as show-and-tells of the new interface. Then, economics, health, changes in personnel at the company and a host of other excuses turned me back to a dam-leak fixer. Mostly in the form of standalone apps that achieved what we needed achieving right then and there. The Nov 2017 Waterloo to that plan made a re-write a necessity. And I'm just trying to buy time till I can take thirty years of programming business logic the way THEY think and roll it into the little I've learned about UI since then. In a new version of Delphi (to me). I can't use the same tools I've always used. I have to change to modern ways and means. And that change started long ago enough that it's end is closer than would be a port's end. Which brings me back to BDE. The Hardware Guy and I enjoy rather tight-fisted control of the work stations, the network and the server. I'm very positive that there is no deviation of paths, shares and settings. To the point where there is a program monitoring the folder for changes to anything other than the PDOXUSRS.NET file. We are using directly wired Microsoft Windows Server. No IP or DNS settings are involved. They exist for NexusDB. But again, we aren't using it yet. Just Paradox. With BDE. With Windows 10, which hates BDE. I'm going to fiddle with the UNC setting tomorrow to see if it is doable. And I'll leave it like that to start the new week (most especially MONDAY) and see what effect it has. If the micro-burst interruptions are the root cause of BDE's issues AND the UNC methodology FIXES that, then this whole thread can be deemed a success in the help process and documented for those few old goats like myself who need that information. And if it only SLOWS down the incident rate, this whole thing will have been worthwhile. And if it doesn't work, it STILL is worth the effort on my part. I will just be sad at wasting everybody else's time. Danke, GM
  10. Gary Mugford

    Blast from the past: BDE and Win10 W/S

    A.M., I will pass along your link and the suggestion to Hardware Guy. I'm little dubious about the ability to use sharenames in the BDEadmin. But then again, I haven't tried. I will report on the latter sometime latter today. Thanks, GM
  11. Gary Mugford

    Blast from the past: BDE and Win10 W/S

    LimElect, I DID indeed find a handful of files in Level 5. Not ones that originated with us, but was sent to us for use in future production and delivery scheduling. I've made the changes and will now monitor new submissions in the future. Thanks for getting me to take a look. GM
  12. Gary Mugford

    Blast from the past: BDE and Win10 W/S

    The testing of the registry ADDITION (it was absent) has begin. I will report the (happy?????) results. Thanks, GM
  13. Gary Mugford

    Blast from the past: BDE and Win10 W/S

    Jobo, Once more into the breach (and thanks for the warning about being too involved ... I'm a Type A personality, it's the only way I know) The organization of this software for THIS client of this built to THEIR specs software ... All applications (the main one, 16, IIRC, applets) goes into T:\DataApp. The apps are with three exceptions, written in Delphi 7. The other three are written in Delphi XE7, the latest licence I own. All Config files for BDE and the Network file for BDE goes into T:\Idapi All databases go into T:\DataApp\Data. That's ALL 249 Paradox databases with their attendant files, ballpark 2000 files in all when you add up the DBs, the MBs, the X# and Y# index files etc. There's an ASC file and a REP file in there somewhere dating back to 1995. The REORGANIZED new version the software will still see the applications in DataApp. The Config files and such will be set up on the server because NexusDB is the new database backbone and is a true database server, not a relational database like Paradox. The Databases will be going into T:\DataApp\NxData This is NOT generic software. Far from it. It uses their business model to do THEIR business the way THEY do it. Terminology is extremely individual. (BOM is Recipe, for example). This is NOT any sort of modification of an existing software base of anything else. It was built to be the most rudimentary of inventory tracking back in the day when the office was two people and the CEO (freshly elevated to the position by his retiring father, after being everything from janitor to salesman under his Dad). One computer for the accountant slash office manager. The other computer for head of purchasing who WAS keeping her purchases straight on a bank calendar (TRUE STORY). That was in the mid 80's and I was working with Paradox DOS. The company had one customer, a large American firm that you've heard the name of. Twice in the next three years, the company was named the International Supplier of the Year by their customer. Two more sugar daddy clients had been added and the company wasn't in a strip mall any more, it was in its own building co-owned with the bank. And there were now THREE, count 'em THREE computers in use. At that point, the Boss went to a trade show and was given a spiffy CD with a presentation of All-in-one software for their specific niche. I took a look at it overnight and went in and told him he had to fire me. That I couldn't reproduce the interface in less than a year and I wouldn't even start to guess at the business rules. I was just one guy, this software was produced by a team of 10. I was just being honest with him. We shook hands and parted friends. I went on to write some Warranty-entering software for a company in a different sector. Eight months later, I got a call. The ladies in the office had rebelled. The original sugar daddy customer had rebelled, warning that one more consecutive negative performance evaluation would end their business relationship. And I was asked to come in on a Friday afternoon and discuss the problems the all-in-one software was creating for the company. I was asked to create 'something' for further discussion Monday AM. Which I did, an OBVIOUSLY ALPHA product. Which they start using after lunch and never stopped using in the (I looked it up) 34 years since. Much against my protests, they've NEVER run in parallel at any time. I've never made them regret that trust except for one time when miscommunications caused my forecasting software to go awry and result in under AND over commitments to raw material, netting a loss for the company for the three days before it was discovered. Do I write software to academic AND real world best standards. No. Not even close. I'm not elegant. I just plug away to get the end result. Might not be the fastest. in fact might isn't even close. It's NOT the fastest. I'm a nibbler. A tester of a small change and once that works, next change up. It's not the fastest developmental strategy. I use direct manipulation of table data with table objects (mostly woll2woll stuff) And remember, I'm working with a RELATIONAL database, not a database server product. Heck, Delphi 7 doesn't even have a decent implementation of SQL built in. I designed against normalization rules I gleaned from reading back in the 80's. Did I understand the full form set? Nope. But I was aware of every byte of memory each record took and I used normalization rules as they made sense to me. It made MORE sense to me to have a small database of extra data than to create a field in the main database for something less than 1 percent utility. And I didn't want to have the overhead of that waste byte or two. These self-directed rules have never changed, even if worrying about a byte in a database design has become silly. And I have always, always felt obligated to have auditing EVEN WHEN NO AUDITING EXISTED. There was no auditing of a Paradox database in those days unless you wrote your own. And I stuffed it into a memo field at the end of the actual database because that made sense to me at the time. There's a central auditing history database in the new design. But it's STILL my design, NOT THE AUDITING that is built into NexusDB because of the need for a database server to be able to roll back changes. MY AUDITING WASN'T DESIGNED FOR THAT. What it was DESIGNED for was that small two-person office where changes needed to be tracked so that we didn't run into the problem of finding WHO had done it and WHY SHE HAD DONE IT. (True story, the inspiration was a Bil Keane The Family Circus cartoon about the little kid being asked who'd done something and the kids automatically naming the ghostly Idunno and NotMe characters). In MY OFFICES (all of my projects), we didn't waste time on figuring out who had done whatever, we moved directly to the why. Blame evasion was cancerous in offices as workers automatically resorting to saying 'Not me,' when they didn't remember or did remember and wanted to avoid censure. That crap went out the door at MY OFFICES. Just get to the chase of finding out why something had been changed and making sure it didn't happen again if there was some problem. I have always worked on the ground level and I know just how petty office politics can be. Now, with due respect, since we haven't been on the same page due to the lack of clarity in my writing, the code would be meaningless to you. What code snippet do you want? The code that writes to the history field? Taken completely out of context, it would be meaningless to you. It works. Has worked. Right up until November 2017. STILL WORKS. Have ABSOLUTELY NO IDEA why it RANDOMLY helps generate a Blob is modified error in something like a tenth of a case per hundred events, about ten times more than it did in the decades before. And it doesn't have ANYTHING to do with Index out of Date errors that I can see. I have never indexed a memo field and have operated under the impression it was impossible anyway. Those Index out of Date errors ONLY GENERATE when somebody signs in and the program burps immediately before doing anything. The Indexes went out of data sometime earlier and the users who are already in DON'T EVEN KNOW IT. It's only on program startup that it's detected. So, what part of my program, if it is indeed my program, is guilty of being the cause? Is my code error-free? Of course not. I'm not stupid enough to think that. But when code works mostly problem free for a LOOOOOONG time and then doesn't work, I did what you wanted me to do, a lot of navel gazing. And for a long time, I thought I was at fault. Until one user detected the near statistical correspondence with Windows updates, starting with the November 2017 Update. Turns out, that was the case for most of the first half of 2018. Since then, the problems now seem to occur on Mondays (after HW Guy does some updates over the weekends, which he manually rolls out to control the process) and Fridays. Today is Friday. Today will not be a good day. Or maybe it will be. We've made the Opportunistic Locks changes and I've looked and found six Paradox Level 5 databases provided to us by a customer to schedule their production and deliveries. They've been upped to Level 7 and I will be on the lookout for new schedules arriving from the customer in the future. EVERY LITTLE BIT HELPS. I've also checked the afterPost event for all the databases in all the table objects (Over 400 in total) in all 16-17 apps. All WERE properly set to save immediately. Jobo, I know you are trying to help and questioning and answering is how truths can emerge. The problem here, by consensus, is that I should NOT be using BDE and the sooner I can do my rewrite and start employing NexusDB as the database backbone, the sooner I can stuff this whole issue back into Al Capone's Vault. Thanks for being generous with your time. It hasn't been the case where your experiences and mine hew close enough to give us a common platform to talk about. Thanks, GM
  14. Gary Mugford

    Blast from the past: BDE and Win10 W/S

    Dany, Thanks for your kind words of solidarity. Honestly, the biggest burden is borne by my partner in crime, the Hardware Guy. What he does scrounging here and there for stuff at prices the company can afford is sometimes spectacular. And when not, just merely great. Me? There was a time where I averaged two updates every three days for four years. I was young and full of energy. And I loved what I was doing. Now, the first two of those things are no longer true. But the third one is. I do get frustrated at times, but then I remember a guy that paid me while I was in hospital after heart surgery. Paid me when I didn't produce a single lick of code. Paid me when I was producing the odd clunker code that cost him money (accepting the blame for incorrect formulas I'd been given). I'd no sooner give up on him then I would family. He and his minions ARE family. (And no, not everyone. There are a few I'd gladly have exported to a war zone). I accept (because I've seen the books) that money is tight. It's been that way for years because every time it's good times, workers get raises. And when belt-tightening is called for, everybody shares the pain, a bit. Even me. So, I make do. Dreaming of that that can't be had is the way to madness. GM
  15. Gary Mugford

    Blast from the past: BDE and Win10 W/S

    Jobo, One other factor I should stress. There isn't a budget to run solutions against. The company employs a fair number of people, none of whom are getting rich, including the owner. We scrimp and save and get by. We have some pressures currently due to political shenanigans, but so does everybody in the sector here in Canada. Moaning about the issue doesn't help. We use eight-year old Work Stations that weren't new when we got them. We improvise to network in a second building via doppleganger machines and the internet. The HW guy is brilliant at making things work with nothing more than will to do so. We use older Delphi and don't keep our licence up to date because we simply can't afford to. The cost of keeping Delphi up to date is an extra part-time worker to help with the workload that keeps all of our workers working almost to their maximum. I'm PROUD to be associated with them. They MOSTLY work to the work's end, not to the time clock. And they put up with me ... and that ain't easy. They are my friends. GM
×