[Delphi 7] EConvertError "" is not a valid integer

Pagina: 1
Acties:

  • Arethusa
  • Registratie: December 2003
  • Laatst online: 19:52

Arethusa

Niet die server

Topicstarter
Allereerst wil ik even kwijt dat ik nog een beginneling ben op Delphi gebied. Al heb ik wel een klein beetje ervaring met basiszaken van delphi. Ook heb ik gezocht op het forum maar ik kon niets geschikts vinden wat me zou helpen. Ik heb het volgende probleem:

Ik heb een programma gemaakt die vanuit een .dat bestand cd informatie ophaalt en deze afbeeld in een listbox. Dat werkt prima.

Ik wil de data weergeven in een nieuwe form zodat ik deze kan modifyen. Dat werkt ook. De data word netjes afgebeeld. Maar zo gauw ik deze wil opslaan krijg ik de foutmelding.

Afbeeldingslocatie: http://www.siewesite.nl/screenshot.GIF

Als ik "The" vervang door een 1 (zoals je bovenin het scherm ziet) doet hij het wel.

De fout zit volgens delphi hier:
code:
1
2
3
4
5
6
7
8
9
function TfrmCdDetails.Start (var crCd: TCdRecord; fsState: TFormState): Boolean;
begin
fsCurrentState := fsState;
crCurrentCd := crCd;

result := ShowModal = mrOk; <- hier 

crCd := crCurrentCd
end;

Maar ik zie er niets vreemds aan.

Weet iemand wat ik moet doen? Mocht je meer info willen dan wil ik die natuurlijk plaatsen.

Alvast bedankt.

I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:15
Je zult die 'The' (althans, hetgeen je in die textbox intyped) in een integer opslaan, terwijl het een string is.

Maak je gebruik van databinding in je form ? Zoja, kijk dan eens aan welk veld in je DB die textbox gekoppeld is; waarschijnlijk zal het een numeriek veld zijn.

[ Voor 45% gewijzigd door whoami op 22-12-2004 20:45 ]

https://fgheysels.github.io/


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Je doet ergens iets met de variabele waar de artiestennaam in zit, waarmee je hem behandelt alsof het een integer (natuurlijk getal) is. Je zal dus waarschijnlijk ergens een string naar een integer casten (door de StrToInt functie bijvoorbeeld, of als je het in een database opslaat), en daar gaat het fout. Je fout zit waarschijnlijk niet in bovenstaand stuk code.

