Czy można ustalić Caption Labela np. 5 px od krawędzi Labela?

2015-01-24 12:31
0

Chodzi o to, że chciałbym ustawić pod sobą 10 Labeli. Ale żeby napis był odsunięty od krawędzi od kilka pikseli. Każdemu Labelowi chce nadać kolor, dlatego przesunięcie samego Labela nie jest rozwiązaniem.

Pozostało 580 znaków

2015-01-24 12:38
0

Co ma wspólnego położenie Labela z jego kolorem?

Pozostało 580 znaków

2015-01-24 12:45
0

Chce malować tło napisu. Konkretnie chodzi mi o to, żeby napis był 5 px od krawędzi rodzica. Jeśli nie zmieniałbym koloru, to mógłbym przesunąć wszystkie Labele w prawo o te 5 px. Ale ja chce żeby kolor był zmieniony przy samej krawędzi rodzica a napis był dalej.

Pozostało 580 znaków

2015-01-24 14:57
2

Nadpisz metodę Paint z klasy TLabel i maluj co chcesz i jak chcesz:

type
  TLabel = class(StdCtrls.TLabel)
  protected
    procedure Paint(); override;
  end;

type
  TForm1 = class(TForm)
    Label1: TLabel;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TLabel.Paint();
begin
  with Self.Canvas do
  begin
    Brush.Color := clBlack;
    FillRect(ClientRect);

    Font.Color := clWhite;
    TextOut(5, 0, Self.Caption);
  end;
end;

end.

Zwróć uwagę na zawartość metody Paint - za pomocą Self.Canvas uzyskujesz dostęp do płótna komponentu i możesz już malować tak, jak w przypadku każdego innego płótna; Przy czym pamiętaj, że punkt [0,0] to lewy górny róg komponentu, a nie formularza;

Efekt użycia powyższego kodu poniżej; Z lewej jest zrzut formularza podczas projektowania, a po prawej po uruchominiu skompilowanego programu:

label.png

Jak widać działa prawidłowo; Co prawda odstęp od prawej wynosi 6px, ale to zasługa wielkiej litery L, która w tym foncie posiada offset 1px od lewej; W przypadku innych liter czy znaków, offsetu może nie być, albo może być większy - to zasługa użycia standardowych fotnów.


edytowany 4x, ostatnio: furious programming, 2015-01-24 15:36
Pod Lazarusem działa tak samo, jakby kto pytał; - furious programming 2015-01-24 15:01
Self.Canvas nie Sender. - babubabu 2015-01-24 15:22

Pozostało 580 znaków

2015-01-24 18:59
0

Ale w tym przypadku to zadziała do wszystkich Labeli, prawda? Na razie nie mam dostępu do Lazarusa i nie mogę tego przetestować. Żeby nie było, ze was wykorzystuje, sam nie myśląc chciałbym zapytać czy rozwiązanie o którym myślę może być prawidłowe?

type
  WlasnyLabel = class(StdCtrls.TLabel)
  protected
    procedure Paint(); override;
  end;

type
  TForm1 = class(TForm)
    Label1: WlasnyLabel;
  end;

Albo inne pytanie. Bo tutaj parametry są nadane z góry. A czy jest możliwość przekazania w jakiś sposób koloru czy rozmiaru czcionki albo punktu w którym ma być tekst rysowany?

edytowany 1x, ostatnio: dani17, 2015-01-24 19:06

Pozostało 580 znaków

2015-01-24 19:37
1

Rozumiem, że dział Newbie. Ale na pewno powinieneś najpierw zacząć od kursu z podstawami obiektowego Pascala. A dopiero później chcieć zmieniać działanie domyślne i rysowanie TLabel czy każdego innego komponentu. To co podał poprzednik to przecież tylko przykład.

