Jump to content

Anders Melander

Members
  • Content Count

    2943
  • Joined

  • Last visited

  • Days Won

    166

Everything posted by Anders Melander

  1. 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).
  2. 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.
  3. 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.
  4. Anders Melander

    Event handler in thread

    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 😘 )
  5. Anders Melander

    Event handler in thread

    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.
  6. Anders Melander

    Event handler in thread

    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).
  7. Anders Melander

    Reduce exe weight : Link with runtime package

    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.
  8. Anders Melander

    Reduce exe weight : Link with runtime package

    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.
  9. Anders Melander

    Event handler in thread

    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;
  10. Anders Melander

    Current Generation methods in Apps under Windows 7?

    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.
  11. Anders Melander

    VCL resizeable and moveable label

    And it shouldn't; It is functionality that belongs in another layer. Keep it simple.
  12. Anders Melander

    I keep being off by one

    Trace Into = Step Into But you don't need to trace into. You can just place a breakpoint inside your square function. This is a very simple problem so I suggest you try to single-step through it "in your head" first; What happens when you call square(0), square(1), etc.
  13. Anders Melander

    Current Generation methods in Apps under Windows 7?

    Thanks for clearing that up - or not.
  14. Anders Melander

    Current Generation methods in Apps under Windows 7?

    Okay, but it seems it doesn't. At least I haven't encountered anything in it that did.
  15. Anders Melander

    Current Generation methods in Apps under Windows 7?

    I don't think that list is up to date given that Delphi has complained when you tried to install it on Windows 7 since 10.3 (AFAIR). That said, I upgraded my main system from Windows 7 to 10 last year but before then I didn't have any problems with the IDE or applications not working on Win7.
  16. Anders Melander

    VCL resizeable and moveable label

    Btw, you should let the TSizeableLabel own the HostedLabel so this: HostedLabel := TLabel.Create(AOwner); should be: HostedLabel := TLabel.Create(Self); - And there you have an example of when to use Self. Now since the HostedLabel is owned by the control, it will be destroyed automatically when the control is destroyed (the base class TComponent takes care of that), so you can must get rid of the HostedLabel.Free.
  17. Anders Melander

    VCL resizeable and moveable label

    If you search here for "Style guide" I think you can find some good ones. Be aware though that most of them will pretend to teach the One True Style and that is obviously false because I haven't published it yet 😉 TCustomControl is probably the easiest to work with. You'll be using a window handle per handle so it's not super optimal, but I wouldn't worry about it unless you'll be using hundreds of these at the same time. With the handles as separate controls you should also be able to generalize your control so it can attach itself to any TControl instead of embedding it (like I what I thought you were doing - good thing I didn't delete the comment 🙂 ).
  18. Anders Melander

    VCL resizeable and moveable label

    Very nice! Here's some suggestions from looking through the code: The default scope is published so you'll probably want to start your class declaration with private scope: TSizeableLabel = class(TCustomControl) private ... By convention member variables are prefixed with F (for field). private FInSizingHandle: boolean; FResizeInProgress: boolean; FMoveInProgress: boolean; ... The HostedLabel should be a property, with a setter, not a variable (reason comes below): private FHostedLabel: TLabel; procedure SetHostedLabel(Value: TLabel); public property HostedLabel: TLabel read FHostedLabel write SetHostedLabel; ... procedure TSizeableLabel.SetHostedLabel(Value: TLabel); begin if (Value = FHostedLabel) then exit; FHostedLabel := Value; end; When a component links to another component, it should be able to handle that the other component is deleted. You do this by asking to be notified when the other component is deleted. protected procedure Notification(AComponent: TComponent; Operation: TOperation); override; ... procedure TSizeableLabel.Notification(AComponent: TComponent; Operation: TOperation); begin inherited; if (Operation = opRemove) and (AComponent = FHostedLabel) then HostedLabel := nil; end; procedure TSizeableLabel.SetHostedLabel(Value: TLabel); begin if (Value = FHostedLabel) then exit; if (FHostedLabel <> nil) then FHostedLabel.RemoveFreeNotification(Self); FHostedLabel := Value; if (FHostedLabel <> nil) then FHostedLabel.FreeNotification(Self); end; Forget the above 🙂 I commented while I read the code and only now see that the label is owned by TSizeableLabel. In that case, the property should not have a setter. You don't need to initialize your booleans class vars to False. They have already been initialized. You don't need to test for nil before calling Free. Free already does that. You don't need to reference Self unless you need to pass a reference. The scope is Self by default. Use Pascal case: Result, False, etc. Otherwise very clean and readable code. I wish my team mates wrote code that pretty 🙂 Did you consider using 8 small controls for the handles instead? It would have made painting and the mouse and cursor handling much easier, I think.
  19. Anders Melander

    Vcl text box that user can move/resize at runtime?

    It's not "relatively common". In my 30 years with Delphi I think I've only had a need to do it (resize a control with the mouse) once and that was for a run-time form designer. Moving a control can be done with something like 10 lines of code. Resize is harder. The Raize controls are owned by Embarcadero now and can probably be installed via GetIt. https://blogs.embarcadero.com/konopka-signature-vcl-controls-version-7/ That's not how I would do it but it's certainly a possibility. Why not try it instead of just giving up? Okay then: I googled the problem, read a lot of examples, tried some different solutions and then wrote some code based on the experience I just acquired. Worked great! Better? Fair enough. Sorry about that. I guess I just don't understand that approach to problem solving.
  20. Anders Melander

    Vcl text box that user can move/resize at runtime?

    As far as I can see both of the searches above returns a plethora of relevant answers to your question, which you are not exactly the first to ask. So what's preventing you from using any of them?
  21. Anders Melander

    Vcl text box that user can move/resize at runtime?

    Let me teach you a trick: https://www.google.com/search?q=delphi+move+control+runtime https://www.google.com/search?q=delphi+resize+control+runtime
  22. Anders Melander

    Continually Losing Frames

    So you're not using version control?
  23. Anders Melander

    IDE hanging. Is it really??

    Use process explorer instead and look at the threads. It will show you the call stack which might get you some hint about what it's doing. 9 out of 10 times when the IDE hangs for me it's caused by the Structure View when the form editor is active (see above) - and the IDE never recovers. Specifically it appears to be a problem with the VirtualTreeView used by the Structure View.
  24. Anders Melander

    Pointer arithmetic question

    I don't know where you are reading this but the sentence is assuming that the pointer points to an element in an array of integers. So incrementing the pointer will make it point to the next integer in the array. Maybe you should stay away from pointers until you figure this out 🙂
  25. Anders Melander

    Enable Discussions on github ?

    Not everything is an issue or an enhancement request. It's common to have discussions enabled so a topic can be debated before it becomes a task - if ever. It's a question of how you manage a project but if Remy prefers everything in one place then it should stay that way since the issue list is primarily a tool for the maintainers, not for the users. Personally I prefer questions and other chit-chat in the discussions. I manage a lot of different projects and I need the issue lists to only show me work items.
×