AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Neuer Blog über FireMonkey Entwicklung eröffnet

Ein Thema von Harry Stahl · begonnen am 6. Mär 2013 · letzter Beitrag vom 12. Mai 2023
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.553 Beiträge
 
Delphi 12 Athens
 
#1

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 15. Okt 2016, 16:15
Bei deiner Uhr kommst du mit LiveBinding-Expressions auf 0 bis 1 Codezeilen.
In die TLayout noch auf die Gegenseite ein TLabel und schon brauchst du 6 TLayout weniger.
Aber vorallem im Code ... Warum diese Stringoperationen?

Delphi-Quellcode:
//rrHout.RotateAngle := 30 * HourOf(Now) + 6 * MinuteOf(Now) / 12;
rrHout.RotateAngle := 30 * HourOf(Now) + MinuteOf(Now) / 2;
rrMin.RotateAngle := 6 * MinuteOf(Now);
rrSec.RotateAngle := 6 * SecondOf(Now);
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Okt 2016 um 16:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl
Online

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#2

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 15. Okt 2016, 16:53
Bei deiner Uhr kommst du mit LiveBinding-Expressions auf 0 bis 1 Codezeilen.
In die TLayout noch auf die Gegenseite ein TLabel und schon brauchst du 6 TLayout weniger.
Aber vorallem im Code ... Warum diese Stringoperationen?

Delphi-Quellcode:
//rrHout.RotateAngle := 30 * HourOf(Now) + 6 * MinuteOf(Now) / 12;
rrHout.RotateAngle := 30 * HourOf(Now) + MinuteOf(Now) / 2;
rrMin.RotateAngle := 6 * MinuteOf(Now);
rrSec.RotateAngle := 6 * SecondOf(Now);

OK, Deine Frage bezieht sich auf Beitrag 55 (siehe oben).

Den Code brauche ich, um die Zeiger zu bewegen und die richtige Uhrzeit anzuzeigen (wenn Du eine schönere Lösung kennst, ist die immer Willkommen).

Was Du mit Deinem Hinweise zum TLayout meinst, ist mir nicht ganz klar. Davon abgesehen, ist das mit dem TLayout eh nur zur Demonstration. In einer anderen Version der Uhr, die ich in meinem in Arbeit befindlichen Buch für Delphi Berlin vorstelle, gibt es nur ein TLayout für einen Stundenabschnitt (siehe Bild in Anlage), das dann zur Laufzeit einfach entsprechend dupliziert wird, dann spart man sich eine Reihe von Layout-Arbeiten, die man ja im Video hinlänglich sehen kann (die gesamte Design-Arbeit, die dann noch zu leisten ist, wird in Bild2 verdeutlicht).
Angehängte Grafiken
Dateityp: jpg clock.jpg (13,6 KB, 11x aufgerufen)
Dateityp: jpg clock2.jpg (15,1 KB, 8x aufgerufen)

