[Delphi] cancel button code

Pagina: 1
Acties:
  • 100 views sinds 30-01-2008
  • Reageer

  • satyriasis
  • Registratie: Januari 2000
  • Laatst online: 14-07 22:05
Ik heb sinds een lange tijd maar weer eens delphi erbij genomen om een oud project af te maken :) ( voor de gene die het willen weten, het wordt een programma wat toernooien kan berekenen en daar de score bij houden ).

maar ff ontopic ( ow damn ik begin net de topic >:) ) ik heb dus een form met daarop een OK knop en een cancel knop. op het moment dat ik op ok druk werkt alles perfect. op het moment dat ik een waarde verander en op cancel druk dan onthoud hij toch de nieuwe waarde ondanks dat ik cancelbutton.cancel := true doe.

google is ook niet echt duidelijk in dit probleem en ik kon hier op got weinig vinden met de search.

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:31
Is dat een modal form waar je het over hebt?

Zoja, heb je al geprobeerd om de ModalResult property op mrCancel te zetten?

Wat wil je precies dat die cancel button doet?
Een cancel button gaat normaal gezien het scherm gaan afsluiten zonder de waardes te bewaren of er iets mee te doen.

Als ik jouw post zo lees, dan vermoed ik dat jij het scherm niet wilt afsluiten?

[ Voor 51% gewijzigd door whoami op 21-04-2003 23:45 ]

https://fgheysels.github.io/


Verwijderd

Ik denk toch dat jezelf, af moet vangen (zie post van whoami), wat de resultcode is van je form, dus mrOk of mrCancel.
Vervolgens kan je met deze waarde wat gaan doen.
Ik neem aan dat je form statisch, dus Delphi onthoudt waarschijnlijk de laatst ingevulde waarde's. Wat je kan doen is alle waardes opslaan, en bij een mrCancel terugzetten.

Of beter, indien je een mrOk terug krijgt, de waardes van het Form overnemen, en
bij de form.OnShow, vul je de gegevens weer in in de betreffende edits, checkboxes etc.

  • CyeZ
  • Registratie: September 2001
  • Laatst online: 05:41

CyeZ

Vroem vroem!!!

Het enige wat de 'Cancel' property doet is zorgen dat die specifieke button gebruikt wordt wanneer je op escape drukt. Je zult nog wel moeten zorgen dat je zelf de juist code achter de onClick van de button hangt, of in het geval van een modal form de ModalResult van de button moeten instellen.

[18:54] <Prammenhanger> |HunterPro|eet
[18:55] <Prammenhanger> lijkt best op
[18:55] <Prammenhanger> |HunterProFeet


  • satyriasis
  • Registratie: Januari 2000
  • Laatst online: 14-07 22:05
ik heb dus inderdaad een statisch form, ik had zelf ook al bed8 dat ik alle waardes moest gaan opslaan en als er op cancel gedrukt word dan de waardes terugzetten, maar ik denk misschien dat er een handigere methode voor is. of is een makelijkere methode?

@whoami: ik wil dus dat op het moment dat ik het scherm afsluit doormiddel van die cancel knop dat alle oude waardes erin komen

ps sorry voor late reactie, ik had gister ruzie met de stabiliteit van mijn pc. ik krijg gelukkig zaterdag een nieuw mobo

