[dephi] app crashed bij query

Pagina: 1
Acties:

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
ik heb een programma gemaakt dat query's uitvoert op mijn mysql server, dat werkt allemaal ok. Alleen nu wil ik in een procedure in een andere unit me database aanspreken, daarbij loopt me programma steeds vast op:


presults^.row_count;

als ik die waarde probeer uit te lezen dan krijg ik steeds een error.

de query klopt die heb ik al getest in me console, en bij het starten van het programma word er verbonden met een database, en word de goede database geselecteerd.
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,_libmysq;

type
  TForm2 = class(TForm)
    GroupBox2: TGroupBox;
    Label6: TLabel;
    achtnedit: TLabel;
    Label11: TLabel;
    VLTedit: TEdit;
    ANMedit: TEdit;
    GSLcombo: TComboBox;
    GroupBox3: TGroupBox;
    telnr: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    TETedit: TEdit;
    TEWedit: TEdit;
    GS1edit: TEdit;
    GS2edit: TEdit;
    EMLedit: TEdit;
    GroupBox1: TGroupBox;
    adres: TLabel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    ST1edit: TEdit;
    PC1edit: TEdit;
    STFedit: TEdit;
    PCFedit: TEdit;
    PL1edit: TEdit;
    PLFedit: TEdit;
    OVVedit: TEdit;
    NCDedit: TEdit;
    Label7: TLabel;
    Memo1: TMemo;
    procedure showinfo(id:integer);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  mysqlrec: mysql;
implementation

{$R *.DFM}


procedure tform2.showinfo(id:integer);
var
   presults: pmysql_res; //results structure *pointer
   prow: pmysql_row;     //row structure *pointer
   i, j: Integer;     //Counter vars
   query:string
begin
     //query:= 'SELECT Voorl FROM klanten where ID = '+inttostr(id)+' ;'; //Query text
     query:= 'SELECT voorl From klanten where ID = 2; ';
     presults:= nil;

     try
      mysql_query(@mysqlrec, PChar(query)); //Send Query to server
      presults := mysql_store_result(@mysqlrec); //Store results locally

      //HIER LOOPT HIJ VAST,
      showmessage(inttostr(presults^.row_count));

      for i:= 0 to presults^.row_count do
      begin
            prow:= mysql_fetch_row(presults);
            for j:= 0 to presults^.field_count -1 do
            begin
                memo1.lines.add(prow^[j]); // Index into row for fields
            end;
      end;

     finally
       mysql_free_result(presults); //release the stored results from memory
     end;
end;



end.

Verwijderd

Op zondag 16 juni 2002 18:43 schreef THIJZEL het volgende:
als ik die waarde probeer uit te lezen dan krijg ik steeds een error.
Wat voor een error?

Verwijderd

is presults niet nil op die plek?

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
Op zondag 16 juni 2002 18:47 schreef delighteddennis het volgende:

[..]

Wat voor een error?
deze:
Afbeeldingslocatie: http://212.120.93.203/error.JPG

aan deur:
code:
1
presults := mysql_store_result(@mysqlrec);

staat er nog voor

Verwijderd

Op zondag 16 juni 2002 18:48 schreef deur het volgende:
is presults niet nil op die plek?
Dat lijkt inderdaad het probleem te zijn

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
Op zondag 16 juni 2002 18:53 schreef delighteddennis het volgende:

[..]

Dat lijkt inderdaad het probleem te zijn
[..]

:?
code:
1
2
3
4
5
6
7
8
presults:= nil;

     try
      mysql_query(@mysqlrec, PChar(query)); //Send Query to server
   >>>>>     presults := mysql_store_result(@mysqlrec); //Store results locally

      //HIER LOOPT HIJ VAST,
      showmessage(inttostr(presults^.row_count));

daar word hij toch geset..

Verwijderd

Op zondag 16 juni 2002 18:56 schreef THIJZEL het volgende:
daar word hij toch geset..
Dat hangt af van de returnwaarde van mysql_store_result.

Maar als je je programma aan het doorsteppen bent kan je de inhoud van presult toch bekijken na deze operatie?

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
moet ik misschienb opnieuw connecten in unit 2, omdat ik unit1 niet bij uses heb staan?

