/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Fejl ved kald af procedure - pointerfejl?
Fra : Ukendt


Dato : 02-05-06 20:04

Hej.

Jeg har en MDI Child form, som jeg creater manuelt, hvori jeg har en
procedure / event, som jeg ønsker kaldt. Det kan dog ikke lade sig gøre
(Access violation) - kun hvis jeg vælger at auto create formen. Det er
formentligt pga. noget halløj med en pointer, men så er det, at jeg desværre
falder ud.

Det er en simpel procedure, der skal skrive linienummeret i den fixede
kolonne i en string grid, som jeg har placeret i grid'ens onCellDraw event.

procedure Tform2StringGridDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
var
RowNumber: integer;
begin
For RowNumber:= 1 to stringgrid.RowCount do
begin
Stringgrid.Cells[0,RowNumber]:= IntToSTr(RowNumber);
end;
end;

Min form bliver kaldt med

procedure Tform1.Button3Click(Sender: TObject);
var
Form2: TForm2;
begin
Form2:= TFormForm2.Create(self);
Form2.Show;
end;



 
 
Harald (02-05-2006)
Kommentar
Fra : Harald


Dato : 02-05-06 21:18

"KentN" <.> skrev i en meddelelse
news:4457ad06$0$11162$ba624c82@nntp02.dk.telia.net...
> Hej.
>
> Jeg har en MDI Child form, som jeg creater manuelt, hvori jeg har en
> procedure / event, som jeg ønsker kaldt. Det kan dog ikke lade sig gøre
> (Access violation) - kun hvis jeg vælger at auto create formen. Det er
> formentligt pga. noget halløj med en pointer, men så er det, at jeg
> desværre falder ud.
>
> Det er en simpel procedure, der skal skrive linienummeret i den fixede
> kolonne i en string grid, som jeg har placeret i grid'ens onCellDraw
> event.
>
> procedure Tform2StringGridDrawCell(Sender: TObject; ACol,
> ARow: Integer; Rect: TRect; State: TGridDrawState);
> var
> RowNumber: integer;
> begin
> For RowNumber:= 1 to stringgrid.RowCount do
> begin
> Stringgrid.Cells[0,RowNumber]:= IntToSTr(RowNumber);
> end;
> end;
>
> Min form bliver kaldt med
>
> procedure Tform1.Button3Click(Sender: TObject);
> var
> Form2: TForm2;
> begin
> Form2:= TFormForm2.Create(self);
> Form2.Show;
> end;

Ved ikke om det har noget med det at gøre, men du skal skrive ... RowCount-1
do

/HK



Ukendt (03-05-2006)
Kommentar
Fra : Ukendt


Dato : 03-05-06 15:44

"Harald" <nomail@noname.dk> skrev i en meddelelse
news:4457be86$0$84021$edfadb0f@dtext01.news.tele.dk...
> "KentN" <.> skrev i en meddelelse
> news:4457ad06$0$11162$ba624c82@nntp02.dk.telia.net...
>> Hej.
>>
>> Jeg har en MDI Child form, som jeg creater manuelt, hvori jeg har en
>> procedure / event, som jeg ønsker kaldt. Det kan dog ikke lade sig gøre
>> (Access violation) - kun hvis jeg vælger at auto create formen. Det er
>> formentligt pga. noget halløj med en pointer, men så er det, at jeg
>> desværre falder ud.
>>
>> Det er en simpel procedure, der skal skrive linienummeret i den fixede
>> kolonne i en string grid, som jeg har placeret i grid'ens onCellDraw
>> event.
>>
>> procedure Tform2StringGridDrawCell(Sender: TObject; ACol,
>> ARow: Integer; Rect: TRect; State: TGridDrawState);
>> var
>> RowNumber: integer;
>> begin
>> For RowNumber:= 1 to stringgrid.RowCount do
>> begin
>> Stringgrid.Cells[0,RowNumber]:= IntToSTr(RowNumber);
>> end;
>> end;
>>
>> Min form bliver kaldt med
>>
>> procedure Tform1.Button3Click(Sender: TObject);
>> var
>> Form2: TForm2;
>> begin
>> Form2:= TFormForm2.Create(self);
>> Form2.Show;
>> end;
>
> Ved ikke om det har noget med det at gøre, men du skal skrive ...
> RowCount-1 do

Hej Harald.

Det mener jeg ikke, da jeg ønsker at gennemløbe fra linie 1 (og ikke 0) til
sidste linie i stringgriden for at skrive linienummeret i første kolonne.



