Newsgroup: it.comp.lang.delphi
Titolo: confusione con creazione componente a runtime

ho la necessita' di creare delle schede dinamiche per dei dati relativi ad edifici ed all'interno degli stessi raggruppare delle informazioni relative alle scale
ho iniziato con un componente PageControl a cui aggiungo dei tabshett a seconda degli edifici da gestire, all'interno dello stesso un altro PageControl su cui raggruppo le informazioni delle n. scale di cui ho bisogno. 
l'inserimento degli edifici e delle scale viene gestito con PopupMenu
La parte relativa agli edifici e al pagecontrol per la prima scala funziona correttamente, al momento di aggiungere altre scale ad un singolo edificio non viene inserita la nuova tabshett ne mi viene segnalato alcun errore. qui sotto il listato della form, grazie per l'aiuto
 
 
type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    PopupMenu1: TPopupMenu;
    Aggiungoedificio1: TMenuItem;
    Eliminoquestoedificio1: TMenuItem;
    PopupMenu2: TPopupMenu;
    Aggiungoscala1: TMenuItem;
    Eliminolascala1: TMenuItem;
    procedure aggtab(page: TPageControl; i, n: integer);
    procedure Eliminoquestoedificio1Click(Sender: TObject);
    procedure Aggiungoscala1Click(Sender: TObject);
    procedure Aggiungoedificio1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses Varie;
 
procedure TForm1.aggtab(page: TPageControl; i, n: integer);
var
  tab: TTabSheet;
  s: string;
begin
  s:= 'Scala_' + IntToStr(i) + '_' + IntToStr(n);
  tab:= TTabSheet.Create(page);
  tab.parent := page;
  tab.TabVisible := true;
  tab.PageIndex := i;
  tab.PageControl := page;
  tab.Name := s;
  tab.Caption := tab.Name;
  tab.Visible := true;
  tab.PopupMenu := PopupMenu2;
end;
 
procedure TForm1.Eliminoquestoedificio1Click(Sender: TObject);
begin
  if (MessageBox(0, 'Confermi la cancellazione di questo edificio?', 'ATTENZIONE', MB_ICONWARNING or MB_YESNO or MB_DEFBUTTON2) = idNo) then
    Exit;
  PageControl1.Pages[PageControl1.ActivePageIndex].Destroy;
end;
 
procedure TForm1.Aggiungoscala1Click(Sender: TObject);
var
  i, n: Integer;
begin
  i := StrToInt(StrTokenAt(
PopupMenu2.PopUpComponent.Name
, '_', 2));
  n := StrToInt(StrTokenAt(
PopupMenu2.PopUpComponent.Name
, '_', 3));
  aggtab(TPageControl(FindComponent('Scale_' + IntToStr(i))), i, n +1);
end;
 
procedure TForm1.Aggiungoedificio1Click(Sender: TObject);
var
  tab :TTabSheet;
  i, n:integer;
  page: TPageControl;
begin
  i := PageControl1.PageCount;
  tab:= TTabSheet.Create(Self);
  tab.parent := self;
  tab.TabVisible := true;
  tab.PageIndex := i;
  tab.PageControl := PageControl1;
  tab.Name := 'Edificio_' + IntToStr(i + 1);
  tab.Caption := 'Edificio ' + IntToStr(i + 1);;
  tab.Visible := true;
  page := TPageControl.Create(tab);
  page.Visible := True;
  page.Parent := tab;
  page.Name := 'Scale_' + IntToStr(i + 1);
  aggtab(page, i + 1, 1);
  PageControl1.ActivePageIndex  := i;
  PageControl1.Pages[i].SetFocus;
end;
 
end.

   page.Parent := tab;
 
Come evidenziato nel codice sopra, sembra che tu abbia fatto confusione: definisci il Form come contenitore del TabSheet, e poi definisci lo stesso TabSheet come Parent del PageControl (che è invece il controllo che li racchiude).
 
Rivedi il codice che hai scritto, magari per step e facendoti una procedura "collaudata" che si possa richiamare specificando come parametri Form, PageControl e TabSheet, così sei certo del suo corretto funzionamento indipendentemente dai casi di utilizzo.
 
Ciao,
  Marco.
 
-- 
MARCO BREVEGLIERI
#Home: 
http://www.marco.breveglieri.name
 
#Blog: 
http://www.compilaquindiva.net
 

 
 
Se posso aggiungere un commento non direttamente relativo alla domanda:
potrebbe essere utile separare le informazioni dal modo di rappresentarle. Se definisci edifici e scale come oggetti (eventualmente ereditando da TPersistent), sarà più semplice passare ad altre rappresentazioni (oltre a semplificare anche test e debug).
 
Saluti
Paolo Arosio

 Paolo Arosio
 
Ciao Paolo!!!! :)
 
-- 
Jax