|
| 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
| |
|
|