Pulsujący button

0

Próbuję zrobić "pulsujący" przycisk - poprzez cykliczne podmienianie glypha.
Na Formę wrzuciłem przycisk i timer.
W timerze dałem:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if x=0 then BitBtn1.Glyph.LoadFromFile('czysc2.bmp') else BitBtn1.Glyph.LoadFromFile('czysc1.bmp');
  x:=x xor 1;
end; 

Pod Win7 wszystko ładnie chodzi, natomiast pod XP wyrzuca: Floating point division by zero.
Sprawdzałem na kilku XP, oraz w Delphi 7 i XE2 - na wszystkich jest tak samo.

Proszę o radę co robię nie tak.
Ewentualnie jak to można zrobić inaczej.

0

Spróbuj tak:

var x: Bool = true;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if x then BitBtn1.Glyph.LoadFromFile('czysc2.bmp') else BitBtn1.Glyph.LoadFromFile('czysc1.bmp');
  x := not x;
end;  
0

Bez zmian

1

W podanym przez Ciebie kodzie nie ma prawa występować błąd FPU...

0

Też mi tak się wydaje (nigdzie tu nie widzę dzielenia), a jednak błąd się pokazuje i tak jak pisałem tylko pod XP - pod 7 jest ok.
(tworzyłem specjalnie nowy projekt w którym jest tylko ta jedna procedura i deklaracja zmiennej i nic więcej)

0
k3cz napisał(a):

Też mi tak się wydaje (nigdzie tu nie widzę dzielenia), a jednak błąd się pokazuje i tak jak pisałem tylko pod XP - pod 7 jest ok.
(tworzyłem specjalnie nowy projekt w którym jest tylko ta jedna procedura i deklaracja zmiennej i nic więcej)

To może lepiej w bieżącym projekcie zakomentuj jedną, potem drugą linię procedury i zobacz, która (i czy w ogóle) powoduje błąd.

1

W podanym przez Ciebie kodzie nie ma prawa występować błąd FPU...

Przecież wywołuje procedury WinApi, może tam się kreszuje.

To może lepiej w bieżącym projekcie zakomentuj jedną, potem drugą linię procedury i zobacz, która (i czy w ogóle) powoduje błąd.

Do takich metod się schodzi gdy się debuggera nie ma.

Pod Win7 wszystko ładnie chodzi, natomiast pod XP wyrzuca: Floating point division by zero.
Sprawdzałem na kilku XP, oraz w Delphi 7 i XE2 - na wszystkich jest tak samo.

Jaka szkoda że debugger nie pokazuje miejsca błędu, call stacku, stanu zmiennych itd. itd. A nawet jeżeli pokazuje to na co to?

0

Zamiast zmieniać glypha, zmieniam sam napis i wtedy jest ok (ale efekt wizualny już nie taki sam :( )

0
-123oho napisał(a):

To może lepiej w bieżącym projekcie zakomentuj jedną, potem drugą linię procedury i zobacz, która (i czy w ogóle) powoduje błąd.

Do takich metod się schodzi gdy się debuggera nie ma.

Oczywiście, ale przecież autor wątku nie ma debuggera, sam pisał:

(tworzyłem specjalnie nowy projekt w którym jest tylko ta jedna procedura i deklaracja zmiennej i nic więcej)

;-)

0

Delphi (zarówno D7 jak i XE2) mam zainstalowane na Win7, a na nim jak pisałem wszystko ładnie chodzi.
A więc debugger chyba nic nie pokaże.

0

Delphi (zarówno D7 jak i XE2) mam zainstalowane na Win7, a na nim jak pisałem wszystko ładnie chodzi.
A więc debugger chyba nic nie pokaże.

Można jakoś ustawić (przynajmniej w FPC) żeby zapisywało call stack do logu wraz z informacjami o kreszu, dawałoby więcej niż kod wyjątku. Poza tym (w FPC) można zainstalować GDB i się nim bawić bez IDE. A jak i to nie to zawsze jest kochana IDA która pomaga tam gdzie GDB przestaje. Możliwości masz dużo.

0

Sprawdzałem takie cudo na WinXP + Borland Delphi 7 i wszystko działa bez żadnych problemów, kod:

{...}

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    bHighlight: Boolean;
  end;

{...}

procedure TForm1.FormCreate(Sender: TObject);
begin
  bHighlight := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
const
  GLYPH_IMG: array [Boolean] of String = ('C:\czysc1.bmp', 'C:\czysc2.bmp');
begin
  bHighlight := not bHighlight;
  BitBtn1.Glyph.LoadFromFile(GLYPH_IMG[bHighlight]);
end;

{...}

Może zapomniałeś właczyć ten tajmer...? Sprawdź właściwość Timer.Enabled;

0

moze on nie odpalil Timera

0

Sprawdzałem takie cudo na WinXP + Borland Delphi 7 i wszystko działa bez żadnych problemów

U mnie nadal wywala błąd (oczywiście przy uruchamianiu exe, a nie przy kompilacji).
Jakiego masz XP ? Ja sprawdzałem na Professional i Home, oba SP3.

Może zapomniałeś właczyć ten tajmer...? Sprawdź właściwość Timer.Enabled;

Timer oczywiście włączony (tak jak pisałem, pod Win7 działa dobrze - przycisk "pulsuje").

1

może masz plik bitmapy zwalony i crash jest w momencie ładowania.
spróbuj użyć dwa razy jednego obrazka, a potem dwa razy drugiego.

0
Azarien napisał(a):

może masz plik bitmapy zwalony i crash jest w momencie ładowania.
spróbuj użyć dwa razy jednego obrazka, a potem dwa razy drugiego.

I to było to.
Widocznie Win7 inaczej interpretuje bitmapy niż XP.

Dzięki za pomoc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.