ik heb namelijk in unit1 geconnect...

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
Op zondag 16 juni 2002 19:02 schreef delighteddennis het volgende:

[..]

Dat hangt af van de returnwaarde van mysql_store_result.

Maar als je je programma aan het doorsteppen bent kan je de inhoud van presult toch bekijken na deze operatie?
ehh hoe precies, ik weet hoe het in bcc werkt maar in delphi niet

edit: beetje gekloot, presults lijkt op dat moment idd leeg


weet jullie hoe ik het beste kan kijken hoe ik verbonden ben mety de server??

Verwijderd

Als je tijdens het steppen met een muis op een variabelen gaat staan krijg je de waarde in beeld.

Een andere optie:

View > Debug Windows > Watches

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:23

Reptile209

- gers -

presults krijgt wel een adres mee, maar waarschijnlijk wijst dat naar een stuk geheugen dat nooit gereserveerd is. Kijk nog eens goed naar de functie die presults zijn waarde geeft: die zou met new ofzo een stuk geheugen moeten claimen.

Zo scherp als een voetbal!


Verwijderd

ik denk dat je mysqlrec niet set.
misschien kan je unit1 includen, en de connectie daaruit gebruiken.
en mysqlrec: mysql; uit unit2 weghalen.

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
Op zondag 16 juni 2002 19:51 schreef deur het volgende:
ik denk dat je mysqlrec niet set.
misschien kan je unit1 includen, en de connectie daaruit gebruiken.
en mysqlrec: mysql; uit unit2 weghalen.
mysqlrec heeft wel een waarde bijhet steppen

ik kan unit1 niet includen want dat krijg ik een circular inclusion ofzo omda unit2 in unit1 al gedeclareerd is.

Verwijderd

Op zondag 16 juni 2002 20:00 schreef THIJZEL het volgende:
ik kan unit1 niet includen want dat krijg ik een circular inclusion ofzo omda unit2 in unit1 al gedeclareerd is.
Probeer eens om unit1 dan niet in het interface maar in het implementatie gedeelte van unit2 te includen.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 04-09 23:45
[mierenneukmode]
Het is Crashen ipv crachen :)
[/mierenneukmode]

Verwijderd

Op zondag 16 juni 2002 20:00 schreef THIJZEL het volgende:

mysqlrec heeft wel een waarde bijhet steppen
doe je er dan ergens wat aan toekennen?

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 18-08 10:58

Bergen

Spellingscontroleur

Op zondag 16 juni 2002 18:43 schreef THIJZEL het volgende:
...
code:
1
2
3
...
presults := mysql_store_result(@mysqlrec); //Store results locally
...
Moet dat niet zijn:
presults^ := bladiebla?

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:23

Reptile209

- gers -

Op zondag 16 juni 2002 20:56 schreef GerbenW het volgende:

[..]

Moet dat niet zijn:
presults^ := bladiebla?
En dan, voor die functieaanroep,
presults := new(mysql_res);
en helemaal aan het einde (als je presults niet meer nodig hebt):
dispose (presults);

Zo scherp als een voetbal!


  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
zo bedoel je?:
code:
1
2
      presults := new(pmysql_res);
      presults := mysql_store_result(@mysqlrec);

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
het stomme is namelijk dat ik het stukkie code ook inform 1 gebrui en daar werkt het gewoon goed..

Verwijderd

Read of address 0 betekent toch dat presult nil is?

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 05-09 11:09

LauPro

Prof Mierenneuke®

offtopic:
LoL! Ik probeerde geheel vanzelf dat bericht weg te klikken :D :+

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Verwijderd

Als geheugen 00000000000000 is, betekent dus dat het een nil-pointer exceptie is, oftwel: niet gevuld, geinitialiseerd, gereset, whatever. Waarschijnlijk maak je in unit1 een connectie die je in een var. opslaat, en in unit2 doe je dat niet (of wordt niet autom. gedaan). Compileren gaat dan wel goed, runnen dus niet...

Dus ga ff na wat je aan initialisatie in unit1 allemaal doet, wat je in unit2 dus niet doet. Dus oa gebruik maken van watches en debug functionaliteit.