[ Voor 34% gewijzigd door satyriasis op 22-04-2003 10:49 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:31
satyriasis schreef op 22 April 2003 @ 10:48:
ik heb dus inderdaad een statisch form, ik had zelf ook al bed8 dat ik alle waardes moest gaan opslaan en als er op cancel gedrukt word dan de waardes terugzetten, maar ik denk misschien dat er een handigere methode voor is. of is een makelijkere methode?
Neen.
Programmeren is wel wat meer hoor dan enkel wat properties zetten. Je zult zelf ook nog code moeten schrijven van wat er nu moet gebeuren.

https://fgheysels.github.io/


  • satyriasis
  • Registratie: Januari 2000
  • Laatst online: 14-07 22:05
dat weet ik alleen, zijn er voor de meeste dingen altijd wel wat foefjes. aangezien ik (nog) niet z'n ster in delphi ben, d8 ik laat ik het de experts vragen _/-\o_

  • Schmoove
  • Registratie: Juli 2001
  • Laatst online: 20-08 11:58
Stel je hebt een Ok en een Cancel button. Is het dan niet makkelijker als je alles opslaat als er op Ok gedrukt wordt en gewoon form1.Close aanroept als er op Cancel gedrukt wordt.
Tenminste zo doe ik het altijd, lekker makkelijk, heb je ook het probleem niet dat je waardes moet gaan onthouden enzo.

  • satyriasis
  • Registratie: Januari 2000
  • Laatst online: 14-07 22:05
bij mij slaat hij standaard alles op als ik form1.close doe
edit:
maar heb jij statische forms??

[ Voor 27% gewijzigd door satyriasis op 22-04-2003 11:04 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:31
satyriasis schreef op 22 april 2003 @ 11:03:
bij mij slaat hij standaard alles op als ik form1.close doe :?
Waar staat je code dan die zorgt dat alles opgeslagen wordt? (Welke event-handler)
Waar sla je alles op? (in een DB, in een file, ....)
Hoe ziet die code eruit die zorgt voor het opslaan?

https://fgheysels.github.io/


  • satyriasis
  • Registratie: Januari 2000
  • Laatst online: 14-07 22:05
dit is nu de code bij mijn knoppen ( ja ik weet dat het hetzelfde is :) )

code:
1
2
3
4
5
6
7
8
9
procedure TfrmToernooiOpties.OKButtonClick(Sender: TObject);
begin
  close;
end;

procedure TfrmToernooiOpties.CancelButtonClick(Sender: TObject);
begin
  close;
end;

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:31
Ik zie daar dus nergens iets wat ervoor zorgt dat je gegevens opgeslagen worden....

Sla je de gegevens op in een DB of iets dergelijks, of wat bedoel je met 'hij slaat alles standaard op'. Waar zie je dat dat het opgeslagen wordt?

https://fgheysels.github.io/


  • satyriasis
  • Registratie: Januari 2000
  • Laatst online: 14-07 22:05
op het moment dat ik mijn form sluit en daarna weer open staan de nieuwe waardes er weer in

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:31
Hoe open je je form opnieuw?
Hoe zorg je ervoor dat de waardes in die form gezet worden?

https://fgheysels.github.io/


  • satyriasis
  • Registratie: Januari 2000
  • Laatst online: 14-07 22:05
dit is de code waarmee ik het form open:
code:
1
2
3
4
procedure TfrmMain.oernooiopties1Click(Sender: TObject);
begin
  frmToernooiOpties.ShowModal;
end;

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:31
Doe eens als volgt:

zorg ervoor dat je form frmToernooiOpties niet autocreated is (project / options / forms ).

Zorg erdan voor dat je zelf een instance maakt van TfrmToernooiOpties:

code:
1
2
3
4
5
6
7
8
procedure TfrmMain.ButtonClick ( Sender : TObject )
var
   frmOpties : TfrmToernooiOpties;
begin

   frmOpties := TfrmToernooiOpties.Create (Self);
   frmOpties.ShowModal();
end;


Zorg ervoor dat je in de OnCreate handler van je TfrmToernooiOpties form de juiste waardes in je form inlaad, en in de OnClick van de OkButton op dat form zorgt dat de waardes bewaard worden.

https://fgheysels.github.io/


  • satyriasis
  • Registratie: Januari 2000
  • Laatst online: 14-07 22:05
ik moet nu weg, maar ik ga het zeker proberen. ik laat nog van mij horen. bedankt

  • Schmoove
  • Registratie: Juli 2001
  • Laatst online: 20-08 11:58
Beetje vaag. Maar ik neem aan dat jij het opslaan van waardes dus regelt in events van andere componenten (zoals een combobox, checkbox, etc.).
Dit is niet echt slim. Het best is om het afhandelen van het bewaren van gegevens onder de Ok button te zetten. Dan is ook makkelijker om weer bepaalde stukken code terug te vinden.
De Ok en de Close button hebben een totaal andere functie.... het is dan ook hoogst bizar dat er onder die knoppen dezelfde code zit. Ik zou dat veranderen als ik jou was.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

whoami schreef op 22 april 2003 @ 11:14:
code:
1
2
3
4
5
6
7
8
procedure TfrmMain.ButtonClick (Sender : TObject )
var
   frmOpties : TfrmToernooiOpties;
begin

   frmOpties := TfrmToernooiOpties.Create (Self);
   frmOpties.ShowModal();
end;
Geheugenlek! Dit lijkt me beter:
Delphi:
1
2
3
4
5
6
7
8
9
procedure TfrmMain.ButtonClick(Sender: TObject);
begin
  with TfrmToernooiOpties.Create(Self) do
  try
    ShowModal;
  finally
    Free;
  end;
end;

[ Voor 1% gewijzigd door Tomatoman op 22-04-2003 16:52 . Reden: code opgemaakt volgens Delphi-conventies ]

Een goede grap mag vrienden kosten.


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:31
tomatoman schreef op 22 april 2003 @ 16:50:
[...]
Geheugenlek! Dit lijkt me beter:
Delphi:
1
2
3
4
5
6
7
8
9
procedure TfrmMain.ButtonClick(Sender: TObject);
begin
  with TfrmToernooiOpties.Create(Self) do
  try
    ShowModal;
  finally
    Free;
  end;
end;
Hoezo geheugenlek?

Ik dacht dat de VCL zelf het geheugen opruimt voor VCL classes? TForm is een VCL class, dus....

https://fgheysels.github.io/


  • satyriasis
  • Registratie: Januari 2000
  • Laatst online: 14-07 22:05
Schmoove schreef op 22 April 2003 @ 12:46:
Beetje vaag. Maar ik neem aan dat jij het opslaan van waardes dus regelt in events van andere componenten (zoals een combobox, checkbox, etc.).
Dit is niet echt slim. Het best is om het afhandelen van het bewaren van gegevens onder de Ok button te zetten. Dan is ook makkelijker om weer bepaalde stukken code terug te vinden.
De Ok en de Close button hebben een totaal andere functie.... het is dan ook hoogst bizar dat er onder die knoppen dezelfde code zit. Ik zou dat veranderen als ik jou was.
ik regel helemaal nix voor het opslaan, hij doet alles automagisch :S als ik mijn form dynamisch maak dan krijg ik telkens de standaard waarde als ik mijn form open. het is de bedoeling dat als ik een waarde verander dat die blijft staan, tenzij er op cancel gedrukt word

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

whoami schreef op 22 April 2003 @ 17:08:
Hoezo geheugenlek?

Ik dacht dat de VCL zelf het geheugen opruimt voor VCL classes? TForm is een VCL class, dus....
  1. De VCL ruimt het geheugen niet zelf op.
    (Er zijn hier wel een paar uitzonderingen op.)
  2. Windows ruimt het geheugen pas op wanneer het programma wordt afgesloten. Iedere keer als je een Form opent met jouw code, wordt er geheugen gealloceerd. Als je dat maar vaak genoeg herhaalt zonder tussendoor het programma te sluiten, loopt Windows vanzelf wel een keer vast.
  3. Dit is een typisch voorbeeld van slecht programmeren. Jij als programmeur alloceert het geheugen, dus ben jij er als programmeur ook voor verantwoordelijk dat het weer wordt vrijgegeven. Dat hoor je onder alle omstandigheden te doen (dus zelfs als er een exception optreedt), vandaar de try... finally constructie.
Een van de uitzonderingen op punt 1: als je in de OnClose event van het form de parameter CloseAction op caFree zet, wordt het form wél automatisch vernietigd.

Een goede grap mag vrienden kosten.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

whoami schreef op 22 April 2003 @ 17:08:
[...]


Hoezo geheugenlek?

Ik dacht dat de VCL zelf het geheugen opruimt voor VCL classes? TForm is een VCL class, dus....
Niet allemaal, maar componenten en forms wel ja. Via een Owner structuur. De Owner is degene die je meegeeft via de constructor. In jouw voorbeeld geef je Self mee (het MainForm) als Owner en deze zal ook m ook vrijgeven als ie gesloten wordt.

Als je een object niet meer gebruikt is het wel zo efficient om m meteen weg te gooien als je de kans daar toe hebt. Met ShowModal is het vrij makkelijk om dat te doen, omdat je precies weet wanneer je m niet meer nodig hebt.

Kortom: Jullie hebben beide gelijk, tis een kwestie van smaak/efficientie. :)

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:31
tomatoman schreef op 22 April 2003 @ 19:27:
[...]
  1. De VCL ruimt het geheugen niet zelf op.
    (Er zijn hier wel een paar uitzonderingen op.)
  2. Windows ruimt het geheugen pas op wanneer het programma wordt afgesloten. Iedere keer als je een Form opent met jouw code, wordt er geheugen gealloceerd. Als je dat maar vaak genoeg herhaalt zonder tussendoor het programma te sluiten, loopt Windows vanzelf wel een keer vast.
  3. Dit is een typisch voorbeeld van slecht programmeren. Jij als programmeur alloceert het geheugen, dus ben jij er als programmeur ook voor verantwoordelijk dat het weer wordt vrijgegeven. Dat hoor je onder alle omstandigheden te doen (dus zelfs als er een exception optreedt), vandaar de try... finally constructie.
