Jump to content

Fr0sT.Brutal

Members
  • Content Count

    2268
  • Joined

  • Last visited

  • Days Won

    46

Everything posted by Fr0sT.Brutal

  1. Fr0sT.Brutal

    Own TQuery without database

    There is no standard query or table, only basic TDataset. What FastReport did is create their own basic query class and provide a bunch of adapters to particular query classes (BDE, ADO, IBX etc). However, all years I've worked with FR, I never needed particular FRQuery. I just prepare datasets inside my app and provide them to FR engine. Probably you too won't really need exactly queries
  2. Fr0sT.Brutal

    TDataSet emulation without database

    Clientdataset seems a good idea but it requires stupid midas.dll IIRC. Alas, the implementation should be as simple as, f.ex., TStream descendant, but it's too complex actually. There was Marco Cantu's article "A Dataset with no Database" (link is obsolete now) which I used to create my own primitive implementation when I needed a grid with word wrapping. For simplicity it's only able to store strings.
  3. Fr0sT.Brutal

    Overloads in implementation

    I always try to declare methods so that most calls jump "up" (to the beginning of a unit).
  4. Fr0sT.Brutal

    Survey of Delphi Versions in use??

    They usually solve it like: 1) Collect as much as possible 2) Extract pieces that are needed for analysis 3) Sell other to 3rd parties 4) Double profit!
  5. Fr0sT.Brutal

    Proxy for TEdgeBrowser/Webview2?

    Really impressive, you seem to revive all-in-one approach of good old Opera!
  6. Fr0sT.Brutal

    HTML Parser alternative to MSHTML?

    HTMLViewer obviously also has its parser; however I'm not aware if it could be used separated from rendering engine
  7. Fr0sT.Brutal

    Proxy for TEdgeBrowser/Webview2?

    I doubt it's possible. Neither Chrome can do this nor all Chromium clones I know (like Opera)
  8. Fr0sT.Brutal

    Update framework question

    I use changelog file as both versions catalog and info for user to read, it has simple format like 3.2.1 + add stuff ! fix stuff ... Update checker requests the file, parses it, checks if latest version differs from the current binary version and suggests to update displaying all the changes from the current version to the latest one. I also have beta versions: b865 + some untested changes where 865 is build number that is compared with that in current binary. I don't think I need something more advanced - the changelogs are so small I don't bother with caching and traffic. Depending on the server settings, you could put the versions into their personal folders so that directory listing will give you the list of all newer versions and their paths; then you can loop through all newer versions getting their changelogs (if each version has its own one) or just retrieve one common file. Proxy support is really something to be considered; however, you can rely on system-wide settings if you don't want to implement custom editors for these options.
  9. Fr0sT.Brutal

    ANN: Skia4Delphi v3.4.0

    No. Any custom graphics just confuse users of business apps. Moreover, it will burden remote channels with no real benefit
  10. Fr0sT.Brutal

    Getting PID of winword.exe based on filename

    Actually that's what Word does. It occupies the opened file for the whole edit cycle blocking it from access
  11. Fr0sT.Brutal

    Survey of Delphi Versions in use??

    What's the sense in such surveys gathered from 20-30 guys?
  12. From the 1st glance, this could be also done with plain old procedures b/c all used members are public
  13. Fr0sT.Brutal

    difference .optset and .dproj file

    What you dislike in idea of having these options set in different build configs inside dproj?
  14. Fr0sT.Brutal

    Sniffer tool detection function

    My crystal ball says he just wants to prevent users from examining his app's traffic. Use SSL with hostname verification and forget about sniffers.
  15. ...and still no multithreading 😄 Moreover, rewriting GUI wrapper, as in subject, in Python is twice senseless.
  16. The shortest form you can achieve is TClass<TEnum, TSetOfEnum>. Or have generic class working with sets of byte and only write specific converters TSetOfEnum<=>SetOfByte
  17. Probably that was intended for design-time auto-naming
  18. Fair point I'm a bit old-school. Pointer+length work with almost any language, interfaces are mess (especially Delphi ones)
  19. only in the form "(import some-library-that-will-do-all-the-work).run()"
  20. Just remember such hacks could break if compiled with RTL that has another layout. Besides this, the solution is quite OK. However, if at least one of 3rd parties you use accepted raw pointers, the issue wouldn't exist at all.
  21. Fr0sT.Brutal

    .NET kill the Delphi IDE

    OT: without the "IDE" word the name of this topiс would be some kind of historical fact 🙂
  22. Any allocations give you previously unused memory blocks, if that wouldn't be true even primitive Hello world app would randomly crash
  23. Fr0sT.Brutal

    So here's my challemge...

    1) UNIQUE constraint on both fields could solve this 2) Using Autoinc there could be only one for all companies so there will be holes in numbering and number capacity could exhaust very quickly (10E8-1). Splitting area between several autoincs could push the issue into more far future but it would make things complicated
  24. Methods are just routines with implicit 1st argument set to Self. If you're not using Self inside them, they will work. Try to add some internal string field and show it inside Ghost, then you'll get what you expect
  25. You may use the following trick which I recently invented and applied to all my projects: 1) TEnumNullable = (enNone, enFoo, enBar); 2) TEnum = enFoo..enBar; // or Succ(Low(TEnumNullable))..High(TEnumNullable) this has following benefits: - RTTI features - "Null" value that won't cause range check errors in FPC like usual TEnum(-1) - "Null" value that is NULL (zero) actually - ZeroMemory, Default(), Class.Create init fields with this value - two types so you can differentiate where null is expected and where not - simple and obvious DB_Value_Of_Enum = Ord()
×