Wat ik sowieso erg vaag vindt is dat je gebruik maakt van pointers!!! In pascal tijdperk moest dat gewoon wel, maar oa het ID van delphi was dat je juist geen pointers moet gebruiken... (wordt door delphi gedaan). Kun niet gewoon gebruik maken van BDE, ADO, of andere std. database componenten? Lijkt me sowieso een stuk handiger...

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
Op maandag 17 juni 2002 14:33 schreef @ndrewDynamo het volgende:
Als geheugen 00000000000000 is, betekent dus dat het een nil-pointer exceptie is, oftwel: niet gevuld, geinitialiseerd, gereset, whatever. Waarschijnlijk maak je in unit1 een connectie die je in een var. opslaat, en in unit2 doe je dat niet (of wordt niet autom. gedaan). Compileren gaat dan wel goed, runnen dus niet...

Dus ga ff na wat je aan initialisatie in unit1 allemaal doet, wat je in unit2 dus niet doet. Dus oa gebruik maken van watches en debug functionaliteit.

Wat ik sowieso erg vaag vindt is dat je gebruik maakt van pointers!!! In pascal tijdperk moest dat gewoon wel, maar oa het ID van delphi was dat je juist geen pointers moet gebruiken... (wordt door delphi gedaan). Kun niet gewoon gebruik maken van BDE, ADO, of andere std. database componenten? Lijkt me sowieso een stuk handiger...
werk dat oook goed met een mysql databeest dan?

* THIJZEL is voor het eerst bezig met delhi + dmbs

Verwijderd

zet eens een breakpoint, en lees de waarde van je variabele uit. Denk dat dat beter helpt dan raden of je variabele NULL is of datie gevuld is.

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
Op maandag 17 juni 2002 19:59 schreef Destruction_Dimbo het volgende:
zet eens een breakpoint, en lees de waarde van je variabele uit. Denk dat dat beter helpt dan raden of je variabele NULL is of datie gevuld is.
had ik al gedaan, de variable is idd nil

  • jopiek
  • Registratie: September 2000
  • Laatst online: 21-08 19:56

jopiek

Tja... 'ns ff denken.

Op zondag 16 juni 2002 22:56 schreef THIJZEL het volgende:
zo bedoel je?:
code:
1
2
      presults := new(pmysql_res);
      presults := mysql_store_result(@mysqlrec);
in delphi doe je ALTIJD een create als je een object aanmaakt, delphi is nl. geen c++ o.i.d.
code:
1
2
3
4
var presults : pmysql_res;
begin
  presults := pmysql_res.create;
end;

trouwens een pointer kan nil zijn, een variant kan Null zijn, voor de rest wordt de laatste naar ik weet niet gebruikt...
in dit geval doet een assignment
"presults := mysql_store_result(@mysqlrec);" 'raar' als presults nil is natuurlijk...

dus sowieso ff
code:
1
2
  if not presults = nil then
    presults := mysql_store_result(@mysqlrec);

source ziet er trouwens errug on-pascals uit, lijkt meer c++ probeer daar ook wat aan te doen, anders gooi je de voordelen van delphi zomaar overboord...
pointers gebruik je in Delphi alleen als het noodzakelijk is!!!

in jou geval doe je zo veel met pointers dat juist daardoor gemakkelijk fouten ontstaan omdat je misschien de ene keer de inhoud en de andere keer het adres referenced...

Cogito Ergo Credo


  • jopiek
  • Registratie: September 2000
  • Laatst online: 21-08 19:56

jopiek

Tja... 'ns ff denken.

Op zondag 16 juni 2002 21:29 schreef Reptile209 het volgende:

[..]

En dan, voor die functieaanroep,
presults := new(mysql_res);
en helemaal aan het einde (als je presults niet meer nodig hebt):
dispose (presults);
waarom zou je dispose gebruiken? je mag NOOIT zelf een Destroy gebruiken behalve in de destructor (als je inherited Destroy aanroept), normaal gebruik je ALTIJD Object.Free in Delphi.
En al je een programma al object georienteerd op wilt zetten maak je dus een constructor aan met zaakje uit m'n bovenstaande post (presult := <objectnam>.create)
en dan in de destructor presult.free

...


Een access violation krijg je trouwens ALTIJD alleen als er iets niet goed zit met je object (ergo de pointer ins blauen hineins wijst ;))

In Delphi is het niet echt zinnig om ^ en * te gebruiken tenzij je bijv. dll's interfaced... (ik zal 't er ff inhameren :))

Cogito Ergo Credo


Verwijderd

in delphi doe je ALTIJD een create als je een object aanmaakt, delphi is nl. geen c++ o.i.d.
presults is een pointer naar een record. Deze record hoef je niet zelf aan te maken of te creeeren, dat doet mysql_store_result. Dealloceren van geheugen gaat zo te zien via mysql_free_result. Conclusie: code van THIJZEL is op zich goed.

mysql_store_result geeft een nil waarde terug; waarschijnlijk is de invoer dus verkeerd, hiervoor moet je in de documentatie kijken. :)

Ik gok dat mysqlrec niet geinitialiseerd is. Nog een gok, waarschijnlijk heb je mysqlrec in verschillende units gedefinieerd als globale variabele; dat is vrij lelijk.

[edit]
Ik zie dat ik deur zit te herhalen en dat je al antwoord hebt gegeven:
mysqlrec heeft wel een waarde bijhet steppen
Waar geef je dan mysqlrec een waarde; als je zegt in Unit1 initialiseer je waarschijnlijk de mysqlrec uit Unit1. Mijn advies: gooi alle globale variabele weg [behalve de var van type TForm]; weet je zeker dat je toch var. met globale scope nodig hebt prefix ze dan met G ofzo, zodat je in de code ziet dat je goed moet opletten met deze variabelen.

Logischer zou zijn om 1 mysqlrec te hebben, die je dan gebruikt in form1 en form2, doe dit bv door een datamodule te maken waarin je mysqlrec als private var definieerd, die te benaderen is via properties. form1 en form2 gebruiken dan die datamodule etc.

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
voor de duidelijkheid zal ik mainunit(unit1) ook maar een keer posten.



unit1:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,  ExtCtrls, DBCtrls, Grids,  ComCtrls, Menus,_libmysq,addklant,unit2;

type
  Tmainform = class(TForm)
    MainMenu1: TMainMenu;
    Menu1: TMenuItem;
    close1: TMenuItem;
    PageControl1: TPageControl;
    soverztab: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    TabSheet5: TTabSheet;
    DBNavigator1: TDBNavigator;
    grid1: TStringGrid;
    refresh: TButton;
    edtQuery: TEdit;
    add_klantbtn: TButton;
    GroupBox1: TGroupBox;
    adres: TLabel;
    ST1edit: TEdit;
    PC1edit: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    STFedit: TEdit;
    PCFedit: TEdit;
    Label4: TLabel;
    GroupBox2: TGroupBox;
    Label6: TLabel;
    VLTedit: TEdit;
    ANMedit: TEdit;
    achtnedit: TLabel;
    PL1edit: TEdit;
    PLFedit: TEdit;
    Label5: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    OVVedit: TEdit;
    Label10: TLabel;
    GSLcombo: TComboBox;
    Label11: TLabel;
    GroupBox3: TGroupBox;
    TETedit: TEdit;
    telnr: TLabel;
    TEWedit: TEdit;
    Label12: TLabel;
    GS1edit: TEdit;
    GS2edit: TEdit;
    Label13: TLabel;
    Label14: TLabel;
    EMLedit: TEdit;
    Label15: TLabel;
    NCDedit: TEdit;
    naamcode: TLabel;
    TabSheet1: TTabSheet;
    procedure close1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure refreshClick(Sender: TObject);
    procedure add_klantbtnClick(Sender: TObject);
    procedure grid1Click(Sender: TObject);
    procedure ANMeditChange(Sender: TObject);
  private

    { Private declarations }
  public
    { Public declarations }
  end;

var
  mainform: Tmainform;
  mysqlrec: mysql;
implementation



{$R *.DFM}

procedure Tmainform.close1Click(Sender: TObject);
begin
application.terminate;
end;


procedure Tmainform.FormCreate(Sender: TObject);
var
   host,user,passwd: string;

   db: String;
   retval: Integer;
