Lazarus - dynamiczny formularz - Acces Violation

0

Witam

Aplikacja wygląda następująco:

program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms
  { you can add units after this }, MainForm, LResources, SQLDBLaz,
MKontrahenci, MOknoLogowania;

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}

begin
Application.Initialize;
Application.CreateForm(TPoleLogowania, PoleLogowania);
//Application.CreateForm(TPanelGlowny, PanelGlowny);
Application.CreateForm(TKontrahenci, Kontrahenci);
  Application.Run;
end.  

W "OknoLogowania" znajduje się przycisk, który ma formularz stworzyć dynamicznie:

procedure TPoleLogowania.OKLogowanieClick(Sender: TObject);
begin

 if PanelGlowny.SQLConnect.Connected then PanelGlowny.SQLConnect.Close;
  // Set the connection parameters.

  With PanelGlowny do
   begin

    SQLConnect.Transaction := SQLTransaction;
    SQLConnect.DatabaseName := 'spasystem';
    SQLConnect.UserName := PoleLogowania.Login.Text;
    SQLConnect.Password := PoleLogowania.Haslo.Text;
    SQLConnect.HostName := '127.0.0.1';
   end;

if not Assigned(PanelGlowny)then PanelGlowny:=TPanelGlowny.Create(Application);
PanelGlowny.Show;

i w tym momencie - ZONK. Wywala Access violation. Nie wiem, o co mu chodzi, bo przecież to książkowy przykład tworzenia formularza dynamicznie. Przeszukałem sieć w poszukiwaniu wyjaśnienia i nic nie znalazłem.
Czy któryś z Kolegów potrafi wyjaśnić, dlaczego problem występuje ?

0

Nie wiadomo co wcześniej działo sie ze zmienna PanelGlowny ale byc moze chodzi o to:

if not Assigned(PanelGlowny)then PanelGlowny:=TPanelGlowny.Create(Application);
PanelGlowny.Show;

Robisz test na Assigned(PanelGlowny), lecz Assigned nie robi nic poza tym, ze sprawdza czy PanelGlowny <> nil. A to, ze jest on nie rowny nil to nie znaczy ze jest utworzony prawda? Byc moze utworzyles go wczesniej, nastepnie zrobiles PanelGlowny.Free ale nie ustawiles zmiennej na nil.
A wiec wynik testu zwraca True(nie tworzy sie PanelGlowny) i nastepuje PanelGlowny.Show ale w PanelGlowny znajduja sie jakies smieci z pamieci, gdyz jej nie wyczysciles.
Zamiast PanelGlowny.Free, uzyj FreeAndNil(PanelGlowny) i powinno byc git:)

Dodatkowo, dlaczego najpierw wykonujesz jakies operacje na PanelGlowny a dopiero pozniej go tworzysz? Nie mozesz odwolywac sie do nieutworzonego obiektu...

0

Zrobiłem, jak poradziłeś, Wodzu i ruszyło. Dziękuję za pomoc :)

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