-
Content Count
620 -
Joined
-
Last visited
-
Days Won
11
Everything posted by corneliusdavid
-
wuppdi Welcome Page for Delphi 11 Alexandria?
corneliusdavid replied to PeterPanettone's topic in Delphi IDE and APIs
Why? Were they causing a problem? -
Is your package using something that pulls in getit or welcomepage? I've never seen this and have compiled components in D11.
-
Why empty dynamic arrays = NIL?
corneliusdavid replied to Mike Torrettinni's topic in Algorithms, Data Structures and Class Design
No, a TList is similar to the dynamic array with no elements in this case, it's just declared but doesn't point to anything yet until the Create constructor is called, THEN it points to the allocated memory for the TList. Even though TList, at that point, doesn't have any items, it still has other properties like Count which is initialized at Create to 0. The dynamic array isn't a class, in other words, it doesn't have other properties, such as Count, which is why you have to use the Length() function. -
Why empty dynamic arrays = NIL?
corneliusdavid replied to Mike Torrettinni's topic in Algorithms, Data Structures and Class Design
And to further clarify my "array declaration" statement, a dynamic array declaration doesn't allocate the space for it until its length is set to at least 1. -
Stream in controls at run time created by REST Debugger
corneliusdavid replied to david_navigator's topic in RTL and Delphi Object Pascal
So what I would suggest is either try out Uwe's code above or look at the GExperts code (it's open source) to figure out how they do it. Also, since you're specifically wanting to use the three components generated by the REST Debugger, you could compare the components it creates with the values in the paste buffer and do a little parsing to set the values for those specific components. -
Why empty dynamic arrays = NIL?
corneliusdavid replied to Mike Torrettinni's topic in Algorithms, Data Structures and Class Design
To expand on what Uwe said, an array declaration allocates space for the variable and creates it when it's declared, much like an integer or string. Changing it's length sort-of redeclares it. This is in contrast to the TList<T> where the declaration doesn't allocate space for the variable (instantiate it) so you have to actually call its Create constructor. Before it's "created" then, it's nil. -
Stream in controls at run time created by REST Debugger
corneliusdavid replied to david_navigator's topic in RTL and Delphi Object Pascal
Or do you want the user to actually use the REST Debugger, click the Copy Components button, and go to your running application and do the paste while it's running? So you want to convert the pasted objects to "create" statements--is that what you're after? -
Stream in controls at run time created by REST Debugger
corneliusdavid replied to david_navigator's topic in RTL and Delphi Object Pascal
Exactly. So just put the code in the OnCreate of the form and they'll be created at run time. -
Stream in controls at run time created by REST Debugger
corneliusdavid replied to david_navigator's topic in RTL and Delphi Object Pascal
Pasting components to the form is essentially creating the components and hooking them to the form. How does this code not do exactly that? What else are you looking for? -
Stream in controls at run time created by REST Debugger
corneliusdavid replied to david_navigator's topic in RTL and Delphi Object Pascal
Any component can be created in code at runtime. Here's the code for your posted set of components: var RESTClient1: TRESTClient; RESTRequest1: TRESTRequest; RESTResponse1: TRESTResponse; begin RESTClient1 := TRESTClient.Create(Self); RESTClient1.Name := 'RESTClient1'; RESTClient1.BaseURL := 'https://api-eu1.XXXXXXXXXXXXXXX/ORD'; RESTClient1.Params := <>; RESTRequest1 := TRESTRequest.Create(Self); RESTRequest1.Name := 'RESTRequest1'; RESTRequest1.AssignedValues := [rvConnectTimeout, rvReadTimeout]; RESTRequest1.Client := RESTClient1; RESTRequest1.Method := rmPOST; with RESTRequest1.Params.Add do begin Kind := pkHTTPHEADER; Name := 'x-api-compleat-key'; Value := '0aXXXXXXXXXXXXXXXXXXXXXX94'; end; with RESTRequest1.Params.Add do begin Kind := pkREQUESTBODY; Name := 'body9BE6CF603159471FB026D7FF6FC3D2DB'; Value := ; ContentType := ctAPPLICATION_JSON; end; RESTRequest1.Response := RESTResponse1; RESTResponse1 := TRESTResponse.Create(Self); RESTResponse1.Name := 'RESTResponse1'; end; The GExperts IDE plugin has a very easy way to generate this. After it's installed, simply right+click on a component and select "Components to Code" and the code to generate the component is copied to the clipboard. Then just paste them into your code editor. It does one component at a time so I had to combine the three RESTxxx components into the VAR section after each one but it's really as simple as that. -
web scraping or web parsing for project?
corneliusdavid replied to KeepTheHonesty's topic in I made this
I would suggest looking at one of Embarcadero's latest acquisitions, ApiLayer; they have a web-scraping API. Don't know anything about it but "Turn web pages into actionable data" (scraped from their website) sounds like what you're trying to do. -
Thank you for these details!
-
Parnassus Bookmarks for Delphi 11 Alexandria?
corneliusdavid replied to PeterPanettone's topic in Delphi IDE and APIs
Bookmarks and Navigator are my favorite Delphi IDE plugins--hope it's not much longer! -
LOL! We all get stuck in a train of thought once in a while! I've definitely been there. 😎
-
I think I would split the string on semicolons and run the regex on each individual address. function ValidEmail(const EmailAddress: string): Boolean; const EMAIL_REGEX = '^((?>[a-zA-Z\d!#$%&''*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])' + '[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)' + '(?>\.?[a-zA-Z\d!#$%&''*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x7f])' + '[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]' + '{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d))' + '{4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])[^\\\[\]]|\\' + '[\x01-\x7f])+)\])(?(angle)>)$'; var Emails: TStringList; begin Result := True; Emails := TStringList.Create; try Emails.Delimiter := ';'; Emails.StrictDelimiter := True; Emails.DelimitedText := EmailAddress; for var i := 0 to Emails.Count - 1 do if not IsMatch(Emails[i], EMAIL_REGEX) then begin Result := False; Break; end; finally Emails.Free; end; end;
-
read integer value from database, best practice ?
corneliusdavid replied to FranzB's topic in Databases
Within both the context of the original question and my response, we were talking specifically about Integer fields--not strings or floats or memos. -
Delphi 11 Alexandria: New Edit Window
corneliusdavid replied to PeterPanettone's topic in Delphi IDE and APIs
Just because it doesn't have features you think are necessary doesn't mean it's useless. I really like this new window as I can open this up and move it to a second monitor so I can see either a different section of the code or the design view of the form while editing the code. In this use case, it wouldn't make sense to have it dockable. Also, I wouldn't need it for every unit, just occasionally for some forms or data modules--when I need it, the feature is there. I can see the benefit for making it dockable and saving it as part of a desktop layout but that's not the first thing I thought of. I'm glad they added this feature. Perhaps there will be a dot release with enhancements you suggest. -
read integer value from database, best practice ?
corneliusdavid replied to FranzB's topic in Databases
If you know there's a space in the field, then the code you listed, "Fieldbyname('IntegerField').AsInteger" is misleading as that is most definitely NOT an IntegerField as Integer fields cannot have spaces (well, SQLite might allow it). If your "integer" field might possibly contain values other than integers, you will have no choice but to test to make sure it actually contains an integer before trying to use it as one. The AsInteger function doesn't check the data type, it just assumes you know what you're doing with your database. -
Yes, FireDAC can connect to local or remote database, the same as IBConsole and you can view remote data from within the Delphi IDE. You just specify the SERVER and PORT to point to the other machine. And, of course, remember that the database filename is local to the SERVER, not the local machine (e.g. don't give the network share name of the location of the database). One thing to keep in mind if you have multiple instances of InterBase: each one has to be licensed separately--you can't use the same license for two different ones. It'll probably run fine for a short while but you'll soon run into the license problem like I did.
-
When I installed Delphi 11, I skipped the InterBase install since I already had IB 2020 installed so I only have one instance of IB 2020 installed on my developer machine. OK, I should explain--that screenshot is misleading. I originally installed IB 2020 with Delphi 10.4 on my developer machine. Then, I started doing some testing with web modules on my Windows Server under IIS so installed IB 2020 on there. After I registered that and started using it there, when I try to open a database on my developer machine, it tells me the license is already in use. I need to uninstall it from my developer machine--the only one I can really use in that screenshot is the one at the IP address that points to my Windows server. I included the screenshot to show that it's possible to register multiple databases with different instance names and ports. Sorry for the confusion. But to answer your question about how to setup up multiple databases in IBConsole (if that's what you wanted to know), when you right+click on "InterBase Servers" and select Add..., you get prompted for local or remote. For my Windows Server, I selected Remote and entered it like this: Hope that helps.
-
However, I should ask why you would need two instances of the same version of InterBase running on the same machine--and likely using the same license... Why not just use the existing installed IB from both versions of Delphi?
-
Reinstall one of them to use a different port and instance name. Then when you add a connection specify which port to connect.
-
Delphi Known IDE Packages Manager updated to Delphi 11 Alexandria
corneliusdavid replied to dummzeuch's topic in Tips / Blogs / Tutorials / Videos
Cool! Does removing some packages speed up loading of Delphi? Do the descriptions show up anywhere else other than the Windows Registry? -
Is it possible to see Git current working branch in IDE?
corneliusdavid replied to Mike Torrettinni's topic in Delphi IDE and APIs
I don't think your original question was ever answered--lots of other information, though. To answer your question, No, the Delphi IDE does not show the current Git branch, only recent commits. It has a nice difference viewer that augments the History pane of the editor but that's it; it uses the current branch of the repository folder. -
I've got a very simple cross-platform app with a TListView on the main form and when you click on an item, it should fire an event which takes the user to the next tab and displays details about the item that was clicked. I want to use OnItemClick so that it updates the current record of a memory table it's hooked to via LiveBindings. For the Windows platforms, this works perfectly as expected. On iOS, there is no OnItemClick event fired. On Mac, I can use the arrow key, then the space bar to activate it but not the mouse. I tried this a couple of days ago with Delphi 10.4.2, found a reported issue that was supposedly fixed in 10.4.1 (I can't find the issue now), and just tried it again today in Delphi 11 but I still have the same problem. Does TListView's click events behave differently on mobile devices? Is there a separate event I can use if I want to use the Accessory Button instead? I've found lots of information to configure viewing data in a TListView but not much in responding to events. Any clues would be most appreciated.