Tabbednotebook

0

Pomocy!!! Użyłem komponenty Tabbednotebook do wprowadzania parametrów komputerów do bazy danych. na górze zakładki to np. parametry dysku, grafiki, procesora. Mam pewnien problem bo jak umieąciłem kilka labelów ,editów itp to po pewnym czasie te labely znikają. Wie ktoś o co chodzi jakiś niedopracowany ten komponenty. Może polecicie coś podobnego do takiego zastosowania??

0

Też kiedyś używałem tego, ale dawno, bo jeszcze pod Delphi 3. W nowszych nie powinno być problemów
z komponentem PageControl (zakładka Win32) i to właśnie ów PageControl mogę Tobie polecić do użycia.

0

a jak dodać tam strone/zakładke na górze??

0

Prawym klawiszem klikasz na PageControl i wybierasz "New Page". A poprzez kod można tak:

procedure TForm1.Button1Click(Sender: TObject);
var
  I: integer;
  Memo: TMemo;
  TabS: TTabSheet;
begin
  I := 0;
  TabS := TTabSheet.Create(Self);
  TabS.PageControl := PageControl1;
  repeat
    I := I + 1;
  until FindComponent('Zakladka' + IntToStr(I)) = nil;
  TabS.Name := 'Zakladka' + IntToStr(I);
  TabS.Tag := I;
  PageControl1.Pages[PageControl1.PageCount - 1].Caption := Format('Strona %d', [I]);
  PageControl1.ActivePage := TabS;
  Memo := TMemo.Create(Self);
  Memo.Top := 10;
  Memo.Left := 8;
  Memo.Parent := TabS;
  Memo.Name := 'Memo' + IntToStr(I);
  Memo.Text := Memo.Name;
end;

Usuwanie zakładek wykorzystując własność Tag zakładki, która ustawiana jest we wcześniejszym kodzie:

procedure TForm1.Button2Click(Sender: TObject);
begin
  if PageControl1.PageCount = 0 then
  begin
    Exit;
  end;
  TTabSheet(FindComponent('Zakladka' + IntToStr(PageControl1.ActivePage.Tag))).Free;
end;
0

Poradziłem sobie z tymi znikającymi labelami. Musiałem wszystkie labele wsadzić w groupboxy bo inaczej znikały :/

0

A jeszcz etakie pytanie jak zablokować zakładki w tym tabbednotebook tzn żeby jedna była aktywna a reszta aktywowała się po kliknięciu na button?

0

Poniższy kod jest dla zakładki drugiej w kolejności, ale powinieneś zrozumieć ideę.

//...
  public
    MoznaWejscNaZakladke : boolean;
  end;
//...
procedure TForm1.FormCreate(Sender: TObject);
begin
  MoznaWejscNaZakladke := False;
end;

procedure TForm1.TabbedNotebook1Change(Sender: TObject; NewTab: Integer;
  var AllowChange: Boolean);
begin
  if NewTab = 1 then
  begin
    AllowChange := MoznaWejscNaZakladke;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MoznaWejscNaZakladke := True;
end;
0

a nie mozna tego jakoś prościej zrobić ?? Jakas własność tego tabbednotebook? :/

0

Może jakoś się da, ale ja zauważyłem tylko taki sposób. Nie widzę w nim nic trudnego.
Nawet jak masz wiele zakładek i dodajesz je dynamicznie to w np. obiekcie typu TList
możesz przechowywać jakby listę booleanów i zmieniać te wartości na liście - po czym
w zależności od wartości True lub False pozwalać na ustawienie danej zakładki Lecz to
chyba bardziej skomplikowany sposób niż ten. który podałem powyżej - według mnie.

0

Nie chciałem zakładać nowego tematu, bo też mam problem z TabbedNotebook'iem, aczkolwiek inny.
Być może problem jest banalny, ale jego rozwiązanie znacznie ułatwi mi życie/programowanie.
Mam kilkanaście zakładek w TabbedNotebook'u, których zawartość jest niemalże identycza, jeśli chodzi o wygląd zewnętrzny. Gdy więc poukładam sobie w jednej zakładce wszystkie gridy, buttony i inne komponenty, to w drugiej muszę zrobić dokładnie to samo, z tym, że te tak samo wyglądające komponenty będą inaczej oprogramowane. No i najprościej byłoby zaznaczyć wszystko co jest w zakładce, ctrl+c, wejść do nowej, pustej zakładki i ctrl+v. Problem w tym, że po kliknięciu ctrl+v całość wkleja mi się w zupełnie innej zakładce, niż ta, w której bym chciał. I co najgorsze - nigdy nie wiadomo w której zakładce się to wklei. Ma ktoś jakieś rozwiązanie na to?

