JonRobertson
Members-
Content Count
278 -
Joined
-
Last visited
-
Days Won
6
Everything posted by JonRobertson
-
How to debug a Not Responding program element
JonRobertson replied to Willicious's topic in Delphi IDE and APIs
Never mind, found it. TGadgetAnimations is a class of TObjectList. TObjectList has a property named OwnsObjects that is True by default. Unless OwnsObjects is set to False, TObjectList will call Free to release all objects that are added to it. See the documentation for TObjectList.OwnsObjects. The only place in the SupperLemmix code where I see OwnsObjects set to False is here: fTalismanButtons.OwnsObjects := false; // Because TFLevelSelect itself will take care of any that remain -
How to debug a Not Responding program element
JonRobertson replied to Willicious's topic in Delphi IDE and APIs
fPrimaryAnimation is likely only a reference to which animation is currently the primary animation. TGadgetAnimations adds NewAnim to a list of some kind (see the calls to Add(NewAnim) and Add(aPrimary). I suspect TGadgetAnimations is responsible for freeing all animations that are added. Is this still SupperLemmix? I downloaded SupperLemmix source just now from https://github.com/Willicious/SuperLemmixPlayer and I do not see TGadgetAnimations in that code. -
Yes. Several questions, about the Database Comparer VCL components. I downloaded the trial and samples of Database Comparer. With the prebuilt DBComparerDemoAdo, I attempted to compare two versions of one of our databases. The result was "Update script is empty" even though there are certainly differences in the schema of the databases. There are some messages in the log indicating an issue, such as "ambiguous column" and "field not found". However there is no additional information to give insight, such as the DB objects that triggered the errors. I hoped that "The trial version can operate inside Delphi / C++Builder IDE only, all other features are completely available without any restrictions" was accurate. There is no mention on the download page of other restrictions. The trial version appears to be limited to extracting only a few DB objects. The help file is unhelpful on most topics, for example: TCustomScriptExtract.ScriptFileNames property ScriptFileNames : TStrings; A vast majority of the help topics are like this, lacking any description aside from the Pascal definition. Without source, it is difficult to determine the capabilities without better documentation. One of the most important capabilities that I need to test is how well the components handle dependencies between database objects. What order are objects created? If there are stored procedures or functions that depend on other stored procedures or functions, are these created in the correct order so the creation scripts do not fail? How can I iterate through DBStructure.Metadata properties (such as Tables, Views, and Procedures) by name? I don't see a way to get a list of the names of the objects that were extracted, a count of the objects, or a way to iterate them by index. If I have a list of table names, how do I use .Tables['MyTable'] to get the CREATE script? I've tried .Body, .CurrentDefinition, .SourceDefinition, .Text, and .SQLExec (to get to .SQLExec.Statements, but .SQLExec is nil). I greatly appreciate any insight you or anyone else can provide. I need to make a recommendation on purchasing either Database Comparer VCL, Delphi HTML Component Library (primarily for the SQL Library components), or writing my own, which I started investigating today.
-
I doubt it. The domain register is in Germany and the registered name servers are in Russia.
-
Embarcadero Partners with Raize Software for KSVC Maintenance
JonRobertson posted a topic in Delphi Third-Party
Embarcadero Partners with Raize Software for KSVC Maintenance -
The Assign method is introduced in TPersistent. All well-written components should override the Assign method. I believe this dates back to Delphi 1. TPersistent.Assign
-
Using reFind to remove property of a specific component
JonRobertson posted a topic in Tips / Blogs / Tutorials / Videos
Does anyone know how to use reFind to remove a property for a specific component in a DFM? For example, remove BorderStyle from only TMemo components? I have tried #remove TMemo:BorderStyle but that does not work for me the way #migrate TMemo:BorderStyle does. I have tried a few other things, but either no BorderStyle property values are removed or all of them are. Thanks -
Using reFind to remove property of a specific component
JonRobertson replied to JonRobertson's topic in Tips / Blogs / Tutorials / Videos
Or provide the source (not open source, just source like the RTL/VCL source) to active subscribers so we can adapt it as we need. I added a comment to the RSP but I probably need to create a new QP request since mine was closed as resolved. -
Using reFind to remove property of a specific component
JonRobertson replied to JonRobertson's topic in Tips / Blogs / Tutorials / Videos
Resolved: Works as Expected. Given reFind is a tool mostly focused on migration to FireDAC, we don't plan expanding it to support other automatic processing scenarios... -
Threadvar "per object"
JonRobertson replied to chkaufmann's topic in Algorithms, Data Structures and Class Design
TLightweightMREW Our "issue" at the time was RTL code. Specially in a DCOM based MIDAS/DataSnap server that created a thread for each user connection. Once the DataSnap server had over 100 users connected, it would frequently lock up due to a deadlock with GlobalnameSpace. However, the contributing factor was we were doing "too much" in RemoteDataModuleCreate, which extended the amount of time that GlobalNameSpace was locked. We also had multiple TRemoteDataModules due to the size of our app. While I don't disagree with your assertion of "people didn't know what they were doing", it wasn't because we were misusing TMREWS. We never used it directly in our code. My apologies for hijacking the thread. I'll stop now. -
Threadvar "per object"
JonRobertson replied to chkaufmann's topic in Algorithms, Data Structures and Class Design
Nope. It returns results like Numerous posts about TMREWS having issue and asking if those were fixed. A few posts suggesting an alternate solution. I trust members of Delphi-Praxis more than most other online resources. So I thought I'd ask. -
Threadvar "per object"
JonRobertson replied to chkaufmann's topic in Algorithms, Data Structures and Class Design
Does anyone use TMultiReadExclusiveWriteSynchronizer? The application team I was on 20 years ago had some problems with it in D6. But I see that the VCL still uses it for GlobalNameSpace (for Windows anyway). -
Reminds me of one step forward, two steps backwards.
-
Threadvar "per object"
JonRobertson replied to chkaufmann's topic in Algorithms, Data Structures and Class Design
Is any instance of TBSItemProvider accessed by multiple threads? -
How to debug a Not Responding program element
JonRobertson replied to Willicious's topic in Delphi IDE and APIs
Classes do not need a destructor to be destroyed/freed. A class needs a destructor if it allocated other objects or memory that it should free or there is other cleanup it needs to do before being destroyed. If an object is not being freed, adding a destructor would not fix the issue. Read the comments in FastMM4Options.inc. Specifically: {Set this option to log all errors to a text file in the same folder as the application. Memory errors (with the FullDebugMode option set) will be appended to the log file. Has no effect if "FullDebugMode" is not set.} {$define LogErrorsToFile} {Set this option to log all memory leaks to a text file in the same folder as the application. Memory leak reports (with the FullDebugMode option set) will be appended to the log file. Has no effect if "LogErrorsToFile" and "FullDebugMode" are not also set. Note that usually all leaks are always logged, even if they are "expected" leaks registered through AddExpectedMemoryLeaks. Expected leaks registered by pointer may be excluded through the HideExpectedLeaksRegisteredByPointer option.} {$define LogMemoryLeakDetailToFile} It has been a while since I did this. I found a post on SO for a reminder. Based on that post, copy FastMM4Options.inc to your project folder. Edit the .inc file and remove the period from {.$define FullDebugMode} Do a full build of the project and any leaks should be written to a text file with additional information about the object leaked and when it was allocated. -
Variable might not have been initialized
JonRobertson replied to shineworld's topic in Delphi IDE and APIs
đź‘Ť I set that compiler warning (and a couple others) as an Error in every project: -
That sounds like much more code than necessary to me. I have a base form with a TDataSet field named StateDataSet and a virtual method called UpdateUIState. Each derived form assigns StateDataSet during FormCreate and overrides UpdateUIState to update the UI based on various conditions, such as TDataSet.State and user security for that form/data. Both the base form and the derived user form is "aware" of the record operation (view, insert, edit) by looking at StateDataSet.State. Every form has a ValidateForm method to ensure that required fields are provided and any referring data is valid before the record is posted. I avoid writing anything to the database unnecessarily. Adding a row temporarily that will be removed if the edit is canceled is wasteful network and disk I/O as well as increasing db index and page fragmentation. Some customers now use a "cloud hosted" database server, so database read/writes also have extra latency. Doing as much as possible in memory is a huge performance gain. I find it much easier to maintain a single form (per table/record). I don't have to take the time to update two or three forms when changes are needed and ensure that the implementation is consistent across multiple forms/units. FWIW, my data edit forms have a lot of common functionality that is implemented in the base form, not just StateDataSet and UpdateUIState.
-
I wouldn't use a separate flag unless necessary. If you are using a TDataSet descendent, you can look at the State property to determine whether the record is being inserted (State = dsInsert) or edited (State = dsEdit). If it is necessary to call Post in code, you can use if ds.State in dsEditModes to determine if the current record needs to be posted.
-
I suspect to gather material for Jim's upcoming webinar.
-
Using reFind to remove property of a specific component
JonRobertson replied to JonRobertson's topic in Tips / Blogs / Tutorials / Videos
I created RSS-1136. This is my first QP under the new portal. I suppose I need to figure out a way to enter a QP for the new portal. It seems odd that the list of "Components" is so limited. This QP does not fit under "IDE", but I couldn't find a better "Component" to specify. -
Delphi 12.1 Amnesty price isn’t what I thought it was…
JonRobertson replied to Al T's topic in Delphi IDE and APIs
So Microsoft Windows Professional, SQL Server (not Express), and most of their other "Enterprise" software aren't enterprise software applications? -
Delphi 12.1 Amnesty price isn’t what I thought it was…
JonRobertson replied to Al T's topic in Delphi IDE and APIs
I don't understand why anyone would compare Microsoft's business motives to Embarcadero's. Microsoft's bottom line is based on the success of their platforms (Windows, SQL Server, Office 365, Azure, ad nauseam). They could give Visual Studio Enterprise to every interested developer for free and not need to worry about paying the bills. Or their Visual Studio development team's salaries. Embarcadero's bottom line is based on the success of development tools and Interbase. They don't spend resources on Delphi and C++ Builder so they can profit from an operating system or hardware platform. -
When I initially installed Delphi 11.0, I went through GetIt and installed several items, including the Parnassus Bookmark and Threaded Debugging plugins. For the next couple of months, the Delphi IDE was more unstable than any previous version. It was bad enough that I emailed my account rep and she arranged an online call. The short version is that once I uninstalled both Parnassus plugins, exceptions stopped occurring in the IDE. I occasionally see one today, but that is typically after having an instance of the IDE open for several hours using the debugger heavily.
-
What version of Delphi has the least amount of bugs throughout history?
JonRobertson replied to Al T's topic in Delphi IDE and APIs
My favorite versions, which has a lot to do with stability, were Delphi 3, 6, and XE2. At a prior position, the company stayed on Delphi 6 for 9 years. Delphi 7 didn't have any benefit for us and then Borland chased the white rabbit down the .NET path... We started migrating with Delphi 2009 but did not have a stable release candidate until Delphi XE2. That was primarily due to switching our product from DCOM DataSnap to dbExpress DataSnap. Same here. I currently maintain a few apps that are Delphi 7 projects, and most will likely not be migrated to a newer Delphi. I use Delphi 7 in Windows 10, sometimes several hours a week. Although being used to the functionality of newer IDEs, I get frustrated at the difference in productivity using Delphi 7. -
Delphi 12.1 Amnesty price isn’t what I thought it was…
JonRobertson replied to Al T's topic in Delphi IDE and APIs
Same here. I brought this up with Ian Barker and my assigned rep. I asked that as well. Yep. Wash, rinse, spin, dry, repeat. But wait, those clothes just came out of the dryer... It helped for a little while. But I am back to receiving multiple "upgrade" or "renew" email offers every week, sometimes multiple times in one day. And our licenses do not expire until February, 2026. But the ones that I find most frustrating are the "personal" emails asking if I'd like a demo of the development tool that has been my tool of choice since 1996.