Kolejność wyświetlania komponentów

0

Mam problem z wyświetlaniem komponentów. Tworzę na formie 3 duże, czerwone panele, w tym samym miejscu, z których tylko jeden ma być widoczny w danym momencie, przycisk nawigacyjny który zmienia widoczny Panel czerwony, oraz dodatkowy przycisk który wyświetla dodatkowy Panel niebieski, ukryty przy tworzeniu formy. Dodatkowy Panel niebieski jest umiejscowiony tak, że duża jego część nachodzi na 3 wcześniejsze czerwone Panele. W ten sposób po naciśnięciu przycisku który ma go wyświetlić, Panel niebieski się pojawia, jednak przy kolejnej próbie jego wyświetlenia, pojawia się tylko mały wycinek, który nie leży bezpośrednio na 3 czerwonych Panelach, tak jakby one go zasłaniały. Co zrobić, aby pojawiał się w całości? Poniżej kod:

unit Unit1;

{$mode delphi}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls;

type
  Komponent = class(ExtCtrls.TPanel)
    public
  end;

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Exit: TButton;
    Przycisk: TButton;
    PrzyciskNawigacji: TButton;
    PanelRozwijany: TPanel;
    Panele: Array[0..3] of TPanel;
    AktywnyPanel: Integer;
    procedure PrzyciskKlik(Sender: TObject);   
    procedure DalejKlik(Sender: TObject);
    procedure ExitKlik(Sender: TObject);
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }   

procedure TForm1.ExitKlik(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TForm1.PrzyciskKlik(Sender: TObject);
begin
  if PanelRozwijany.Visible then
    PanelRozwijany.Hide
  else
    PanelRozwijany.Show;
end;

procedure TForm1.DalejKlik(Sender: TObject);
var
  I: Integer;
begin
  if AktywnyPanel = High(Panele) then
    AktywnyPanel := Low(Panele)
  else
    Inc(AktywnyPanel);
  for I := Low(Panele) to High(Panele) do
    Panele[I].Hide;
  Panele[AktywnyPanel].Show;
  if PanelRozwijany.Visible then
    PanelRozwijany.Hide;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  if PanelRozwijany.Visible then
    PanelRozwijany.Hide
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  AktywnyPanel := 0;
  Left := 0;
  Top := 0;
  Width := Screen.Width;
  Height := Screen.Height;
  BorderStyle := bsNone;

  Przycisk := TButton.Create(Self);
  with Przycisk do
  begin
    Parent := Self;
    Left := 20;
    Top := 20;
    Width := 180;
    Height := 30;
    Caption := 'Przycisk';
    OnClick := PrzyciskKlik;
  end;

  Exit := TButton.Create(Self);
  with Exit do
  begin
    Parent := Self;
    Left := Self.Width - 200;
    Top := 20;
    Width := 180;
    Height := 30;
    Caption := 'Zakończ';
    OnClick := ExitKlik;
  end;

  PrzyciskNawigacji := TButton.Create(Self);
  with PrzyciskNawigacji do
  begin
    Parent := Self;
    Left := 200;
    Top := 20;
    Width := 30;
    Height := 30;
    Caption := '>';
    OnClick := DalejKlik;
  end;

  PanelRozwijany := TPanel.Create(Self);
  with PanelRozwijany do
  begin
    Parent := Self;
    Left := 20;
    Top := 50;
    Width := 180;
    Height := 180;
    Color := clRed;
    Hide;
  end;

  for I := Low(Panele) to High(Panele) do
    begin
      Panele[I] := TPanel.Create(Self);
      with Panele[I] do
      begin
        Parent := Self;
        Left := 0;
        Top := 70;
        Width := Self.Width;
        Height := Self.Height - 70;
        Color := clBlue;
        Hide;
        Caption := 'Panel ' + IntToStr(I);
      end;
    end;

  Panele[AktywnyPanel].Show;
end;

end.

0

Dorzuć do załączników program testowy i pokaż na rzucie ekrany w czym leży problem.

0

Jeśli jest przesłaniany to spróbuj go pokazać tak:

Panele[AktywnyPanel].Show;
Panele[AktywnyPanel].BringToFront;
0

Na screenach jest pokazane co się dzieje po kliknięciu Przycisku, następnie spośród przycisków na panelu rozwijanym wybierany jest Panel2 i później znowu kliknięty Przycisk, a wtedy PanelRozwijany nie pokazuje się w całości.

Jeszcze tylko dodam że jeśli zanim wcisnę Przycisk i przejdę przyciskiem nawigacyjnym przez wszystkie panele, to później wszystko działa prawidłowo.

0

ja bym to załatwił używając TPageControl zamiast panele w tym samym miejscu. Pasek z nazwami stron można ukryć w runtime a w trybie edycji łatwo edytować co ma się pojawiać na poszczególnych panelach. Wybór aktywnego panelu w combobox też nie stwarza żadnych problemów.

0

A tak nie zadziała?

procedure TForm1.PrzyciskKlik(Sender: TObject);
var
  I: Integer;
begin
  for I := Low(Panele) to High(Panele) do
    Panele[I].Hide;
  Panele[AktywnyPanel].Show;
  if PanelRozwijany.Visible then
    PanelRozwijany.Hide
  else
  begin
    PanelRozwijany.Show;
    PanelRozwijany.BringToFront;
  end;
end;
0

Niestety nie, dzieje się to samo.

1

Tutaj bardziej by się przydało ten niebieski panel potraktować metodą SendToBack.

1

Tak jak napisał @furious programming użyj SendToBack przy pokazywaniu aktywnego panelu.
Dodatkowo w PrzyciskKlik masz nadmiarowy kod do ukrywania i pokazywania aktywnego panelu. Do niczego on tu nie służy.
Tak to będzie wyglądać:

procedure TForm1.Odswiez;
var
  I: Integer;
begin
  for I := Low(Panele) to High(Panele) do
    Panele[I].Hide;
  Panele[AktywnyPanel].Show;
  Panele[AktywnyPanel].SendToBack;
end;

procedure TForm1.PrzyciskKlik(Sender: TObject);
var
  I: Integer;
begin
  if PanelRozwijany.Visible then
    PanelRozwijany.Hide
  else
    PanelRozwijany.Show;
end;  
1
procedure TForm1.PrzyciskKlik(Sender: TObject);
var
  I: Integer;
begin
  if PanelRozwijany.Visible then
    PanelRozwijany.Hide
  else
    PanelRozwijany.Show;
end;

Ekhm…

procedure TForm1.PrzyciskKlik(Sender: TObject);
begin
  PanelRozwijany.Visible := not PanelRozwijany.Visible;
end;  

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