Niet helemaal.
Zoals LordLarry al zei, is de owner iedere keer verantwoordelijk voor het vrijgeven van het geheugen.
Als ik een form A heb, die op zijn beurt een form B opent, dan wordt het geheugen van form B dus vrijgegeven als ik form A sluit.
Het is idd wel netter om het geheugen direct vrij te geven als je het niet meer nodig hebt.

https://fgheysels.github.io/


  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09-2025

BdR

TV is gooder then books

satyriasis schreef op 22 April 2003 @ 11:06:
dit is nu de code bij mijn knoppen ( ja ik weet dat het hetzelfde is :) )

code:
1
2
3
4
5
6
7
8
9
procedure TfrmToernooiOpties.OKButtonClick(Sender: TObject);
begin
  close;
end;

procedure TfrmToernooiOpties.CancelButtonClick(Sender: TObject);
begin
  close;
end;
je kan beter de properties van de OK en CANCEL knoppen op de volgende manier aanpassen, zie lijstje:
code:
1
2
3
4
5
property    | OKButton CancelButton
---------------------------------
Default     | TRUE     FALSE
Cancel      | FALSE    TRUE
ModalResult | mrOk     mrCancel

hiermee is die bovenstaande code met "close;" niet meer nodig. Als je nu op de OK of CANCEL knop klikt, wordt automatisch het formClose event aangeroepen en het ModalResult gezet (ook zijn de knoppen ENTER en ESC nu automatisch gekoppelt aan die buttons)

