[DELHPI] Formpje openen...

Pagina: 1
Acties:

  • unclero
  • Registratie: Juni 2001
  • Laatst online: 22:51

unclero

MB EQA ftw \o/

Topicstarter
Na veel geld en tijd heb ik de Borland Turbo Pascal periode afgesloten en ga ik nu 'maar es even' verder met Delphi (5 Enterprise),,

Nu heb ik twee formpjes.
En ik wil dat het ene formpje (Form1) opent als er op een knopje word gedrukt:
code:
1
2
3
4
procedure TMainform.HelpAbout(bla : integer);
begin
   { iets als Open.Form1 ??}
end;

Best weird, want die Help- annex documentatie die in Delphi zit is gewoon genieten, alleen net dat ene stukje, ben ik gister een hele avond bezig geweest om het te zoeken...
Dus probeer ik het nu hier.

Quelle chimère est-ce donc que l'homme? Quelle nouveauté, quel monstre, quel chaos, quel sujet de contradiction, quel prodige!


  • cimbom
  • Registratie: Juni 2001
  • Laatst online: 26-04-2024

cimbom

Just Kidding

Form1.ShowModal;

of

Form1.Visible := true;

Zoek het verschil maar zelf uit

  • ArieProductions
  • Registratie: Januari 2002
  • Laatst online: 27-11-2024
code:
1
2
3
4
5
procedure TMainForm.Button1Click(Sender: TObject);
begin
  Form2.ShowModal;

end;

"Quidquid latine dictum sit, altum videtur" (Whatever is said in Latin sounds profound)


Verwijderd

[b]Op woensdag 30 januari 2002 09:01 schreef unclero
code:
1
2
3
4
procedure TMainform.HelpAbout(bla : integer);
begin
   { iets als Open.Form1 ??}
end;
Nu heb ik geen ervaring met Delphi, maar eerlijkgezegd klinkt Form1.open beter...

[totzover mijn zinloze reply] :p

Verwijderd

Op woensdag 30 januari 2002 09:10 schreef D-weaver het volgende:

[..]

Nu heb ik geen ervaring met Delphi, maar eerlijkgezegd klinkt Form1.open beter...

[totzover mijn zinloze reply] :p
't is nog vroeg... had andere postings nie gezien... :z

  • ta_chi79
  • Registratie: Juli 2001
  • Laatst online: 20:18
als je het netjes wilt doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procecedure TForm1.Button1Click(Sender as TObject)
var
  lForm: TForm2;
  lModalResult: Integer;
begin
  lForm := TForm2.Create(Self);
  try
    lModalResult := lForm.ShowModal;
    
    // en dan nog eventueel als je de ModalResult property 
    // van de TButtons hebt gezet...
    case lModalResult
    mrOk:   // heeft op de OK knop geklikt
    mrCancel:  // heeft op Cancel geklikt
    mrApply:   // en nu de Apply button
    else 
           // of iets anders
    end;
  finally
    lForm.Free;
  end;
end;

Verwijderd

Op woensdag 30 januari 2002 09:17 schreef ta_chi79 het volgende:
als je het netjes wilt doen:

procecedure TForm1.Button1Click(Sender as TObject)
var
lForm: TForm2;
lModalResult: Integer;
begin
lForm := TForm2.Create(Self);
try
lModalResult := lForm.ShowModal;

// en dan nog eventueel als je de ModalResult property
// van de TButtons hebt gezet...
case lModalResult
mrOk: // heeft op de OK knop geklikt
mrCancel: // heeft op Cancel geklikt
mrApply: // en nu de Apply button
else
// of iets anders
end;
finally
lForm.Free;
end;
end;
Deze methode was dus absoluut niet netjes, beter is dan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm2.Button1Click(Sender: TObject);
begin
  with TForm1.Create(Self) do
  try
    // Eventuele Initialisatie
    case ShowModal of
    mrOk: ShowMessage('OK');
    mrCancel: ShowMessage('Cancel');
    else
    ShowMessage('Ander knopje');
    end;
  finally
    Release; // Veel veiliger dan Free
  end;
end;

Ik zou zo zeggen: zoek de verschillen! De Self in de Create verwijst nu naar Form2, deze mag naar eigen believen vervangen worden door nil of application of een ander component.

PS: mrApply bestaat niet.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Waarom is release beter als Free, en FreeAndNil dan?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Op woensdag 30 januari 2002 10:29 schreef jelmervos het volgende:
Waarom is release beter als Free, en FreeAndNil dan?
Uit de Delphi help:
Release does not destroy the form until all event handlers of the form and event handlers of components on the form have finished executing. Any event handlers of the form should use Release instead of Free. Failing to do so could lead to an access violation.
Release doet dus hetzelfde als Free maar laat eerst alle event handlers van dat form en de daarop geplaatste componenten 'finishen', stukje veiliger dus.
Het verschil tussen Free en FreeAndNil is dat de variabele (bijv. Form1) bij FreeAndNil ook weer naar nil wordt gezet. Bij gebruik van Free wordt het object gedestroyed en het geheugen vrijgegeven. De variabele verwijst bij Free alleen nog naar een stuk geheugen. Bij gebruik van Assigned(Form1) bijv. zal met gebruik van Free dus idd. True worden teruggegeven in tegenstelling tot FreeAndNil().
Hopelijk een beetje duidelijk?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:59

