Avatar billede ugge Nybegynder
08. november 2000 - 01:04 Der er 2 kommentarer og
2 løsninger

Override accesmethods i TComponent??

Jeg har lavet min egen komponent-kontrol som nedarver fra TCustomControl. Den arver nogle (published) properties (eks. Width) fra TControl. Jeg kunne godt tænke mig at udføre noget kode når man eksempelvis ændre Width. Jeg kunne forestille mig at Width var deklareret sådan:

published
property Width:integer write SetWidth read FWidth;

jeg kunne godt tænke mig at override SetWidth til f.eks:

procedure TMinKontrol.SetWidth(w:integer);
begin
  inherited SetWidth(w);
  //gør noget
end;

men TControl.SetWidth er ikke virtual/dynamic så det kan man ikke. Alternativet er at override selve propetyen Width, men det er ikke ønskeligt da properties er statisk bundne det vil sige at

var
  k:TControl;
begin
  k := TMinKontrol.Create(self)
  k.Widt := 100;

stadig kalder den oprindelige SetWidth.

Er der nogen som kan hjælpe mig??
Avatar billede torbenthyregod Nybegynder
08. november 2000 - 07:25 #1
SetWidth kalder proceduren Setbounds

procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); virtual;

Den er virtuel, kunne du ikke bruge den på en eller anden måde ??
Avatar billede borrisholt Novice
08. november 2000 - 09:03 #2
ugge> Hvis det skal give mening at tale om viden af din kontrol, må du være igang med at lave et grafisk komponent. Ergo har den et Windows handle ... Så kan du far fat i dine dimentioner ved hjælp af Windows.GetClientRect()

Så kan du gøre noget alla det her :
procedure tMyComponent.SetHeight(const Value: Integer);
var
  Rect : TRect;
begin
  FHeight := Value;
  windows.GetClientRect(Handle,Rect);
  FWidth := Rect.Bottom - Rect.Top;
  SetBounds(Rect.Left,Rect.Top,FWidth,fHeight);

end;

procedure tMyComponent.SetWidth(const Value: integer);
var
  Rect : TRect;
begin
  FWidth := Value;
  windows.GetClientRect(Handle,Rect);
  FHeight := Rect.Bottom - Rect.Top;
  SetBounds(Rect.Left,Rect.Top,FWidth,fHeight);
end;


Jens B
Avatar billede ugge Nybegynder
08. november 2000 - 15:26 #3
>>borrisholt

du mener vel
FWidth := Rect.Right - Rect.Left;
ikke?
 
dit svar løser nu ikke mit problem særlig godt da propertyen Width kalder SetWidth og GetWidt i den statiske type. Men tak for hjælpen :)

>> torbenthyregod

Tak for svaret. At override SetBounds løste ti problemer på en gang. Suverænt.

Ugge.
Avatar billede torbenthyregod Nybegynder
08. november 2000 - 15:50 #4
Det var da så lidt

TT
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester