Lazarus nie wyświetla na formularzu nowo utworzonego komponentu

Odpowiedz Nowy wątek
2018-12-08 20:49
0

Witam!
To mój pierwszy post, pozdrawiam wszystkich.

Chcę utworzyć moduł wyświetlający szachownicę. Do tego chcę użyć zestawu komponentów TImage. Problem polega na tym, że kiedy tworzę zadeklarowany jako pole publiczne komponent TImage, to pomimo kompilowania kodu, po uruchomieniu na formatce nie pojawia się komponent TImage. Próbowałem umieszczać kod w OnCreate i OnShow formularza i efekt jest ten sam. W czym jest problem? P.S. To kod próbny. Docelowo, będzie to tablica z dowiązaniami do TImage, zawierających rysunki figur.


unit Unit1;

{$mode objfpc}
{$H+}

interface

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

type

  { TForm1 }

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

  public
    Im:TImage;
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormShow(Sender: TObject);
begin
    Im:=TImage.Create(Form1);
         Im.Top:=1;
         Im.Left:=1;
         Im.Width:=300;
         Im.Height:=300;
         Im.Stretch:=True;
         Im.Visible:=TRUE;
         Im.Picture.LoadFromFile('bp.bmp');
end;

end.

Pozostało 580 znaków

2018-12-08 21:29

Pod wywołaniem konstruktora klasy komponentu dodaj poniższą linijkę:

Im.Parent := Form1;

edytowany 2x, ostatnio: furious programming, 2018-12-08 21:30

Pozostało 580 znaków

2018-12-08 21:59
0

A czy jak dodajesz ten TImage nie dynamicznie, ale "upuszczasz" go na formatkę z palety komponentów, to wszystko działa?

Abstrahując do tego, co napisał @furious programming, sam pewien czas temu miałem jakiegoś buga w Lazarusie, który powodował (już nie pamiętam dokładnie), że podczas upuszczania komponentów na formatkę, albo pojawiały się one w edytorze wizualnym, ale nie dodawały się do kodu (znaczy jako elementy klasy TForm1), albo odwrotnie (były w kodzie, ale nie było ich widać). Było to pewien czas temu i o ile pamiętam, to sprawę załatwiła reinstalacja środowiska.

No i tak poza tym (pomijając już zasadność stosowania TImage w tej sytuacji) - czemu robisz to dynamicznie, zamiast po prostu wrzucić jeden/kilka takich komponentów na formatkę? Piszesz, że tworzysz szachownicę, więc raczej jej wygląd nie będzie żadną niespodzianką, poza tym nie zmienia ona swojego kształtu czy wyglądu podczas gry, więc możesz ją sobie zakodować "na sztywno". Zastanawiam się, czy Twoja decyzja wynika z jakichś powodów, czy po protu tak zrobiłeś bo tak zrobiłeś? ;) Opcji jest wiele, chociażby korzystanie z canvashttp://wiki.freepascal.org/Drawing_with_canvas, a konkretnie to Canvas.Rectangle.


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

2018-12-09 16:38
2
cerrato napisał(a):

A czy jak dodajesz ten TImage nie dynamicznie, ale "upuszczasz" go na formatkę z palety komponentów, to wszystko działa?

Aby kontrolka była widoczna w oknie-rodzicu, musi posiadać ustawioną właściwość Parent. Designer robi wszystko co potrzeba, a OP zapomniał lub nie wiedział o tym – dlatego nie było jej widać w oknie.


edytowany 1x, ostatnio: furious programming, 2018-12-09 16:38

Pozostało 580 znaków

2018-12-09 22:55
0

Podejrzewam, że to właśnie o to chodzi, ale ponieważ sam pewien czas temu miałem styczność z dziwnym zachowaniem Lazarusa, wolałem się upewnić, czy robiąc to "tradycyjnie" wszystko jest OK.


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

2018-12-10 00:36
0

O to chodzi – upewniłem się przed napisaniem pierwszego posta w tym wątku.


edytowany 1x, ostatnio: furious programming, 2018-12-10 16:00

Pozostało 580 znaków

2018-12-10 18:37
0

Dziękuję za odpowiedź. Dodanie linijki "Im.Parent := Form1;" pomogło. Dziwi mnie tylko, dlaczego kiedy tworzę komponent, trzeba to było ustawić. Myślałem, że kiedy umieszczę nazwę formatki w linijce "Im:=TImage.Create(Form1);" nazwę komponentu-rodzica (Form1) ustawi automatycznie.

Pozostało 580 znaków

2018-12-10 18:47
1
mw_1975 napisał(a):

Dziękuję za odpowiedź. Dodanie linijki "Im.Parent := Form1;" pomogło. Dziwi mnie tylko, dlaczego kiedy tworzę komponent, trzeba to było ustawić. Myślałem, że kiedy umieszczę nazwę formatki w linijce "Im:=TImage.Create(Form1);" nazwę komponentu-rodzica (Form1) ustawi automatycznie.

w konstruktorze podajesz właściciela (owner) nowo tworzonego obiektu, czyli referencję do obiektu odpowiedzialnego za zwolnienie nowo tworzonej instancji
owner to nie to samo co parent

edytowany 1x, ostatnio: grzegorz_so, 2018-12-10 18:47

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