Toon posts:

[DELPHI] Formulieren wisselen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een klein e-mail programmatje gemaakt in delhi met behulp van een stuk gedownloade code.

Het programmatje werkt verder perfect alleen nu wil ik een ander formulier laten zien wanneer het programma start.

Nu start MainForm op als eerste maar dat moet worden AboutFrm.
Ik heb dit gedaan door de simpele code:

code:
1
2
MainForm.visible := false;
AboutFrm.visible := true;


Alleen dan crashed het programma. Haal ik de regel Aboutfrm.visible := true; weg dan draait het programma wel maar is MainForm gewoon visible.
Hieronder de code die achter FormCreate staat:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  (*  Icon := Application.Icon;  *)
  Application.Title := 'TEmail demonstration';

  Messages := TStringlist.Create;
  Messages.Sorted := false;

  nUnread  := -1;
  MsgIndex := 0;
  Abort    := False;

{$IFDEF TESTCOMPON}
  Email1 := TEmail.Create(Self);
{$ENDIF TESTCOMPON}

  if Email1.Logon <> EMAIL_OK then
    MessageDlg('MAPI Logon failed', mtError, [mbOk], 0);

  Caption := Caption + ' [demo of TEmail ' + Email1.Version + ']';

MainForm.visible := false;
AboutFrm.visible := true;


Wie weet waar dit aan ligt? of heeft een betere oplossing? (Ik ben redelijke newbie @ delphi)

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:05
Je programma crashed omdat die frmAbout waarschijnlijk niet gekend is.

In het menu Project vind je een item Options weer. Daarin zie je welke forms er door Delphi AutoCreated zijn en welk form er als hoofdform ingesteld wordt.

Wat is de bedoeling dat je eerst frmAbout wilt laten zien? Wil je een splashscreen maken?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ten eerste: Thx voor de super snelle reactie
Ten Tweede: Dat zocht ik inderdaad :p, soort splashscreen ja. AboutFrm staat wel in de lijst maar als ik daar het hoofdformulier van maak is het probleem wel opgelost.

Mijn hartelijke dank, kan ik weer verder!

Verwijderd

Verwijderd schreef op 07 oktober 2002 @ 13:56:
code:
1
2
MainForm.visible := false;
AboutFrm.visible := true;


Wie weet waar dit aan ligt? of heeft een betere oplossing? (Ik ben redelijke newbie @ delphi)
Ik heb de rest van de code nog niet bekeken maar probeer het eens om te draaien, dus:
code:
1
2
AboutFrm.visible := true;
MainForm.visible := false;

Het is al lang geleden dat ik wat met delphi heb gedaan maar volgens mij maakt dit toch wat uit.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:05
Verwijderd schreef op 07 oktober 2002 @ 14:03:
Ten eerste: Thx voor de super snelle reactie
Ten Tweede: Dat zocht ik inderdaad :p, soort splashscreen ja. AboutFrm staat wel in de lijst maar als ik daar het hoofdformulier van maak is het probleem wel opgelost.

Mijn hartelijke dank, kan ik weer verder!


Eigenlijk is dat niet de goede manier om een splashscreen te maken. Hoe ik het precies doe, weet ik niet vanbuiten maar er is hier wel al eens een topic over geweest....

Deze dus: [rml][ Delphi] Splash screen lukt. Hoofdscherm niet meer[/rml]
Maar der moet nog ergens een recenter rondhangen zeggen m'n grijze cellen, alleen, dat kan ik zo gauw niet vinden. :X

https://fgheysels.github.io/


Verwijderd

Topicstarter
Dank, zal dat even doorlezen.

Ik zit met nog een probleem.

Ik sluit het programma af met
code:
1
close;


Het programma blijft nog wel lopen in windows 9x bij ctrl-alt-del in de takenlijst. (win2000 in processenlijst). Hoe kan ik er voor zorgen dat het gehele programma afsluit?

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:05
Mbhv Close sluit je enkel het form af.

code:
1
Application.Terminate()

of
code:
1
Application.Exit()


oid zorgt ervoor dat het programma volledig afgesloten wordt.

https://fgheysels.github.io/


