Avatar billede vint Nybegynder
02. januar 2007 - 23:06 Der er 4 kommentarer og
1 løsning

Oprette en label runtime

Hej.

Kan jeg få lidt hjælp til at oprette et par labels runtime, da jeg ikke ved, om jeg skal bruge 2 eller 3 eller 4 og deres indbyrdes placering ved design time.

Jeg har i øjeblikekt denne kode:

Procedure VisOplysninger;
var
  lblNavn, lblAdresse1, lblAdresse2, lblPostnrBy: TLabel;
begin
  lblNavn.Create(form1);
  lblNavn.Font.Style:= [fsbold];
  lblNavn.Caption:= edtNavn;
  etc
end;

Men jeg får en fejl, når jeg forsøger at køre koden runtime.

Access violation at adress... den kendte smøre ;o)
Avatar billede hrc Mester
02. januar 2007 - 23:22 #1
lblNavn.Create(form1);

skal nok rettes til

  lblNavn := TLabel.Create(self);
  lblNavn.Parent := self; // Hvis den skal være direkte på din TForm

Men der er flere ting galt med din fremgangsmåde:
1. Du skal ikke referere til instansen, her form1, men derimod bruge self.
2. Hvis du angiver en Owner i din create, så er det dens ansvar at frigive den igen. Dette er som sådan helt OK, men jeg synes bare du bør slette hvad du opretter.
3. Du bør vælge et GUI-design hvor det ikke er nødvendigt at have et dynamisk antal
labels. Hvad med en TListBox eller lignende? Alternativt kan du lave din egen nedarving af TStringList som automatisk opretter labels, bare du indsætter en streng i listen - det ville ikke være svært.
Avatar billede vint Nybegynder
03. januar 2007 - 11:31 #2
Hej og tak for dit svar.

Jeg er dog lidt i tvivl.

1. Hvornår skal jeg bruge self (og hvad betyder self i grunden her) og hvornår skal jeg bruge fx TForm eller form1 eller hvad det nu er, jeg har set i kodeeksempler rundt omkring

2. OK - det forstår jeg egentlig godt. Det er for ikke at spilde hukommelse, ik?

3. Her er jeg ikke helt med på, hvad du mener med GUI-design...
Grunden til jeg i første omgang ikke valgte en memo var, at man kunne se en cursor derpå. En Listbox valgte jeg ikke fordi jeg har brug for forskellig layout mht. fonte på de forskellige linier.
Avatar billede hrc Mester
03. januar 2007 - 12:45 #3
Jeg bruger ordet instans et par gange her. Det er et ord som jeg selv havde noget svært ved at forstå betydningen af - men "here goes".

1. Self refererer til den pågældende objektinstans og er kun synlig indenfor denne. Din "form1" virkede på samme måde men er en global variabel. Den slags skal man pinedød prøve at undgå i et objektorienteret udviklingsmiljø. Givet nedenstående procedure

  procedure TForm1.OnCreate(Sender : TObject);
  var
    st : string;
  begin
    st := self.ClassName; // = 'TForm1'
    self.Caption := 'Hej med dig'; // Din forms caption sættes
  end;

Her refererer self direkte til din forms instans (den oprettede klasse).

2. Når du angiver self som "ejer" af et objekt, her TLabel så, så puttes labelen ind i en liste af objekter som "ejeren" skal sørge for at frigive når programmet / formen frigives - og det er jo egentlig meget smart.

Mit argument er bare, at når man selv opretter komponenter og placerer dem på formen, så skal man også selv frigive dem. Ydermere har det tit givet mig problemer at angive en ejer, så jeg plejer bare at angive nil som ejer og klare det selv (i eksempelvis formens OnCreate og OnDestroy events)

3. En read only TMemo har da ingen cursor, har den? I øvrigt så er der muligheden at bruge OwnerDraw i en TListBox; så tegner du alt selv - og er herre over fonte, farver og lignende.

Termen "Instans" er et oprettet objekt af en given klasse.

var


  procedure TForm1.OnCreate(Sender : TObject);
  var
    st : string;
  begin
    st := self.ClassName; // = 'TForm1'
    self.Caption := 'Hej med dig';
  end;
Avatar billede hrc Mester
03. januar 2007 - 12:47 #4
Nå, der kom lige lidt skrammel med forneden i kommentaren
Avatar billede psycosoft-funware Nybegynder
03. januar 2007 - 15:36 #5
>>hrc: tak for denne forklaring :)
har selv tit gået og funderet over de ting du belyser her :)
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