Dwa wiersze Caption na TPanel?

Odpowiedz Nowy wątek
2019-06-11 07:54
0

Jak w temacie - da sie to jakoś uzyskać ?
+#13+#10+ nie działa
sLineBreak też nie działa

edytowany 1x, ostatnio: furious programming, 2019-06-11 19:02

Pozostało 580 znaków

2019-06-12 10:29
1

Nie wiem, czy o to Ci chodziło, ale tak na szybko zrobiłem coś, żeby pokazać Ci jak możesz podejść do tematu. Jest to zrobione raczej brzydko, żeby pokazać sam mechanizm, jak możesz to zrobić:

unit Unit1;

{$mode objfpc}{$H+}

interface

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

type

  TNewPanel = class(TPanel)
    NewCaption: TLabel;
  end;

  { TForm1 }

  TForm1 = class(TForm)
    Panel: TNewPanel;
    procedure FormCreate(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.Panel:= TNewPanel.Create(Form1);
  Form1.Panel.Parent:= Form1;
  Form1.Panel.SetBounds(10,10,200, 200);
  Form1.Panel.Color:= clRed;
  Form1.Panel.NewCaption:= TLabel.Create(Form1.Panel);
  Form1.Panel.NewCaption.Parent:= Form1.Panel;
  Form1.Panel.NewCaption.Caption:= 'siakiś napis';
  Form1.Panel.NewCaption.Left:= 30;
  Form1.Panel.NewCaption.Top:= 30;
end;

end.

That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-06-12 10:39
0

To nie działa :/

Pozostało 580 znaków

2019-06-12 10:40
1

A to dziwne, bo u mnie działa. Zrobiłem kopiuj-wklej ze swojego Lazarusa.
Napisz może coś więcej, co konkretnie się dzieje, co nie działa, jakie błędy itp. Bo to, co napisałeś w sumie to nic nie wnosi do sprawy :P


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-06-12 10:52
0

zrobiłem też copy/paste do nowego proj w lazarusie . Uruchamia się pusta forma.
IDE 2.0.0
FPC 3.0.4
wer. 64-bit (ale na 32 też sprawdziłem)
Win 10 1803

Zaktualizuj IDE do wersji 2.0.2 - furious programming 2019-06-12 12:54
Czy coś to zmieni, poza świadomością posiadania aktualnej wersji? Bo to mi przypomina trochę mój fetysz z aktualizowaniem biosu/firmware. Jak tylko jakiś sprzęt mi wpadnie w ręce, to robię update, nawet jak wcale nie jest on potrzebny, wszystko działa, nie ma błędów itp - cerrato 2019-06-12 16:18
Pomiędzy tymi wersjami są znaczące różnice w LCL. Np. dodano do komponentów właściwości upublicznione, które wcześniej nie istniały, więc import projektu z wersji 2.0.0 zakończy się błędami o nieznanych właściwościach. - furious programming 2019-06-12 17:36

Pozostało 580 znaków

2019-06-12 11:01
3

Copy/paste to nie jest dobra metoda programowania....

procedure FormCreate(Sender: TObject);

W edytorze obiektów (czy jak to się nazywa w Lazarusie) wybierz dla formatki w zdarzeniach OnCreate -> FormCreate (będzie z liście rozwijanej)

wyprzedziłeś mnie :P - cerrato 2019-06-12 11:31
A ja chciałem wcześniej napisać o dziedziczeniu komponentu i też ktoś mnie ubiegł... - Clarc 2019-06-12 15:14
No to mamy remis ;) - cerrato 2019-06-12 16:15

Pozostało 580 znaków

2019-06-12 11:13
0

No tak teraz działa :D

Pozostało 580 znaków

2019-06-12 12:04
0

To moja przeróbka - nie wiem jak to zrobić by klik na label było tym samym co klik na utworzony panel

unit Unit1;

{$mode objfpc}{$H+}

interface

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

type

  TNewPanel = class(TPanel)
    NewCaption: TLabel;
    NewCaption2: TLabel;
  end;

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Fpanel: TFlowPanel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    Procedure shownewpanel(nazwa:string;id:integer);
    Procedure ClickOnPanel(Sender: TObject);
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
 shownewpanel('test 1',1);
 shownewpanel('test 2',2);
 shownewpanel('test 3',3);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 // FPanel.boxid_2.boxLabel2_id_2.Caption:='test zmiany tekstu';
