[Delphi]Property CustomEdit is verdwenen?

Pagina: 1
Acties:

  • Dala
  • Registratie: November 2000
  • Laatst online: 18-05 19:00
Ik was bezig met een functie om een berg aan edit's en memo's in 1 keertje readonly te maken of niet.
Het volgende heb ik toen gecreëerd:

Delphi:
1
2
3
4
5
6
7
8
procedure PrepareCustomEditsForEditing(AWinControl: TWinControl);
var
  i: Integer;
begin
  for i := 0 to AWinControl.ControlCount - 1 do
    if (AWinControl.Controls[i] is TCustomEdit) then
      TCustomEdit(AWinControl.Controls[i]).ReadOnly := FALSE;
end;

en bij compilen krijg ik dan de volgende error msg:
[Error] uFrmTest.pas(102): Undeclared identifier: 'readonly'

dus ik kijk in de source van StdCtrls.pas
en kom dit tegen:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  TCustomEdit = class(TWinControl)
  private
    ...
    FReadOnly: Boolean; 
    ...
    procedure SetReadOnly(Value: Boolean);
    ...
  protected
    ...
    property ReadOnly: Boolean read FReadOnly write SetReadOnly default False;
  public
    ...
  published
    ...
  end;


nu is dus duidelijk dat het een protected property is.. die dus bijvoorbeeld bij de edits als published property staat..

terwijl in de help van delphi wel readonly voor tcustomedits word vermeld.

is er een manier om deze toch aan te roepen?

of moet ik een paar ifjes maken voor de memo's, edit's etc te onderschijden?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Het kan via een hack:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
type
  TCustomEditHack = class(TCustomEdit);

procedure PrepareCustomEditsForEditing(AWinControl: TWinControl); 
var 
  i: Integer; 
begin 
  for i := 0 to AWinControl.ControlCount - 1 do 
    if (AWinControl.Controls[i] is TCustomEdit) then 
      TCustomEditHack(AWinControl.Controls[i]).ReadOnly := FALSE; 
end;

Deze werkt omdat alles wat binnen de unit gedeclareerd ook bij de privates en protecteds van de ander kan. Je kan in dit geval wel bij de protecteds van TCustomEditHack die overgeerfd zijn van TCustomEdit, maar natuurlijk niet bij de geovererfde privates. De harde typecast is eigenlijk niet correct, want de componenten zijn geen TCustomEditHack, maar aangezien de signature van beide classes gelijk is kan het wel.

De help laat alle published, public en protected methods en properties zien. Als je namelijk van zo'n classe wilt overerven zijn ook de protected dingen interresant. Ik zie niet waarom dat een probleem is. Zeker niet omdat ook nog met icoontjes aangegeven wordt dat ze protected zijn.

We adore chaos because we like to restore order - M.C. Escher


  • Dala
  • Registratie: November 2000
  • Laatst online: 18-05 19:00
heej dat is inderdaad een goed idee,

bedankt.

ja het was vroeg.. en ik denk dat ik de topic titel ietjes slimmer had kunnen kiezen.

in iedergeval, het werkt.. en ik stoot me nu aan de kop dat ik dit niet eerder hab gedaan :D