Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TRectangle ändert in D10.4 die Farbe nicht (https://www.delphipraxis.net/212834-trectangle-aendert-d10-4-die-farbe-nicht.html)

dynamo 10. Apr 2023 16:51

TRectangle ändert in D10.4 die Farbe nicht
 
Mal ein ganz triviales Problem:
in Delphi-FMX (Android-Platform) benutze ich u.a. ein Rectangle, das, wenn ich drauf tippe, kurz die Farbe wechseln soll.
Quasi als primitive Animation, so dass man sieht, dass das Element auch tatsächlich angeklickt wurde.

Delphi-Quellcode:

var: rectangle: TRectangle;

TForm1.rectangleClick(Sender: TObject);
begin
 ...
    rectangle.Fill.Color := TAlphaColorRec.Green;// kurze Farbänderung
    sleep(500);
    rectangle.Fill.Color := TAlphaColorRec.White;// wieder die ursprüngliche Farbe setzen
 ...
end;
Falsch kann der Code ja nicht sein - denn in Delphi 10.2 funzt das!
Aber jetzt benutze ich Delphi 10.4. Da funktioniert das leider nicht.
Auch application.ProcessMessages vor und nach dem sleep() nutzt nichts.

Gibt es für Delphi 10.4 vielleicht eine einfache Entsprechung?

himitsu 10. Apr 2023 18:27

AW: TRectangle ändert in D10.4 die Farbe nicht
 
Delphi-Quellcode:
procedure TForm2.Rectangle1Click(Sender: TObject);
begin
  Rectangle1.Fill.Color := TAlphaColorRec.Green;
  Rectangle1.Repaint; // male dich "demnächst" neu (hier wird sowas wie ein PostMessage+WM_PAINT abgesetzt)
  Application.ProcessMessages; // jetzt (und nun wird das verarbeitet)
  Sleep(2000);
  Rectangle1.Fill.Color := TAlphaColorRec.White;
end;
Aber besser, wenn man rausbekommt, wie man der Komponente oder der Form direkt sagen könnte "Das" jetzt zu machen.


[add]
Delphi-Quellcode:
procedure TForm2.Rectangle1Click(Sender: TObject);
begin
  Self.Canvas.BeginScene;
  Rectangle1.Fill.Color := TAlphaColorRec.Green;
  Rectangle1.PaintTo(Self.Canvas, Rectangle1.UpdateRect, nil); // du willst nicht wissen, wie ich hierfür auf BeginScene gekommen bin. (Tipp: kommentiere mal BeginScene/EndScene aus)
  Self.Canvas.EndScene;
  Sleep(2000);
  Rectangle1.Fill.Color := TAlphaColorRec.White;
end;

Uwe Raabe 10. Apr 2023 21:16

AW: TRectangle ändert in D10.4 die Farbe nicht
 
Zitat:

Zitat von dynamo (Beitrag 1520838)
Mal ein ganz triviales Problem:
in Delphi-FMX (Android-Platform) benutze ich u.a. ein Rectangle, das, wenn ich drauf tippe, kurz die Farbe wechseln soll.
Quasi als primitive Animation, so dass man sieht, dass das Element auch tatsächlich angeklickt wurde.

Kann man das nicht mit einer TColorAnimation oder TColorKeyAnimation machen? Für den Trigger bietet sich IsPressed an und mit AutoReverse und einer passenden Duration sollte das doch hinzubekommen sein.

dynamo 10. Apr 2023 22:04

AW: TRectangle ändert in D10.4 die Farbe nicht
 
Ja vielen Dank, ich werde in dieser Richtung mal rumexperimentieren. Eigentlich ist das Programm ja schon fertig. Ich hatte es in Delphi 10.2 programmiert und auf Delphi 10.4 übertragen. Diese Primitiv-Ani war der einzige Punkt, der nur in 10.4 rumgezickt hat. Alles andere ist in Ordnung (oder sogar noch besser geworden).

dynamo 10. Apr 2023 23:26

AW: TRectangle ändert in D10.4 die Farbe nicht
 
Das mit der TColorAnimation war genau der richtige Tipp. Jetzt kann ich auch noch andere Komponenten damit beglücken. Vielen Dank nochmal.

dynamo 11. Apr 2023 14:08

AW: TRectangle ändert in D10.4 die Farbe nicht
 
Ich hab jetzt für mich die ideale Lösung gefunden. Hier ein kleines Beispiel für alle Interessierten:

Delphi-Quellcode:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.Edit, FMX.Objects, FMX.Ani;

type
  TForm1 = class(TForm)
    Rectangle1: TRectangle;
    Rectangle2: TRectangle;
    Rectangle3: TRectangle;
    procedure Rectangle2Click(Sender: TObject);
    procedure Rectangle1Click(Sender: TObject);
    procedure Rectangle3Click(Sender: TObject);
  private
    procedure ani(Sender: TObject; Color: TAlphaColor);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}


