Access Violation....

0

Zrobiłem program,gdzie po wpisaniu "adam" do MaskEdit1 i kliknięciu na "wejdź" otwierała się nowa forma z speedbuttonem o zdarzeniu "Close;".Do zamknięcia Form1(tej z maskeditem) użyłem OnDestroy:Form1.Destroy.No więc kiedy kliknę "wejdź"(mając wpisane hasło),znika mi Form1 i pokazuje Form2(do tego użyłem Form2.Show(lub i modal)) z tym speedbuttonem kiedy kliknę na niego to mi wyskoczy: Project haselko.exe raised exception class EAccessViolation of adress 00000013.Read of adress FFFFFFFF.itp... .Co mam zrobić?Proszę o szybką odpowiedź.Z góry dzięki!
FilD :-( <email> [email protected]</email>
My source:

unit starts;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, ExtCtrls, StdCtrls, Mask;

type
  TForm1 = class(TForm)
    Image1: TImage;
    bitBtn1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    MaskEdit1: TMaskEdit;
    StaticText1: TStaticText;
    procedure SpeedButton2Click(Sender: TObject);
    procedure bitBtn1Click(Sender: TObject);
    procedure MaskEdit1Change(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
 uses force2;
{$R *.dfm}


procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.bitBtn1Click(Sender: TObject);
begin
Form1.Destroy;
end;

procedure TForm1.MaskEdit1Change(Sender: TObject);
begin
If Maskedit1.text= 'macintosh' then bitBtn1.enabled:=true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Form2.ShowModal;
end;

end.

oraz form2:

unit force2;

interface

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

type
  TForm2 = class(TForm)
    SpeedButton1: TSpeedButton;
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.SpeedButton1Click(Sender: TObject);
begin
Form2.Close;
end;

end.

.Pomórzcie!!!

0

Wiesz, troche dziwnie to opisales, jakbys zniszczyl Form1 to w wiekszosci przypadkow zamknal by sie tez caly proces. Ktora forma jest glowna forma aplikacji?

0

Of course,unit: starts.Teraz podałem dwa kody źródłowe.

0

moze

procedure TForm1.bitBtn1Click(Sender: TObject);
begin
  Form1.Hide;
  Form2.Show;
end;
0

A po co sie męczysz z jakimś Destroy? Ja wychode z założenia, że na formie głównej powinno sie umieszczać głowne elementy programu. Ty używasz jej do hasła poczym usuwasz. To tylko wprowadza zamieszanie do projektu. Poza tym potem nie zamkniesz aplikacji zamykając Form2, bo to nie jest forma główna. Proponuje zrobić to tak:
Masz sobie te dwie formy. Form2 to forma z maskeditem, a Form1 ta, która ma się pokazać po wpisaniu hasła. Wejdź w źródło projektu i zmodyfikuj je według kodu poniżej (nie zapomnij o Controls w uses):

program Project1;

uses
  Forms, Controls,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Form2 := TForm2.Create(nil);
  if Form2.ShowModal = mrOK  then
  begin
     Form2.Free;
     Application.Initialize;
     Application.CreateForm(TForm1, Form1);
     Application.Run;
  end;
end.

Teraz w Form2 w przycisku, który niszczył formę (ten który sie uaktywniał po wpisaniu dobrego hasła) wpisz:

ModalResult := mrOK;

I tyle.

[<font color="red">do postu poniżej</span>]
Close? Hehe, gratulacje za pomysł. Sprawdziłeś chociaż co się dzieje gdy użyjesz Close na formie głównej?

0

Zamiast Form1.Destroy użyj Form1.Close powinno coś to dać Narka

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