Avatar billede morten_s Nybegynder
25. juni 2001 - 08:46 Der er 32 kommentarer og
1 løsning

Komponentbyggeri, tilføjelse af label til komponent

Jeg har bygget et grafisk komponent til brug i et program, komponenten skifter form, farve m.m. ifb. forskellige hændelser, og komponenten/nerne placeres på formen under runtime, hvilket altsammen virker som det skal.

men nu har jeg brug for at placere en label nedenuder komponenten med en tekst som viser hvilken \"state\"
komponenten er i

Jeg har prøvet med følgende erklæring/kode


Unit Komponenten;

Interface

Uses
......., StdCtrls;

Type
  TKompNr : Integer;
  .
  .
  TKompState = Integer;
  TKompLabel = TLabel;
  TKomp = class(TGraphicControl)
  Private
    FKompNr : TKompNr
    .
    .
  Public
    Lablen : TKompLabel;
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
  Published
    property KompNr: TKompNr read FLKompNr write SetKompNr;
    .
    .



Diverse Procedure
    .
    .
    .

constructor TKomp.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  KompNr := 0;
  Left := 20;
  Top := 50;
  ParentShowHint := False;
  ShowHint := True;
  Visible := True;
  FPen:= TPen.Create;
  FPen.OnChange:= StyleChanged;
  FBrush:= TBrush.Create;
  FBrush.OnChange:= StyleChanged;
  Brush.Color := clScrollBar;
  Lablen.Caption := \'Her er jeg\';
  Lablen.Top := 30;  <---- Når denne linie afvikles går det galt
  Lablen.Left := 50;
end;


Hvad går galt ?
jeg kan godt tilskrive Lablen.Caption, men når jeg vil tilskrive Lablen.Top får jeg Acces Violation.

Avatar billede pellelil Nybegynder
25. juni 2001 - 08:50 #1
Det undre mig at du ikke får fejl når du sætter caption, man hvorom alting er så creater du aldrig din label. Prøv noget sådan:
<SNIP>
  Labelen := TLabel.Create(Self);
  Lablen.Caption := \'Her er jeg\';
  Lablen.Top := 30;  <---- Når denne linie afvikles går det galt
  Lablen.Left := 50;
</SNIP>
Avatar billede torbenthyregod Nybegynder
25. juni 2001 - 08:51 #2
Creater du Lablen et andet sted ??

Hvis ikke så skal du gøre det inden du skriver til den.

Lablen := TKompLabel.Create(aOwner);
Avatar billede morten_s Nybegynder
25. juni 2001 - 09:00 #3
Nu kan koden afvikles

<Snip>
Brush.Color := clScrollBar;
  Lablen := TLabel.Create(Self);
  Lablen.Caption := \'Her er jeg\';
  Lablen.Font.Size := 10;
  Lablen.Top := 30;
  Lablen.Left := 50;
  Lablen.Visible := True;
  Lablen.Invalidate;
end;
</Snip>

