Avatar billede anold Nybegynder
24. januar 2000 - 09:44 Der er 11 kommentarer og
1 løsning

Problemer med ComponentCount


var
fLabel : TLabel;
I : Integer;

// Opretter en Label
procedure TForm1.Button1Click(Sender: TObject);
begin
  fLabel := Tlabel.Create(Form1);
  fLabel.Parent := Form1;
  fLabel.Top := Form1.Shape1.Top+20 ;
  fLabel.left := Form1.Shape1.Left+50;
  fLabel.Caption := 'Dette er en test';
end;
// Tæller antal Label
procedure TForm1.Button2Click(Sender: TObject);
begin
  For I := 0 To Shape1.ComponentCount -1 Do  //Uanset hvormange label der er
  If (Components[I] is TLabel) Then        //så bliver Shape1.ComponentCount
    Begin                                  //ved med at være 0
      Label2.Caption := IntToStr(I);
    end;
end;
// Sletter Label
procedure TForm1.Button3Click(Sender: TObject);
begin
For I := 0 To Shape1.ComponentCount -1 Do
  If (Components[I] is TLabel) Then
    Begin
      If Assigned(FLabel) then
        begin
          FLabel.Free;
          FLabel:=nil;
        end;
    end;
  end;
end.


// Hvis jeg laver det samme med et Image så vil Shape1.ComponentCount
// godt tælle op
Avatar billede anold Nybegynder
24. januar 2000 - 09:47 #1
Hovsa jeg glemte at beskrive problemet !!!

Det jeg gerne vil vide er, hvorfor vil ComponentCount ikke tælle, hvor mange Label jeg opretter når den godt vil tælle hvor mange Image der er oprettet.
Avatar billede sjensen Nybegynder
24. januar 2000 - 09:51 #2
Der er fordi Shape1 ikke er container for dine labels. I din create af flabel siger du Tlabel.Create(Form1); d.v.s. form1 er container (parent)

brug enten for i := 0 to form1.compunentcount -1 i din optælling eller
flabel := tlabel.create(shape1);

sjensen
Avatar billede sjensen Nybegynder
24. januar 2000 - 10:17 #3
Hej anold,

Tak for det.

Hvordan er det i øvrigt gået med dit tidligere spm. vedr. 'Gemme Images dynamisk':

http://www.eksperten.dk/spm.asp?id=10112

Jeg kan se af dette spm. at du bruger noget af mit forslag.

sjensen
Avatar billede anold Nybegynder
24. januar 2000 - 10:47 #4
Hej sjensen.

med hensyn til mit problem med ComponentCount så vælger jeg at bruge løsning nr.2  da jeg har mange andre componenter på form1. (det som du ser her er kun et meget lille udsnit af mit program). Jeg har lige prøvet programmet med de nye ændringer og det virker fint,men kan du forklare mig hvorfor jeg ikke kan slette mere end en label i min procedure TForm1.Button3Click selv om at der er oprettet mange Label's på Shape1.

Ang.'Gemme Images dynamisk'
Jeg har ikke haft tid til at prøve dit løsnings-forslag men jeg har kigget lidt på det.

Kan jeg ikke få dig til, at lave et program ,hvor du under runtime opretter to Image og To Label på en Shape, og så gemmer dem i EN fil med en SaveDialogBox for derefter at henter dem ind på shap'en igen med en OpenDialogBox

Det ville være en stor hjælp for mig

Hvis du vil og har brug for det kan du få min E-mail adresse

Hilsen Anold


Avatar billede sjensen Nybegynder
24. januar 2000 - 11:14 #5
Umiddelbart vil jeg sige at det er fordi du kun opretter en label du kaldet FLabel i button1click. Denne fjerner du igen i med flabel.free i button3click. Husk at der kan kun være en label ad gangen der hedder FLabel.

Hvis du vil fjerne alle labels på shape1 så skal du bruge:

For I := 0 To Shape1.ComponentCount -1 Do
  If (Components[I] is TLabel) Then
    Begin
      If Assigned((Components[I] as TLabel)) then
        begin
          (Components[I] as TLabel).Free;
          (Components[I] as TLabel):=nil;
        end;
    end;
  end;

I øvrigt burde det jo være nok at skrive "if assigned(component[i]) then component[i].free;", da du jo med testen "if (component[i] is TLabel)" har sikret at det pågældende component ER en label, men Delphi vil desværre have at man typecaster med AS.

Med hensyn til det lille program: Jo, hvis jeg får tid i løbet af dagen. Er der ok hvis det er D4 ?

sjensen
Avatar billede anold Nybegynder
24. januar 2000 - 11:19 #6
Ok
jeg prøver lige at ændre mit program

D4 vil være meget fint tak
Avatar billede anold Nybegynder
24. januar 2000 - 11:26 #7
Hej sjensen

jeg har lige prøvet dit prog.eks.

men jeg får denne fejl :
[Error] Unit1.pas(74): Left side cannot be assigned to
i linien

(Components[I] as TLabel):= nil;

Hvad tror du der er galt ??

Hilsen Anold


Avatar billede sjensen Nybegynder
24. januar 2000 - 11:34 #8
Du har i linien før free'et componentet og derfor kan du ikke sætte det nil. Fjern linien, eller sæt den til nil inden du fjerner.

Men, eftersom du fjerner den med free behøver du ikke at sætte den til nil. Med free bliver hukommelsen frigivet.
Avatar billede delphi Nybegynder
24. januar 2000 - 11:56 #9
Kaldet til Free vil automatisk sætte komponenten til Free.  Sætter man manuelt komponenten til nil inden Free kaldes, vil Free ikke virke idet free egentligt bare gør følgende:

  If Assigned(x) Then // Dvs: x <> Nil
    Begin
      x.Destroy;
      x := Nil;
    End;

Du skal derfor glemme alt om at sætte din label til nil - Delphi gør det for dig.

NiP
Avatar billede sjensen Nybegynder
24. januar 2000 - 13:57 #10
anold,

jeg er igang med det lille program og opdager først nu at en Shape ikke er en container for f.eks. Images. Selvom man sagtens kan placere en image på en shape, er det formen der ejer den og ikke shapen. Prøv engang selv at oprette en shape og smid en image på den. Når du så flytter shapen et andet sted hen, bliver imagen hvor den er i forhold til formen og ikke i forhold til shapen. Årsagen er at en shape ikke er en TWinControl og derfor kan den ikke være Parent.

Kan du bruge et Panel i stedet for en shape ?

sjensen
Avatar billede anold Nybegynder
24. januar 2000 - 14:11 #11
Hej sjensen

om det er en shape eller et panel er uden betydning
for mig så hvis du kan lave programmet med et panel er det OK for mig
Anold
Avatar billede sjensen Nybegynder
24. januar 2000 - 17:08 #12
anold, det med at gemme det hele i en fil driller lidt.

Pt. kan jeg gemme en fil med teksterne samt navnet på hvert image, samt en fil for hvert image.

Men det er jo ikke lige det du vil, vel ?

Jeg arbejder videre med det men det bliver desværre ikke idag jeg bliver færdig.
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