Obwiednia Panelu

0

Jak zrobić obwiednie dla TPanel ?

Chodzi mi o taki czarny pasek na około, czyli przy bokach panelu, aby go wyszczególnić.
Zaznaczam że Panel mam ustawiony na bsNone;

0

Najszybciej to wstaw do TPanel TShape. Zas w TShape ustaw własciwości Align na alClient i bedziesz miał ramkę.

Zdrówka
Kochzg

0

Zamieniając na TShape traci się możliwości jakie daje panel, napisz w procedurze OnPaint rysowanie po canvasie panelu

0

Ja nie pisze o zamianie TPanel na TShape, tylko wstawienie do aktualnego TPanela komponentu TShapa. W ten sposób nie tracisz zadnych własciwości TPanela, gdyż go ciągle posiadasz. Oczywiście mozesz sam narysować na tym Panelu ramkę, ale uruchamiasz dodatkowa procedure. A jak wiadomo im mniej tym lepiej.

Zdrówka
kochzg

0

ok, masz racje moje niedoczytanie. Jednak nie wmówisz mi, że szybciej działa gdy jest TShape dodatkowy niż własna procedura OnPaint, bo i tak Paint będzie wywołane dla TShape aby był widoczny, a TShape zżera zasoby tylko po to aby być pustą ramką

0

Masz rację Force optymalnym rozwiązaniem będzie narysować tę ramkę.

Proponuję napisać sobie własny komponent w taki sposób:

{...}
type
  TP = class(TPanel)
  protected
    procedure Paint; override;
  end;

{...}
procedure TP.Paint;
begin
  inherited;
  // i tu sobie rysujesz coś po panelu poprzez Canvas
end;
0

Sądziłem że da się to zrobić, bez żadnych TShape.

Nadal zależy mi na przykładzie narysowania obwiedni, czyli ramki najzwyklejszej czarnej. Pozdrawiam ;]

0

Ramkę rysujesz w taki sposób:

Canvas.Rectangle(0,0,Panel.Width, Panel.Height);

Umieść to np. w metodzie Paint klasy, którą proponowałem.

0

Nie działa, nie rysuje obramowania

type
  TP = class(TPanel)
  protected
    procedure Paint; override;
  end;

{...}
procedure TP.Paint;
begin
  inherited;
  Canvas.Rectangle(0,0,Panel.Width, Panel.Height);
end;
0

Jeżeli napisałeś tylko tyle to się nie ma co dziwić, że nie działa.

type
  TP = class(TPanel)
  protected
    procedure Paint; override;
  end;

{...}
procedure TP.Paint;
begin
  inherited;
  Canvas.Brush.Style:= bsClear;
  Canvas.Pen.Color:= clBlack;
  Canvas.Pen.Width:= 2;
  Canvas.Rectangle(1, 1, Width, Height);
end;

{poniżej jest OnCreate formy. Wejdź na zdarzenia formy i kliknij OnCreate następnie wpisz to co jest poniżej}
procedure TmainWindow.FormCreate(Sender: TObject);
var
  Panel1: TP;
begin
  Panel1:= TP.Create(Self);

  with Panel1 do
  begin
    Parent:= Self;
    BevelOuter:= bvNone;
    Left:= 100;//pozycja na formie w poziomie...
    Top:= 100;//...i w pionie
    Width:= 100;//szerokość...
    Height:= 100;//...wysokość
  end;
end;
0

Hmm, ale tutaj jest tworzony nowy Panel, albo inaczej... Istniejący panel jest zasłaniany przez narysowany drugi panel w ramką.

A przecież mam na tym Panelu wiele rzeczy i nie mogę go tworzyć na początku, bo bym musiał na nim wszystko tworzyć.

Jednym słowem, czy da radę to zrobić na istniejącym Panelu i tylko ramkę ?

Jestem nie pocieszony :-/

0

A od czego masz schowek ?

Po pierwsze TP musi być zarejestrowane. Z menu Components wybierz New Component i stwórz nowy panel. Nazwij go TP czy jak tam chcesz, niech dziedziczy po TPanel. Przeładuj metodę Paint tak jak AdamPL pokazał. Skompiluj. Powinien się pojawić na palecie komponentów.

Teraz aby podmienić istniejące TPanel'e na twoje TP sposoby są 2:

  1. Zaznacz wszystko co jest na panelu i wytnij. Usuń panel, wstaw nowy TP i wklej kontrolki. Nowy panel możesz nazwać tak samo jak stary to będzie mniej zamieszania.

lub

  1. Otwórz plik .dfm formy w edytorze tekstowym i podmień interesujące cię TPanel na TP.
0
AdamPL napisał(a)

Jeszcze jest taki sposób:
http://4programmers.net/Delphi/FAQ/Jak_rysowa%C4%87_po_komponencie
Ten art to po prostu jakaś kpina. Co on jeszcze robi na 4p ? Po co tak kombinować, jak wystarczy
Button1.Canvas. i lecimy z malowaniem.

Oprócz sposobu podanego wcześniej (czyli napisać własną kontrolkę z przeładowaną metodą Paint) można po prostu obsłużyć zdarzenie OnPaint panelu.

0

Panel ma ukrytą metodę Paint, więc ten sposób z linka jest zawsze jakąś alternatywą dla "klikaczy", którzy nie wiedzą co to jest klasa.

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