[delphi] SpinEdit, onchange, vastloper bij handmati invoeren

Pagina: 1
Acties:

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Allereerst moet ik even kwijt dat ik echt een ongelofelijke new-bie ben met Delphi (heb er nu twee dagen mee gewerkt...)

In ieder geval heb ik het volgende probleem:

Ik maak gedurende runtime een X aantal SpinEdit's aan. Deze houd ik bij in een componentlist (clZones).
Op een gegeven moemnt wil ik alle waarden optellen die staan in de aangemaakte SpinEdit's. Daarom roep ik de componentlist aan en typecast ik hem naar SpinEdit, zodat ik de waarde value eruit kan halen, die ik nodig heb om alles op te tellen.

Dat doe ik alsvolgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
{Telt het aantal locaties dat er in de zones is}
procedure TfrMain.TelAantalLocaties(Sender: TObject);
var i,j,k : integer;
begin
  j:=0;
  for i := clZones.Count-1 downto 0 do
  begin
    k:=TSpinEdit(Clzones[i]).value;
    j:=j+k;
  end;
  edtAantalLocaties.Text:=IntToStr(j);
end;


Deze procedure wordt aangeroepen bij het onchange event van de SpinEdit. Het werkt in principe goed als je de +1 en -1 knopjes gebruikt van de SpinEdit. Maar zodra je handmatig (dus met je numpad) een waarde invoert in de Spinedit, dan crasht het programma.

Volgens mij omdat ie op dat moment eerst de box even leeg maakt om er vervolgens een getal in te zetten. Bij het leegmaken wordt de procedure TelAantalLocaties aangeroepen en is die box leeg, dus werkt mijn typecasting niet, en crasht de boel.

Is dit inderdaad wat er fout gaat, en zoja, wat kan ik daar aan doen? Zonee, wat gaat er dan fou en wat is dan de oplossing?

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:49
Heb je al eens gedebugged en weet je zeker dat het bij die casting ligt? Zonee, debug eens.
Zoja, kan je niet checken of de cast zal lukken?

Met welke fout crashed hij trouwens?

https://fgheysels.github.io/


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
whoami schreef op 06 mei 2003 @ 11:20:
Heb je al eens gedebugged en weet je zeker dat het bij die casting ligt? Zonee, debug eens.
Zoja, kan je niet checken of de cast zal lukken?