[ Voor 6% gewijzigd door NMe op 22-12-2004 20:46 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Arethusa
  • Registratie: December 2003
  • Laatst online: 19:52

Arethusa

Niet die server

Topicstarter
Bedankt voor de reacties. Het enige wat ik via de StrToInt functie omzet is het jaar van uitgave. Ik heb hier de code van het formulier details (waarin de modificatie plaats vind).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
procedure TfrmCdDetails.FormActivate(Sender: TObject);
var
crCd: TCdRecord;

begin
  // set form title
  frmCdDetails.Caption := 'Cd Details';

if fsCurrentState in [ADD, MODIFY]
 then begin
 // Stel property ReadOnly in op FALSE voor alle editboxen
 edtArtistNamePart1.ReadOnly := False;
 edtArtistNamePart2.ReadOnly := FALSE;
 edtTitle.ReadOnly := FALSE;
 edtDescription.ReadOnly := FALSE;
 edtReleaseYear.ReadOnly := FALSE;

 // Button settings
 btnOk.Show;
 btnCancel.Caption := 'Cancel'
end
else begin
 // Stel property ReadOnly in op TRUE voor alle editboxen
 edtArtistNamePart1.ReadOnly := TRUE;
 edtArtistNamePart2.ReadOnly := TRUE;
 edtTitle.ReadOnly := TRUE;
 edtDescription.ReadOnly := TRUE;
 edtReleaseYear.ReadOnly := TRUE;

 // Button settings
 btnOk.Hide;
 btnCancel.Caption := 'Close';
end;

if fsCurrentState in [DISPLAY, MODIFY]
then begin
 // Kopieer data van record naar editboxen
  untCdData.GetCurrentCD(crCD);
  edtArtistNamePart1.Text := crCd.sArtistNamePart1 ;
  edtArtistNamePart2.Text := crCd.sArtistNamePart2;
  edtTitle.Text := crCd.sTitle;
  edtDescription.Text := crCd.sDescription;
  edtReleaseYear.Text := IntToStr(crCd.iReleaseYear)
end
 else begin
 // Wis inhoud van editboxen
  edtArtistNamePart1.Clear;
  edtArtistNamePart2.Clear;
  edtTitle.Clear;
  edtDescription.Clear;
  edtReleaseYear.Clear;
 end
end;


Misschien dat dit wat verduidelijking brengt.


Edit: die php tags horen er natuurlijk niet in.

[ Voor 5% gewijzigd door Arethusa op 23-12-2004 11:07 ]

I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:15
Van welk type is crCd.sArtisNamePart1?

Ga verder ook eens na op welke regel dat die fout precies gebeurt; je moet je code debuggen, dat is 1 van de taken van een programmeur, en het is ook noodzakelijk dat je kunt 'debuggen'. Het is een vrijwel dagelijkse bezigheid voor een programmeur.

Zet een breakpoint in je code (door in de kantlijn te klikken), en voor de code stap voor stap uit.

https://fgheysels.github.io/


  • Arethusa
  • Registratie: December 2003
  • Laatst online: 19:52

Arethusa

Niet die server

Topicstarter
crCd.sArtistNamePart1 behoort hier bij

code:
1
2
3
4
5
6
7
8
9
type
  TCdRecord =
    record
      sArtistNamePart1: String[MAXLEN_NAMEPART1];
      sArtistNamePart2: String[MAXLEN_NAMEPART2];
      sTitle: String[MAXLEN_TITLE];
      sDescription: String[MAXLEN_DESCRIPTION];
      iReleaseYear: Integer
    end;


Dit is afkomst uit de unit untCdData

Wat betreft het debuggen, dat ga ik zeker proberen.


edit:
typo

[ Voor 6% gewijzigd door Arethusa op 23-12-2004 11:42 ]

I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs


  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 05-05 10:41

Bergen

Spellingscontroleur

Het stuk code wat je nu hebt laten zien is de FormActivate, dat wordt uitgevoerd nadat het formulier wordt getoond en dat gaat vast ook allemaal goed. Het gaat mis zodra je op OK drukt. Kun je die code eens laten zien?

  • Arethusa
  • Registratie: December 2003
  • Laatst online: 19:52

Arethusa

Niet die server

Topicstarter
Hier de code van de ok button.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TfrmCdDetails.btnOkClick(Sender: TObject);
// Toevoegen data
var
 crNewCd: TCdRecord;
begin
 if fsCurrentState in [ADD, MODIFY]
 then
  crNewCd.sArtistNamePart1 := edtArtistNamePart1.Text;
  crNewCd.sArtistNamePart2 := edtArtistNamePart2.Text;
  crNewCd.sTitle := edtTitle.Text;
  crNewCd.sDescription := memDescription.Text;
  crNewCd.iReleaseYear := StrToInt(edtReleaseYear.Text);
  if fsCurrentState in [ADD]
  then
  untCdData.AddCD(crNewCd);
  WriteCDs;
  ModalResult := mrOK
end;


De wijzigingen die je maakt (bijvoorbeeld aanpassen van de omschrijving) worden
helemaal niet doorgevoerd terwijl dat (naar mijn idee over de code) wel zou moeten.

P.s ik heb edtDescription vervangen door memDescription

edit:
extra info

[ Voor 10% gewijzigd door Arethusa op 23-12-2004 11:41 ]

I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs


  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 05-05 10:41

Bergen

Spellingscontroleur

Weet je zeker dat dat hokje waar "The" in staat niet perongeluk edtReleaseYear is ipv edtArtistNamePart1, dus dat je ze niet perongeluk hebt omgedraaid?

Verwijderd

Bergen schreef op donderdag 23 december 2004 @ 00:38:
Weet je zeker dat dat hokje waar "The" in staat niet perongeluk edtReleaseYear is ipv edtArtistNamePart1, dus dat je ze niet perongeluk hebt omgedraaid?
Weet eigenlijk wel voor 99% zeker dat dat het probleem is.

Wat handig is hiervoor; zet een breakpoint. Dit kun je doen door de regel code waar je het breakpoint wilt zetten op te zoeken, en dan voor die regel in het grijze gedeelte klikken. Delphi zet nu een rode punt neer, en je hele regel wordt rood. Doe dit bij de 1e regel van je onclick voor die button.

Draai nu het programma (F9) en klik op die OK. Delphi zal dan meteen terugspringen naar de code, naar je breakpoint. Het programma is nu paused. Je kunt nu met F8 regel voor regel door je code stappen, dan zie je vanzelf waar hij met die foutmelding komt. Indien dit bv. gebeurt bij het aanroepen van een functie, kun je die functie inspringen door ipv. F8, F7 te gebruiken.

Overigens.. waarom gebruik je [ code=php] tags, terwijl er ook [ code=Delphi] tags zijn?

Delphi:
1
2
3
begin
  if 1337 then use(Delphi)
end;

  • Arethusa
  • Registratie: December 2003
  • Laatst online: 19:52

Arethusa

Niet die server

Topicstarter
Ik heb in de btnOk procedure op de regel waar Begin staat een breakpoint gezet. Ik loop door de code heen maar hij slaat AddCD over lijkt het, althans daar komt geen blauw lijntje op de regel te staan. De rest van de code die daarna gebruikt word, word wel gepakt.

De waarde die in edtArtistNamePart2 was gevuld heb ik tijdens het runnen in edtArtistNamePart1 gezet. Die verandering word bevestigd als ik tijdens het debuggen. Met andere woorde. De waarde die eerst in sArtistNamePart2 stond staat nu in sArtistNamePart2.

Dat lees ik af (tijdens het debuggen) uit deze regel:
code:
1
untCdData.AddCD(crNewCd);


Echter word deze regel niet gemarkeerd. Verder lijkt het mij ook dat de waar in
code:
1
 if fsCurrentState in [ADD]


niet ADD is. Terwijl ADD wel ADD is volgens de debugger. Als ik in diezelfde procedure ADD in MODIFY verander word de regel wel gepakt alleen komt de waarde in de lijst. Ik krijg hierdoor dubbele waarden.
Wat nu te doen?

I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 12:05

Tomatoman

Fulltime prutser

Je gebruikt een variabele fsCurrentState van het type TFormState. Als ik je code bekijk lijkt TFormState me een door jou gedefinieerd enumerated type. Hij heeft een beetje ongelukkige naam, aangezien TFormState al bestaat in Delphi en wel als een property van TForm.
Sieweshaoao schreef op donderdag 23 december 2004 @ 13:26:
[...]
Delphi:
1
 if fsCurrentState in [ADD]
Waarom schrijf je dat niet gewoon als
Delphi:
1
2
if fsCurrentState = ADD then
  ...
Dat is al een stuk duidelijker :)
Sieweshaoao schreef op woensdag 22 december 2004 @ 23:06:
Hier de code van de ok button.

