Wyliczanie zmiennej typu Int64 po kliknięciu w progresbar

2015-02-22 17:33
unknow_
0

Jest taki problem

procedure TfmNagrania.pbPercentMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  newPosition: Int64;
begin
  inherited;
  newPosition := Round(x * pbPercent.Max / pbPercent.ClientWidth);
  imePlay.IO.DShowParams.Position := newPosition;
end; 

X = 237
pbPercent.Max = 253130000
pbPercent.ClientWidth = 952

Z matematycznego punktu widzenia newPosition powinna posiadać wartość: 63016607
Natomiast w delphi zmienna newPosition przybiera wartość: -144677

Przez co pozycja wraca na 0 przy każdym kliknięciu w progressbara. Czy możecie coś podpowiedzieć?

Pozostało 580 znaków

2015-02-22 17:41
1

Na Delphi się nie znam, ale podejrzewam overflow. Zastanów się czy dobrze dobrałeś rozmiar zmiennej. Masz tam jakiś debugger?

edytowany 1x, ostatnio: Sawyer7, 2015-02-22 17:43
na 100% overflow - kAzek 2015-02-22 17:44

Pozostało 580 znaków

2015-02-22 17:43
0

Spróbuj

newPosition := Round(x * Int64(pbPercent.Max) / pbPercent.ClientWidth);

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek, 2015-02-22 18:42

Pozostało 580 znaków

2015-02-22 17:43
unknow_
0

Napisałem szybciej niż pomyślałem ... poniżej działające rozwiązanie:

procedure TfmNagrania.pbPercentMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  newPosition: integer;
  vmax: Int64;
begin
  inherited;
  vMax := pbPercent.Max div 100000;
  newPosition := Round(x * vMax / pbPercent.ClientWidth);
  imePlay.IO.DShowParams.Position := newPosition * 100000;
end; 
Mi się wydaje że przekombinowałeś, tak jak napisałem wyżej powinno działać ;) - kAzek 2015-02-22 17:46

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0