En je zal toch echt moeten aangeven waar de gevens worden opgeslagen (in database of file of bedoel je alleen de waarden v/d variabelen). En in welke event wordt de procedure aangeroepen die het daadwerkelijk op slaat :? want ik snap het probleem niet helemaal

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


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

cimbom

Just Kidding

tomatoman schreef op 22 April 2003 @ 16:50:
[...]
Geheugenlek! Dit lijkt me beter:
Delphi:
1
2
3
4
5
6
7
8
9
procedure TfrmMain.ButtonClick(Sender: TObject);
begin
  with TfrmToernooiOpties.Create(Self) do
  try
    ShowModal;
  finally
    Free;
  end;
end;
nou dit lijkt me beter:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
procedure TfrmMain.ButtonClick(Sender: TObject);
var
 aForm :TfrmToernooiOpties; 
begin
  aForm := TfrmToernooiOpties.Create(Self) ;  
  try
    aForm.ShowModal;
  finally
    aForm.Free;
  end;
end;

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:31
Dat is gewoon een kwestie van smaak en syntax en is hier verder niet echt aan de orde.
Ik ben het wel met je eens dat jouw code-voorbeeld duidelijker is en prettiger leest.

https://fgheysels.github.io/


  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

We hebben overigens nog steeds geen antwoord op de vraag -welke- gegevens je form opslaat. Wordt er iets in de database (als die er al is) opgeslagen? Zo ja, dan moet je eens het een en ander over de methoden post, transaction en rollback lezen. Zeer verhelderend en de Delphi help is er duidelijk zat over :)

