-
Content Count
2850 -
Joined
-
Last visited
-
Days Won
155
Everything posted by Anders Melander
-
Uses clauses and ide performance - does it make a difference?
Anders Melander replied to ventiseis's topic in RTL and Delphi Object Pascal
More DOS legacy. RAM-drives hasn't had any justification since 16-bit processors. -
Uses clauses and ide performance - does it make a difference?
Anders Melander replied to ventiseis's topic in RTL and Delphi Object Pascal
It sounds like you should focus on fixing your build environment first 🙂 Well, there you have it. subst is a leftover from DOS and should be avoided. A file in a virtual (subst) location has (at least) two paths: The virtual path and the physical path. Depending on what windows API a virtual filename is passed though you can either get a result that is relative to the virtual location or to the physical location. I can't give you a concrete example but I've seen it happen many times. For example, I would guess that if you resolve a virtual filename to a PIDL and then convert that back to a path, then you will end up with the physical path. -
Loading a JPEG into FMX.TBitmap honoring EXIF orientation
Anders Melander replied to Alexander Halser's topic in FMX
Where do you think the EXIF orientation data comes from? It comes from the camera orientation sensor. The problem here is to handle the EXIF data in an existing image. -
Loading a JPEG into FMX.TBitmap honoring EXIF orientation
Anders Melander replied to Alexander Halser's topic in FMX
Definitely. I'm not denying that it's a problem. I'm just saying that the problem isn't that it doesn't rotate automatically (because that would also be a problem). The problem is that it doesn't give us any way of knowing that the image needs to be rotated be display. You should probably report it as a bug against FMX. -
Loading a JPEG into FMX.TBitmap honoring EXIF orientation
Anders Melander replied to Alexander Halser's topic in FMX
FWIW, TBitmap/TJPEGImage are low-level image containers. It's not their job to rotate or mirror the image because they don't know what you want to do with the image after load. So, if anything, the problem is that the classes don't surface the EXIF information so you can apply the transformation after load if you want to. -
How can to set up an umbrella unit?
Anders Melander replied to araujoarthur's topic in RTL and Delphi Object Pascal
The API: https://bitbucket.org/anders_melander/better-translation-manager/src/master/Source/amDialog.Manager.API.pas The implementation: https://bitbucket.org/anders_melander/better-translation-manager/src/master/Source/amDialog.Manager.pas And here's the commit that introduced it: https://bitbucket.org/anders_melander/better-translation-manager/commits/c1341cb4eaaab433ee1680fcbd22e5dc570a5b97 It contains a few examples of changing some modal dialogs from traditional Create/Free to interfaces & DialogManager.CreateDialog. As usual, sorry about bitbucket 😕 -
How can to set up an umbrella unit?
Anders Melander replied to araujoarthur's topic in RTL and Delphi Object Pascal
Not directly; Delphi unfortunately doesn't support "wildcard" includes like that. The way I do it, for something like dialogs, is to associate each dialog with an interface and then separate the implementation of the dialog from the interface: unit Foo.Dialogs.Bar.API; type IFooDialogBar = interface ['{4279694B-C3D6-4B2A-A134-CEACDF6185AF}'] function Execute: boolean; end; unit Foo.Dialogs.Bar; interface uses Forms, Foo.Dialogs.Bar.API; type TFormFooBar = class(TForm, IFooDialogBar) // ...other stuff here... private // IFooDialogBar function Execute: boolean; end; implementation function TFormFooBar.Execute: boolean; begin Result := (ShowModal = mrOK); end; In order to create the dialog you could use a factory function like Peter suggested: function FooDialogBar: IFooDialogBar; begin Result := TFormFooBar.Create(nil); end; You will then have to manage the lifetime of the dialog somehow. Since you are accessing the dialog object via an interface you can't just free it once you are done with it. It will have to be done via reference counting. Unfortunately the default TComponent reference counting will not do it so it will have to be modified (overridden). I have a dialog manager that takes care of all this without the need to modify anything. It handles both modal and non-modal dialogs. I'm in the process of adding it to the translation manager project, so the code it will probably be public later tonight or tomorrow. The dialog manager is used like this: // Register the dialog API in the initialization section of the disloag unit initialization DialogManager.RegisterDialogClass(IFooDialogBar, TFormFooBar); end; ... // Create dialog var DialogBar := DialogManager.CreateDialog(IFooDialogBar) as IFooDialogBar; // Display dialog if (DialogBar.Execute) then begin ... end; // Lifetime is controlled via reference counting. // When interface goes out of scope, the dialog object is destroyed. ... -
It's really hard to understand what you are doing from your description. Please show us the code of a minimal example instead (and please use the code tag). // Like this
-
Modern way to create splash screen from transparent png with edges that blend with the background
Anders Melander replied to CyberPeter's topic in General Help
Nice! -
Modern way to create splash screen from transparent png with edges that blend with the background
Anders Melander replied to CyberPeter's topic in General Help
In TFormSplash.UpdateBannerImage: if (Scale = 255) then PixDst^ := PixSrc^ else if (Scale = 0) then PixDst^ := PixSrc^ or $00FFFFFF // *** Change this *** else begin RGB := PixSrc^ and $00FFFFFF; RGB := RGB xor $00FFFFFF; // *** Add this *** PixDst^ := (PixSrc^ and $FF000000) or (Div255((RGB shr 16) * Scale) shl 16) or (Div255((RGB shr 8 and $FF) * Scale) shl 8) or (Div255((RGB and $FF) * Scale)); PixDst^ := PixDst^ xor $00FFFFFF; // *** Add this *** end; This isn't the most elegant solution but since the original code was a bit of a hack (which is also why the solution isn't obvious at all) I guess it doesn't matter. Anyway, what it does is invert the color of the source pixel, blend it with the (black) text, and then invert the result again. -
Very nice!
-
How do I close a modal form without ModalResult being set to mrCancel ?
Anders Melander replied to dormky's topic in VCL
Keep digging -
How do I close a modal form without ModalResult being set to mrCancel ?
Anders Melander replied to dormky's topic in VCL
I dunno. I think it's pointless. I mean, properties? Pfft! What's the point? Delphi is dead anyway and if there's one thing the past 30 years has shown it is that the design is flawed beyond repair but we were just too ignorant to notice. If only we had been told about this before. The shame is unbearable. -
How do I close a modal form without ModalResult being set to mrCancel ?
Anders Melander replied to dormky's topic in VCL
Yes, yes, we see now. How could we have been so blind? Totally different things. Totally! Now, run along. -
Desktop App Development with Object Pascal
Anders Melander replied to PhilBoy's topic in Algorithms, Data Structures and Class Design
Are you okay? -
How do I close a modal form without ModalResult being set to mrCancel ?
Anders Melander replied to dormky's topic in VCL
The inconsistency, as you call it, is by design and just because you want the design to be different doesn't make the design wrong. Even Windows' own modal dialog function works the same way; Internally it implements a message loop which exits once a flag has been set (by the EndDialog function). -
How do I close a modal form without ModalResult being set to mrCancel ?
Anders Melander replied to dormky's topic in VCL
If you use ShowModal then you are using the modal loop built into the VCL which relies on exiting the loop when ModalResult<>mrNone. If you disagree with that design then don't use ShowModal; Use Show and build your own modal handling around it. And good luck doing that without a loop which monitors some kind of state flag. I don't think you have thought this through. -
Desktop App Development with Object Pascal
Anders Melander replied to PhilBoy's topic in Algorithms, Data Structures and Class Design
That makes better sense because there was something really fishy about the prerequisites of that project. I once designed, on paper, a large enterprise support system in which one of the key components was a telekinetic interface. The goal of the design was to get fired (long story). It sounds as if these people used the same strategy. -
I agree. One of the things that have helped me tremendously over the years as a software developer is my (hobby) background in first analog electronics and then digital, hardware and then software. It gives one a deep understanding of how things work and why. There was also an early phase where I ventured into chemistry but, although I got really good at blowing shit up, I don't think that particular skill set has helped me much 🙂 (and thanks 😘 )
-
You don't need an owner; Just specify nil as the owner in the constructor and remember that you have to destroy the object in the thread destructor (or on exiting Execute, if you create it there). Generally, the purpose of Owner is to have a TComponent destroyed automatically when the owner is destroyed, which is handy when you place stuff on a form. For dynamically created components it is better to control the lifetime (Create/Destroy) explicitly so you have complete control of what is going on and when. It also makes the code easier to understand when you don't rely on implicit behavior.
-
Yes. It doesn't hurt but if you are not referencing the type then you might as well delete it. I couldn't spot any obvious issues after a brief look through the source. One thing I would do though, is to move the TCommPortDriver.Create into the Execute method so it is constructed in the context of the thread, instead of the calling thread (which is supposedly the main thread).
-
So use an installer or zip the files. I'm not buying the argument that users can't figure out how to unzip a file or run an installer. IME, they can if they have to.
-
Yes it is because it trashes the page cache. If memory is low then something else has to be paged out before the exe can be extracted to memory - and then paged out.
-
CommPortReceiveData is a method pointer. @CommPortReceiveData is a pointer to a method pointer. You have declared TCommPortReceiveData as a "procedure of object". That makes it a method pointer so this: procedure CommPortReceiveData(Sender: TObject; DataPtr: Pointer; DataSize: Cardinal); is wrong (it's not a method; It's a procedure) while this: procedure TUploadThread.CommPortReceiveData(Sender: TObject; DataPtr: Pointer; DataSize: Cardinal); is correct. You haven't declared the method. You have declared a pointer to a method. Your declaration in TUploadThread should look like this instead: TUploadThread = class(TThread) private ...other stuff... procedure CommPortReceiveData(Sender: TObject; DataPtr: Pointer; DataSize: Cardinal); ...more stuff... end;
-
Current Generation methods in Apps under Windows 7?
Anders Melander replied to Ian Branch's topic in General Help
I wouldn't know; I'm not confused - but that shouldn't stop people from explaining if they find joy in that. It should have been obvious that I know recent Delphi versions doesn't support being installed on Windows 7, given that I've installed and run several versions on Windows 7 and of course got told by the installer that it wasn't supported. I also stated that I hadn't encountered any problem with Delphi applications running on Windows 7.