procedure TForm1.Rectangle1Click(Sender: TObject);
begin
  ani(Rectangle1,TAlphaColorRec.Red);
end;

procedure TForm1.Rectangle2Click(Sender: TObject);
begin
  ani(Rectangle2,TAlphaColorRec.Green);
end;

procedure TForm1.Rectangle3Click(Sender: TObject);
begin
  ani(Rectangle3,TAlphaColorRec.Blue);
end;

procedure TForm1.ani(Sender: TObject; Color: TAlphaColor);
var origColor : TAlphaColor;
begin
  if sender is TRectangle then
  begin
    // welche Farbe hatte TRectangle vor der Animation?
    origColor := (sender as TRectangle).Fill.Color;
    // set animation Color
    (sender as TRectangle).AnimateColor('Fill.Color', Color, 0.5, TAnimationType.InOut,
       TInterpolationType.Linear);
    // reset original Color
    (sender as TRectangle).AnimateColor('Fill.Color', origColor, 0.5, TAnimationType.InOut,
       TInterpolationType.Linear);
  end;
end;

end.

himitsu 11. Apr 2023 16:02

AW: TRectangle ändert in D10.4 die Farbe nicht
 
Im FormDesigner, bei Fill.Color, die Liste aufklappen und gaaaaaaaaanz unten z.B. eine ColorAnimation erstellen.
Dort gibt es auch ein StartFromCurrent.

* eine Animation mit dem selben Start- und End-Wert, aber mit einem Zwischenwert (also hin und zurück als eine Animation)
* oder eine Animation mit AutoRevert, also anschließend wieder zurück zum Ausgangswert

Nur bei Trigger "IsPressed=true" startet bei mir leider keine Animation, wenn ich mit der Maus draufdrück.

Uwe Raabe 11. Apr 2023 16:24

AW: TRectangle ändert in D10.4 die Farbe nicht
 
Zitat:

Zitat von himitsu (Beitrag 1520875)
Nur bei Trigger "IsPressed=true" startet bei mir leider keine Animation, wenn ich mit der Maus draufdrück.

Laut Doku wird IsPressed nur von TCustomButton, TRadioButton, TCheckBox und TThumb unterstützt.

himitsu 11. Apr 2023 18:00

AW: TRectangle ändert in D10.4 die Farbe nicht
 
OK, dann ist es nur etwas unpraktisch, dass es hier im Designer zur Auswahl steht. :freak:

himitsu 12. Apr 2023 13:47

AW: TRectangle ändert in D10.4 die Farbe nicht
 
Tipp:

Zitat:

procedure ani(Sender: TObject; Color: TAlphaColor);
Statt TObject kannst du auch TRectangle oder TShabe benutzen (somit auch für die anderen Figuren)
und mußt dann in der Methode nichts prüfen oder casten. (macht der Compiler beim Aufruf der Funktion)

TShape wegen dem .Fill,
der Rest (AnimateColor) wäre schon ab TFmxObject verfügbar (also für praktisch alle Komponenten)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz