Toon posts:

[delphi6] invalid pointer operation

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

Verwijderd

Topicstarter
Hi,

ik ben bezig met een programma, en die vult een array. Maar als ik het programma opstart krijg ik de volgende fout:

invalid pointer operation


Hieronder een stukje code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
A: array of Integer;
i: Integer;
begin
  i := 0;
  SetLength(A, 3);


  while not DataSource1.DataSet.Eof do i := i + 1;
  begin
    A[i] := DataSource1.DataSet.FieldValues['id'];
    ListBox1.Items.Add(DataSource1.DataSet.FieldValues['voornaam']);
    DataSource1.DataSet.Next;
  end;


Klopt er iets niet in mijn code ofzo?

[ Voor 15% gewijzigd door Verwijderd op 16-05-2003 13:30 ]


  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Is je tabel niet te klein gedefinieerd?

Doe anders SetLength(Tabel, RecordCount) na het openen van de datasource.
Verder gebruik ik steeds DataSource.DataSet.FieldByName('id').Value in plaats van FieldValues['id'].

Edit:

En i:=i+1 moet ook na de "begin" van je lus. Inc(i) is makkelijker trouwens :)

[ Voor 52% gewijzigd door Coltrui op 16-05-2003 13:50 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Een array begint bij 0, jij begint bij 1. Jij gaat dus verder dan de array groot is.

PS: Je kan ook data in je TStrings bewaren mbv de methode AddObject. TListBox.Items is een TStrings.

[ Voor 39% gewijzigd door LordLarry op 16-05-2003 14:20 ]

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


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

OZ-Gump

terug van weggeweest

Verder heb je natuurlijk ook wel door dat i := i + 1 voor de while wordt uitgevoerd, en datgene wat tussen begin en end staat maar één keertje he? En dat i dus eigenlijk gewoon de recordcount van je dataset wordt he? DataSet.RecordCount dus..... :/

While X do Y; <-- Dit is een volledige while-lus!!!!

[ Voor 22% gewijzigd door OZ-Gump op 16-05-2003 14:49 ]

My personal website


  • Cai
  • Registratie: December 2001
  • Nu online

Cai

Delphi is een tijdje terug hoor, maar als ik het zo zie heb je een for lus en een while lus gekoppeld.

Je kan niet in je while statement aangeven hoe je de waade van een bepaalde var verandert.

dus het is of:
code:
1
2
3
4
5
6
7
while not DataSource1.DataSet.Eof do 
  begin
    i := i + 1;
    A[i] := DataSource1.DataSet.FieldValues['id'];
    ListBox1.Items.Add(DataSource1.DataSet.FieldValues['voornaam']);
    DataSource1.DataSet.Next;
  end;


of

code:
1
2
3
4
5
6
for ((i:=i+1)and(not(DataSource1.DataSet.Eof))) do
begin
 A[i] := DataSource1.DataSet.FieldValues['id'];
    ListBox1.Items.Add(DataSource1.DataSet.FieldValues['voornaam']);
    DataSource1.DataSet.Next;
  end;


vergeef het me als die code ongelijk is maar ben helemaal de Delphi manier verleerd, geef mij maar: for(i=0;!DataSource1.DataSet.FieldValues['id'];i++) :p

  • Cai
  • Registratie: December 2001
  • Nu online

Cai

Sorry kan mn post niet editten.

Ongelijk bedoel ik mee dat de syntaxis van de delphi for lus onjuist kan zien, het is ong in die trend

  • WildernessChild
  • Registratie: Februari 2002
  • Niet online

WildernessChild

Voor al uw hersenspinsels

LordLarry schreef op 16 mei 2003 @ 14:19:
...
PS: Je kan ook data in je TStrings bewaren mbv de methode AddObject. TListBox.Items is een TStrings.
Gebruik dan een TStringList (directe descendant van TStrings) want die is tenminste niet abstract :)

Maker van Taekwindow; verplaats en resize je vensters met de Alt-toets!


Verwijderd

Klopt er iets niet in mijn code ofzo?
Dit stukje:

Delphi:
1
2
3
  SetLength(A, 3);
  while not DataSource1.DataSet.Eof do i := i + 1;
  begin


Datasource1.DataSet.Eof zal altijd evalueren naar 'False'. Dit is een oneindige loop.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
A: array of Integer;
i: Integer;
begin
  i := 0;
  SetLength(A, 3);
  With DataSource1.Dataset do
     Repeat
        A[i] := FieldByName('id').AsInteger;
        Listbox1.Items.Add(FieldByName('voornaam').AsString);
        Inc(i);
        Next;
     Until EOF;
end;


In plaats van die array, kun je ook gebruik maken van de addobject functie van die listbox. Voorbeeld:

Delphi:
1
2
3
4
5
6
7
8
9
10
var
  nId: Integer;
  cVoornaam: String;
begin
  With DataSource1.Dataset do
     Repeat
        Listbox1.Items.AddObject(FieldByName('voornaam').AsString, TObject(FieldByName('ID').AsInteger));
        Next;
     Until EOF;
end;


dit is wel een beejte smerig, vanwege die cast. Wil je van een listboxitem weten welk ID er bij hoort:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
var
  nId: Integer;
  nLus: Integer;
begin
  With Listbox1 do
     for nLus:=0 to Items.Count-1 do
       begin 
          nId:=Integer(Items.Objects[nLus]);
          MessageDlg('Ítem:'+Items[nLus]+#13+'ID: '+IntToStr(nId), mtInformation, [mbOk],0);
       end;         
end;

[ Voor 39% gewijzigd door Verwijderd op 17-05-2003 01:33 ]


  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 17 May 2003 @ 01:24:
[...]


Dit stukje:
Delphi:
1
2
3
  SetLength(A, 3);
  while not DataSource1.DataSet.Eof do i := i + 1;
  begin
Dat klopt
Datasource1.DataSet.Eof zal altijd evalueren naar 'False'. Dit is een oneindige loop.
Nope.....
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
A: array of Integer;
i: Integer;
begin
  i := 0;
  SetLength(A, 3);
  With DataSource1.Dataset do
     Repeat
        A[i] := FieldByName('id').AsInteger;
        Listbox1.Items.Add(FieldByName('voornaam').AsString);
        Inc(i);
        Next;
     Until EOF;
end;
Jij zegt dus dat een
code:
1
2
3
while not Datasource1.DataSet.Eof do
begin
end

fout is, omdat Datasource1.DataSet.Eof altijd false is?

Maar een
code:
1
2
repeat
until Datasource1.DataSet.Eof

is wel goed? Je checkt op precies hetzelfde (al verberg je dat met het with statement).

En als er nu is geen data is? Dan is eof meteen true! Een repeat loop wordt minimaal 1 keer uitgevoerd. Als er dus geen data is (en de dataset meteen eof is) gaat jou code in de repeat loop onderuit, en zal de while loop van de topicstarter het juiste doen. De while loop van de topicstarter is volgens mij beter, dat de opbouw van z'n code niet helemaal klopt is een ander verhaal maar daar zijn al verschillende oplossingen voor gegeven. (hij was de .next niet vergeten hoor ;) ).

[ Voor 5% gewijzigd door Creepy op 17-05-2003 10:25 ]

"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


  • brokenp
  • Registratie: December 2001
  • Nu online
creepy volgens mij maak je een kleine fout.
De ts gaf deze code
code:
1
2
3
4
5
6
  while not DataSource1.DataSet.Eof do i := i + 1;
  begin
    A[i] := DataSource1.DataSet.FieldValues['id'];
    ListBox1.Items.Add(DataSource1.DataSet.FieldValues['voornaam']);
    DataSource1.DataSet.Next;
  end;


Voor zover ik delphi ken, voer delphi na een while lus slechts 1 commando uit, of alles binnen een begin..end.
In de code van de TS wordt binnen de while-lus het commando i:=i+1 uitgevoerd.
Als deze lus volledig doorlopen is, dan pas wordt er begonnen aan de begin..end constructie.

Mocht je dit compilen en runnen, dan zijn er 2 mogelijkheden:
- initieel geld al DataSource1.DataSet.Eof -> i wordt niet opgehoogt, prog loopt vast bij next..., want hij is al bij EOF
- Initieel geldt niet DataSource1.DataSet.Eof -> i wordt oneindig vaak opgehoogd, foutmelding dat i niet meer in een integer past ofzo

[ Voor 3% gewijzigd door brokenp op 17-05-2003 11:13 ]


Verwijderd

Creepy schreef op 17 May 2003 @ 10:24:
Jij zegt dus dat een
code:
1
2
3
while not Datasource1.DataSet.Eof do
begin
end

fout is, omdat Datasource1.DataSet.Eof altijd false is?

Maar een
code:
1
2
repeat
until Datasource1.DataSet.Eof

is wel goed? Je checkt op precies hetzelfde (al verberg je dat met het with statement).
Je moet beter gaan lezen. Topicstarter doet dit (even uitgeschreven, dan wordt het duidelijker)
Delphi:
1
2
3
4
While Datasource1.Dataset.eof do
  begin 
     i:=i+1;
  end; 


En dat is wel degelijk een oneindige loop. Ik doe:

Delphi:
1
2
3
4
5
While Datasource1.Dataset.eof do 
  begin
     DATASOURCE1.DATASET.NEXT // <-- !!!!!!!!!!!!!
     i:=i+1;
  end
En als er nu is geen data is?
Die opmerking is waar. Mijn code gaat uit van en result. Dat is eventueel op te lossen door er een if not dataset.isemty then repeat until. Een repeat until is hier domweg netter omdat dat beter weergeeft wat je wilt.
(hij was de .next niet vergeten hoor ;) ).
Dat was hij dus wel, beter lezen. Let op de puntkomma na zijn i := i+1.
Pagina: 1