![]() |
ERangeError wo keiner ist.
Nach eingeschalteter Bereichsprüfung bekomme ich einen ERangeError.
Dürfte aber eigentlich nicht sein.
Delphi-Quellcode:
Im string sBF steht als Beispiel: "ACTIVECAPTION, 255,250,250,255"
// "ACTIVECAPTION, 255,250,250,255" ' Active caption text color.
stActiveCaption: begin ActiveCaption[SkinEngine.SkinARGB(sBF), 1]; end; 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:
Die Farbe wird korrekt berechnet dementsprechend auch der String korrekt geparst.
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; trotzdem ein Bereichsprüfungs Fehler? Rückgabe der Farbe.
Delphi-Quellcode:
gruss
function TSkinConfig.GetActiveCaption(FColorMode, FReadColorMode: Integer): COLORREF;
begin if FReadColorMode <> 0 then FActiveCaptionColor := FColorMode; Result := FActiveCaptionColor; end; |
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 :) |
AW: ERangeError wo keiner ist.
Zitat:
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 |
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? |
AW: ERangeError wo keiner ist.
Zitat:
@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 |
AW: ERangeError wo keiner ist.
Zitat:
![]() |
AW: ERangeError wo keiner ist.
Zitat:
Ok habe das ja gefixt. Danke. gruss |
AW: ERangeError wo keiner ist.
Zitat:
|
AW: ERangeError wo keiner ist.
Zitat:
So habe wenigsten nicht ganz sauberen code dahingehend bereinigt das dort kein Problem mehr auftritt. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz