Lazarus nie wyświetla na formularzu nowo utworzonego komponentu

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.
0

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

Im.Parent := Form1;
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.

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.

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.

0

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

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.

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

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