Forget your fears...
...and want to know more...


Verwijderd

Wat ik vaak doe bij dialogen die instellingen bewerken.
-Properties maken van de instellingen op de Form
-Bij start programma properties zetten vanuit registry/inifile/ of standaard waarde
-Method op form iets van 'DoOptions'
code:
1
2
3
4
5
6
7
8
procedure tfrmOpties.DoOptions;
begin
  // Zet dialoog elementen (edit,radiobutton,checkbox) aan de hand van de properties
  If ShowModal=mrOK then
  begin
    // Zet properties aan de hand van de dialoog elementen
  end;
end;

Dit geeft je de mogelijkheid om helder te reageren op de cancel knop, of het kruisje, en de communicatie met de rest van je programma loopt rechtstreeks via de form, en niet via onderdelen ervan

  • killermar
  • Registratie: Augustus 2002
  • Laatst online: 12-07 08:05
Satyriasis, maak je gebruik van de data-aware controls (TDBEdit etc)? Zo ja, dan moet je maar een kijken naar de Cancel method van een dataset.

  • satyriasis
  • Registratie: Januari 2000
  • Laatst online: 14-07 22:05
whoami schreef op 23 April 2003 @ 12:07:
Dat is gewoon een kwestie van smaak en syntax en is hier verder niet echt aan de orde.
Ik ben het wel met je eens dat jouw code-voorbeeld duidelijker is en prettiger leest.
Er word "nog" nix opgeslagen in een databeest of zo, hij slaat alles op in het geheugen ( denk ik :? )

@killermar : neej dus, er hangt nog geen database aan, ik weet namelijk nog neit hoe ik het ga opslaan, daar zal ik nog wel een keer een topic over openen ter zijner tijd

[ Voor 20% gewijzigd door satyriasis op 24-04-2003 13:49 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:31
satyriasis schreef op 24 April 2003 @ 13:47:
[...]


Er word "nog" nix opgeslagen in een databeest of zo, hij slaat alles op in het geheugen ( denk ik :? )
Denk je?
Als je een form afsluit, en je bewaart de gegevens die je in de textvakken ed hebt ingegeven nergens, dan zijn die gegevens ook foetsie bij het afsluiten natuurlijk.

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Kleine nuance nog op het verhaal van whoami:

Het sluiten van een form met Close sluit het form niet echt, maar maakt m onzichtbaar. Als de programmeur tenminste geen extra code daarvoor heeft toegevoegd. Dan staan de gegevens nog wel in de tekstvakken. Evengoed niet erg netjes.

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:31
LordLarry schreef op 24 April 2003 @ 15:52:
Kleine nuance nog op het verhaal van whoami:

Het sluiten van een form met Close sluit het form niet echt, maar maakt m onzichtbaar. Als de programmeur tenminste geen extra code daarvoor heeft toegevoegd. Dan staan de gegevens nog wel in de tekstvakken. Evengoed niet erg netjes.
Gewoon in de OnClose event volgende regel opnemen:
code:
1
Action := caFree;


:Y)

https://fgheysels.github.io/

Pagina: 1