men lablen kan ikke ses på formen
Avatar billede pellelil Nybegynder
25. juni 2001 - 09:09 #4
Prøv: Labelen := TKompLabel.Create(Owner);
Avatar billede morten_s Nybegynder
25. juni 2001 - 09:12 #5
Kan kompileres, men lablen vises desværre ikke
Avatar billede pellelil Nybegynder
25. juni 2001 - 09:14 #6
Prøv: (efter ovenstående linie9 Labelen.Parent := Owner;
Avatar billede torbenthyregod Nybegynder
25. juni 2001 - 09:24 #7
Mangler han ikke og bruge functionen InsertControl ??

Jeg ved ikke om det virker, kan compileres

aOwner.insertcontrol(Lablen);

eller bare

insertcontrol(Lablen);

Avatar billede morten_s Nybegynder
25. juni 2001 - 09:27 #8
Labelen.Parent := Owner

Giver compileringsfejl:
Incompatible types: \'TWinControl and TComponent\'
Avatar billede morten_s Nybegynder
25. juni 2001 - 09:27 #9
>TorbenThyregod

Hvor skal din linie indsættes ?

Avatar billede torbenthyregod Nybegynder
25. juni 2001 - 09:29 #10
Jeg mener det er lige efter

Lablen := TLabel.Create(Self);

Og når det er Owner er TWinControl så skal du bruge

aOwner.insertcontrol(Lablen);
Avatar billede morten_s Nybegynder
25. juni 2001 - 09:29 #11
aOwner.insertcontrol(Lablen);

og insertcontrol(Lablen);
giver compileringsfejl undeclared identifire(insertcontrol)
Avatar billede pellelil Nybegynder
25. juni 2001 - 09:31 #12
Så er det vel blot et spørgsmål om at Owner skal typecastes til en TForm eller lign.
Avatar billede morten_s Nybegynder
25. juni 2001 - 09:32 #13
pellelil> har prøvet til formen, men så får jeg cirkulær reference idet form1 er ejet af unit1, som har
unit
  Komponenten
Avatar billede pellelil Nybegynder
25. juni 2001 - 09:34 #14
At typecaste til en TForm kan på ingen måde give cirkulær reference
Avatar billede morten_s Nybegynder
25. juni 2001 - 09:36 #15
Lablen := TLabel.Create(Form1);

giver undeclared identifire(Form1);

og når jeg så tilføjer Unit1 til uses får jeg cirkulær reference
Avatar billede pellelil Nybegynder
25. juni 2001 - 09:38 #16
Du skal blot Use Unit1 i din implementation-del i stedet for i din Interface del
Avatar billede morten_s Nybegynder
25. juni 2001 - 09:40 #17
pellelli> det var lige det som skulle til.

er der nogen måde som jeg kan gøre Lablen.Top og left relativ i forhold til komponenten ?
Avatar billede torbenthyregod Nybegynder
25. juni 2001 - 09:41 #18
øøhhhhh, er det særlig smart og lave en referance til en bestemt form (Form1) når man laver en component, der vel skal bruges på flere forskellige forms ????

Du skal ikke skrive

Lablen := TLabel.Create(Form1);

Du skal bruge Owner/aOwner i stedet for Form1 !!!!

Der hvor du skal typecaste er ved

Labelen.Parent := TForm(Owner);
Avatar billede pellelil Nybegynder
25. juni 2001 - 09:42 #19
Labelen.Top  := Top + 15;
Labelen.Left := Left;
Avatar billede morten_s Nybegynder
25. juni 2001 - 09:42 #20
ja ok ;-))
Avatar billede pellelil Nybegynder
25. juni 2001 - 09:45 #21
torbenthyregod> Hvordan går det ellers med at ligge processprogrammet (og resten) om til windows ?
Avatar billede torbenthyregod Nybegynder
25. juni 2001 - 09:49 #22
Det går rimeligt, vi har sat det første sted i gang med det nye (som test værk, men de kører med det).
Avatar billede martinlind Nybegynder
25. juni 2001 - 09:57 #23
Dette er måden :

Lablen := TLabel.Create(Self);
Lablen.Parent := Self;

Og grunden til at du skal sætte parent er at det er den der sætter din label ind i listen af componenter der skal opdateres, Owner er delphis component liste som bruges til streaming of \"oprydning\".

/Martin
Avatar billede pellelil Nybegynder
25. juni 2001 - 09:59 #24
torbentyregod> Det går \"trods alt\" videre kan jeg høre  :-)  Hils Max.
Avatar billede morten_s Nybegynder
25. juni 2001 - 10:01 #25
  Lablen.Parent := Self;

giver kompileringsfejl:
  Incompatible types: \'TWinControl and TKomp\'


Avatar billede torbenthyregod Nybegynder
25. juni 2001 - 10:03 #26
Pellelil> Jaja, selvfølgelig gør det det !!!! Vi kan godt klare os uden \"Guruen\" !!!!
Avatar billede pellelil Nybegynder
25. juni 2001 - 10:05 #27
Nåh i kan godt undvære Brian  :-)
Avatar billede torbenthyregod Nybegynder
25. juni 2001 - 10:05 #28
Pellelil> Jeg skulle hilse igen (fra Max)
Avatar billede torbenthyregod Nybegynder
25. juni 2001 - 10:06 #29
Brian !!!!!! Hvem ??????

:-)
Avatar billede martinlind Nybegynder
25. juni 2001 - 10:18 #30
morten_s >> Sorry, jeg troede det var en wincontrol, du havde fat i, så brug du bare din Owner, den vil i alle tilfælle sikkert også wære en Wincontrol ( TForm / TPanel ) eller lign.

Men TForm er ligge en tand for meget, jeg ville bruge TWinControl(AOwner), så undgår du problemer hvis du sætter din comp. på noget andet en en Form. ( F.eks en hjemmelavet comp. det arver fra en wincontrol )

/Martin
Avatar billede morten_s Nybegynder
25. juni 2001 - 10:21 #31
>Martin>>  Hvad bliver syntaksen ?
Avatar billede torbenthyregod Nybegynder
25. juni 2001 - 10:23 #32
Lablen.Parent := TWinControl(aOwner);

Avatar billede martinlind Nybegynder
25. juni 2001 - 10:28 #33
Yep
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