Creepy

Tactical Espionage Splatterer

En natuurlijk heb je ook nog gewoon form.show. Dan heb je je forms echt naast elkaar open, en kan je ze allebei nog gebruiken.

Het modalresult checken (met een case form.showmodal of, of m.b.v. een if) kan natuurlijk alleen als je knoppen op dat form hebt staan, waaraan je een modalresult hebt toegekent (dit kan m.b.v. de object explorer). Ook kan je het modal result in code zetten in een event van dat form

"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


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:04

Tomatoman

Fulltime prutser

Any event handlers of the form should use Release instead of Free.
Event handlers van het form zelf moeten dus Release gebruiken, maar code buiten het form hoeft dat niet te doen. Sterker nog, de code
code:
1
2
3
4
5
6
  with TForm1.Create(Self) do
  try
    ShowModal;
  finally
    Release;   // bug! Moet Free zijn
  end;

bevat een regelrechte bug. XXX.Free gaat altijd goed, zelfs als XXX nil is. Bij XXX.Release krijg je een access violation als XXX nil is. Ga maar eens met de debugger door de volgende code heen, dan zie je het zelf:
code:
1
2
3
4
5
6
7
8
procedure TForm1.Button1Click(Sender: TObject);
var
  AnyForm: TForm;
begin
  AnyForm := nil;
  AnyForm.Free; // gaat goed
  AnyForm.Release;   // veroorzaakt een access violation
end;

Een goede grap mag vrienden kosten.


Verwijderd

Op woensdag 30 januari 2002 14:10 schreef tomatoman het volgende:

[..]

Event handlers van het form zelf moeten dus Release gebruiken, maar code buiten het form hoeft dat niet te doen. Sterker nog, de code
code:
1
2
3
4
5
6
  with TForm1.Create(Self) do
  try
    ShowModal;
  finally
    Release;   // bug! Moet Free zijn
  end;

bevat een regelrechte bug. XXX.Free gaat altijd goed, zelfs als XXX nil is. Bij XXX.Release krijg je een access violation als XXX nil is. Ga maar eens met de debugger door de volgende code heen, dan zie je het zelf:
code:
1
2
3
4
5
6
7
8
procedure TForm1.Button1Click(Sender: TObject);
var
  AnyForm: TForm;
begin
  AnyForm := nil;
  AnyForm.Free; // gaat goed
  AnyForm.Release;   // veroorzaakt een access violation
end;
Object die niet geassigned is (nil is) en waarbij je zonder enig probleem de methode Free van kan aanroepen vind ik heel vaud. Het is imho niet meer dan logisch dat Release een Access violation geeft!
Gaat het bij Release immers fout dan krijg je, en volkomen terecht, een Access Violation. Kennelijk bij Free niet maar weet jij dan of die wel opgeruimd is?
Ben het dus helemaal niet met je eens. FreeAndNil vind ik dan nog altijd beter. Moet je trouwens eens proberen om Destroy aan te roepen, krijg je ook een Access Violation.
Mijns inziens is de Free zoals je hem hier boven beschreven hebt juist een grote bug.
In jouw voorbeeld roep je de Free aan als member van een object dat helemaal niet bestaat. Ieder andere methode geeft een Access Violation behalve Free. Waarschijnlijk wordt dit intern vertaalt naar iets als 'delete(FSomeObject);' en gaat derhalve niet fout.

/Edit:
Uit de help (procedure Free):
To free a form, call its Release method, which destroys the form and releases the memory allocated for it after all its event handlers and those of the components it contains are through executing.
I rest my case.

  • unclero
  • Registratie: Juni 2001
  • Laatst online: 22:51

unclero

MB EQA ftw \o/

Topicstarter
Hm,
code:
1
   BlaForm.Show;

verrek, t werkt,
bedankt evr1

Quelle chimère est-ce donc que l'homme? Quelle nouveauté, quel monstre, quel chaos, quel sujet de contradiction, quel prodige!


Verwijderd

unclro, je hebt in Delphi iets wat Code Completion of iets in die trant heet. Als je dan iets schrijft als in

"EenOfAnderIets."

verschijnt een lijst met beschikbare properties en methods.
Als je dus
Form1.
intikt, verschijnt er een lijstje met Show, Showmodal, Width, Top, etc. Als je er een beetje doorheen scrollt, zie je vanzelf wat je moet hebben. En dat geldt ook voor de rest van de components en zo.
Het komt erop neer dat wat je ook wilt hebben ACHTER de punt komt, niet ervoor (dus nooit als in Open.Form, da's net zoiets als deurhuis zeggen i.p.v. huisdeur) :).

Overigens, als je met "na veel geld" bedoelt dat je hebt moeten sparen voor Delphi 5, een editie van Delphi6 is gratis te downloaden (als je het niet commercieel gebruikt). Is vast redelijk kaal, maar je kunt van alles en nog wat op Delphi-gebied gratis vinden op Internet en bovendien, als je nog geen formpje kunt openen, heb je vast niet het laatste op Decision Cube en reporting gebied nodig :).

[edit:]
Trouwens, in de help-functie staat Show/Showmodal bij de Methods van TForm en wel onder het kopje "Derived from TCustomForm".
Pagina: 1