Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Combobox - Zugriffsverletzung bei Syleänderung im OnChange (https://www.delphipraxis.net/206653-combobox-zugriffsverletzung-bei-syleaenderung-im-onchange.html)

bernau 15. Jan 2021 12:44

Combobox - Zugriffsverletzung bei Syleänderung im OnChange
 
Ich habe einen Fehler, den ich nicht wirklich eingrenzen kann. Vielleicht kann mir jemand einen Tipp geben.

Bei fehlerhaften Eingaben färbe ich gerne die Fläche des Eingabelementes Rot ein. Die Anwendung verwendet Styles, weshalb ich bei Einfärbung das Property StyleElements ändern muss. Das mache ich so:

Delphi-Quellcode:
procedure TFormCbColorTest.ComboBoxTestChange(Sender: TObject);
var
  lValid: Boolean;
  lCombobox:TCombobox;
begin
  lCombobox :=TCombobox(Sender);

  lValid := ComboDataIsValid(lCombobox);

  if lValid then
    begin
      lCombobox.StyleElements := lCombobox.StyleElements + [seClient];
    end
  else
    begin
      lCombobox.StyleElements := lCombobox.StyleElements - [seClient];
      lCombobox.Color := clRed;
    end;
end;
Das Funktioniert auch eigentlich in 99% der Fälle. Aber in manchen Fällen gibt es einen Fehler "Zugriffsverletzung bei Adresse xxxxx in Modul user32.dll. Lesen von Adresse 00000000."

Debuggen klappt nicht wirklich. Der Code geht fehlerfrei durch. Erst bei verlassen der Procedure, nach dem letzten "end" kommt die Fehlermeldung.

Wenn der Fehler in einen Form auftritt, dann tritt er immer in diesem Form auf. Deshalb kann ich es eingrenzen. Ich kann aber kein Beispielprogramm bereit stellen, da in allen Programmen, in dem der Fehler reproduziert werden soll, der Fehler nicht auftritt.

Der Fehler tritt auch nur ein einziges mal auf. Bei der zweiten Änderung der Combobox gibt es keine Fehlermeldung. Erst wenn das Formular geschlossen wird und neu aufgerufen wird, erscheint bei Änderung der Combobox der Fehler.

Vielleich übersehe ich ja was. Gibt es einen Grunde, weshalb ein Style NICHT in einem Event geändert werden sollte?

bernau 15. Jan 2021 12:55

AW: Combobox - Zugriffsverletzung bei Syleänderung im OnChange
 
Folgendes ist mir noch aufgefallen. Wenn ich den Style nicht direkt im OnChange ändere, sondern einen Timer mit 50ms starte, und im TimerEvent den Style ändere, dann kommt der Fehler nicht.

Uwe Raabe 15. Jan 2021 13:04

AW: Combobox - Zugriffsverletzung bei Syleänderung im OnChange
 
Man sollte bedenken, dass ein Ändern von StyleElements ein RecreateWnd auslöst. Insofern kann das Entkoppeln dieses Aufrufs schon eine heilende Wirkung haben.


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