[stukje code]

De wijzigingen die je maakt (bijvoorbeeld aanpassen van de omschrijving) worden
helemaal niet doorgevoerd terwijl dat (naar mijn idee over de code) wel zou moeten.
Logisch dat er niets wordt aangepast in de database, want je post nergens de wijzigingen die je in de record doorvoert. Normaliter zou ergens in je code MijnRecordSet.Edit en MijnRecordSet.Post staan, maar dat is nergens het geval.
Sieweshaoao schreef op woensdag 22 december 2004 @ 20:52:
Delphi:
44
45
46
47
48
49
50
51
52
53
...
 else begin
 // Wis inhoud van editboxen
  edtArtistNamePart1.Clear;
  edtArtistNamePart2.Clear;
  edtTitle.Clear;
  edtDescription.Clear;
  edtReleaseYear.Clear;
 end
end;

Misschien dat dit wat verduidelijking brengt.
Het brengt zeker wat duidelijkheid, want uit je commentaar op regel 46 blijkt dat je niet helemaal begrijpt wat je doet :). Met regel 47 t/m 51 wis je de velden in het op dat moment geselecteerde record in je dataset. Als gevolg daarvan zie je dat er geen gegevens in de editboxen worden weergegeven, want de daaraan gekopelde velden in de database zijn leeg. Je wist dus niet de inhoud van de editboxen, maar doet iets anders.