end;

Procedure TForm1.shownewpanel(nazwa:string;id:integer);
var nowe:TNewPanel;
begin
  nowe:=TNewPanel.Create(Form1.Fpanel);
  with nowe do
        begin
          Parent:=  FPanel;
          Name:='boxid_'+inttostr(id);
          Caption:='';
          SetBounds(10,10,100, 100);
          Color:= clRed;

          NewCaption:= TLabel.Create(  nowe);
          NewCaption.Parent:=   nowe;
          NewCaption.Font.Color:=clWhite;
          NewCaption.Caption:= 'napis 1:'+nazwa;
          NewCaption.Left:= 5;
          NewCaption.Top:= 15;
          NewCaption.Name:='boxLabel1_id_'+inttostr(id);

          NewCaption2:= TLabel.Create(  nowe);
          NewCaption2.Parent:=   nowe;
          NewCaption2.Font.Color:=clYellow;
          NewCaption2.Caption:= 'napis 2:'+nazwa+' !';
          NewCaption2.Left:= 10;
          NewCaption2.Top:= 40;
          NewCaption2.Name:='boxLabel2_id_'+inttostr(id);
          onClick:[email protected];

        end;
end;

procedure TForm1.ClickOnPanel(Sender: TObject);
begin
showmessage('kliknieto '+TPanel(sender).Name);
end;

end.
edytowany 1x, ostatnio: titako, 2019-06-12 12:04

Pozostało 580 znaków

2019-06-12 12:21
2

No to proszę - poniżej wersja z obsługą kliknięć także na napisach:

Procedure TForm1.shownewpanel(nazwa:string;id:integer);
var nowe:TNewPanel;
begin
  nowe:=TNewPanel.Create(Form1.Fpanel);
  with nowe do
        begin
          Parent:=  FPanel;
          Name:='boxid_'+inttostr(id);
          Caption:='';
          SetBounds(10,10,100, 100);
          Color:= clRed;
          OnClick:= @Form1.ClickOnPanel;

          NewCaption:= TLabel.Create(  nowe);
          NewCaption.Parent:=   nowe;
          NewCaption.Font.Color:=clWhite;
          NewCaption.Caption:= 'napis 1:'+nazwa;
          NewCaption.Left:= 5;
          NewCaption.Top:= 15;
          NewCaption.Name:='boxLabel1_id_'+inttostr(id);
          NewCaption.OnClick:= @Form1.ClickOnPanel;

          NewCaption2:= TLabel.Create(  nowe);
          NewCaption2.Parent:=   nowe;
          NewCaption2.Font.Color:=clYellow;
          NewCaption2.Caption:= 'napis 2:'+nazwa+' !';
          NewCaption2.Left:= 10;
          NewCaption2.Top:= 40;
          NewCaption2.Name:='boxLabel2_id_'+inttostr(id);
          NewCaption2.OnClick:= @Form1.ClickOnPanel;

        end;
end;

procedure TForm1.ClickOnPanel(Sender: TObject);
  var nazwa: string;
begin
  if (Sender is TPanel) then nazwa:= TPanel(Sender).Name;
  if (Sender is TLabel) then nazwa:= TLabel(Sender).Parent.Name;
  showmessage('kliknieto '+nazwa);//TPanel(sender).Name);
end; 

That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-06-12 12:32

A poza tym, nawiązując do naszej innej rozmowy, możesz zastanowić się nad alternatywnym (pytanie - czy lepszym?) rozwiązaniem - zamiast umieszczać na panelu elementy typu TLabel, może obsłuż sobie zdarzenie OnPaint i w nim po prostu sobie napisz tekst na Canvasie tego Panela - coś w stylu

procedure TForm1.Panel1Paint(Sender: TObject);
begin
  panel1.Canvas.TextOut(10,20, 'KASZANKA');
end; 

That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-06-12 12:40
1

Rozwiązanie z labelami w pełni mnie satysfakcjonuje - ale i za tę ciekawostkę dziękuje :)

Fajnie, że mogłem pomóc, jakbyś miał jakiś problem to śmiało pisz - cerrato 2019-06-12 12:43

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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