Quelle chimère est-ce donc que l'homme? Quelle nouveauté, quel monstre, quel chaos, quel sujet de contradiction, quel prodige!
of
Form1.Visible := true;
Zoek het verschil maar zelf uit
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
Nu heb ik geen ervaring met Delphi, maar eerlijkgezegd klinkt Form1.open beter...[b]Op woensdag 30 januari 2002 09:01 schreef unclero
code:
1 2 3 4procedure TMainform.HelpAbout(bla : integer); begin { iets als Open.Form1 ??} end;
[totzover mijn zinloze reply]
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
Deze methode was dus absoluut niet netjes, beter is dan: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;
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.
"The shell stopped unexpectedly and Explorer.exe was restarted."
Verwijderd
Uit de Delphi help:Op woensdag 30 januari 2002 10:29 schreef jelmervos het volgende:
Waarom is release beter als Free, en FreeAndNil dan?
Release doet dus hetzelfde als Free maar laat eerst alle event handlers van dat form en de daarop geplaatste componenten 'finishen', stukje veiliger dus.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.
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?
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
Event handlers van het form zelf moeten dus Release gebruiken, maar code buiten het form hoeft dat niet te doen. Sterker nog, de codeAny event handlers of the form should use Release instead of Free.
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:
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
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!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 6with 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;
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):
I rest my case.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.
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
"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".