Avatar billede kbb2 Nybegynder
13. september 2002 - 15:04 Der er 10 kommentarer

Typecast spørgsmål

Følgende kode kalder "enable" på en control, der er nedarvet fra TWinControl.

if Ctrl is TWinControl then begin
  if TWinControl(Ctrl).ControlCount <= 0 then begin
    Ctrl.Enabled:=enable;
  end;
end;

Problemet er den kalder TWinControl.Enable metoden. Det jeg er ude på er at få kaldt kontrollens enable. Altså hvis det er en TEdit vil jeg kalde TEdit.Enable. Kan dette lade sig gøre? Det _SKAL_ være generelt.

Jeg ved godt jeg kunne lave et tjek på alle typer der findes og så lave en typecast, men der er ufedt.
Avatar billede Slettet bruger
13. september 2002 - 20:33 #1
hvilken type variabel er Ctrl
Avatar billede Slettet bruger
13. september 2002 - 21:11 #2
Prøv dette
var
WCtrl:TWincontrol;
Begin
if Ctrl is TWinControl then begin
  WCtrl=Ctrl
  if WCtrl.ControlCount <= 0 then begin
    WCtrl.Enabled:=enable;
  end;
end;


Mvh. Simon
Avatar billede hermandsen Juniormester
15. september 2002 - 19:39 #3
Jeg tror desværre ikke det er muligt...

Brug noget i retning af:

if Ctrl is TEdit then
  (Ctrl as TEdit).Enabled := Enable
else if Ctrl is TLabel then
  (Ctrl as TLabel).Enabled := Enable;

Med mindre du finder en GetClassTypeName-agtig funktion, så tror jeg ikke lige får så meget ud af det... Baren case-sætning ville gøre det bedre, men jeg har selv haft et lignende problem, og der fandt jeg ingen vej uden om den jeg lige har beskrevet... Dog siger jeg ikke at den ikke findes! ;)
Avatar billede kbb2 Nybegynder
16. september 2002 - 09:21 #4
tankred din forslag virker ikke. Det er det jeg gør!

hermandsen dit forslag kender jeg godt, men det er jo netop det jeg skriver jeg vil undgå da jeg i så fald altid ville skulle vedligeholde min funktion når der kommer nye fremmede kontroller på formen. Jeg tror du har ret, der findes nok ikke nogen mulighed for det.
Avatar billede hermandsen Juniormester
16. september 2002 - 09:52 #5
Du må tænke på at alle tingene skal paintes forskelligt, så der er brug for enkelte procedure til hvert komponent!

Eller skal lave en eller anden shading over det hele, men hvordan du liiiiige gør det, det ved jeg ikke!
Avatar billede kbb2 Nybegynder
16. september 2002 - 11:21 #6
Selvfølgelig skal tingene håndteres forskelligt, det er netop derfor jeg ikke kan nøjes med base-class funktionens 'enable', jeg skal bruge den rigtige type og tilhørende enable funktion, men den er vist ikke tilgængelig på det niveau. Ohh well, jeg finder en anden løsning :)
Avatar billede klasker Nybegynder
17. september 2002 - 09:43 #7
Kan du ikke bare skrive (Ctrl as TComponent).Enable := ...?
Avatar billede hermandsen Juniormester
20. september 2002 - 20:47 #8
>>klasker
Læs hvad kbb2 og jeg selv har skrevet! ;)
Avatar billede loke-liscom Nybegynder
26. september 2002 - 00:12 #9
Det kan godt være at jeg er lidt sent på den men en base class med en abstract funktion, enable ville nok være løsningen.
Avatar billede Slettet bruger
30. september 2002 - 19:54 #10
Prøv at lave et program med dette som koden til Tform1 med et breakpoint på linje
33 og/eller 42

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TS=Class(TLabel)
    Public
    Procedure RePaint; override;
    End;
  TForm1 = class(TForm)
    procedure FormClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    T:TS;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Procedure TS.RePaint;
Begin
    Caption:='Repainted';
    Inherited;
End;

procedure TForm1.FormClick(Sender: TObject);
var
T1:TLabel;
begin
    T1:=T;
    T1.Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    T:=TS.Create(self);
    T.Parent:=Self;
    T.Caption:='dtr';
end;

end.


Der vor jeg kalder functionen fra er en TLabel variabel men den kalder aligevel TS.Repaint og ikke som Vis du typecastede den TLabel.Repaint.

Mvh. Simon
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



IT-JOB

PensionDanmark

ML Engineer

LB Forsikring

Salesforce udvikler

Unik System Design A/S

Udviklingschef

Danske Andelskassers Bank A/S

IT-konsulent