begin
//connect met sql server
 host:='10.0.0.1';
 user:='thijs';
 mysql_connect(@mysqlrec, PChar(host), PChar(user), PChar(passwd));
 if mysqlrec.status = mysql_status_ready then
     begin
        ShowMessage ('Successfully connected to the Database.');
     end;

//selecteer database thijs
     db:= 'project';
     retval:= mysql_select_db(@mysqlrec, PChar(db));
     if retval <> 0 then
      ShowMessage('Error attaching to: ' + db)
     else
       begin
            ShowMessage('Successfully attached to sql database ' + db);
       end;

end;


procedure Tmainform.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    //close connection witch mysql
    mysql_close(@mysqlrec);
end;

procedure Tmainform.refreshClick(Sender: TObject);
var
   presults: pmysql_res; //results structure *pointer
   prow: pmysql_row;     //row structure *pointer
   i,j: Integer;      //Counter vars
   query: String;
begin
     query:= 'SELECT id,anaam,straat,plaats,Tthuis FROM klanten ;'; //Query text
     presults:= nil;
     try
     mysql_query(@mysqlrec, PChar(query)); //Send Query to server
     presults:= mysql_store_result(@mysqlrec); //Store results locally
     //results:= presults^;
     grid1.Cells[0,0]:= 'ID';
     grid1.Cells[1,0]:= 'Naam';
     grid1.Cells[2,0]:= 'Adres';
     grid1.Cells[3,0]:= 'Plaats';
     grid1.Cells[4,0]:= 'Telnr';
     //crow:= presults^.data^.data^.data;
     //ShowMessage(crow^[0]);
     for i:= 1 to presults^.row_count do begin
     prow:= mysql_fetch_row(presults);
     //row:= prow^;  //Only way I could figure out to use an index into a MYSQL_ROW struct
     for j:= 0 to presults^.field_count -1 do begin
       grid1.Cells[j, i]:= prow^[j]; // Index into row for fields
     end; // j
     end; // i
     finally
       mysql_free_result(presults); //release the stored results from memory
     end;
end;

procedure Tmainform.add_klantbtnClick(Sender: TObject);
var
      query,naamcode:string;
      i:integer;
begin
query:= createquery('NULL',query,false);

query := createquery(VLTedit.text,query,false);
query := createquery(ANMedit.text,query,false);
query := createquery(GSLcombo.text,query,false);

query := createquery(TETedit.text,query,false);
query := createquery(TEWedit.text,query,false);
query := createquery(GS1edit.text,query,false);
query := createquery(GS2edit.text,query,false);
query := createquery(EMLedit.text,query,false);

query := createquery(ST1edit.text,query,false);
query := createquery(PC1edit.text,query,false);
query := createquery(PL1edit.text,query,false);
query := createquery(OVVedit.text,query,false);
query := createquery(STFedit.text,query,false);
query := createquery(PCFedit.text,query,false);
query := createquery(PLFedit.text,query,false);

for i:= 1 to 5 do
begin
      naamcode:=naamcode+ANMedit.text[i];
end;
query := createquery(naamcode,query,true);

showmessage(query);
mysql_query(@mysqlrec, PChar(query));
end;

procedure Tmainform.grid1Click(Sender: TObject);
begin
      showmessage('userid: '+(grid1.cells[0,grid1.row]));
      form2.showinfo(strtoint(grid1.cells[0,grid1.row]));
      form2.show;
end;

procedure Tmainform.ANMeditChange(Sender: TObject);
begin
      NCDedit.clear;
      NCDedit.text:=NCDedit.text+ANMedit.text[1];
      NCDedit.text:=NCDedit.text+ANMedit.text[2];
      NCDedit.text:=NCDedit.text+ANMedit.text[3];
      NCDedit.text:=NCDedit.text+ANMedit.text[4];
      NCDedit.text:=NCDedit.text+ANMedit.text[5];
end;

end.

unit 2:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,_libmysq;