Harald (03-05-2006)
Kommentar
Fra : Harald


Dato : 03-05-06 17:00

"KentN" <.> skrev i en meddelelse
news:4458c1c5$0$12109$ba624c82@nntp02.dk.telia.net...
> "Harald" <nomail@noname.dk> skrev i en meddelelse
> news:4457be86$0$84021$edfadb0f@dtext01.news.tele.dk...
>> "KentN" <.> skrev i en meddelelse
>> news:4457ad06$0$11162$ba624c82@nntp02.dk.telia.net...
>>> Hej.
>>>
>>> Jeg har en MDI Child form, som jeg creater manuelt, hvori jeg har en
>>> procedure / event, som jeg ønsker kaldt. Det kan dog ikke lade sig gøre
>>> (Access violation) - kun hvis jeg vælger at auto create formen. Det er
>>> formentligt pga. noget halløj med en pointer, men så er det, at jeg
>>> desværre falder ud.
>>>
>>> Det er en simpel procedure, der skal skrive linienummeret i den fixede
>>> kolonne i en string grid, som jeg har placeret i grid'ens onCellDraw
>>> event.
>>>
>>> procedure Tform2StringGridDrawCell(Sender: TObject; ACol,
>>> ARow: Integer; Rect: TRect; State: TGridDrawState);
>>> var
>>> RowNumber: integer;
>>> begin
>>> For RowNumber:= 1 to stringgrid.RowCount do
>>> begin
>>> Stringgrid.Cells[0,RowNumber]:= IntToSTr(RowNumber);
>>> end;
>>> end;
>>>
>>> Min form bliver kaldt med
>>>
>>> procedure Tform1.Button3Click(Sender: TObject);
>>> var
>>> Form2: TForm2;
>>> begin
>>> Form2:= TFormForm2.Create(self);
>>> Form2.Show;
>>> end;
>>
>> Ved ikke om det har noget med det at gøre, men du skal skrive ...
>> RowCount-1 do
>
> Hej Harald.
>
> Det mener jeg ikke, da jeg ønsker at gennemløbe fra linie 1 (og ikke 0)
> til sidste linie i stringgriden for at skrive linienummeret i første
> kolonne.

Ja men Cells starter fra 0 så derfor skal det være RowCount-1, prøv det så
vil du se at det virker.
Dvs.

Første Cells er Cells[0, 0]
Sidste Cells er Cells[0, stringgrid.RowCount-1]

/HK



Ukendt (03-05-2006)
Kommentar
Fra : Ukendt


Dato : 03-05-06 19:51

"Harald" <nomail@noname.dk> skrev i en meddelelse
news:4458d372$0$84026$edfadb0f@dtext01.news.tele.dk...
> "KentN" <.> skrev i en meddelelse
> news:4458c1c5$0$12109$ba624c82@nntp02.dk.telia.net...
>> "Harald" <nomail@noname.dk> skrev i en meddelelse
>> news:4457be86$0$84021$edfadb0f@dtext01.news.tele.dk...
>>> "KentN" <.> skrev i en meddelelse
>>> news:4457ad06$0$11162$ba624c82@nntp02.dk.telia.net...
>>>> Hej.
>>>>
>>>> Jeg har en MDI Child form, som jeg creater manuelt, hvori jeg har en
>>>> procedure / event, som jeg ønsker kaldt. Det kan dog ikke lade sig gøre
>>>> (Access violation) - kun hvis jeg vælger at auto create formen. Det er
>>>> formentligt pga. noget halløj med en pointer, men så er det, at jeg
>>>> desværre falder ud.
>>>>
>>>> Det er en simpel procedure, der skal skrive linienummeret i den fixede
>>>> kolonne i en string grid, som jeg har placeret i grid'ens onCellDraw
>>>> event.
>>>>
>>>> procedure Tform2StringGridDrawCell(Sender: TObject; ACol,
>>>> ARow: Integer; Rect: TRect; State: TGridDrawState);
>>>> var
>>>> RowNumber: integer;
>>>> begin
>>>> For RowNumber:= 1 to stringgrid.RowCount do
>>>> begin
>>>> Stringgrid.Cells[0,RowNumber]:= IntToSTr(RowNumber);
>>>> end;
>>>> end;
>>>>
>>>> Min form bliver kaldt med
>>>>
>>>> procedure Tform1.Button3Click(Sender: TObject);
>>>> var
>>>> Form2: TForm2;
>>>> begin
>>>> Form2:= TFormForm2.Create(self);
>>>> Form2.Show;
>>>> end;
>>>
>>> Ved ikke om det har noget med det at gøre, men du skal skrive ...
>>> RowCount-1 do
>>
>> Hej Harald.
>>
>> Det mener jeg ikke, da jeg ønsker at gennemløbe fra linie 1 (og ikke 0)
>> til sidste linie i stringgriden for at skrive linienummeret i første
>> kolonne.
>
> Ja men Cells starter fra 0 så derfor skal det være RowCount-1, prøv det så
> vil du se at det virker.
> Dvs.
>
> Første Cells er Cells[0, 0]
> Sidste Cells er Cells[0, stringgrid.RowCount-1]

