Jump to content

Mike Warren

Members
  • Content Count

    71
  • Joined

  • Last visited

Everything posted by Mike Warren

  1. I don't exactly need multiple inheritance (I think), but I'm trying to find a clean way of doing the following (This is simplified): This is in FireMonkey, if that makes a difference. I have 2 classes; TapRectangle, inherited from TRectangle, and TapCircle, inherited from TCircle. I want to retain all the properties and methods of the ancestor classes, but I want to add some new methods and properties, which are the same for both TapRectangle and TapCircle, so I can't inherit from TShape. I also want to be able to pass a TapRectangle or TapCircle to a function and access these new properties and methods. Is there an elegant way of doing all this? I can achieve what I want by copying the new properties and methods to each new class and the using the common ancestor TShape to pass my components, but it's not elegant. I've actually never used interfaces, but from what I understand that wouldn't work here. Please correct me if I'm wrong.
  2. Mike Warren

    Simulate Multiple Inheritance

    Thank you all for your replies. I'll experiment with the example darnocian suppled.
  3. Mike Warren

    Simulate Multiple Inheritance

    I tried it like this, which shows I don't understand interfaces properly: IapShape = interface procedure SetThing(AThing: Boolean); property Thing: Boolean read FThing write SetThing; // Error here: Field or method identifier expected end; TapRectangle = class(TRectangle, IapShape) private FThing: Boolean; procedure SetThing(AThing: Boolean); public property Thing: Boolean read FThing write SetThing; end;
  4. Mike Warren

    FMX Inter-process Communication

    Many years ago I wrote a small D7 program for logging from applications I was developing. This used WMCopyData and a few other Windows APIs and it was really robust. I used it for many projects. It was great in that it could keep logs right up to the point of failure with almost no impact on the performance of the main program. The problem I have now is that I want to do the same thing for multi-device applications in FMX. My initial thought is to make it a network application, but I'm wondering if there's a better method I don't know about. Does anyone have any suggestions? Also, I haven't done any network applications for many years. Is Indy still the go-to for network coms that's reliable and lightweight?
  5. Is the version of Fast Reports FMX supposed to be able to export PDFs? When I right-click on the preview window the popup menu has "Export" and "Export PDF", but neither of these do anything at all. I also notice the VCL version doesn't have these export options in the pop-up, which makes me suspect the menu items were accidentally left in the FMX version.
  6. When I try to install Fast Reports in Delphi 12.1 Pro it fails as shown in the screenshot. Does anyone know how I can solve this?
  7. Mike Warren

    Getit Fails to Install Fast Reports D12.1

    Installing Tee Chart did the trick. Thanks Tom.
  8. Mike Warren

    Hide Main Form on Start

    In the past all I needed to do was add Application.ShowMainForm := False, but FMX does not have ShowMainForm. Setting the main form's Visible property to False, either at design time, or in Form.Create does nothing, and adding MyForm.Visible := False to the application anywhere before Application.Run causes an A/V. I need this to work on Windows and Mac, so a WinAPI solution is not suitable. Does anyone have a suggestion?
  9. Mike Warren

    Hide Main Form on Start

    Actually, that StackOverflow thread looks like it might contain the answer in the second reply. Overriding the CanShow method seems to stop the flash. function TForm1.CanShow: Boolean; begin Result := not Timer1.Enabled; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; Left := 500; Top := 200; Visible := True; end;
  10. Mike Warren

    Hide Main Form on Start

    Thanks for the reply, Nigel. Unfortunately, the form flashes up briefly at the default position and size before being hidden. Below is something I just thought of. It seems to work fine on Windows. I'm not able to test on Mac at the moment. unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs; type TForm1 = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private StartLeft: Integer; public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin StartLeft := Left; Left := MaxInt; Timer1.Interval := 4000; Timer1.Enabled := True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; Left := StartLeft; end; end.
  11. Mike Warren

    Issue with TNumberBox

    I just tried a FMX NumberBox in D11.3 and D12 and find it a complete mess. Nothing about the operation is intuitive. In addition to your observation, if I try to highlight the text by clicking and dragging, any vertical mouse movement at all changes the value wildly. Ctrl+A does not work for me. Personally, I'd do my own thing and forget TNumberBox completely.
  12. That's what I used the first time where everything got messed up. I skipped it on the second installation and in the small amount of testing I've done the installation seems to have worked fine.
  13. Mike Warren

    [FMX beginner] Key Handling

    I've been using Delphi since 1996, but have been fixed at D7 for many years. I've finally upgraded to D11.3 and am creating my first FMX based application, targeting Win64 and Android64. I added an ActionList and added an Action with a shortcut of Alt+X. The problem I have is that the Alt+X key press triggers a windows beep sound. This is something I do regularly in VCL based apps. As soon as an action with a shortcut is defined the Windows beep does not fire. How do I fix this in a FMX based app?
  14. Installing D12 was "fun" for me. I made the stupid mistake of trying to import settings from V11.3 and got dozens of errors during the install and each time I ran it. Tried uninstalling, and that took ages before finally locking up. Tried the uninstaller again, and got told it couldn't uninstall without telling me why. Fortunately, I run Delphi in a VM, so I just created a new duplicate of my working dev VM and installed it from there. Don't really understand why the "offline" installer spent most of its time downloading things, but finally it completed. One of the bugs that was causing me problems is fixed. Another has supposedly been fixed, but has not, and within the first 10 minutes I found a couple of new bugs. I'm looking forward to the first maintenance release.
  15. Mike Warren

    [FMX beginner] Key Handling

    This issue is mostly fixed in D12. Only tested on Windows so far. Accelerator keys work in TMainMenu and on TButton.Text without causing a Windows beep. Shortcuts using Alt+<letter> do not work in menus, but they do work in actions. Alt + the first letter of a root main menu item will open that menu and then the first letter of each sub-menu item will highlight it, but not select it. So even though this is not exactly the behaviour in VCL, at least it's workable.
  16. Mike Warren

    User Drawing of Lines and Curves

    I need to allow the users of my program to draw lines and curves. Is TPath the best way to do this? I haven't been able to find much in the way of documentation so far, and because this sort of thing is totally new to me I'd love an example to allow me to understand what needs to be done. Probably the way I imagine the user would interact would be to click a start point and then an end point to draw a line, and then click along the line and drag to create nodes to change the line into a curve. I'm expecting a steep learning curve, unless there is already a Firemonkey component I can purchase to do this. Can anyone offer any suggestions?
  17. Mike Warren

    User Drawing of Lines and Curves

    It doesn't appear to be fixed to me.
  18. Mike Warren

    User Drawing of Lines and Curves

    Looks like this bug has been fixed in D12 according to the QC. I haven't installed D12 yet to check.
  19. Mike Warren

    LongClick listbox selected Item

    A simplistic approach might be to use MouseDown and trigger a timer. In MouseUp reset the timer if it hasn't expired. I haven't put a lot of thought into this, but feel it should be possible to make it work.
  20. Mike Warren

    Zooming At Mouse Position

    I don't know what I'm doing wrong, but I can't seem to get this to work properly. For each page (TFrame) I have a TScrollBox that contains a number of Layers (TScaledLayout), which in turn contain a bunch of components. I zoom in and out using the mouse wheel and want the position of the frame to remain visually locked to the mouse cursor as I zoom. What I thought would work would be to change the Scrollbox.ViewportPosition as I zoom, but this produces a non-linear movement (a strange curve). Each step of the mouse wheel changes the zoom in 10% increments. Here's the code: if WheelDelta > 0 then begin Z := CurrentPage.Zoom + 0.1; if Z > 4 then Z := 4 else CurrentPage.sbView.ViewportPosition := CurrentPage.sbView.ViewportPosition * 1.1; end else begin Z := CurrentPage.Zoom - 0.1; if Z < 0.1 then Z := 0.1 else CurrentPage.sbView.ViewportPosition := CurrentPage.sbView.ViewportPosition / 1.1; end; CurrentPage.Zoom := Z; This is the Zoom code: procedure TfrmPage.SetZoom(const Value: Single); var I: Integer; begin FZoom := Value; for I := 0 to LayerCount -1 do Layers[I].Zoom := FZoom; end; // The layer frame is not shown. Instead, the ScaledLayouts are parented to the page frame's scrollbox procedure TfrmLayer.SetZoom(const Value: Single); begin FZoom := Value; slContent.Width := slContent.OriginalWidth * FZoom; slContent.Height := slContent.OriginalHeight * FZoom; end; The video below shows what happens. What am I doing wrong?
  21. Mike Warren

    Zooming At Mouse Position

    Okay, this seems to work: var P1, P2: TPointF; begin // Mouse location on page before zoom P1 := (sbView.ScreenToLocal(Screen.MousePos) + sbView.ViewportPosition) / CurrentPage.Zoom; if WheelDelta > 0 then begin Z := CurrentPage.Zoom + 0.1; if Z > 4 then Z := 4; end else begin Z := CurrentPage.Zoom - 0.1; if Z < 0.1 then Z := 0.1; end; // Mouse location on page after zoom P2 := (sbView.ScreenToLocal(Screen.MousePos) + sbView.ViewportPosition) / Z; sbView.ViewportPosition := sbView.ViewportPosition + ((P1 - P2) * Z); CurrentPage.Zoom := Z;
  22. Mike Warren

    Zooming At Mouse Position

    Good point. This is simplified because I couldn't get it to work in a way that makes sense to me. I have a member that gets set in the page's MouseMove event: FMouseOnPage: TPointF But I took that out for testing, expecting the zoom to at least stay centred. But It does that weird curve.
  23. Mike Warren

    Issue with TMenuBar and Alt key

    Done.
  24. Mike Warren

    Issue with TMenuBar and Alt key

    Excellent! If you do report it, post the link here and I'll vote for it.
  25. Mike Warren

    User Drawing of Lines and Curves

    Thank you both. I really appreciate your help. Sorry for the delay getting back to this thread. I've been sick and haven't had a chance to delve into this yet.
×