Verwijderd

application.terminate laat alles afsluiten

edit: hmm ik ben weer eens traag met op versturen klikken :)

Verwijderd

Topicstarter
ja heb idd in Delphi help al gezocht. Gebruik nu Application.Terminate en geloof dat deze wel werkt!

Thx iig, je bent lekker rap, scheelt mij erg veel tijd :)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 31-08 19:41

Creepy

Tactical Espionage Splatterer

Als je alle forms hebt gesloten, en je sluit je mainform als laatste dan zal de application zich ook netjes afsluiten. Dan heb je dus geen application.terminate nodig.
Het eerst aangemaakte form m.b.v. application.createform is je mainform.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Inderdaad. Application.Terminate gebruiken is alleen geoorloofd in nood. Je hoort gewoon het main form te sluiten met Close;

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
ok, Application.Terminate werkt anders wel goed :)

Maar kan per form wel "close;" aangeven natuurlijk.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:05
Verwijderd schreef op 07 oktober 2002 @ 15:29:
ok, Application.Terminate werkt anders wel goed :)

Maar kan per form wel "close;" aangeven natuurlijk.


Als je het mainform sluit, zullen de andere forms die open staan ook wel gesloten worden. Het mainform is nl. de owner van die andere forms.

https://fgheysels.github.io/


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 31-08 19:41

Creepy

Tactical Espionage Splatterer

whoami schreef op 07 oktober 2002 @ 15:30:

[...]


Als je het mainform sluit, zullen de andere forms die open staan ook wel gesloten worden. Het mainform is nl. de owner van die andere forms.
Niet als al je form ge-autocreate worden, dan is het application object owner van je forms.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:05
Creepy schreef op 07 oktober 2002 @ 15:31:
[...]

Niet als al je form ge-autocreate worden, dan is het application object owner van je forms.


Hmmmja, maar als het mainform gesloten wordt, dan wordt het application object toch ook ge-freed en zullen die andere forms toch ook gesloten worden?

En heb je dan ook niet zoiets als
code:
1
Application.Exit()

of
code:
1
Application.Close

?
* whoami heeft hier geen delphi staan.

https://fgheysels.github.io/


Verwijderd

Topicstarter
hehe maar het kan toch verder geen kwaad als je Application.Terminate gebruikt of wel?

Werkt eigenlijk heel goed namelijk :)

En kan makkelijk door Aboutfrm.visible := true; het schermpie ff snel aanroepe als ze op about klikken :)

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ook als je forms auto create sluit de app als je Close doet op het main form. Echt, Application.Terminate bijna nooit gebruiken.

in procedure TCustomForm.Close;
if Application.MainForm = Self then Application.Terminate

We adore chaos because we like to restore order - M.C. Escher


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:05
LordLarry schreef op 07 oktober 2002 @ 15:41:
Ook als je forms auto create sluit de app als je Close doet op het main form. Echt, Application.Terminate bijna nooit gebruiken.

in procedure TCustomForm.Close;
if Application.MainForm = Self then Application.Terminate


Waarom eigenlijk niet?
In jouw voorbeeld spreek je je eigen een beetje tegen imho. Daar ga je nl. terminate iedere keer gebruiken als je je applicatie afsluit.

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 07 oktober 2002 @ 15:38:
hehe maar het kan toch verder geen kwaad als je Application.Terminate gebruikt of wel?
Kan inderdaad niet veel kwaad, maar tis gewoon slecht design.

We adore chaos because we like to restore order - M.C. Escher


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

whoami schreef op 07 oktober 2002 @ 15:43:

[...]


Waarom eigenlijk niet?
In jouw voorbeeld spreek je je eigen een beetje tegen imho. Daar ga je nl. terminate iedere keer gebruiken als je je applicatie afsluit.
Wat ik post is geen voorbeeld maar code uit de VCL zelf.

Je moet het zo zien: Het werkt perfect, geen problemen en het is zelfs de geprefereerde manier om je applicatie af te sluiten in het geval van nood. Maar als je Application.Terminate moet gebruiken zit er een fout in je design of je bent te lui :)