type
  TForm2 = class(TForm)
    GroupBox2: TGroupBox;
    Label6: TLabel;
    achtnedit: TLabel;
    Label11: TLabel;
    VLTedit: TEdit;
    ANMedit: TEdit;
    GSLcombo: TComboBox;
    GroupBox3: TGroupBox;
    telnr: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    TETedit: TEdit;
    TEWedit: TEdit;
    GS1edit: TEdit;
    GS2edit: TEdit;
    EMLedit: TEdit;
    GroupBox1: TGroupBox;
    adres: TLabel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    ST1edit: TEdit;
    PC1edit: TEdit;
    STFedit: TEdit;
    PCFedit: TEdit;
    PL1edit: TEdit;
    PLFedit: TEdit;
    OVVedit: TEdit;
    NCDedit: TEdit;
    Label7: TLabel;
    Memo1: TMemo;
    procedure showinfo(id:integer);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  
implementation

uses unit1;
{$R *.DFM}


procedure tform2.showinfo(id:integer);
var
   presults: pmysql_res; //results structure *pointer
   prow: pmysql_row;     //row structure *pointer
   i, j,retval: Integer;      //Counter vars
   query:string;
begin
     //query:= 'SELECT Voorl FROM klanten where ID = '+inttostr(id)+' ;'; //Query text

     query:= 'SELECT voorl From klanten where ID = 2; ';
     presults:= nil;

     try
      mysql_query(@mysqlrec, PChar(query)); //Send Query to server
      presults := new(pmysql_res);
      presults := mysql_store_result(@mysqlrec); //Store results locally

      //HIER LOOPT HIJ VAST,
      showmessage(inttostr(presults^.row_count));

      for i:= 0 to presults^.row_count do
      begin
            prow:= mysql_fetch_row(presults);
            for j:= 0 to presults^.field_count -1 do
            begin
                memo1.lines.add(prow^[j]); // Index into row for fields
            end;
      end;

     finally
       mysql_free_result(presults); //release the stored results from memory
     end;
end;



end.

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
mysqlrec word dus maar 1 keer gedeclareerd, en dat is in unit 1..

hoer bedoel je dat met die private vars, als ik die declaratie in het private gedeelte van unit1 zet dan kent geeneen procedure hem meer.

ps: excuseer me voor mijn misschien brakke coding style maar ik ben nog niet zo heel ervaren..

Verwijderd

Zoals ik al zei, maak een nieuwe datamodule en zet er zoiets in:
code:
1
2
3
4
5
6
7
8
  TMyDatamodule = class(TDatamodule)
  private 
    FMySQLRec: mysql;
  public
    procedure Connect;
    procedure Disconnect;
    property MySQLRec: mysql read FMySQLRec;
  end;

Die code in Tmainform.FormCreate zet je nu in TMyDatamodule.Connect; de code in Tmainform.FormClose zet je in TMyDatamodule.Disconnect;

In de OnCreate vd TMyDatamodule roep je Connect aan; in de OnDestroy vd TMyDatamodule roep je Disconnnect aan.

Verder definieer je nergens een var vh type mysql, maar gebruik je de property MySQLRec van TMyDatamodule.

Volgens mij is mysql een record; dus MySQLRec is ook een record; beter zou zijn als je een pointer doorgeeft via de property, dus maak MySQLRec van het type PMySQL ofzo [Ken MySQL verder niet]

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
Op woensdag 19 juni 2002 00:18 schreef DiFool het volgende:
Zoals ik al zei, maak een nieuwe datamodule en zet er zoiets in:
code:
1
2
3
4
5
6
7
8
  TMyDatamodule = class(TDatamodule)
  private 
    FMySQLRec: mysql;
  public
    procedure Connect;
    procedure Disconnect;
    property MySQLRec: mysql read FMySQLRec;
  end;

Die code in Tmainform.FormCreate zet je nu in TMyDatamodule.Connect; de code in Tmainform.FormClose zet je in TMyDatamodule.Disconnect;

In de OnCreate vd TMyDatamodule roep je Connect aan; in de OnDestroy vd TMyDatamodule roep je Disconnnect aan.

Verder definieer je nergens een var vh type mysql, maar gebruik je de property MySQLRec van TMyDatamodule.

Volgens mij is mysql een record; dus MySQLRec is ook een record; beter zou zijn als je een pointer doorgeeft via de property, dus maak MySQLRec van het type PMySQL ofzo [Ken MySQL verder niet]
ja naa een eindje puzzelen werkt het nu eindelijk met die datamodule van je, iedereen bedankt!
Pagina: 1