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/)
-   -   Delphi Im OI zugewiesener Wert wird nach Progr.-Start überschrieben (https://www.delphipraxis.net/89523-im-oi-zugewiesener-wert-wird-nach-progr-start-ueberschrieben.html)

scrat1979 1. Apr 2007 19:24


Im OI zugewiesener Wert wird nach Progr.-Start überschrieben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich habe mit einer meiner Komponenten ein kleines Problem, was mir allerdings schon öfters auch bei anderen Komponenten aufgefallen ist. Es handelt sich um eine von TCustomLabel abgeleitete Komponente, welche in einem Label das Datum/Uhzeit in diversen Formaten anzeigt.

So, nun zum Problem. Ändere ich im OI die Art der Anzeige wird ein gewisses TimerIntervall zugewiesen. Möchte man dies (Intervall) aber danach verändern, kann man dann im OI den entsprechenden Wert eingeben (sinnvoll z.B. bei eigenem "Custom" Format). Startet man nun das Programm, dann wird im Konstruktor der Wert allerdings wieder durch den "Standardwert" überschrieben. Dass es im Konstruktor passieren muss, ist mir bewusst, allerdings sind sämtliche Versuche fehlgeschlagen, den Fehler zu beheben. Hoffe einer von Euch kann mir weiterhelfen. Den Source habe ich angehängt - wer ihn selber benutzen möchte, nur zu :thumb:

Grüsse,

SCRaT

Muetze1 1. Apr 2007 20:35

Re: Im OI zugewiesener Wert wird nach Progr.-Start überschri
 
Das Problem dabei liegt darin, dass dein ShowTimeAs Eigenschaft beim Laden deinen Timerintervall wieder überschreibt - schliesslich legst du bei "Custom" wieder 500 ms fest. Entweder - oder. Du musst dich von daher entscheiden. Die ShowTimeAs wird einfach nur später geladen als deine Intervall-Eigenschaft.

Problemlösung: Verhindere das Setzen des Intervalls auf 500, wenn es csLoading gesetzt ist in ComponentState und der Value der Eigenschaft ShowTimeAs als "Custom" geladen wird.

scrat1979 1. Apr 2007 20:42

Re: Im OI zugewiesener Wert wird nach Progr.-Start überschri
 
Ah! Vielen Dank für den Tip mit csLoading...

Habe es nun so gelöst, scheint prima zu funktionieren:

Delphi-Quellcode:
procedure TDateTimeLabel.SetDateTimePresentation(Value: TDateTimePresentation);
begin
  if not (csloading in ComponentState) then Begin;

  If FDateTimePresentation <> Value Then
    begin
      FDateTimePresentation := Value;

      // TimerIntervall festlegen
      case FDateTimePresentation of
        dtpCustom: SetfTimerIntervall(500);
        dtpTime: SetfTimerIntervall(500);
        dtpDateTime: SetfTimerIntervall(30000);
        dtpLongDate: SetfTimerIntervall(30000);
        dtpWeekdayDate: SetfTimerIntervall(30000);
        dtpWeekdayDateTime: SetfTimerIntervall(30000);
      end;

      ShowTheTime(self);
    end;
  end;
end;
Noch eine Verständnis-Frage: Wann genau (von wann--bis wann) liegt denn der Status "csLoading" eigentlich vor?

SCRaT

Muetze1 1. Apr 2007 20:44

Re: Im OI zugewiesener Wert wird nach Progr.-Start überschri
 
Grob gesagt, wenn die Komponenten aus den Resourcen bzw. der DFM "gestreamed" werden. Näheres dazu in der Hilfe zu TComponentState

scrat1979 1. Apr 2007 20:46

Re: Im OI zugewiesener Wert wird nach Progr.-Start überschri
 
Zitat:

Zitat von Muetze1
[...]
Näheres dazu in der Hilfe zu TComponentState

Hätte ich auch selbst drauf kommen können :wall:

Vielen Dank nochmals!

SCRaT

scrat1979 3. Apr 2007 23:11

Re: Im OI zugewiesener Wert wird nach Progr.-Start überschri
 
Habe dazu noch eine Verständnisfrage:

Weise ich aber die Variable im Konstruktor direkt zu, z.B.

Delphi-Quellcode:
FDateTimePresentation := dtpTime;
... dann wird der im OI zugewiesene Wert beim Start dennoch NICHT überschrieben. Warum?


SCRaT


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 Uhr.

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