Avatar billede jgthb Nybegynder
27. juli 2006 - 00:41 Der er 2 kommentarer og
1 løsning

free, component

Hej

jeg har lavet nogle tradiobutton'er, og vil så godt have dem fjernet igen. det gør man ved at frigøre dem, ikke? men det virker ikke. I øvrigt siger den, at der er nul komponenter, hvis jeg tæller i min onclick-procedure, der hører til mine tradiobutton'er. hvorfor dog det? al den relevante kode er her:
lidt hjælp ville være dejligt, tak.


Her skulle de gerne frigives:
procedure TForm1.N11Click(Sender: TObject);
var
i: integer;
begin
showmessage(inttostr(componentcount));
showmessage(inttostr(memo5.Lines.count));
while componentcount > componentcount-memo5.Lines.Count do
begin
if (Components[i] is tradiobutton) then
(Components[i] as tradiobutton).Free;
end;
end;


her laves de:
procedure TForm1.ndrenavn1Click(Sender: TObject);
var
radito: tradiobutton;
I: integer;
begin
listbox1.Visible:=false;
memo3.Visible:=false;
memo2.Visible:=false;
edit1.Visible:=true;
edit1.Clear;
edit2.Visible:=false;
button1.Visible:=false;
label1.Visible:=false;
label2.Visible:=false;
for i:=1 to memo5.Lines.Count do
begin
radito:=tradiobutton.Create(self);
radito.Parent:=Self;
radito.Name:='rad'+inttostr(i);
radito.Caption:=memo5.Lines[i-1];
radito.Left:=90;
radito.Top:=40+i*18;
radito.tag:=i;
radito.onclick:=skifte;
end;
end;


onclick-proceduren:
procedure tform1.skifte(sender: tobject);
var
i: integer;
begin
with sender as tradiobutton do begin
if edit1.Text='' then exit;
memo5.lines[tag-1]:=edit1.text;
memo5.lines.SaveToFile(sti+'data\navne.txt');
showmessage(tradiobutton(findcomponent('rad1')).caption);
//while componentcount >= componentcount-memo5.Lines.Count do
//showmessage(inttostr(componentcount));
//for i:=0 to componentcount-1 do
//if (Components[i] is tradiobutton) then showmessage(inttostr(i));
ShellExecute(0, nil, pchar(Application.ExeName), nil, nil, SW_NORMAL);
Close;
end;
end;
Avatar billede jgthb Nybegynder
27. juli 2006 - 04:15 #1
Så fik jeg det endelig løst!! Her er løsningen, hvis nogen skulle være interesseret.
Det kan sikkert gøres smartere.

procedure TForm1.N11Click(Sender: TObject);
var
o,s: integer;
begin
o:=0;
s:=componentcount;
while o <= s-1 do
begin
if (Components[o] is tradiobutton) then
while componentcount > s-memo5.Lines.Count do
begin
if (Components[o] is tradiobutton) then
(Components[o] as tradiobutton).Free;
end;
if o=componentcount then break;
if not (Components[o] is tradiobutton) then
o:=o+1;
end;
end;
Avatar billede jgthb Nybegynder
27. juli 2006 - 04:15 #2
godnat
Avatar billede hrc Mester
27. juli 2006 - 08:31 #3
Hej jhthb. Hvis du angiver noget i komponentens constructor, så skal den nok selv sørge for at frigive den igen.

Så hvis du skriver: TRadioButton.Create(self), så behøver du ikke frigive den selv. Det sker når selve formen frigives, eksempelvis ved lukning af program.

Det er kun når du skriver: TRadioButton.Create(nil) at du behøver lave noget lignende ovenstående.

I øvrigt har komponenterne en Tag-property. Det er en integer som kan bruges til lidt af hvert - du bestemmer selv. Eventuelt kan du sætte den til 1 og søge efter det i stedet for at frigive alle TRadioButtons som må findes på formen:

procedure TForm1.N11Click(Sender: TObject);
var
i : integer;
begin
  for i := ComponentCount - 1 downto 0 do
    if Components[i].Tag = 1 then // Måske TWinControl(Components[i]).Tag = 1 ...
      Components[i].Free;
end;

Alternativt kan man måske gøre det sådan her, men det har jeg aldrig tøænkt på før. Hvis det virker er det nok den pæneste løsning:

procedure TForm1.N11Click(Sender: TObject);
var
i : integer;
begin
  for i := ComponentCount - 1 downto 0 do
    if not assigned(Components[i].Owner) then
      Components[i].Free;
end;
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