Een sub venster zou de applicatie af kunnen sluiten zonder dat het venster die het subvenster geopend heeft kan reageren op het resultaat van het subvenster. Misschien wil je wel eerst vragen aan de gebruiker of ie wel zeker wat dat ie wil afsluiten. Of misschien wil je nog wat bewaren als een form of app sluit. Dat soort dingen.

We adore chaos because we like to restore order - M.C. Escher


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:05
LordLarry schreef op 07 oktober 2002 @ 15:53:
[...]


Een sub venster zou de applicatie af kunnen sluiten zonder dat het venster die het subvenster geopend heeft kan reageren op het resultaat van het subvenster. Misschien wil je wel eerst vragen aan de gebruiker of ie wel zeker wat dat ie wil afsluiten. Of misschien wil je nog wat bewaren als een form of app sluit. Dat soort dingen.


Daar heb je de OnCloseQuery event oid voor.... Ik veronderstel dat deze ook wel getriggerd wordt bij het aanroepen van application.terminate?

Ik gebruik zelf ook nergens application.terminate in m'n code hoor, als ik het gebruik, dan is het enkel in m'n mainform

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nee, dat is dus het leuke. Zodra Application.Terminate is aangeroepen is er geen redden meer aan, je app gaat down. Geen OnClose en OnCloseQuerys voor geen enkel form. Ze worden niet gesloten maar geDestroyed! Hetzelfde gebeurt natuurlijk ook als via de main form Close de Application.Terminate is aangeroepen, maar daarvoor is iig de OnClose en OnCloseQuery van het main form aangeroepen. Daarom zei ik dat je er mee op moest passen en dat het bad design is als je het moet gebruiken.

In je mainform hoef je m juist nooit te gebruiken :) Gewoon Close is genoeg.

[ Voor 0% gewijzigd door LordLarry op 07-10-2002 16:08 . Reden: typo ]

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Application.Termination werkt niet geheel goed, heb hier netwerk clients die het programma nog hebben lopen in het geheugen.

Toch maar opgelost met Aboutfrm.close, deze werkt overal wel goed geloof ik :)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 31-08 19:41

Creepy

Tactical Espionage Splatterer

LordLarry schreef op 07 oktober 2002 @ 16:04:
Nee, dat is dus het leuke. Zodra Application.Terminate is aangeroepen is er geen redden meer aan, je app gaat down. Geen OnClose en OnCloseQuerys voor geen enkel form. Ze worden niet gesloten maar geDestroyed! Hetzelfde gebeurt natuurlijk ook als via de main form Close de Application.Terminate is aangeroepen, maar daarvoor is iig de OnClose en OnCloseQuery van het main form aangeroepen. Daarom zei ik dat je er mee op moest passen en dat het bad design is als je het moet gebruiken.

In je mainform hoef je m juist nooit te gebruiken :) Gewoon Close is genoeg.
Vandaar ook het verschil tussen OnClose en OnDestroy ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 08 oktober 2002 @ 11:08:
Application.Termination werkt niet geheel goed, heb hier netwerk clients die het programma nog hebben lopen in het geheugen.

Toch maar opgelost met Aboutfrm.close, deze werkt overal wel goed geloof ik :)
Is een beetje vreemd, vind je niet? Dat je ten eerste altijd je About box in het geheugen houd en dat je about box ook nog je main form is?
Verder is het normaal om je forms zo los mogelijk te koppelen. Als ik het goed begrijp moeten meerdere forms Aboutfrm.Close gebruiken? Dan is aboutfrm duidelijk geen kandidaat voor een main form.

We adore chaos because we like to restore order - M.C. Escher


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:05
Wat je best doet is slechts 1 scherm auto-created te maken. Als je werkt met datamodules, kan je die ook auto-created maken, maar al de rest zou ik zeker niet autocreeëren.

Om een splash-screen te maken/tonen, lees je best eens dat andere topic door waarvan ik hier de url gepost heb.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Die aboutform is een informatie schermpie. Dit start op en met een knop op het andere formulieren kunnen ze daar weer heen. Doordat ik het Aboutfrm als hoofdformulier is het nu wel mogelijk om met dit scherm op te starten.