Geändert von Harry Stahl (15. Okt 2016 um 17:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.553 Beiträge
 
Delphi 12 Athens
 
#3

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 15. Okt 2016, 21:54
das dann zur Laufzeit einfach entsprechend dupliziert wird, dann spart man sich eine Reihe von Layout-Arbeiten
Dann hast du aber wieder mehr Code im Code

Ich meinte es einfach so, wie du es schon gemacht hast, nur eben nicht nur ein Label "12" in das TLayout, sondern auch noch ein Label "6"
und das dann nur 5 Mal kopieren statt 11 Mal.

Den Code brauche ich, um die Zeiger zu bewegen und die richtige Uhrzeit anzuzeigen (wenn Du eine schönere Lösung kennst, ist die immer Willkommen).
OK
Zitat:
rrSec.RotateAngle := 6 * StrToInt(FormatDateTime('ss', Now));
Du erstellst einen String und wandelst diesen dann wieder in eine Zahl, aber man kann das auch direkt mathematisch lösen.
rrSec.RotateAngle := 6 * (Trunc(Now * SecsPerDay) mod 60);
Aber natürlich gibt es schon eine schöne Funktion, welche das verständlicher erledigt.
rrSec.RotateAngle := 6 * SecondOf(Now);
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Okt 2016 um 21:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl
Online

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#4

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 15. Okt 2016, 22:34
Upps, manchmal ist man doch echt blind. Hatte gar nicht mitbekommen, dass Du schon meinen Code abgewandelt hattest.

Super!!

Die HourOF, MinuteOF und SecondOf (TDateTime) kannte ich noch gar nicht! Müssen irgendwie an mir vorbeigegangen sein.

Wer Sie auch noch nicht kannte: man muss die Unit DateUtils (die kannte ich natürlich) einbinden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.553 Beiträge
 
Delphi 12 Athens
 
#5

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 15. Okt 2016, 22:39
Passiert jedem mal und man lernt eben nie aus.

Einfach kopieren, via Strg+V im FormDesigner einfügen und F9 drücken.
Man müsste nur noch beim Start die Animationen einmal mit der aktuellen Zeit synchronisieren
oder besser noch über die LiveBinding-Expressions ... dann braucht man garkeinen "Code" mehr.

Bei den LiveBindings-Expressions ist es so, dass man in den Bindings direkt "Code" verwenden kann, also nicht nur synchronisere Property pA von Objekt oA mit Property pB von Objekt oB , sondern dass bei der "Zuweisung" auch noch irgendwelche mathematischen Operationen auf den Wert angewendet werden sollen.
Code:
object Circle1: TCircle
  Align = Center
  Size.Width = 400.000000000000000000
  Size.Height = 400.000000000000000000
  Size.PlatformDefault = False
  object Layout1: TLayout
    Align = Center
    Size.Width = 50.000000000000000000
    Size.Height = 400.000000000000000000
    Size.PlatformDefault = False
    TabOrder = 0
    object Text1: TText
      Align = Top
      Text = '12'
      TextSettings.Font.Size = 24.000000000000000000
      TextSettings.Font.StyleExt = {00070000000000000004000000}
    end
    object Text2: TText
      Align = Bottom
      Position.Y = 350.000000000000000000
      Text = '6'
      TextSettings.Font.Size = 24.000000000000000000
      TextSettings.Font.StyleExt = {00070000000000000004000000}
    end
  end
  object Layout2: TLayout
    Align = Center
    RotationAngle = 30.000000000000000000
    Size.Width = 50.000000000000000000
    Size.Height = 400.000000000000000000
    Size.PlatformDefault = False
    TabOrder = 1
    object Text3: TText
      Align = Top
      RotationAngle = -30.000000000000000000
      Text = '1'
      TextSettings.Font.Size = 24.000000000000000000
      TextSettings.Font.StyleExt = {00070000000000000004000000}
    end
    object Text4: TText
      Align = Bottom
      Position.Y = 350.000000000000000000
      RotationAngle = -30.000000000000000000
      Text = '7'
      TextSettings.Font.Size = 24.000000000000000000
      TextSettings.Font.StyleExt = {00070000000000000004000000}
    end
  end
  object Layout3: TLayout
    Align = Center
    RotationAngle = 60.000000000000000000
    Size.Width = 50.000000000000000000
    Size.Height = 400.000000000000000000
    Size.PlatformDefault = False
    TabOrder = 2
    object Text5: TText
      Align = Top
      RotationAngle = -60.000000000000000000
      Text = '2'
      TextSettings.Font.Size = 24.000000000000000000
      TextSettings.Font.StyleExt = {00070000000000000004000000}
    end
    object Text6: TText
      Align = Bottom
      Position.Y = 350.000000000000000000
      RotationAngle = -60.000000000000000000
      Text = '8'
      TextSettings.Font.Size = 24.000000000000000000
      TextSettings.Font.StyleExt = {00070000000000000004000000}
    end
  end
  object Layout4: TLayout
    Align = Center
    RotationAngle = 90.000000000000000000
    Size.Width = 50.000000000000000000
    Size.Height = 400.000000000000000000
    Size.PlatformDefault = False
    TabOrder = 3
    object Text7: TText
      Align = Top
      RotationAngle = -90.000000000000000000
      Text = '3'
      TextSettings.Font.Size = 24.000000000000000000
      TextSettings.Font.StyleExt = {00070000000000000004000000}
    end
    object Text8: TText
      Align = Bottom
      Position.Y = 350.000000000000000000
      RotationAngle = -90.000000000000000000
      Text = '9'
      TextSettings.Font.Size = 24.000000000000000000
      TextSettings.Font.StyleExt = {00070000000000000004000000}
    end
  end
  object Layout5: TLayout
    Align = Center
    RotationAngle = 120.000000000000000000
    Size.Width = 50.000000000000000000
    Size.Height = 400.000000000000000000
    Size.PlatformDefault = False
    TabOrder = 4
    object Text9: TText
      Align = Top
      RotationAngle = -120.000000000000000000
      Text = '4'
      TextSettings.Font.Size = 24.000000000000000000
      TextSettings.Font.StyleExt = {00070000000000000004000000}
    end
    object Text10: TText
      Align = Bottom
      Position.Y = 350.000000000000000000
      RotationAngle = -120.000000000000000000
      Text = '10'
      TextSettings.Font.Size = 24.000000000000000000
      TextSettings.Font.StyleExt = {00070000000000000004000000}
    end
  end
  object Layout6: TLayout
    Align = Center
    RotationAngle = 150.000000000000000000
    Size.Width = 50.000000000000000000
    Size.Height = 400.000000000000000000
    Size.PlatformDefault = False
    TabOrder = 5
    object Text11: TText
      Align = Top
      RotationAngle = -150.000000000000000000
      Text = '5'
      TextSettings.Font.Size = 24.000000000000000000
      TextSettings.Font.StyleExt = {00070000000000000004000000}
    end
    object Text12: TText
      Align = Bottom
      Position.Y = 350.000000000000000000
      RotationAngle = -150.000000000000000000
      Text = '11'
      TextSettings.Font.Size = 24.000000000000000000
      TextSettings.Font.StyleExt = {00070000000000000004000000}
    end
  end
  object RoundRect1: TRoundRect
    Fill.Color = claBlack
    Position.X = 191.000000000000000000
    Position.Y = 64.000000000000000000
    RotationCenter.Y = 0.935000002384185700
    Size.Width = 17.000000000000000000
    Size.Height = 145.000000000000000000
    Size.PlatformDefault = False
    object FloatAnimation1: TFloatAnimation
      Enabled = True
      Duration = 43200.000000000000000000
      PropertyName = 'RotationAngle'
      StartValue = 0.000000000000000000
      StopValue = 360.000000000000000000
    end
  end
  object RoundRect2: TRoundRect
    Fill.Color = claBlack
    Position.X = 193.000000000000000000
    Position.Y = 40.000000000000000000
    RotationCenter.Y = 0.944000005722046000
    Size.Width = 13.000000000000000000
    Size.Height = 169.000000000000000000
    Size.PlatformDefault = False
    object FloatAnimation2: TFloatAnimation
      Enabled = True
      Duration = 3600.000000000000000000
      PropertyName = 'RotationAngle'
      StartValue = 0.000000000000000000
      StopValue = 360.000000000000000000
    end
  end
  object RoundRect3: TRoundRect
    Fill.Color = claCrimson
    Position.X = 196.000000000000000000
    Position.Y = 24.000000000000000000
    RotationCenter.Y = 0.875000000000000000
    Size.Width = 8.000000000000000000
    Size.Height = 201.000000000000000000
    Size.PlatformDefault = False
    object FloatAnimation3: TFloatAnimation
      Enabled = True
      Duration = 60.000000000000000000
      Loop = True
      PropertyName = 'RotationAngle'
      StartValue = 0.000000000000000000
      StopValue = 360.000000000000000000
    end
  end
end
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Okt 2016 um 22:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl
Online

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#6

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 16. Okt 2016, 16:37
OK, jetzt weiß ich, was Du meinst mit den Layouts.

Ich hatte mir auch überlegt, eine Animation zu verwenden, die Sekundenweise, bzw. Minuten oder Stundenweise aktiv ist und dann damit die Zeiger bewegt. Allerdings ist es mir mit den Expressions nicht gelungen hier eine entsprechende Anweisung für eine Initialisierung der aktuellen Uhrzeit hinzubekommen. Der Befehlssatz ist da leider etwas beschränkt (http://docwiki.embarcadero.com/RADSt...n_LiveBindings).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.553 Beiträge
 
Delphi 12 Athens
 
#7

AW: Neuer Blog über FireMonkey Entwicklung eröffnet

  Alt 16. Okt 2016, 20:14
Jupp, mit dem Standardbefehlssatz hab ich's och nicht hinbekommen. Aber bestimmt kann man den ja irgendwie erweitern.

Was ginge, war im Timer ein Timer1.Tag := SecondOfTheDay(Now); im OnTimer und dann könnte man in den LiveBindings damit die Zeiger setzen,
also jeweils für RotationAngle:
rrHour: (Tag div 3600) * 30
rrMin: (Tag div 60 mod 60) * 6
rrSec: (Tag mod 60) * 6

Ich glaub MOD und DIV gab's nicht, aber das kann man mathematisch und mit bisschen Rundung ersetzten.
Now liefert auch die Millisekunden ... da vergrößert man den Integer etwas oder nimmt gleich TagFloat (falls die LiveBindings den lesen können),
lässt einfach das Runden weg und zeichnet Zwischenschritte.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 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