0

zrób z tego jedną forme i ją dokuj na każdej zakładce

oForm := TfmJakasForma.Create(Self);
oForm.ManualDock(tsJakasZakladka);
oForm.Align := alClient;
oForm.Show();
0

Dobrze rozumiem ideę dokowania, że chodzi o to, że fizycznie te same komponenty w zależności od wybranej zakładki są inaczej oprogramowane?

Jeśli tak, to odpada, bo te zakładki u mnie niestety nie są identyczne, ale "niemalże identycznie" (jak napisałem w poprzedni poście). Gridy będą miały inne kolumny, przyciski inne captiony, w jednej zakładce będą jakieś DBEdity, a w innej już nie... Na pierwszy rzut oka wszystko jest podobne, ale tak na prawdę nie jest. Jeśli udałoby mi się jednak skopiować całość i wkleić do innej zakładki, to nie musiałbym tworzyć każdego grida od nowa, ustawiać jego rozmiarów, kolorów, położenia itp. od nowa. Ewentualnie po wklejeniu dokonywałbym małych poprawek typu dołożenie nowej kolumny, czy zmiana szerokości innej kolumny...

0

dokowanie.. można to wyjaśnić na zasadzie komponentow.. komponenty tez kładziesz kilka razy.. formy tez możesz.. tyle ze poprzez dokowanie FORM lub kładzenie ramek.. jak coś zmienisz na ramce to sie zmieni wszędzie gdzie ta ramka została użyta.. to taki portal położony na formie do innej formy..

jak sa rozne to nie ma wyboru.. jedynie kopiowanie..

a problem kopiowania prawdopodobnie wynika z tego ze po zaznaczeniu komponentów na jednej zakładce nie uwzględniasz ich parentów..

przykład:
dwa panele, na każdym przycisk. zaznaczasz przyciski, ctrlC ctrlV i wszystko jest inaczej. Dlatego ze przyciski pamiętają swoja pozycje w relacji z panelami i po wklejeniu maja te same wartości Left i Top ale w relacji do parenta na którym je wklejasz..

0
zajcev napisał(a)

a problem kopiowania prawdopodobnie wynika z tego ze po zaznaczeniu komponentów na jednej zakładce nie uwzględniasz ich parentów..

przykład:
dwa panele, na każdym przycisk. zaznaczasz przyciski, ctrlC ctrlV i wszystko jest inaczej. Dlatego ze przyciski pamiętają swoja pozycje w relacji z panelami i po wklejeniu maja te same wartości Left i Top ale w relacji do parenta na którym je wklejasz..

Tak się składa, że żaden z komponentów nie ma tam parenta. Jedynym ich wspólnym parentem jest TabbedNotebook. W zakładce "A" tego TabbedNotebook'a leży sobie "luzem" np. jeden grid i jeden button. Zaznaczam grida, robię ctrl+c, przechodzę do zakładki "B", robię ctrl+v, a on mi wkleja tego grida do zakładki "C". Co ciekawe, gdy następnym razem zrobię to samo, to wklei mi do zakładki "D", a kiedyś indziej do "H" - zupełnie losowo gdzie to wkleja.

0

z ciekawosci probowalem to zrobic i faktycznie tragiczny komponent.. nawet ustawiony odpowiednio active page nic nie daje
proponuje przejsc na pagecontrol

0
zajcev napisał(a)

proponuje przejsc na pagecontrol

Już za późno. Program jest w mocno zaawansowanym stadium.

Co ciekawe, w starej wersji Delphi 6 problem był podobny, z tą różnica, że można było przewidzieć gdzie wyląduje wklejany komponent. To znaczy, można było dojść do tego, że np. chcąc, żeby wkleił się do zakładki "D", to trzeba się ustawić na zakładkę "G". Teraz mam Delphi 2010 i tutaj to jest zupełnie losowo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1