Hej Harald.

Jeg havde selvfølgelig forsøgt at afprøve din kode, inden jeg svarede
tilbage. Og jeg får stadig en access violation fejl.



Ukendt (03-05-2006)
Kommentar
Fra : Ukendt


Dato : 03-05-06 20:03

"Harald" <nomail@noname.dk> skrev i en meddelelse
news:4458d372$0$84026$edfadb0f@dtext01.news.tele.dk...
> "KentN" <.> skrev i en meddelelse
> news:4458c1c5$0$12109$ba624c82@nntp02.dk.telia.net...
>> "Harald" <nomail@noname.dk> skrev i en meddelelse
>> news:4457be86$0$84021$edfadb0f@dtext01.news.tele.dk...
>>> "KentN" <.> skrev i en meddelelse
>>> news:4457ad06$0$11162$ba624c82@nntp02.dk.telia.net...
>>>> Hej.
>>>>
>>>> Jeg har en MDI Child form, som jeg creater manuelt, hvori jeg har en
>>>> procedure / event, som jeg ønsker kaldt. Det kan dog ikke lade sig gøre
>>>> (Access violation) - kun hvis jeg vælger at auto create formen. Det er
>>>> formentligt pga. noget halløj med en pointer, men så er det, at jeg
>>>> desværre falder ud.
>>>>
>>>> Det er en simpel procedure, der skal skrive linienummeret i den fixede
>>>> kolonne i en string grid, som jeg har placeret i grid'ens onCellDraw
>>>> event.
>>>>
>>>> procedure Tform2StringGridDrawCell(Sender: TObject; ACol,
>>>> ARow: Integer; Rect: TRect; State: TGridDrawState);
>>>> var
>>>> RowNumber: integer;
>>>> begin
>>>> For RowNumber:= 1 to stringgrid.RowCount do
>>>> begin
>>>> Stringgrid.Cells[0,RowNumber]:= IntToSTr(RowNumber);
>>>> end;
>>>> end;
>>>>
>>>> Min form bliver kaldt med
>>>>
>>>> procedure Tform1.Button3Click(Sender: TObject);
>>>> var
>>>> Form2: TForm2;
>>>> begin
>>>> Form2:= TFormForm2.Create(self);
>>>> Form2.Show;
>>>> end;
>>>
>>> Ved ikke om det har noget med det at gøre, men du skal skrive ...
>>> RowCount-1 do
>>
>> Hej Harald.
>>
>> Det mener jeg ikke, da jeg ønsker at gennemløbe fra linie 1 (og ikke 0)
>> til sidste linie i stringgriden for at skrive linienummeret i første
>> kolonne.
>
> Ja men Cells starter fra 0 så derfor skal det være RowCount-1, prøv det så
> vil du se at det virker.
> Dvs.
>
> Første Cells er Cells[0, 0]
> Sidste Cells er Cells[0, stringgrid.RowCount-1]

Hej Harald.

Blot til orientering (hvis det har interesse), så er problemet løst.

Det er på ingen måde nødvendigt at skrive -1 efter RowCount. Til gengæld gav
du mig svaret i en anden tråd (MDI Fomrs).

Jeg har konsekvent fulgt opskriften fra en bog om, hvordan man opretter
MDI-child forms

procedure Tform1.Button3Click(Sender: TObject);
var
Form2: TForm2;
begin
Form2:= TFormForm2.Create(self);
Form2.Show;
end;

Men som du skrev i anden tråd, så dur det ikke at oprette således (Den
ellers udmærkede bog "Teach yourself Delphi in 21 days" er misvisende her).

Min access violation fejl går formentligt igen på, at pointeren ikke kan
finde formen, når der bliver brugt lokale variabler ved oprettelsen.

