InsertControl

Vse kar vas zanima glede komponent.
Odgovori
drago
Prispevkov: 48
Pridružen: 03.10.2007 19:23:48

InsertControl

Odgovor Napisal/-a drago » 12.07.2011 09:29:25

V kodi dinamično sestavljam vsebino panela tako, da nanj v zanki "nalagam" Label-e.
Podatke za Labele preberem v tabeli. Vrstni red Label je pomemben.
Label-e morajo biti naložene ena do druge ( zato AlLeft ).

Primer kode:

Koda: Izberi vse

    wParentPanel:  TPanel;                    
    wLabelPolje:    TLabel; 
   ...
   while  .....  do
   begin
      wLabelPolje        := TLabel.create(Self);             // Kreiram Labelo
      wLabelPolje.Align  := AlLeft;                                 // Poravnam na levo
      wParentPanel.InsertControl(wLabelPolje);              // Dodam na panel
      wLabelPolje.Caption  := 'Kar nekaj';                       // Določim ostale lastnosti labele
      .....               
   end;
Problem imam pa naslednji:
- Običajno InsertControl vriva Labele levo pred predhodne.
Rezultat je torej: skrajno levo je zadnja dodana labela, zadnja desno pa prva dodana labela.
- Včasih se pa zgodi obratno in ne vriva. Takrat so Labele v obratnem vrstnem redu.

Postopek vedno izvajam z isto proceduro, ki pa jo večkrat ponovim.
Pred ponovnim "nalaganjem" Label prejšnje stanje pobrišem.

Koda: Izberi vse

for wI := wParentPanel.ControlCount -1 downto 0 do    
     wParentPanel.Controls[wI].Destroy;
Nečesa očitno ne razumem.

Drago

drago
Prispevkov: 48
Pridružen: 03.10.2007 19:23:48

Re: InsertControl

Odgovor Napisal/-a drago » 12.07.2011 11:07:15

Pozabil sem pojasniti še en pomemben podatek. Ker postopek izvajam v proceduri, Parent panel posredujem kot parameter.

Popolnejša koda je torej:

Koda: Izberi vse

procedure Formxx.Sestavi(pParent:   TPanel;
                                        pKey:       string);
var
  wParentPanel:  TPanel;                    
  wLabelPolje:    TLabel;
begin 
  ...
  wParentPanel  := pParent;
while  .....  do
begin
   wLabelPolje        := TLabel.create(Self);             // Kreiram Labelo
   wLabelPolje.Align  := AlLeft;                                 // Poravnam na levo
   wParentPanel.InsertControl(wLabelPolje);              // Dodam na panel
   wLabelPolje.Caption  := 'Kar nekaj';                       // Določim ostale lastnosti labele
   .....               
end;
Proceduri pošiljam različne "Parent-e". Razlika pa nastane na istem panelu ( Parent-u).
Razlika bi bila lahko v lastnostih Parent-a (Sem preverjal, pa nisem našel razlike).
Sicer pa ne vem, katera lastnost Parent-a, bi lahko vplivala na opisano razliko "InsertControl-a".

Drago

mig640
Prispevkov: 59
Pridružen: 03.01.2008 11:36:54

Re: InsertControl

Odgovor Napisal/-a mig640 » 12.07.2011 11:51:02

Poskusi ugotoviti katera panela, ti drugače dela.Potem pa poglej njene lastnosti.
Pa v kodo zapiši katera vrednost mora biti, da ti prav dela ne glede na lastnosti panel.
Tvojega primera si pa nisem znal simulirati..

drago
Prispevkov: 48
Pridružen: 03.10.2007 19:23:48

Re: InsertControl

Odgovor Napisal/-a drago » 13.07.2011 09:21:24

Hvala za nasvet, sem upošteval.
Proceduro sem spremenil še tako, da čim bolj simuliram postopek, ki bi ga izvedel v design Time-u.
Torej:
Najprej kreiram labelo brez poravnave, potem jo dodam na panel, določim ostale lastnosti, nato jo postavim (.Left) tako daleč desno, da grem čez vse prejšnje labele in na koncu jo poravnam levo. Sedaj se Labele lepo "lepijo ena na drugo".

Še vedno pa nisem razumel napake. Zato sem v kodi še malo potelovadil in ugotovil naslednje:
- Ko prvič Insertiram labele na panel dobi prva dodana levo poravnana labela levo pozicijo 1. OK
- Ko pa v naslednjem krogu na panelu najprej pobrišem vse komponente
(for wI := wParentPanel.ControlCount -1 downto 0 do
wParentPanel.Controls[wI].Destroy;)
pa prva dodana labela po poravnavi levo dobi levo pozicijo 2.
Razliko (eno ?) na panelu sem torej odkril, kako pa vpliva na InsertControl pa ne razumem povsem.
OK, sedaj deluje po pričakovanjih.

Drago

Odgovori