Jump to content


Popular Content

Showing content with the highest reputation since 02/19/21 in all areas

  1. A new version (1.1) of SVGShellExtensions (Open-Source) has been released with a new component (a very useful SVG Text Editor) and a context-menu to export an SVG file to multiple PNG files. The new Setup is always available on the project page: https://github.com/EtheaDev/SVGShellExtensions The preview panel now has a slider to change the "backlight" of the image and more settings (such as text color attributes, theme, use of native Direct2D). The SVG Text Editor is useful for developers who need to change certain aspects of the icons (such as element colors) or try to change the SVG language and see an instant preview of the changes. Any suggestions for improving these components are welcome!
  2. This is a bug in TFDBatchMoveTextReader. To fix it: open FireDAC.Comp.BatchMove.Text.pas locate there lines (around line # 1750): until FEof or lEOL or not lInDelim and (FBuff[iLen] = DataDef.Separator); if not FEof then Dec(iLen); replace with: until FEof or lEOL or not lInDelim and (FBuff[iLen] = DataDef.Separator); if not FEof or not lEOL then Dec(iLen); add FireDAC.Comp.BatchMove.Text.pas to your project, or include path to this unit to project->options Search Path, or to tools->options Library Path PS: Best will be to report this issue to quality.embarcadero.com
  3. In a similar vein, @Eric Grange saved my last week with his SamplingProfiler (https://www.delphitools.info/samplingprofiler/). A good example of a KISS tool - just the right amount of information needed, and really simple to use. So a big thanks from me to Eric Grange.
  4. Thank you very much @AndreMussche. Your https://github.com/andremussche/asmprofiler has saved my day ... my week ... after searching the bug and not finding it by myself ... and a "not working AQ..." demo 😉 I found your project! What a good coincidence! Don't know, if others know your work .. but they definitely should! Very good job! Thanks again!
  5. Can we please sit for a while and appreciate how cute the separating line with scissors is
  6. Lars Fosdal

    Delphi is 26 years old - Marco's blog

    This means I now have 26 years of experience with Delphi, and I still feel like a n00b around parts of it.
  7. COVID-19 got us all down a bit and even with the vaccines theoretically available now, the light at the end of the tunnel seems very far away. My own turn for a jab will probably not come before fall 2021, so I can only hope that summer will reduce the infection rates as much as it did last year, but the new mutants that spread around the world definitely aren’t good news. Maybe I can lighten up your mood a bit with a new GExperts release. There are a few bug fixes and an also a few new features in the new version, but nothing really exciting. read on in the blog post.
  8. Lars Fosdal

    Max string literal length = 255

    Make sure you understand the core issue before posting a googled suggestion. Good luck filling an AnsiString with a string literal longer than 255 chars. Oh wait, you can't. If I don't want to split up and combine multiple literals, loading from a resource string is an option. It just irks me that I can't initialize a string variable that can literally hold billions of characters with a single constant longer than 255 chars.
  9. Anders Melander

    spinlock primitives

    You are writing your own spinlock to get better performance - and then you use Sleep() which is guaranteed to cause a context switch...? Unless you really know what you're doing then you better of using the synchronization primitives provided by the OS. https://devblogs.microsoft.com/oldnewthing/20051004-09/?p=33923 http://joeduffyblog.com/2006/08/22/priorityinduced-starvation-why-sleep1-is-better-than-sleep0-and-the-windows-balance-set-manager/ Apparently this can't be repeated often enough.
  10. I think this is what you need, you just have to adjust it a bit. // search in dfm resources by Attila Kovacs unit DFMSearch; interface uses System.Classes, System.Generics.Collections; type TDFMSearch = class private FFormClasses: TList<string>; FResourceNames: TList<string>; FSearchDictionary: TDictionary<string, string>; function GetFormClasses(AClass: TClass): TList<string>; procedure BuildStrings(AResources: TList<string>); procedure EnumClasses(AClass: TClass); public function Find(const ASearchString: string): TList<string>; constructor Create(AClass: TClass); overload; constructor Create(AClassNames: TList<string>); overload; destructor Destroy; override; end; implementation uses Winapi.Windows, System.Rtti, System.SysUtils, System.StrUtils; function EnumResNames(Module: HMODULE; ResType, ResName: PChar; Obj: Pointer): integer; stdcall; var ds: TDFMSearch; begin ds := TDFMSearch(Obj); if ds.FFormClasses.IndexOf(string(ResName)) > -1 then ds.FResourceNames.Add(string(ResName)); Result := 1; end; function TDFMSearch.GetFormClasses(AClass: TClass): TList<string>; var cl: TClass; ctx: TRttiContext; types: TArray<TRttiType>; typ: TRttiType; begin Result := TList<string>.Create; ctx := TRttiContext.Create; types := ctx.GetTypes; for typ in types do begin if typ.TypeKind = tkClass then begin cl := typ.AsInstance.MetaclassType; if (cl <> AClass) and cl.InheritsFrom(AClass) then Result.Add(UpperCase(cl.ClassName)); end; end; end; procedure TDFMSearch.BuildStrings(AResources: TList<string>); var i: integer; Flags: TFilerFlags; R: TReader; RS: Tresourcestream; vt: TValueType; Position: integer; text, PropName, CompClass, CompName, StrValue, ResStr: string; procedure ReadProperty; begin PropName := R.ReadStr; if ContainsText(PropName, 'caption') then begin vt := R.NextValue; case vt of vaWString, vaUTF8String: StrValue := R.ReadString; vaString, vaLString: StrValue := R.ReadString; else R.SkipValue; end; text := text + ' ' + StrValue; end else R.SkipValue; end; procedure ReadData; forward; procedure ReadComponent; begin R.ReadPrefix(Flags, Position); CompClass := R.ReadStr; CompName := R.ReadStr; ReadData; end; procedure ReadData; begin while not R.EndOfList do ReadProperty; R.ReadListEnd; while not R.EndOfList do ReadComponent; R.ReadListEnd; end; begin for i := 0 to AResources.Count - 1 do begin ResStr := UpperCase(AResources[i]); RS := Tresourcestream.Create(HInstance, ResStr, RT_RCDATA); try R := TReader.Create(RS, 4096); try text := ''; R.ReadSignature; ReadComponent; FSearchDictionary.AddOrSetValue(ResStr, text); finally R.Free; end; finally RS.Free; end; end; end; constructor TDFMSearch.Create(AClass: TClass); begin FSearchDictionary := TDictionary<string, string>.Create; EnumClasses(AClass); end; constructor TDFMSearch.Create(AClassNames: TList<string>); begin FSearchDictionary := TDictionary<string, string>.Create; BuildStrings(AClassNames); end; destructor TDFMSearch.Destroy; begin FSearchDictionary.Free; inherited; end; procedure TDFMSearch.EnumClasses(AClass: TClass); begin if not Assigned(FSearchDictionary) then begin FFormClasses := GetFormClasses(AClass); try FResourceNames := TList<string>.Create; try EnumResourceNames(HInstance, RT_RCDATA, @EnumResNames, NativeInt(Self)); BuildStrings(FResourceNames); finally FResourceNames.Free; end; finally FFormClasses.Free; end; end; end; function TDFMSearch.Find(const ASearchString: string): TList<string>; var i, j, slen: integer; sl: TArray<string>; pa: TPair<string, string>; begin Result := TList<string>.Create; sl := ASearchString.Split([' ']); slen := Length(sl); for pa in FSearchDictionary do begin j := 0; for i := 0 to High(sl) do begin if ContainsText(pa.Value, sl[i]) then inc(j); end; if j = slen then Result.Add(pa.Key); end; end; end.
  11. What about creating a new form instance and adjust the components and properties in question from that?
  12. I guess it is theoretically possible to shoehorn Delphi's streaming mechanism to do what you want. Essentially you could just reread your form with an adjusted TReader. Specifically you would not want for the components to be recreated. Have a look at the TReader events, specifically TReader.OnCreateComponent One problem though is how to "skip" rereading of components as you want to only select a number of components.
  13. Stefan Glienke

    Micro optimization: Split strings

    Some of your functions have a defect as in returning an empty array when no delimiter is found - they must return a 1 element array with the input string if they should follow RTL behavior. Also you can remove some unnecessary branching and make the code simpler: function CustomSplitWithPrecountByIndex2(const aString: string; const aDelimiter: Char): TArray<string>; var i, resultLen, resultIdx, tokenPos, inputLen, lastDelimiterPos: Integer; begin inputLen := aString.Length; lastDelimiterPos := 0; resultLen := 1; for i := 1 to inputLen do if aString[i] = aDelimiter then begin Inc(resultLen); lastDelimiterPos := i; end; SetLength(Result, resultLen); resultIdx := 0; tokenPos := 1; for i := 1 to lastDelimiterPos do if aString[i] = aDelimiter then begin SetString(Result[resultIdx], PChar(@aString[tokenPos]), i - tokenPos); tokenPos := i + 1; Inc(resultIdx); end; SetString(Result[resultIdx], PChar(@aString[tokenPos]), inputLen - lastDelimiterPos); end;
  14. Antony Augustus

    SortListBox component

    I have developed a SortListBox that accepts Integer items and sorts it in Quicksort, InsertionSort and SelectionSort both order Ascending and Descending. Steps 1) Install the SortPackage.bpl 2) SortListBox Component can be found in 'Samples' page SortListBox Properties SortActive SortType SortOrder SortPackage.bpl
  15. Attila Kovacs

    SQLite, adding a function

    @Dany Marmur Because the server works faster if you are shouting 😛
  16. Thanks for your help. The issue is resolved. I reported the bug and your solution: https://quality.embarcadero.com/browse/RSP-32465
  17. Fr0sT.Brutal

    Hiding a public property in a descendant class

    (YourEdit as TCustomEdit).Text := 'ahaha'
  18. Remy Lebeau

    Delphi is 26 years old - Marco's blog

    And now we are drawing particles instead, my how far things have come
  19. Stefan Glienke

    Generic set comparer

    Spring4D has ISet<T> and 2.0 will introduce IMultiSet<T>
  20. For inspiration you may also look into this excellent answer from Uwe Raabe on Stackoverflow on a related question: https://stackoverflow.com/questions/47347578/manually-skip-a-component-from-being-created-from-the-dfm which also shows a hacky way to prevent components from getting created. I guess Uwe wasn't aware of his answer more than 3 years ago 😉 As for loading the dfm from the resource that's in the executable have a look at http://docwiki.embarcadero.com/Libraries/Sydney/de/System.Classes.TStream.ReadComponentRes
  21. xorpas

    full screen view capture

    How you solved this problem Can you put Your Code Hier ?
  22. Dany Marmur

    SQLite, adding a function

    I Like YOU B U T I D O NO t Hv🤦‍♂️Te server-code from the client?! Or are you building a server-side plugin?CAPS why?++++ WHY ALL CAPS++ It is not reDABLE.
  23. Pat Foley

    Keep D2006 vs Sydney aligned

    Very Good. I learned something too about default transparency being changed. I am working on a component that sighs, moans and grunts when Sydney gives up.
  24. I use for Windows, Mac, IOs, Android and Linux TMS FNC UIpack, which contains FNC Core, which contains a pdf lib. Do NOT take FMX UI Pack if interested, as recommanded. I runs fine, very fast (2 seconds for 58 pages on Windows). You can draw, print texts and pictures, embed fonts. Very great tool. It's here... In attachment, an example with pictures in png, drawings (the targets), and texts. tms-fnc-pdf-lib.pdf
  25. Dalija Prasnikar

    Delphi 10.3 and supported version of Android

    There are two API levels in manifest (actually, there is another one, but not important) - minSdkVersion and targetSdkVesrion minSdkVersion marks minimum API required by application and it will not run on Android devices with API lower than specified targetSdkVersion marks highest supported API level by application - that means Android will not use any compatibility mode when running on devices with specified or lower API. If you run application on device with higher API level, OS will use compatibility mode for newly introduced API features. Tokyo 10.2.3 (and previous versions) by default had both API levels set to 14. Rio 10.3 changed that and minimum API level is now 19 and target is 26. That means devices with Android version lover that 19 will no longer be able to run applications built with Rio. Conclusion: Delphi application compiled with Rio can by default run on any device with API 19 or higher.