form.create heb ik nog nooit mee gewerkt, heb die URL wel doorgelezen, maar geloof niet dat ik er veel wijzer van wordt om mijn aboutFrm zo tevoorschijn te toveren.

Vind het alleen vreemd dat de applicatie in het geheugen van bepaalde netwerk clients blijft staan en andere netwerkclients sluit ie wel goed af :?

Net uitgetest: Aboutfrm.close is dus ook niet goed........wheeeheee....

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:05
[nohtml]
Verwijderd schreef op 08 oktober 2002 @ 12:15:
Die aboutform is een informatie schermpie. Dit start op en met een knop op het andere formulieren kunnen ze daar weer heen. Doordat ik het Aboutfrm als hoofdformulier is het nu wel mogelijk om met dit scherm op te starten.

form.create heb ik nog nooit mee gewerkt, heb die URL wel doorgelezen, maar geloof niet dat ik er veel wijzer van wordt om mijn aboutFrm zo tevoorschijn te toveren.
Is totaal niet moeilijk. Je moet gewoon een instance maken van die class (Form) en die dan showen:
code:
1
2
3
4
5
6
var
  frmForm : TfrmAbout;
begin
  frmForm := TfrmAbout.Create (Self);
  frmForm.Show();
end;

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 08 oktober 2002 @ 12:15:
Vind het alleen vreemd dat de applicatie in het geheugen van bepaalde netwerk clients blijft staan en andere netwerkclients sluit ie wel goed af :?

Net uitgetest: Aboutfrm.close is dus ook niet goed........wheeeheee....
Dan is waarschijnlijk een ander form het main form dan jij denkt. Als je alle forms onzichbaar maakt (Hide) sluit je app niet af, maar zie je gewoon niets. Bij Close maakt ie ook alleen je forms onzichtbaar (default) maar worden ze niet uit het geheugen verwijderd. Alleen als je een main form sluit, sluit de application en dan worden alle forms uit het geheugen verwijderd. Dit is alleemaal erg basic. Misschien moet je dat eerst maar even doornemen hoe dat allemaal werkt met forms.

Een about box is ecjht niet iets wat waar je applicatie omheen zou moet draaien. Het zou prefect zonder moeten werken.

We adore chaos because we like to restore order - M.C. Escher


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ik vind dit allemaal te erg offtopic worden. Ik stel voor dat je even wat gaat spelen met forms creeren en vrijmaken en een ander klein apart test progje en als je dan vragen hebt die in een nieuw topic zetten.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
AboutForm is wel mijn hoofdform, dit staat al ergens bovenin in dit topic!!!!. Normaal als ik het mainform afsluit sluit het programma zich. Nu dus niet op alle pc's.

Het kan natuurlijk Win95 zijn, deze draait op die k*tclients, zal eerst met dat form.create gaan stoeien dan, misschien dat

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:05
Verwijderd schreef op 08 oktober 2002 @ 13:17:
AboutForm is wel mijn hoofdform, dit staat al ergens bovenin in dit topic!!!!. Normaal als ik het mainform afsluit sluit het programma zich. Nu dus niet op alle pc's.
Er werd niet gezegd dat je die aboutform als je hoofdscherm moest instellen, want dat wisten we ondertussen al. ;)
Lordlarry maakt gewoon duidelijk (en terecht), dat het geen goede zaak is om van die aboutform je mainform te maken.
Het kan natuurlijk Win95 zijn, deze draait op die k*tclients, zal eerst met dat form.create gaan stoeien dan, misschien dat

Als jouw programma op een computer goed afsluit, zou het normaal gezien op alle andere ook goed moeten kunnen afsluiten, tenzij het programma misschien nog op iets wacht.

https://fgheysels.github.io/


Verwijderd

Topicstarter
naja, het is wel goed.

In een test programma werkt wat ik doe gewoon meteen en goed, alleen met die e-mail code ertussen dus niet.......

Ik maak het Mainfrm wel het hoofdscherm en haal het beginscherm er wel uit. Anders werkt het gewoon niet. Maak wel button waar ze op kunnen klikken dan......

In ieder geval bedankt voor de hulp
Pagina: 1