Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi ERangeError wo keiner ist. (https://www.delphipraxis.net/190191-erangeerror-wo-keiner-ist.html)

EWeiss 9. Sep 2016 18:20


ERangeError wo keiner ist.
 
Nach eingeschalteter Bereichsprüfung bekomme ich einen ERangeError.
Dürfte aber eigentlich nicht sein.

Delphi-Quellcode:
// "ACTIVECAPTION, 255,250,250,255" ' Active caption text color.
stActiveCaption:
begin
  ActiveCaption[SkinEngine.SkinARGB(sBF), 1];
end;
Im string sBF steht als Beispiel: "ACTIVECAPTION, 255,250,250,255"
Dieser wird jetzt geparst mit dem Delemiter ","

Delphi-Quellcode:
function TSkinEngine.SkinARGB(sBF: string): COLORREF;
var
  bytestruct: COLORBYTES;

begin
  bytestruct.A := byte(StrToInt(ParseThis(sBF, ',', 1, 1)));
  bytestruct.R := byte(StrToInt(ParseThis(sBF, ',', 2, 2)));
  bytestruct.G := byte(StrToInt(ParseThis(sBF, ',', 3, 3)));
  bytestruct.B := byte(StrToInt(ParseThis(sBF, ',', 4, 4)));

  Result := MakeColor(bytestruct.A, bytestruct.R, bytestruct.G, bytestruct.B);
end;
Delphi-Quellcode:
function ParseThis(Source, Deli: string; Count: Integer): string;
var
  StringList : TstringList;
  EndOfCurrentString: byte;

begin
  StringList := TStringList.Create;
  try

  repeat
    EndOfCurrentString := Pos(Deli, Source);
    if EndOfCurrentString = 0 then
    StringList.add(Source)
    else
    StringList.add(Copy(Source, 1, EndOfCurrentString - 1));
    Source := Copy(Source, EndOfCurrentString + length(Deli), length(Source) - EndOfCurrentString);
  until EndOfCurrentString = 0;

    Result:= Trim(StringList.Strings[Count]);
  finally
    StringList.Free;
  end;
end;
Delphi-Quellcode:
function RightTrim(const s:String):String;
var
  i:integer;
begin
  i:=length(s);
  while (i>0) and (s[i]<=#32) do
    Dec(i);
    result:=Copy(s,1,i);

end;

function LeftTrim(const s: string):string;
var
  i, L:integer;
begin
    L := length(s);
    i := 1;
    while (i <= L) and (s[i] <= #32) do
    Inc(i);
    result := Copy(s, i, MaxInt);
end;

function Trim(Str: String): String;
begin
  Result := LeftTrim(RightTrim(Str))

end;
Delphi-Quellcode:
function MakeColor(a, r, g, b: Byte): ARGB; overload;
begin
    result := ((DWORD(b) shl Blue_Shift) or
               (DWORD(g) shl Green_Shift) or
               (DWORD(r) shl  Red_Shift) or
               (DWORD(a) shl Alpha_Shift));
end;
Die Farbe wird korrekt berechnet dementsprechend auch der String korrekt geparst.
trotzdem ein Bereichsprüfungs Fehler?

Rückgabe der Farbe.
Delphi-Quellcode:
function TSkinConfig.GetActiveCaption(FColorMode, FReadColorMode: Integer): COLORREF;
begin
   if FReadColorMode <> 0 then
    FActiveCaptionColor := FColorMode;

   Result := FActiveCaptionColor;
end;
gruss

Zacherl 9. Sep 2016 18:41

AW: ERangeError wo keiner ist.
 
An welcher Stelle genau kommt denn der Fehler?

Das Parsen kannst du dir btw viel einfacher machen:
Delphi-Quellcode:
StringList.Delimiter := ',';
StringList.DelimitedText := sBF;
// Fertig :)

EWeiss 9. Sep 2016 18:48

AW: ERangeError wo keiner ist.
 
Zitat:

Zitat von Zacherl (Beitrag 1347280)
An welcher Stelle genau kommt denn der Fehler?

Das Parsen kannst du dir btw viel einfacher machen:
Delphi-Quellcode:
StringList.Delimiter := ',';
StringList.DelimitedText := sBF;
// Fertig :)

Nachdem der Komplette Vorgang abgeschlossen ist.
Dann springt die Funktion zurück in
Delphi-Quellcode:
ActiveCaption[SkinEngine.SkinARGB(sBF), 1];

und von da aus in die WinProc und gibt den ERangeError aus.

Normalerweise springt sie ohne Bereich Prüfung hier rein..
TSkinConfig.GetActiveCaption.

1 bedeutete das ein Neuer Farbwert eigelesen wurde.
diese Funktion repräsentiert quasi einen Getter und Setter in einem.

gruss

hoika 9. Sep 2016 19:04

AW: ERangeError wo keiner ist.
 
Hallo,

ActiveCaption[SkinEngine.SkinARGB(sBF), 1];

Dann nimm das doch mal auseinander.
Eine kleine lokale Variable und schon weisst, warum der Fehler kommt.

MyVar := SkinEngine.SkinARGB(sBF);
ActiveCaption[MyVar, 1];

Sind denn irgendwelche Compilerwarnungen da?

EWeiss 9. Sep 2016 19:08

AW: ERangeError wo keiner ist.
 
Zitat:

Sind denn irgendwelche Compilerwarnungen da?
Nein keine.

@hoika :) Danke.

Das hat geholfen..
Hatte da einen großen Denkfehler.

Delphi-Quellcode:
function TSkinConfig.GetActiveCaption(FColorMode, FReadColorMode: Integer): COLORREF;


FColorMode <> COLORREF ;)
Das hat den Fehler verursacht.

Kommt davon wenn man 2 Variablen gleichzeitig definiert.
Anstelle jede einzeln für sich.

Delphi-Quellcode:
function TSkinConfig.GetActiveCaption(FColorMode: COLORREF; FReadColorMode: Integer): COLORREF;


Mich wunder nur das nicht eine Warnung ausgegeben wurde.
Der Compiler hätte das merken müssen das Cardinal nicht gleich Integer ist.
Ich meine damit ohne die Bereichsprüfung zu aktivieren.

gruss

Uwe Raabe 9. Sep 2016 21:45

AW: ERangeError wo keiner ist.
 
Zitat:

Zitat von EWeiss (Beitrag 1347284)
Der Compiler hätte das merken müssen das Cardinal nicht gleich Integer ist.

Cardinal und Integer sind typkompatibel und somit auch zuweisungskompatibel - insofern lässt der Compiler das ohne Warnung zu (siehe: Kompatibilität und Identität von Typen (Delphi)).

EWeiss 9. Sep 2016 21:48

AW: ERangeError wo keiner ist.
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1347286)
Zitat:

