-
Content Count
2829 -
Joined
-
Last visited
-
Days Won
154
Everything posted by Anders Melander
-
Move a Function or Procedure to a Unit??
Anders Melander replied to Ian Branch's topic in General Help
Instead of this: const sCannot: string = #13#10 + 'Cannot send AP Emails!'; do this: const sCannot = #13#10 + 'Cannot send AP Emails!'; and then read: https://docwiki.embarcadero.com/RADStudio/Sydney/en/Declared_Constants#Typed_Constants As I read the documentation, if you make the const typed then the compiler cannot concatenate the strings at compile time but will have to do it at run time. Probably because typed consts can be modified at runtime if you have that option enabled. In your example it's a variable local to the method. I'm sure there are also still people who argue that it's safe to run with scissors as long as <insert excuse here>. No seriously, stop using "with". It doesn't make you code more readable. On the contrary. It's impossible for someone else (i.e. that unfortunate person who will maintain the code after the author has moved on to greener pastures) to see if an identifier references a "with'ed" member or something higher up in the scope. Also the debug inspector can't cope with it. You might think that in your case it's safe because <insert excuse here> but I could identify several things that could go wrong in your code that you apparently haven't thought of. -
Move a Function or Procedure to a Unit??
Anders Melander replied to Ian Branch's topic in General Help
Not related to your specific question but... Get rid of that. TaskMessageDlg already plays the system sound associated with the message type. Does sCannot really need to be a typed const? As far as I remember it's better type use untyped string consts since these will end up in R/O memory. Also you use #13#10 here but sCRLF everywhere else. Personally I prefer #13#10 (or just #13 when that is appropriate) since it's more explicit. Since MailSender is a local var and only used inside the try...except block, there's no point in using FreeAndNil() here. Just use Free instead. If you only use FreeAndNil when there's a reason to then it will communicate to the reader that here's something to be aware of; The var needs to be nil when it doesn't reference a valid instance. Since you're already refactoring all this, get rid of the "with" statements - and forget you ever learned about it. -
Not that what you say aren't true, but look at the screenshots. It's Delphi 7 so strings are basically byte arrays.
-
Special Offer for Documentation Insight
Anders Melander replied to baoquan.zuo's topic in Delphi Third-Party
To my knowledge there aren't any (better, that is). -
Special Offer for Documentation Insight
Anders Melander replied to baoquan.zuo's topic in Delphi Third-Party
Sure. I agree on that. It is something to consider though. In this case we are reliant on explicit support for newer versions of Delphi since this is an IDE integration-only tool and the parser also needs to be updated when the language changes. So far there has not been problems but I do worry a bit. As I said I use it myself and it does what it's supposed to do rather well but the output is beginning to look a bit dated (VS2012 style), the help is out of date (or completely missing as in the case of the latest release) and the advertised new versions has never appeared. -
Special Offer for Documentation Insight
Anders Melander replied to baoquan.zuo's topic in Delphi Third-Party
Yes, very useful. I use it on a number of projects myself. I'm a bit hesitant to recommend it though as: It seems to have gone into maintenance mode many years ago. It appears to rely on MSHTML for the editor feature and MSHTML is a dead end. -
How to load a PNG file into TImage, then copy another PNG file into it
Anders Melander replied to alank2's topic in VCL
If you only want to convert from PNG to BMP then just assign the TPNGImage to the TBitmap. If you want a bitmap containing two PNGs side by side (or one on top of the other), then create a TBitmap of the desired size and then draw the PNGs onto the bitmap canvas at the desired locations. Uwe's examples contains most of the necessary code. You can't. CopyRect requires a TCanvas and TPNGImage ain't got it. TCanvas is a wrapper around a GDI device handle (HDC). -
Quite OK Image (QOI) image format
Anders Melander replied to dummzeuch's topic in Algorithms, Data Structures and Class Design
That didn't answer my question: Why should they? "There's little cost" isn't a reason because there's even less cost in not doing it. IMO nobody will benefit from browsers supporting this format (apart from the authors ego 🙂 ). -
Quite OK Image (QOI) image format
Anders Melander replied to dummzeuch's topic in Algorithms, Data Structures and Class Design
Why should they? I mean, what's the benefit? It compresses worse than PNG and WebP and only supports 32-bit RGB(A). I agree that "it's pretty" but that's irrelevant when they already have the other formats implemented. It's even irrelevant if they hadn't. -
Quite OK Image (QOI) image format
Anders Melander replied to dummzeuch's topic in Algorithms, Data Structures and Class Design
Phosphoglucose Isomerase ? https://www.abbreviationfinder.org/acronyms/pgi.html -
Quite OK Image (QOI) image format
Anders Melander replied to dummzeuch's topic in Algorithms, Data Structures and Class Design
Meh. As far as I can see it just does RLE and Delta compression so it's no wonder it's faster. It's also no wonder that it doesn't compress as good as PNG (look at the benchmark numbers). Also it only handles 32 bit RGBA image data. I guess it's fine for internal application use but it's definitely not a general purpose image format. -
how to respond on user drag of a column border in a listview
Anders Melander replied to vshvetsov's topic in VCL
The column headers of a listview is in fact a separate header control owned by the listview. The column resize notifications are only sent to the parent of the header control (i.e. the listview) so in order to get at them you need to hook into the WndProc of the listview and catch the HDN_BEGINTRACK and HDN_ENDTRACK messages. I'm guessing @Remy Lebeau has some code..? -
Create an animated gif from a set of bitmaps?
Anders Melander replied to Felix.'s topic in General Help
Ah yes, TGraphic is a VCL class. I forgot that. I don't use FMX either and I knew FMX couldn't use TGIFImage for display (since that requires TPicture/TImage) but I would have thought one could still use the non-visual stuff such as load/save and GIF manipulation. I guess not. -
Create an animated gif from a set of bitmaps?
Anders Melander replied to Felix.'s topic in General Help
Try this: procedure MakeGIF(Bitmap1, Bitmap2, Bitmap3: TBitmap); var GIF: TGIFImage; Frame: TGIFFrame; GCExt: TGIFGraphicControlExtension; LoopExt: TGIFAppExtNSLoop; begin GIF := TGIFImage.Create; try Frame := GIF.Add(Bitmap1); // Netscape Loop extension must be the first extension in the first frame! LoopExt := TGIFAppExtNSLoop.Create(Frame); LoopExt.Loops := 0; // Number of loops (0 = forever) // Add Graphic Control Extension GCExt := TGIFGraphicControlExtension.Create(Frame); GCExt.Delay := 30; // Animation delay (30 = 300 mS) Frame := GIF.Add(Bitmap2); GCExt := TGIFGraphicControlExtension.Create(Frame); GCExt.Delay := 30; Frame := GIF.Add(Bitmap3); GCExt := TGIFGraphicControlExtension.Create(Frame); GCExt.Delay := 30; GIF.OptimizeColorMap; GIF.Optimize([ooMerge, ooCrop], rmNone, dmNearest, 0); GIF.SaveToFile('foobar.gif'); finally GIF.Free; end; end; This is just from (my) memory so I'm not sure if it compiles. It's been a while since I wrote that thing. You should be able to find plenty of examples if you search for TGIFImage. -
Create an animated gif from a set of bitmaps?
Anders Melander replied to Felix.'s topic in General Help
Doesn't TGIFImage (the non-visual part) work with FireMonkey? -
List of most popular UI components for VCL
Anders Melander replied to Jaska's topic in Delphi Third-Party
Makes sense then. The learning curve is ...um... spectacular 🙂 -
List of most popular UI components for VCL
Anders Melander replied to Jaska's topic in Delphi Third-Party
So what do you use for grids, pivots, toolbars, etc? -
Image32 - 2D graphics library (open source freeware)
Anders Melander replied to angusj's topic in I made this
🤔- 42 replies
-
- graphics
- cross-platform
-
(and 2 more)
Tagged with:
-
Should I free a sub-form or does its owner do that?
Anders Melander replied to Tom F's topic in RTL and Delphi Object Pascal
Yes. Unless you have a reason to specify an explicit owner, you should actually specify nil to make it clear (when reading the code) that there is no owner. No. You can specify that a "child form" should be centered on the owner form (Position=poOwnerFormCenter), but it's still safe to specify nil as the owner. You're mistaken. There must have been something else going on. It's the same for all classes derived from TComponent; When a component is free'd it will free all the components it owns. TComponent is a base class of TForm. -
Paste file from clipboard to blob field (Remote Desktop)
Anders Melander replied to Fivecord's topic in VCL
This should get you started: https://github.com/landrix/The-Drag-and-Drop-Component-Suite-for-Delphi/tree/master/Demos/VirtualFileStream -
Generics: Delphi does not always seem to force the instantiated type
Anders Melander replied to yonojoy's topic in RTL and Delphi Object Pascal
IMO that's a bug since the two interfaces are distinct. I don't have time to investigate if the problem exists in newer versions right now. -
Generics: Delphi does not always seem to force the instantiated type
Anders Melander replied to yonojoy's topic in RTL and Delphi Object Pascal
Yes, exactly. I just wanted to be sure that you were aware of this. Many people misunderstand what interface inheritance is. I still can't follow your example but from your description it does sound like there's a bug. Since you're not doing any hard type casts the compiler should see the problem (whatever it is) and not produce code that leads to an AV. -
Generics: Delphi does not always seem to force the instantiated type
Anders Melander replied to yonojoy's topic in RTL and Delphi Object Pascal
I can't really follow your example but I noticed that you haven't assigned IFooBroker a GUID. Is that by design? Also, are you aware that inheriting one interface from another is just a convenience that copies the declaration from the base interface into the derived interface. There's no "interface polymorphism". -
You do know that you don't speak for everyone, right?
-
Is this code safe: Queued calls and [weak] interfaces
Anders Melander replied to Keesver's topic in RTL and Delphi Object Pascal
IMO you're bound to get into trouble with that design - it's very fragile. Firstly you're mixing object and interface references. If you stuck with interfaces, dropped [weak] and used some other mechanism to flag that the object was no longer valid (e.g. a lock protected flag on the object), then it would be fine. Secondly since you're using [weak] there are limits on what you can safely do with the interface reference. For example supports/queryinterface can't be used on it.