Niewłaściwe kolory na IBM Think Pad

0

Problem natury technicznej. Stworzyłem za pomocą komponentu TChart wykres, do którego link podaję: http://www.fotosik.pl/showFullSize.php?id=0d747826f46f81ed. Jak widać na screenie, każdy typ błędu ma przypisany unikatowy kolor. Ustalanie wzorca koloru odbywa się w sposób następujący:

procedure TScrapColorForm.TrackBarChange(Sender: TObject);
begin
 with TrackBar do
  shKolorZlomu.Brush.Color := RGB(Position, Position, Position);
end;

Słupki są kolorowane w sposób następujący:

GeneralSeries.Add(ProdPr, Kod, dbENgine.CodeToColor(Kod))
function TdbEngine.CodeToColor(CodeName: string): Integer;
var i :Word;
begin
 for i := 1 to ScrapCount do
  if CodeName = ScrapList^[i].ID then
     begin
      CodeToColor := ScrapList^[i].CL;
      Break;
     end else CodeToColor := 16777215;  // biały
end; // CodeToColor

Dla wiekszej czytelności screen formy: http://www.fotosik.pl/showFullSize.php?id=21536c80815499e6

Następnie shKolorZlomu.Brush.Color jest umieszczany w tablicy z owymi kodami. I tu pytanie. U mnie na komputerze wykres wygląda jak na screenie, natomiast na komputerach firmowych wszystkie słupki są czarne. Dlaczego? :| System operacyjny XP, z głębia 32 bity. Jedyne co różni nasze kompy to to, że ja mam GeForca, a w pracy są karty graficzne zintegrowane. Przy czym kolory mojego windowsa i w pracy są takie same, dlatego pojęcia nie mam co może być przyczyną takiego zachowania aplikacji. Dodam, że cała aplikacja wygląda dokładnie tak samo, poza słupkami.

0

Problem, rozwiązany, wątpliwosci pozostały. Patrząc na typ wartości zwracanej przez CodeToColor widzimy, ze to Integer. W czasach 16-bitowych, dosa i pascala mieliśmy do dyspozycji takie oto typy:

Type      Range                      Format
Shortint   -128..127                 Signed 8-bit
Integer    -32768..32767             Signed 16-bit
Longint    -2147483648..2147483647   Signed 32-bit
Byte       0..255                    Unsigned 8-bit
Word       0..65535                  Unsigned 16-bit

Widać tu wyraźną różnicę pomiędzy typem Ineger i LongInt. Po przesiadce na delphi, owa tabelka nieco ulega zmianie:

Generic integer types for 32-bit implementations of Delphi  
Type      Range                     Format
Integer   -2147483648..2147483647    signed 32-bit
Cardinal  0..4294967295              unsigned 32-bit

Fundamental integer types 
Type      Range                   Format
Shortint   -128..127               signed 8-bit
Smallint   -32768..32767           signed 16-bit
Longint    -2147483648..2147483647 signed 32-bit
Int64      -2^63..2^63-1           signed 64-bit
Byte       0..255                  unsigned 8-bit
Word       0..65535                unsigned 16-bit
Longword   0..4294967295           unsigned 32-bit

Tutaj już nie ma różnicy pomiędzy typem Integer i LongInt.
Do rzeczy. Wersja programu v1.0 zwracała wartość LongInteger. Pisząc wersję v2.0 z rozpędu użyłem Integer, i zostawiłem no bo to to samo (wg dokumentacji). To dało mi do myślenia. Wziąłem kompa do pracy i naprzód. Przerobiłem typ funkcji na LongInt, przegrałem na pamięć flash i odpalam na kompie w pracy. Hurra, działa... kopiuje na dysk, odpalam, k%$##a nie działa, znowu to samo. Okazało się, że kompy w pracy nie odczytywały z dysku poprawnych wartości (tak jakby Integer było nadal 16b) ale jakim cudem? Na flashu działa, na twardym nie działa? Tak więc pytanie już dla ciekawości: dlaczego się tak zachowało? Dodam, że owe kolory były zapisywane do tablicy, a tablica do pliku. Mówię sobie, że wystarczy zmienić typ funkcji i po kłopocie. Niestety, nie. Musiałem u siebie dokonać odczytu jako lognint z zapisu jako lognint, przegrać na kompa w pracy i teraz działa. Co nadal nie zmienia faktu, że to zachowanie jest dziwne.

Jeżeli trochę namieszałem to sorry.

0

Integer i LongInt mają ten sam zakres. Ale nikt nie powiedział, że są tak samo zapisywane (ważność kolejnych bajtów może być inna w każdym typie). Jeśli chcesz zachować kompatybilność, stosuj konkretne typy (LongInt, SmallInt, ShortInt itp.), a nie zależne od platformy (Integer itp.).

0

Przy czym nadal nie rozumiem, dlaczego program odpalony na dysku nie działał, a na flashu bez problemu.

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