(sådan tolker jeg det, da det ikke havde noget at sige med rowCount -1, men
det virker efter at have ændret formens create metode som i anden form. Men
jeg har heller ikke alt på plads mht. pointere osv. så jeg kan tage fejl.)



Harald (03-05-2006)
Kommentar
Fra : Harald


Dato : 03-05-06 21:41

"KentN" <.> skrev i en meddelelse
news:4458fe63$0$12399$ba624c82@nntp02.dk.telia.net...
> "Harald" <nomail@noname.dk> skrev i en meddelelse
> news:4458d372$0$84026$edfadb0f@dtext01.news.tele.dk...
>> "KentN" <.> skrev i en meddelelse
>> news:4458c1c5$0$12109$ba624c82@nntp02.dk.telia.net...
>>> "Harald" <nomail@noname.dk> skrev i en meddelelse
>>> news:4457be86$0$84021$edfadb0f@dtext01.news.tele.dk...
>>>> "KentN" <.> skrev i en meddelelse
>>>> news:4457ad06$0$11162$ba624c82@nntp02.dk.telia.net...
>>>>> Hej.
>>>>>
>>>>> Jeg har en MDI Child form, som jeg creater manuelt, hvori jeg har en
>>>>> procedure / event, som jeg ønsker kaldt. Det kan dog ikke lade sig
>>>>> gøre (Access violation) - kun hvis jeg vælger at auto create formen.
>>>>> Det er formentligt pga. noget halløj med en pointer, men så er det, at
>>>>> jeg desværre falder ud.
>>>>>
>>>>> Det er en simpel procedure, der skal skrive linienummeret i den fixede
>>>>> kolonne i en string grid, som jeg har placeret i grid'ens onCellDraw
>>>>> event.
>>>>>
>>>>> procedure Tform2StringGridDrawCell(Sender: TObject; ACol,
>>>>> ARow: Integer; Rect: TRect; State: TGridDrawState);
>>>>> var
>>>>> RowNumber: integer;
>>>>> begin
>>>>> For RowNumber:= 1 to stringgrid.RowCount do
>>>>> begin
>>>>> Stringgrid.Cells[0,RowNumber]:= IntToSTr(RowNumber);
>>>>> end;
>>>>> end;
>>>>>
>>>>> Min form bliver kaldt med
>>>>>
>>>>> procedure Tform1.Button3Click(Sender: TObject);
>>>>> var
>>>>> Form2: TForm2;
>>>>> begin
>>>>> Form2:= TFormForm2.Create(self);
>>>>> Form2.Show;
>>>>> end;
>>>>
>>>> Ved ikke om det har noget med det at gøre, men du skal skrive ...
>>>> RowCount-1 do
>>>
>>> Hej Harald.
>>>
>>> Det mener jeg ikke, da jeg ønsker at gennemløbe fra linie 1 (og ikke 0)
>>> til sidste linie i stringgriden for at skrive linienummeret i første
>>> kolonne.
>>
>> Ja men Cells starter fra 0 så derfor skal det være RowCount-1, prøv det
>> så vil du se at det virker.
>> Dvs.
>>
>> Første Cells er Cells[0, 0]
>> Sidste Cells er Cells[0, stringgrid.RowCount-1]
>
> Hej Harald.
>
> Blot til orientering (hvis det har interesse), så er problemet løst.
>
> Det er på ingen måde nødvendigt at skrive -1 efter RowCount. Til gengæld
> gav du mig svaret i en anden tråd (MDI Fomrs).
>
> Jeg har konsekvent fulgt opskriften fra en bog om, hvordan man opretter
> MDI-child forms
>
> procedure Tform1.Button3Click(Sender: TObject);
> var
> Form2: TForm2;
> begin
> Form2:= TFormForm2.Create(self);
> Form2.Show;
> end;
>
> Men som du skrev i anden tråd, så dur det ikke at oprette således (Den
> ellers udmærkede bog "Teach yourself Delphi in 21 days" er misvisende
> her).
>
> Min access violation fejl går formentligt igen på, at pointeren ikke kan
> finde formen, når der bliver brugt lokale variabler ved oprettelsen.

Du har ret i at hvis du opretter formen som i Button3Click så har du ikke
længere nogen pointer til formen i samme øjeblik du forlader Button3Click
proceduren. Er den en MDI child form kan du f.eks. benytte MDIChildren
propertyen i din MDI form for at finde formen. Men den bedste måde, efter
min mening, når man kun skal oprette en enkelt child er at benytte den
globale variable som befinder sig i MDI child formens pas fil, hvis man da
ikke har slettet den.

/HK



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste