Avatar billede friiiiis Novice
20. december 2012 - 11:26 Der er 13 kommentarer og
1 løsning

FormShow og Close

Hej,

Jeg placere en kode i FormShow til at kontrollere at der er adgang til en database.

Hvis der IKKE er adgang skal formen lukkes via Close. Men det sker bare ikke. Formen forbliver åben.

Hvad gør jeg forkert?
Avatar billede 2Mida Praktikant
20. december 2012 - 12:11 #1
Kode eksempel?
Avatar billede 2Mida Praktikant
20. december 2012 - 12:24 #2
Og se her http://delphi.about.com/od/formsdialogs/a/delphiformlife.htm
måske er det onActivate eventen du skal have fat i!
Avatar billede hugopedersen Nybegynder
20. december 2012 - 14:47 #3
Personligt ville jeg foretrække at flytte det til FormShow
Jeg bruger gerne noget lig nedenstående:

procedure TfrmMain.FormShow(Sender: TObject);
begin
  if UniDAC.Validate(Settings.Database.Provider) = False then
    begin
      if ShowDBSetup(Self, True) = True then
        begin
          ForcedDown := True;
          Close;
        end;
    end
  else
    begin
      frmDBConn := TfrmDBConn.Create(Self);
      Settings.Load;
      Caption := ProgramInfo;
      User.DoInitialize;
      fMessageClock := TMessageClock.Create(Self, True);
      barStatus.DoubleBuffered := true;
      TabsSet := TStringList.Create;
      WindowState := wsMaximized;
      fMessageClock.Start;
      TabsSetFill;
      PostMessage(Handle, WM_RIBBONUPDATE, 0, 0);
      PostMessage(Handle, WM_STATUSUPDATE, 0, 0);
      tabHome.Active := True;
      TimerLogon.Enabled := True;
      SetFocus;
    end;
end;
Avatar billede martinlind Nybegynder
22. december 2012 - 13:41 #4
Man kan IKKE lukke formen med en alm. close i onShow eventen !

Du skal sende en WM_CLOSE til din form, det kan du nemli godt få lov til i onShow

SendMessage(formHandle,WM_Close);


( Har ikke lige delphi kørende )
Avatar billede hugopedersen Nybegynder
22. december 2012 - 22:01 #5
Det forstår jeg nu ikke. Jeg har ikke nogen problemer med at lukke med den viste kode.
Eneste detalje er at jeg i FormCloseQuery sætter CanClose := ForcedDown
Den metode har jeg brugte uden problemer i både 2009 og XE versionen af Delphi - jeg har dog ikke testet det i min nuværende XE3 (det burde jeg måske gøre)
Avatar billede martinlind Nybegynder
23. december 2012 - 14:08 #6
hehe... jeg husker det fra før 2009 :-), der kunne man ikke slippe afsted med en close i din formshow.

God Jul :-)
Avatar billede kroning Nybegynder
23. december 2012 - 14:13 #7
Jeg bruger Delphi 7 (2002) og der virker det fint med Close i formshow.
Avatar billede mbsnet Nybegynder
23. december 2012 - 19:31 #8
ellers er der jo også application.terminate eller halt...
Avatar billede mbsnet Nybegynder
23. december 2012 - 19:47 #9
I koden til TCustomForm.close udfører den application.terminate hvis mainform, så den ville jeg foretrække, hvis det er hele programmet der skal lukkes
Avatar billede mbsnet Nybegynder
23. december 2012 - 20:01 #10
Hvis det ikke er hele programmet som skal lukkes så prøv
form2.release;
Avatar billede friiiiis Novice
02. januar 2013 - 15:15 #11
Hej,

1) Præcision:  Hvis jeg kalder en DLL fil og i DLL filen's onshow laver en "CLOSE;" så vil DLL filen IKKE lukke ned.

2) Application.Terminate kan jeg ikke bruge da den lukker hele applicationen ned og jeg kun ønsker at formen skal lukkes

3) Release; virker ikke - formen lukker godt nok men der opstår en eller anden fejl - jeg kan ikke få adgang til hovedformen hvorfra DLL filen blev kaldt

4) SendMessage(formHandle,WM_Close); kan jeg ikke få til at virke - der sker ingenting
Avatar billede friiiiis Novice
02. januar 2013 - 15:16 #12
Koden til DLL filen er:

Close kalder jeg i formens OnShow kode.

library DLLFile;

uses
  SysUtils,
  Classes,
  ActiveX,
  Windows,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

var
  DllApplication2 : TApplication;
{$R *.res}

function DLLShow(ParentApplication:TApplication;ParentForm:TForm): integer; stdcall;
begin
  Application := ParentApplication;
  coinitialize(nil);
  Form1 := TForm1.Create(ParentForm);
  Form1.Showmodal;
  Result := 1;
  Form1.free;
end;

procedure DLLUnloadProc(Reason: Integer); register;
begin
  if Reason = DLL_PROCESS_DETACH then
    Application := DllApplication2;
end;

exports
  DLLShow;

begin
DllApplication2 := Application;
DLLProc := @DLLUnloadProc;
end.
Avatar billede mbsnet Nybegynder
02. januar 2013 - 21:01 #13
Hej, under normale omstændigheder burde release eller close kunne bruges.
Forstår godt det ikke virker her, men vil alligevel lige afslutte min egen kommentar med, at i koden til release afsendes en meddelelse, og dermed meget tæt på martinlinds bud, hvilken jeg nok også ville foretrække (i situationer hvor WM_CLOSE virker...)

Jeg har ikke flere bud på dette, andet end at generelt set er det nok bedre hvis formen slet ikke bliver oprettet, og så at flytte koden helt ud af onshow.
Det kan gøres på flere måder, eksempelvis ved at oprette en funktion til at oprette formen med, eller lave en nedarvet klasse.

procedure createMyForm(...);
begin
if not shouldCreate then exit;
//create form here.
end;
Avatar billede friiiiis Novice
25. april 2013 - 13:10 #14
problemet var at jeg lavdede:

result := 1;

Jeg SKULLE have lavet

result := Form1.ShowModal;

Borrisholt Guruen hjalp...

Jeg lukker...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester