Einzelnen Beitrag anzeigen

Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.406 Beiträge
 
Delphi XE8 Enterprise
 
#10

AW: Property Read Only bei Combobox hinzufügen (Style = csSimple)

  Alt 25. Okt 2011, 17:09
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 ?
Rolf Warnecke
EasyNetSoft
  Mit Zitat antworten Zitat