![]() |
Fehler bei Bereichsprüfung in SendMessage
Hallo DPler,
ich habe ein merkwürdigen Fehler manchmal wird nach Start meiner Anwendung ein Fehler in der Bereichsprüfung ausgelöst und manchmal kann ich die Anwendung so oft starten wie ich will es kommt kein Fehler. Und zwar werden nach dem Start Daten aufbereitet und dies soll durch ein blinkendes Icon in der Statuszeile (TStatusBar) angezeigt werden, dazu wird ein Timer gestartet der alle paar Millisekunden eine Prozedur aufruft die ein Icon in der Statusbar anzeigen soll. Das Icon wird aus einer ImageList geladen und dann via SendMessage in eine StatusBar eingebunden, hier jedoch tritt dann gelegentlich der Fehler in der Bereichsprüfung auf, ich habe nur keinen Schimmer wie und was ich machen muß damit der Fehler nicht mehr kommt. Ich hab einen Beitrag ![]() In dem Beitrag wird was von einer geänderten Handle größe gesprochen.
Delphi-Quellcode:
procedure TfrmMain.pShowStatusBarIcon(IconIdx: Byte; bShow: Boolean; Panel: Byte);
begin if (IconIdx < imlStatusBar.Count) then begin if bShow then begin //Icon holen... imlStatusBar.GetIcon(IconIdx, AnimatedIcon); //Icon anzeigen try SendMessage(barStatus.Handle, SB_SETICON, Panel, AnimatedIcon.Handle); except on E: exception do begin ShowMessage(E.Message); end; end; end else begin //Icon wieder löschen SendMessage(barStatus.Handle, SB_SETICON, Panel, 0); end;{else} end;{if IconIdx Ok} end; |
Re: Fehler bei Bereichsprüfung in SendMessage
Hmm niemand eine Idee was den Fehler in der Bereichsprüfung auslöst, bzw. wie man diesen verhindert!?
|
Re: Fehler bei Bereichsprüfung in SendMessage
Hallo,
was ich hier vermisse sind ein paar Asserts, z.B. Assert(barStatus.Handle>0); Assert(AnimatedIcon.Handle>0); Heiko |
Re: Fehler bei Bereichsprüfung in SendMessage
WParam und LParam sind idiotischerweise von CodeGear als Integer (LongInt) deklariert worden und von daher könnte AnimatedIcon.Handle einen Wert > MaxInt haben, so dass er ein Problem bekommt. Gleiches für das Fensterhandle...
|
Re: Fehler bei Bereichsprüfung in SendMessage
Zitat:
Ich bin mir nicht sicher ob mit der Zeit die Handle immer höher indiziert werden und somit erst später und nicht "kurz" nach Rechner start auftreten. Was ich mich jetzt nur Frage der Compiler meldet: "Warnung: Vorzeichenbehaftete und -lose Typen werden verglichen - beide Operanden werden erweitert" wie ich diese Warnung wieder weg bekomme.
Delphi-Quellcode:
procedure TfrmMain.pShowStatusBarIcon(IconIdx: Byte; bShow: Boolean; Panel: Byte);
begin if (IconIdx < imlStatusBar.Count) then begin if bShow then begin //Icon holen... imlStatusBar.GetIcon(IconIdx, AnimatedIcon); //Icon anzeigen try if (barStatus.Handle <= MaxInt) and (AnimatedIcon.Handle <= MaxInt) then SendMessage(barStatus.Handle, SB_SETICON, Panel, AnimatedIcon.Handle); except on E: exception do begin ShowMessage(E.Message+': '+IntToStr(barStatus.Handle)+' '+IntToStr(Panel)+' Icon: '+IntToStr(AnimatedIcon.Handle)); end; end; end else begin //Icon wieder löschen if (barStatus.Handle <= MaxInt) then SendMessage(barStatus.Handle, SB_SETICON, Panel, 0); end;{else} end;{if IconIdx Ok} end; Zitat:
in der OH steht auch das man "Assert" nicht in einer Fertigen Anwendung einsetzen soll, ich verstehe das eher als Debug Möglichkeit. |
Re: Fehler bei Bereichsprüfung in SendMessage
1. Was soll die Abfrage bringen? Sende die Daten doch - du musst dem Compiler nur sagen, er sollte es bitte als LongWord bzw. Cardinal übertragen und nicht die Datentypanpassung vornehmen zu einem Integer.
2. Assert() als Befehl einfügen und gut. Ob diese beachtet werden legst du in den Projektoptionen unter Compiler fest. Sprich: Beim Release Build kannst du die Assertions abwählen und schon sind die Abfragen alle nicht umgesetzt. Ich für meinen Teil habe diese auch in der Release Version aktiviert, da diese nur Werte und Bedingungen prüfen die absolut nicht sein sollten und damit bei auftreten zu weitreichenden und schweren Fehlern führe (u.a. Datenänderung/-verfälschung). Lieber um die Stelle wissen und entsprechend beheben als dies niemals zu erfahren und defekte Daten zu haben. Und wenn der Kunde mal einen Datensatz nicht schreiben kann, dann ist es ihm wohl lieber als das die ganze DB zerschossen wäre. Und so hat er nach dem Fehler die Gewissheit, dass du vom Code her diesen entsprechend beachtest, behandelst - und wenn möglich - die Ursache behoben hast. Dafür sind die Assertions da. |
Re: Fehler bei Bereichsprüfung in SendMessage
@Muetze.
Du solltest aber Assertions und Exceptions nicht durcheinanderbringen. |
Re: Fehler bei Bereichsprüfung in SendMessage
Zitat:
in der Bereichsprüfung nicht mehr auftaucht. Das hatte ich wohl falsch verstanden. :gruebel: Und wie sag ich dem Compiler das er das als LongWord bzw. Cardinal senden soll, ich dachte die Handle sind vom Typ Cardinal!? Ich versteh das alles noch nicht so recht. Und mit den "Assertions" is ja in Ordnung wenn man dadurch herrausfindet das ein Fehler vorliegt und wo er ist, jedoch wäre es doch besser man verhindet das überhaupt ein Fehler auftritt. Ich mein im Release Build kann man auch die Bereichsprüfung abschalten dann ist auch alles mehr oder weniger in Ordnung und es tritt kein Fehler auf, aber nur weil man etwas nicht sieht heißt es nicht das es nicht doch da ist. |
Re: Fehler bei Bereichsprüfung in SendMessage
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
SendMessage(barStatus.Handle, SB_SETICON, integer(Panel), integer(AnimatedIcon.Handle));
|
Re: Fehler bei Bereichsprüfung in SendMessage
Hallo,
Zitat:
Wenn ja, hättest du usn das mal sagen können. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 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