Lees in een boek over Delphi eens wat over de grondbeginselen van databaseprogramma's, ik krijg een beetje de indruk dat je nu een hoop aan het proberen bent zonder precies te begrijpen wat je doet. Het is allemaal niet moeilijk, maar met trial and error schiet het niet echt op.

Nog een offtopic tip: lees de Object Pascal Style Guide eens, waarin een hoop nuttigs staat over zaken als naamgeving van variabelen, hoofdlettergebruik en inspringen. Je code zal er leesbaarder van worden :)

Een goede grap mag vrienden kosten.


  • Arethusa
  • Registratie: December 2003
  • Laatst online: 19:52

Arethusa

Niet die server

Topicstarter
Mijn excuses. Ik moet erkennen dat ik niet helemaal duidelijk ben geweest. Ik maak in het programma geen gebruik van een database. Ik maak gebruik van een .DAT bestand.

De fout die ik in mijn beginpost aangaf is inmiddels opgelost.

Nu iets over het programma.
In de formulieren word gebruik gemaakt van 3 standen: DISPLAY, MODIFY en ADD . De eerste stand is voor het afbeelden van data, de tweede is om data te wijzigen en de derde is om data aan het .DAT bestand toe te voegen.

Het Detail formulier begint in de ADD stand als je een cd wilt toevoegen, vandaar het legen van de inhoud van de tekstboxen in de laatste else begin. Je wilt geen data van het 1e record in je velden hebben staan als je een nieuwe cd wilt toevoegen.

De DISPLAY stand van het formlier dient alleen om een cd met details af te beelden. De editboxen worden daarom ook ReadOnly gemaakt.

De MODIFY stand van het formulier maakt het mogelijk om data aan te passen. De data word afgebeeld en kan bewerkt worden.

Dit gebeurd allemaal tijdens de FormActivate procedure.

Het probleem zit hem nu in het feit dat ik de data kan bewerken van de Modify button (code daarvan bevindt zich elders in dit topic) maar dat de wijzigingen (na het klikken op OK) niet opgeslagen word. Het formulier sluit zich en toont het beginscherm weer. Debuggen leert me dat het formulier op het moment dat ik op OK klik niet in de juiste stand staat. Ik weet ook niet precies hoe ik dat voor elkaar kan krijgen.

Wat betrefd mijn coderinglayout. De manier zoals ik de code omschrijf is me zo aangeleerd. Maar het kan altijd beter zoals gezegd is :)


Misschien dat dit nog iets duidelijker en bedankt dat jullie zo geduldig zijn.

I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 12:05

Tomatoman

Fulltime prutser

Sieweshaoao schreef op donderdag 23 december 2004 @ 20:25:
Het probleem zit hem nu in het feit dat ik de data kan bewerken van de Modify button (code daarvan bevindt zich elders in dit topic) maar dat de wijzigingen (na het klikken op OK) niet opgeslagen word. Het formulier sluit zich en toont het beginscherm weer. Debuggen leert me dat het formulier op het moment dat ik op OK klik niet in de juiste stand staat. Ik weet ook niet precies hoe ik dat voor elkaar kan krijgen.
Debuggen kan je ook leren waar fsCurrentState de verkeerde waarde krijgt. Dat kun je bijvoorbeeld uitvinden door een breakpoint te zetten op het punt waar je fsCurrentState de juiste waarde geeft. Je definieert ook een watch voor fsCurrentState (View - Debug Windows - Watches). Als je programma stopt bij het breakpoint, stap je met Trace Into (F7) regel voor regel door je code. Je ziet dan vanzelf wel een keer aan de watch dat de waarde van fsCurrentState verandert, waarmee je de coderegel die dat doet te pakken hebt.

Een goede grap mag vrienden kosten.

Pagina: 1