Możesz sobie przecież utworzyć tak jak pokazał klasę - przykładowo TMojZajebistyLabelKtoryMaPiecioPixelowyMarginesOdLewej i zadeklarować tylko część lub tylko jedną kontrolkę tego typu. Dodanie dodatkowych własności to też nie problem. Trzeba tylko myśleć co się robi. Ponieważ żeby używać własnej klasy tak jak pokazałeś, należało by przygotować moduł z kodem z procedurą rejestrującą taki komponent na palecie. Następnie taki komponent zainstalować. Robiłem to raczej głównie pod Delphi 7, ale myślę, że również pod Lazarusem nie sprawi to większych problemów.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TWlasnyLabel = class(StdCtrls.TLabel)
  private
    FTBrainWasUsed : boolean;
  protected
    procedure Paint(); override;
  published
    property TBrainWasUsed : boolean read FTBrainWasUsed write FTBrainWasUsed;
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender : TObject);
  private
  public
    Label1 : TWlasnyLabel;
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TWlasnyLabel.Paint();
begin
  with Self.Canvas do
  begin
    Brush.Color := clBlack;
    FillRect(ClientRect);
    if FTBrainWasUsed then
    begin
      Font.Color := clWhite;
    end
    else
    begin
      Font.Color := clRed;
    end;
    TextOut(5, 0, Self.Caption);
  end;
end;

procedure TForm1.FormCreate(Sender : TObject);
begin
  Label1 := TWlasnyLabel.Create(Self);
  Label1.Caption := 'Use TBrain, Luck';
  Label1.Parent := Self;
end;

end.

edytowany 2x, ostatnio: olesio, 2015-01-24 21:16

Pozostało 580 znaków

2015-01-24 19:56
0

Kursy czytam na bieżąco, w trakcie pisania tego co potrzebuje. Kiedyś HTML i CSS się próbowałem w ten sposób nauczyć, ale to nic nie dało. Dopiero metodą prób i błędów i analizy szablonów zrozumiałem co jest co.

Tylko jedno pytanie. Czy procedure Paint(); override; musi być w sekcji protected?

edytowany 1x, ostatnio: dani17, 2015-01-24 19:58

Pozostało 580 znaków

2015-01-24 21:05
1

Nie musi, ale póki nie wiesz jaka jest w tym różnica - pozostaw w tej samej sekcji; Najwyżej dostaniesz podpowiedź o zmianie jej widoczności, w porównaniu do klasy bazowej:

[Hint] Unit1.pas(12): Overriding virtual method 'TLabel.Paint' has lower visibility (private) than base class 'TLabel' (protected)

edytowany 3x, ostatnio: furious programming, 2015-01-24 21:07
właśnie stąd się wzięło moje pytanie - dani17 2015-01-24 22:11

Pozostało 580 znaków

2015-01-24 22:08
0

@dani17: no widzisz, uparcie unikasz kursu Delphi, nawet tego w kompendium na 4p. I masz coraz więcej pytań o banalne podstawy. Skorzystaj więc z mojej dobrej rady - nie olewaj kursu jak przy HTMLu. A nauczysz się więcej.


edytowany 1x, ostatnio: olesio, 2015-01-25 00:14

Pozostało 580 znaków

2015-01-24 22:19
0

Nie tak, że olewam. Staram się czytać, ale nie potrafię tak czytać cały czas. Więc jak czegoś potrzebuje to staram się czytać. Z czasem poznam to wszystko.
Powiem inaczej. Staram się realizować pewien projekt. I po prostu na bieżąco staram się ten kod poprawiać. Na początku był totalny chaos. Teraz zaczyna to wyglądać rozsądniej.

Pozostało 580 znaków

2015-01-24 22:34
1

@dani17 - jeśli nie wszystkie etykiety mają być malowane inaczej, to zawsze możesz skorzystać z bazowej metody malującej, wywołując ją słówkiem Inherited; Teraz wystarczy sprawdzić która etykieta jest malowana:

type
  TLabel = class(StdCtrls.TLabel)
  protected
    procedure Paint(); override;
  end;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TLabel.Paint();
begin
  { jeśli to druga etykieta - malujemy po swojemu... }
  if Self = Form1.Label2 then
    with Self.Canvas do
    begin
      Brush.Color := clBlack;
      FillRect(ClientRect);

      Font.Color := clGray;
      TextOut(5, 0, Self.Caption);
    end
  else
    { ...w przeciwnym razie wywołujemy metodę z bazowej klasy }
    inherited;
end;

end.

Efekt poniżej - z lewej formularz podczas projektowania, z prawej po uruchomieniu programu:

labels.png


edytowany 1x, ostatnio: furious programming, 2015-01-24 22:36

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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