Zitat von EWeiss (Beitrag 1347284)
Der Compiler hätte das merken müssen das Cardinal nicht gleich Integer ist.

Cardinal und Integer sind typkompatibel und somit auch zuweisungskompatibel - insofern lässt der Compiler das ohne Warnung zu (siehe: Kompatibilität und Identität von Typen (Delphi)).

Ach so bekomme aber trotzdem einen Bereichsprüfung Fehler.
Ok habe das ja gefixt.

Danke.

gruss

Uwe Raabe 9. Sep 2016 22:25

AW: ERangeError wo keiner ist.
 
Zitat:

Zitat von EWeiss (Beitrag 1347288)
Ach so bekomme aber trotzdem einen Bereichsprüfung Fehler.

Weil bei eingeschalteter Bereichsprüfung vor der Zuweisung genau das abgeprüft wird. Da der Fehler aber nicht vom Typ, sondern vom aktuellen Inhalt der Variablen abhängt, kann man das nur durch einen Runtime-Check finden.

EWeiss 9. Sep 2016 22:30

AW: ERangeError wo keiner ist.
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1347293)
Zitat:

Zitat von EWeiss (Beitrag 1347288)
Ach so bekomme aber trotzdem einen Bereichsprüfung Fehler.

Weil bei eingeschalteter Bereichsprüfung vor der Zuweisung genau das abgeprüft wird. Da der Fehler aber nicht vom Typ, sondern vom aktuellen Inhalt der Variablen abhängt, kann man das nur durch einen Runtime-Check finden.

Ok.
So habe wenigsten nicht ganz sauberen code dahingehend bereinigt das dort kein Problem mehr auftritt.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:20 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