Toon posts:

[Delphi] 2 forms tonen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil 2 normale forms op het scherm hebben. Alleen het probleem is dat eerst het hoofdform wordt aangemaakt vervolgens het 2e form.

Dit 2e form heeft dan de focus. Maar de applicatie moet de focus op form1 zetten.

Hoe doe ik dat?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15-09 19:59

Creepy

Tactical Espionage Splatterer

wat dacht je van in de onshow-event van de tweede form een eersteform.setfocus.

"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


Verwijderd

Of de volgorde van het aanmaken veranderen?

Verwijderd

Topicstarter
Op donderdag 24 januari 2002 12:55 schreef Creepy het volgende:
wat dacht je van in de onshow-event van de tweede form een eersteform.setfocus.
Nee dat werkt dus niet.

Verwijderd

Op donderdag 24 januari 2002 13:22 schreef tokkie het volgende:

[..]

Nee dat werkt dus niet.
Zou wel werken als je het in OnActivate zou doen. Al is dit een baggermethode aangezien je dan nooit het 2e form kan activeren.

Maar uhh, die Form.SetFocus werkt goed hoor. Staat trouwens gewoon in de help hoor.

  • Marv
  • Registratie: Oktober 2000
  • Laatst online: 11-06 06:52
Ander probeer je dit.. niet echt de mooiste oplossing maar misschien werkt het wel: form2.visible:=false

"Everything I've ever done or said is the complete opposite of what I've wanted" -- George


Verwijderd

Op donderdag 24 januari 2002 13:29 schreef Marv het volgende:
Ander probeer je dit.. niet echt de mooiste oplossing maar misschien werkt het wel: form2.visible:=false
Topicstarter wil 2 formulieren tegelijk tonen. Met Visible:=False wordt het 2e form verborgen.

  • Marv
  • Registratie: Oktober 2000
  • Laatst online: 11-06 06:52
Op donderdag 24 januari 2002 13:31 schreef hvdberg het volgende:

[..]

Topicstarter wil 2 formulieren tegelijk tonen. Met Visible:=False wordt het 2e form verborgen.
Foutje... d8 dat het niet lukte de 2e te verbergen...

Zie dat ie: form1.setfocus al geprobeerd heeft... vaag....

"Everything I've ever done or said is the complete opposite of what I've wanted" -- George


Verwijderd

Op donderdag 24 januari 2002 13:34 schreef Marv het volgende:

[..]

Foutje... d8 dat het niet lukte de 2e te verbergen...

Zie dat ie: form1.setfocus al geprobeerd heeft... vaag....
Ik denk dat topicstarterform1.setfocus in het form2.onshow event heeft geprobeerd en dat is dus gewoon fout.

Makkelijkste is gewoon setfocus nadat het form getoond is, dus bijvoorbeeld:
code:
1
2
3
4
5
procedure TForm1.Button1Click(Sender: TObject)
begin
  Form2.Show;
  Form1.SetFocus;
end;

En dit werkt (getest dus).

Verwijderd

code:
1
2
3
4
5
6
7
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Form2.Visible := True;
  Application.Run;
end;

Dit werkt iig, maar d'r zullen vast wel betere methodes zijn.

Verwijderd

Topicstarter
De oplossing bleek dus heel simpel te zijn:
code:
1
2
3
4
  Application.CreateForm(TFormStartup, FormStartup);
  Application.CreateForm(TFormTerminal, FormTerminal);
  FormStartup.SetFocus;
  Application.Run;

Verwijderd

Op donderdag 24 januari 2002 15:17 schreef tokkie het volgende:
De oplossing bleek dus heel simpel te zijn:
code:
1
2
3
4
  Application.CreateForm(TFormStartup, FormStartup);
  Application.CreateForm(TFormTerminal, FormTerminal);
  FormStartup.SetFocus;
  Application.Run;
Advies: ga eerst een Delphi boekje lezen alvorens je zulke code post!

Hoewel de oplossing misschien werkt zou de code niet fouter kunnen!

Je gaat namelijk je programmaloop op een bijna onnarekenbare wijze beïnvloeden zonder ook maar enige foutcontrole.

  • Tomatoman
  • Registratie: November 2000
  • Nu online

Tomatoman

Fulltime prutser

Je Application.MainForm is het eerste form dat met Application.CreateForm creëert. De truc die bij een 'splash screen' veel wordt toegepast is de volgende. Je creëert als eerste je splash screen, maar dat doe je niet met Application.CreateForm. In plaats daarvan gebruik je de gewone constructor van het Form zelf:
code:
1
2
3
4
  Splash := TSplash.Create(Application);  // FormStyle moet meestal fsStayOnTop zijn
  Splash.Show;
  Application.CreateForm(TMain, Main);
  Application.Run;

Main is nu je Application.MainForm. Het splash screen kun je bijvoorbeeld sluiten in OnActivate van Main. Niet vergeten Splash.Free aan te roepen (of beter: FreeAndNil(Splash)) om alvast wat resources vrij te maken.

Ook hierbij geldt het nadeel dat je handmatig in je project source file moet klooien, maar het toont wel hoe het mechanisme van je main form werkt. Het is trouwens de door Borland gesuggereerde oplossing.

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Op donderdag 24 januari 2002 15:36 schreef hvdberg het volgende:

Advies: ga eerst een Delphi boekje lezen alvorens je zulke code post!

Hoewel de oplossing misschien werkt zou de code niet fouter kunnen!

Je gaat namelijk je programmaloop op een bijna onnarekenbare wijze beïnvloeden zonder ook maar enige foutcontrole.
Ik zou zeggen geef dan maar een betere methode.

Het is dus de bedoeling dat allebei de schermen automatisch getoond worden na het starten van de applicatie en dat de MainForm de focus krijgt, zonder op een knop te moeten drukken.

  • Tomatoman
  • Registratie: November 2000
  • Nu online

Tomatoman

Fulltime prutser

Op donderdag 24 januari 2002 16:34 schreef tokkie het volgende:

[..]

Ik zou zeggen geef dan maar een betere methode.
Een voordracht uit eigen werk. LegendExecute is de OnExecute handler van een TAction om een legenda (LegendForm) te tonen of te verbergen. Het main form in deze applicatie heet toevallig MainForm en is dus iets anders dan Application.MainForm.
code:
1
2
3
4
5
6
7
8
9
10
11
procedure TMainForm.LegendExecute(Sender: TObject);
begin
  with LegendForm do
    if Visible then
    Hide
    else
    begin
    Show;
    MainForm.SetFocus;
    end;
end;

Een goede grap mag vrienden kosten.


Verwijderd

Op donderdag 24 januari 2002 16:34 schreef tokkie het volgende:

[..]

Ik zou zeggen geef dan maar een betere methode.

Het is dus de bedoeling dat allebei de schermen automatisch getoond worden na het starten van de applicatie en dat de MainForm de focus krijgt, zonder op een knop te moeten drukken.
Andere manier heb ik al laten zien. Ging nu puur op de code af.
Pagina: 1