Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Codeoptimierung verursacht probleme

  Alt 20. Jan 2017, 13:40
EDIT:
Er gibt mir einen ErangeError sagt aber nicht wo.
Weiß ja nicht, ob das früher anderes war, aber wenn man das Programm aus der IDE heraus im Debugger laufen lässt, kommt in der Regel eine Messagebox hoch, wo man auf Break/Anhalten klicken kann.
Außer natürlich, du hast ERangeError irgendwann mal ganz klugerweise auf ignorieren gestellt.
Nö nur wo man OK klicken kann.
Da ist es doch schon zuspät. Das klingt so, als ob du das Programm nur so startest, ohne Debugger.
Du musst das Programm im Debugger starten?!?!

Ich speicher verschiedene Datentypen in propertys wenn dieses Property den Bereich eines Integer verlässt also minus wird
kracht es das kann ich aber nicht ändern.

Delphi-Quellcode:
procedure TSkinEngine.SetProperty(WinHandle: HWND; Item: integer; V: integer);
begin
  if (Item > 0) and (Item < EXTEND_EXTRA + 1) and (WinHandle <> 0) then
    SetWindowLong(WinHandle, (Item - 1) * 4, V);

end;
Delphi-Quellcode:
function TSkinEngine.GetProperty(WinHandle: HWND; Item: integer): integer;
begin
  Result := 0;

  if (Item > 0) and (Item < EXTEND_EXTRA + 1) and (WinHandle <> 0) then
    Result := GetWindowLong(WinHandle, (Item - 1) * 4);

end;
Sagen wir mal das Property das gelesen wird ist ein HDC und dieses hat einen negativen wert -123134345
Dann tritt ein ERangeError auf.

Ich kann aber bei GetWindowLong kein DWORD zurückgeben und es erwartet einen Integer für Index.
Ich wüsste jetzt nicht wie ich das behandeln sollte.

Erweitertes Beispiel:
SkinEngine.SetProperty(Handle, PROP_TEXT_COLOR, TextCol);
TextCol wird jetzt in das Property gespeichert.
TextColor ist COLORREF also DWord kann minus werte enthalten und das verletzt die Untergrenze (Integer). outofbounds
Irgendwie verwechselst du die grundlegenden Datentypen. Integer ist vorzeichenbehaftet, DWORD ist ohne Vorzeichen.
Einfach mal auf die entsprechenden Datentypen per Strg+Linksklick oder Doku stöbern.
Und wenn du Handles und ähnliche Daten (THandle, HWND, HDC, COLORREF, DWORD...) per SetProperty hart auf Integer castet, dann brauchst du dich nich wundern das da nur Quatsch bei GetProperty zurückkommt und du Bereichfehler bekommst.
  Mit Zitat antworten Zitat