02. januar 2007 - 23:06Der 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)
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.
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.
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;
>>hrc: tak for denne forklaring :) har selv tit gået og funderet over de ting du belyser her :)
Synes godt om
Ny brugerNybegynder
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.