Met welke fout crashed hij trouwens?
Dit is de foumelding:
---------------------------
Debugger Exception Notification
---------------------------
Project ArtikelAanZoneToewijzer.exe raised exception class EConvertError
with message ''' is not a valid integer value'. Process stopped. Use Step or
Run to continue.
---------------------------
OK Help
---------------------------
Zoals je ziet zegt ie dat er geen valid integer value staat. Verder treed de foutmelding alleen op als ik het handmatig verander. Als ik TelAantalArtikelen niet laat aanroepen met het onchange event (wat ik wel wil) dan loopt ie nooit vast.

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Net even ge-debugged en hij crasht inderdaad bij die typecasting.

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:49
Wel, je kan toch checken of de inhoud numeriek is alvorens je cast?

https://fgheysels.github.io/


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

oplossing: de onchange veranderen in een onExit of voor je onchange een criterium zetten
Delphi:
1
2
if SpinEdit.Text <> '' then
  Blaat;


Die laatste oplossing is natuurlijk veeeel netter dan de eerste. Wat misschien nog netter is, is een try .. except, waarin je in de try probeert de waarde van de spinedit aan een integer toe te kennen, en in de except de procedure exit. Na de try .. except kun je dan je tel-functie aanroepen.

[ Voor 53% gewijzigd door OZ-Gump op 06-05-2003 11:40 . Reden: Nog een ideetje... ]

My personal website


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
whoami schreef op 06 May 2003 @ 11:36:
Wel, je kan toch checken of de inhoud numeriek is alvorens je cast?
En hoe doe ik dat? (Ben ten slotte newbie, want ik zat al iest soortgelijks te proberen, dat als de inhoud void is dat ie dan uit de procedure springt. Maar void kent ie niet in delphi, volgens mij)

Ik ga ff de oplossing proberen die boven deze post staat.

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
OZ-Gump schreef op 06 mei 2003 @ 11:37:
oplossing: de onchange veranderen in een onExit of voor je onchange een criterium zetten
Delphi:
1
2
if SpinEdit.Text <> '' then
  Blaat;


Die laatste oplossing is natuurlijk veeeel netter dan de eerste. Wat misschien nog netter is, is een try .. except, waarin je in de try probeert de waarde van de spinedit aan een integer toe te kennen, en in de except de procedure exit. Na de try .. except kun je dan je tel-functie aanroepen.
THNX!! dat is de oplossin, de laatste dus, want dat is mooier en wat ik wilde. Ik zat al te proberen om hem uit de procedure te late springen als de value, void was. maar ik wist niet hoe je dat zei. Maar dat kun je dus oplossen door de text op te vragen en te zeggen dat ie niks doet als dat een lege string is.

Had het trouwens ook gekund via de .value? Dus zeggen:

Delphi:
1
If SpinEdit.value <> void/er staat niks then ....

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:49
void bestaat niet in Delphi.
Ook in C++ zou dat niet lukken hoor. ;)

Als je wilt checken of iets leeg is, kan je checken op NULL (nil in Delphi), maar ik weet niet of dat werkt in het geval van die spinctrl.

https://fgheysels.github.io/


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

CyeZ

Vroem vroem!!!

whoami schreef op 06 mei 2003 @ 12:30:
void bestaat niet in Delphi.
Ook in C++ zou dat niet lukken hoor. ;)


Als je wilt checken of iets leeg is, kan je checken op NULL (nil in Delphi), maar ik weet niet of dat werkt in het geval van die spinctrl.
Nee dat kan inderdaad niet, want de .value van een TSpinEdit is een integer. En een integer kun je geen nil aan assignen. De methode om te controleren of de .text leeg is is dus correct.

Een andere manier zou zijn
Delphi:
1
2
3
4
5
try
  k := TSpinEdit(Clzones[i]).value;
except
  <doe iets om exceptie af te handelen.>
end;

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


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
De try.. ..except oplossing werkt merkwaardig genoeg niet bij...

Maar even een ander standaard probleem:

code:
1
2
3
4
5
1. Maak een form met twee SpinEdit's en druk op F9
2. Selecteer het getal in de eerste SpinEdit
3. Druk op backspace
4. Klik met je muis in de andere SpinEdit
5. Delphi crasht, er staat namelijk niks in de SpinEdit en dat kan niet


Altijd als je spinedits gebruikt heb je te maken met dat probleem. Hoe los je dat op? Met de spinedit.text<>'' of try.. ..except lukt het mij niet.
Wat kun je er wel aan doen?

EDIT
Foutje, werkt wel als je het aan de OnExit doet :X

Delphi:
1
2
3
4
5
procedure TfrMain.GeefWaardeAlsLeeg(Sender: TObject);
begin
 if TSpinEdit(Sender).text='' then
  TSpinEdit(Sender).value:=1;
end;

[ Voor 28% gewijzigd door Oscar Mopperkont op 06-05-2003 13:19 ]


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

Tomatoman

Fulltime prutser

Gefeliciteerd Oscar Mopperkont, je bent op de tweede dag dat je met Delphi werkt tegen een bug aangelopen die er al vanaf versie 1 inzit :). Als je de waarde van de Value property van een TSpinEdit uitleest op het moment dat de spin edit leeg is, krijg je een exception om je oren geslingerd. Alleen controleren of de tekst een lege string is, is niet genoeg. Ook de waarde '-' (je wilde bijvoorbeeld -1 gaan invoeren) levert een EConvertError op. Cyez heeft al een prima werkende workaround gegeven.

Misschien vind je de volgende code voor de OnExit event handler wel handig.
Delphi:
1
2
3
4
5
6
7
8
9
10
procedure TfrMain.SpinEditExit(Sender: TObject);
begin
  with TSpinEdit(Sender) do
    try
      Value := Value;  // kan een EConvertError veroorzaken
    except
      ShowMessage('Voer een geldig getal in de spin edit in.');
      SetFocus;
    end;
end;

Een goede grap mag vrienden kosten.


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
tomatoman schreef op 06 May 2003 @ 22:25:
Gefeliciteerd Oscar Mopperkont, je bent op de tweede dag dat je met Delphi werkt tegen een bug aangelopen die er al vanaf versie 1 inzit :). Als je de waarde van de Value property van een TSpinEdit uitleest op het moment dat de spin edit leeg is, krijg je een exception om je oren geslingerd. Alleen controleren of de tekst een lege string is, is niet genoeg. Ook de waarde '-' (je wilde bijvoorbeeld -1 gaan invoeren) levert een EConvertError op. Cyez heeft al een prima werkende workaround gegeven.

Misschien vind je de volgende code voor de OnExit event handler wel handig.
Delphi:
1
2
3
4
5
6
7
8
9
10
procedure TfrMain.SpinEditExit(Sender: TObject);
begin
  with TSpinEdit(Sender) do
    try
      Value := Value;  // kan een EConvertError veroorzaken
    except
      ShowMessage('Voer een geldig getal in de spin edit in.');
      SetFocus;
    end;
end;
Het was inmiddels de derde dag dat ik er mee bezig was ;) Maar ik ga de code zeker gebruiken, thnx!
Pagina: 1