Hintergrund ist Folgender:
Delphi-Quellcode:
procedure TComboBoxReadOnly.SetReadOnly(Value: Boolean);
begin
...
if HandleAllocated then
SendMessage(EditHandle, EM_SETREADONLY, Ord(Value), 0);
end;
Du setzt EM_SETREADONLY nur, wenn die interne Komponente vorhanden ist (HandleAllocated=True), was ja vollkommen korrekt ist.
Ist die interne Komponente da aber noch nicht vorhanden, oder wird sie zwischendurch/danach
neu erstellt, ist/wird dieses natürlich nicht gesetzt.
Darum also Dieses ebenfalls setzen, nachdem die (neu) Komponente erstellt wurde.
Ich habe jetzt einfach die Zeile
if HandleAllocated then
einfach rausgenommen, dann habe ich die ReadOnly Funktion aktiv im Style csSimple, wenn ich den Style während der Laufzeit umstelle. Dieses war ja auch mein Ziel.
Delphi-Quellcode:
type
TComboBoxReadOnly = class(TComboBox)
private
FReadOnly: Boolean;
procedure SetReadOnly(const Value: Boolean);
procedure KeyPress(var Key: Char);override;
Procedure CreateWnd;Override;
public
{ Public-Deklarationen }
published
property ReadOnly: Boolean read FReadOnly write SetReadOnly default False;
end;
procedure TComboBoxReadOnly.CreateWnd;
begin
inherited;
ReadOnly := FReadOnly;
end;
procedure TComboBoxReadOnly.KeyPress(var Key: Char);
begin
if not readonly then inherited;
end;
procedure TComboBoxReadOnly.SetReadOnly(const Value: Boolean);
begin
FReadOnly := Value;
if HandleAllocated then
SendMessage(EditHandle, EM_SETREADONLY, Ord(Value), 0);
end;
Mit den beiden Funktionen KeyPress und CreateWnd erschlage ich doch das Gleiche, wie mit dem Weglassen der Abfrage nach HandleAllocated oder ?
Desweiteren taucht bei mir, dann auch noch die Frage auf, wenn ich jetzt das Ereignis KeyPress verwenden will in seiner ursprünglichen Form, funktioniert dieses doch nicht, da in der Deklaration ein Override drin steht ?