-
Content Count
1085 -
Joined
-
Last visited
-
Days Won
23
aehimself last won the day on June 10 2024
aehimself had the most liked content!
Community Reputation
404 ExcellentTechnical Information
-
Delphi-Version
Delphi 12 Athens
Recent Profile Visitors
The recent visitors block is disabled and is not being shown to other users.
-
TListView & TJvListView - Subitems line in 255 characters
aehimself replied to Gin Beginner's topic in VCL
The caption isn't truncated, only the display is clipped: procedure TForm1.FormCreate(Sender: TObject); Const MYTEXT = '<RHINOSTRING English="Exploding this mesh will create %d individual meshes. This may be more than your system can safely manage using the available memory. You can use Weld to make the mesh explode into fewer pieces, or see Help for more information.\n\nClick OK to proceed with Explode, or Cancel to leave the mesh as is.[[24836]]" Localized="Exploding this mesh will create %d individual meshes. This may be more than your system can safely manage using the available memory. You can use Weld to make the mesh explode into fewer pieces, or see Help for more information.\n\nClick OK to proceed with Explode, or Cancel to leave the mesh as is.[[24836]]" />'; begin ListView1.Items.Add.Caption := MYTEXT; ShowMessage(MYTEXT.Length.ToString + sLineBreak + ListView1.Items[0].Caption.Length.ToString); end; Shows 661 and 661 respectively. The reason seems to be a WinApi limitation: https://stackoverflow.com/questions/19881409/tlistview-add-600-characters-on-item-caption -
Ignoring nil values with ΤJsonSerializer
aehimself replied to pyscripter's topic in RTL and Delphi Object Pascal
Does TJSonSerializer work with TObjectList and TObjectDictionary already? As far as I remember this is why I started to (de)serialize objects manually back around Delphi 10.4 but would love to automate things finally :) -
For a while I used this unit to detect the OS version and edition. For a while it is unmaintained though and could use some refactoring for sure. As @David Heffernan mentioned you must include a mainfest file as a resource in your application, otherwise OS detection will return false information due to compatibility modes.
-
I read a tip here on DelphiPraxis back in 10.x that disabling the Welcome screen altogether greatly improves stability. Since then that's the first thing I do after a Delphi installation and the IDE is rock solid since then. You get an AV if you click on the Welcome screen settings in Options, but that's a sacrifice I'm willing to live with :)
-
I'm using this code for alternating colors: Procedure TDBGrid.DrawColumnCell(Const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); Var dataset: TDataSet; {$IFDEF HIDECOLLINESIFEMPTY} colline: Boolean; {$ENDIF} editcolor: TColor; hidefocus: Boolean; Begin dataset := Self.DataSource.DataSet; // This method is only being called on DATA cells, which only happens if there is a dataset connected. Therefore, no // need to perform an assigned check here. {$IFDEF HIDECOLLINESIFEMPTY} colline := True; {$ENDIF} hidefocus := Not (csDesigning In Self.ComponentState) And (gdSelected In State) And Not Self.Focused; If (dgMultiSelect In Self.Options) And (Self.SelectedRows.CurrentRowSelected) Then Begin End Else If dataset.IsEmpty Then Begin {$IFDEF HIDECOLLINESIFEMPTY} colline := False; {$ENDIF} editcolor := TStyleManager.ActiveStyle.GetStyleColor(scEdit); Self.Canvas.Brush.Color := editcolor; Self.Canvas.Font.Color := editcolor; End Else // This code imitates the highlight of the whole row even if RowSelect is disabled. Note that it needs MultiSelect to be enabled! // If Not (gdSelected In State) And grid.SelectedRows.CurrentRowSelected Then // grid.Canvas.Brush.Color := clHighLight // Else If (dataset.RecNo Mod 2 = 0) And ((State = []) Or hidefocus) Then Self.Canvas.Brush.Color := TStyleManager.ActiveStyle.GetStyleColor(scButtonDisabled) Else If (dataset.RecNo Mod 2 = 1) And hidefocus Then Self.Canvas.Brush.Color := TStyleManager.ActiveStyle.GetStyleColor(scEdit); If hidefocus Then Self.Canvas.Brush.Color := TStyleManager.ActiveStyle.GetStyleColor(scCategoryButtonsGradientBase); {$IFDEF HIDECOLLINESIFEMPTY} If HIDECOLLINESIFEMPTY And colline And Not (dgColLines In Self.Options) Then Self.Options := Self.Options + [dgColLines] Else If HIDECOLLINESIFEMPTY And Not colline And (dgColLines In Self.Options) Then Self.Options := Self.Options - [dgColLines]; {$ENDIF} inherited; Self.DefaultDrawColumnCell(Rect, DataCol, Column, State); End; Supports VCL styles and works fine for a couple of years now. I used the "lazy" technique. Save this as uDBGrid.pas, add is to the uses clause of your form and in the declaration change "grdMyDBGrid: TDBGrid;" to "grdMyDBGrid: uDBGrid.TDBGrid". Since the class name is the same no modification in the dfm is necessary. Drawback is, it only works runtime. And it's hacky.
-
should be simple: is computer on home network?
aehimself replied to bobD's topic in Network, Cloud and Web
I never personally used FireDac, but doesn't it have a configurable timeout property? If no, what you can do is to attempt to connect in a background thread. Use your local connection until DB connection succeeded then simply swap them out and sync changes. -
should be simple: is computer on home network?
aehimself replied to bobD's topic in Network, Cloud and Web
Why to have any additional checks then...? When you initiate a connection to a host name / fqdn, name resolution is done automatically by the DB client library. Just attempt a connection to your database server. If that fails for any reason, fall back to the local DB. -
should be simple: is computer on home network?
aehimself replied to bobD's topic in Network, Cloud and Web
This check will trigger on all networks, which are set to private which is probably not a desired behavior. While these will work, OP's solution will be a different design pattern. What if you put the code in a separate DLL, which you are not distributing; and lives only on your home dev PC? -
should be simple: is computer on home network?
aehimself replied to bobD's topic in Network, Cloud and Web
When you are trying to detect your home network, don't rely on a successful (reverse) DNS lookup. I usually ping my home router (using fqdn) but even better, attempt a connection to a well-known service. However I only use this method to decide if VPN should be fired up or not; it's better to set up your DNS properly so tools will work from inside and outside. If you are keen to go this way I found these two snipplets in my codebase: Function LookupHostName(inIP: String): String; Var host: PHostEnt; addr: Integer; dat: TWSAData; Begin Result := ''; WSAStartup($0101, dat); Try addr := inet_addr(PAnsiChar(AnsiString(inIP))); host := GetHostByAddr(@addr, 4, PF_INET); If host <> nil Then Result := String(host.h_name); Finally WSACleanup; End; End; This one was abandoned halfway as no variables seem to be declared: Write('Attempting to resolve ' + HostName + '...'); If WSAStartup($0101, wsdata) = 0 Then Try tmp := GetHostByName(PAnsiChar(HostName)); If tmp <> nil Then Begin tmpin.sin_addr.S_addr := LongInt(PLongInt(tmp^.h_addr_list^)^); IPAddress := inet_ntoa(tmpin.sin_addr); WriteLn(IPAddress); End; Finally WSACleanup; End; May I ask why your program needs to behave different from a specific network? There might be a better way than relying on simple checks, which might trigger in places you don't want them to. -
The basic ones (label, edit, memo, etc.) are self-explanatory. For the rest I'm usually creating an empty project, dropping one of the components on the form and start experimenting in what I can do with it.
-
Set StyleName for one single control, yet no style for the rest of the app
aehimself replied to CyberPeter's topic in VCL
I had one situation when VCL styles flickered a lot, and that was if they were on an anchored / aligned panel and the form was being resized. Setting .ParentBackround := False on the panel solved this though. -
In theory, you can use XP... I'd love to give it a spin and see if the latest Delphi runs fine or not :)
-
Windows 11 moved further away from privacy, prefers "innovation" noone asked for over functionality and requires way too much hardware just to sit on the desktop, doing nothing. I'm eyeing Windows 10 IoT Enterprise LTSC. Price is not that high and you get a fully functional and debloated WIndows 10, supported until 2035. Until then I hope a Delphi IDE will be released for Linux :)
-
Long story short - if you don't have to, don't. I am forced to use it at work and the only positive thing I can say about it is even XE7 runs on it without issues.
-
Build time affected with an updated component...
aehimself replied to Ian Branch's topic in General Help
Antivirus exclusion? If only specific bds.exe-s are set (not the whole Program Files\Embarcadero\Studio folder) your real time scanner can and will affect build times.