[Delphi] Access violation in event handler *

Pagina: 1
Acties:

  • Cypher87
  • Registratie: Oktober 2004
  • Laatst online: 23-01 17:24
ik heb het volgende:
code:
1
2
3
4
5
6
7
8
9
if (edit1.Text<>'') and (edit2.Text<>'') then
begin
  try
    form1.client.Host:=edit2.Text; //fout
    form1.client.Port:=strtoint(edit1.text);
    form1.client.Connect;
..
  except end;
end;


Maar op de een of andere manier geeft ie een fout bij form1.client.host:=edit2.text; (access violation)
en als ik die regel onder die van port zet geeft ie dezelfde fout bij
form1.client.Port:=strtoint(edit1.text);

Ik heb echt geen idee hoe dit kan

FYI:
client: TIdTCPClient; (Indy 9)
stukje code zit onder knop op form2
ik roep form2 aan op de volgende manier: Form2.ShowModal;


Weet iemand waar de fout zit :?

Verwijderd

Je maakt waarschijnlijk of het form (form1) of de client dynamisch aan, of beter gezegd je vergeet dit te doen?

[ Voor 10% gewijzigd door Verwijderd op 23-11-2004 17:45 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

De referentie naar form1 is niet geinitialiseerd.

Professionele website nodig?


Verwijderd

curry684 schreef op dinsdag 23 november 2004 @ 17:45:
De referentie naar form1 is niet geinitialiseerd.
of die van form1.client :)

  • Cypher87
  • Registratie: Oktober 2004
  • Laatst online: 23-01 17:24
Verwijderd schreef op dinsdag 23 november 2004 @ 17:40:
Je maakt waarschijnlijk of het form (form1) of de client dynamisch aan, of beter gezegd je vergeet dit te doen?
Er word niets dynamisch aangemaakt...

Verwijderd

Gooi dan even de type declaratie van je TForm1 en TForm2 hier neer, dus zoiets als dit:

Delphi:
1
2
3
4
5
6
7
 TForm2 = class(TForm)
   client = TIdTCPClient;
  private
    { Private declarations }
  public
    { Public declarations }
  end;


Wat is je mainform van het Project ?
Staan zowel Form1 als Form2 in de autocreate lijst van je project ?

[ Voor 13% gewijzigd door Verwijderd op 23-11-2004 18:01 ]


  • Cypher87
  • Registratie: Oktober 2004
  • Laatst online: 23-01 17:24
Form1 = Mainform en ja ze staan beide in autocreate.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type
  TForm1 = class(TForm)
    ...
    client: TIdTCPClient;
    server: TIdTCPServer;
    ...
  private
    { Private declarations }
  public
    ....
  end;


type
  TForm2 = class(TForm)
    // hier staat verder geen nuttige informatie
  private
    { Private declarations }
  public
    ...
  end;

Verwijderd

maak van die code in je startpost eens het volgende,
laat dan de tekst van de access violation is goed zien.
(btw ff in je Delphi omgeving bij Tools -> Debug Options -> Language Exceptions, het vinkje weghalen bij Stop on Delphi exception (onderaan in venster), en ook indien aanwezig vinkje bij Indy weghalen).

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
if (edit1.Text<>'') and (edit2.Text<>'') then
begin
  try
    form1.client.Host:=edit2.Text; //fout
    form1.client.Port:=strtoint(edit1.text);
    form1.client.Connect;
..
  except
    on e: exception do 
      showmessage('Exception: ' + e.message);
  end;
end;

[ Voor 25% gewijzigd door Verwijderd op 23-11-2004 18:23 ]


  • Cypher87
  • Registratie: Oktober 2004
  • Laatst online: 23-01 17:24
Laat maar, kheb een workaround gevonden:

bij form1:

code:
1
2
3
4
5
6
7
8
9
10
11
  try
    Form2.ShowModal;
  finally
    if form2.changed=true then
    begin
      client.Host:=form2.edit2.Text;
      client.Port:=strtoint(form2.edit1.text);
      client.Connect;
      ...
    end;
  end;


Form2 button:

code:
1
2
3
4
5
if (edit1.Text<>'') and (edit2.Text<>'') then
begin
  changed:=true;
  close;
end;


Form2 onshow:

code:
1
  changed:=false;


Beetje moeilijk mss, maarjah je moet wat he? ;)

Verwijderd

Beetje moeilijk mss, maarjah je moet wat he? ;)
huh?? die changed is een eigen verzonnen property neem ik aan.

Probeer je na de form2.showmodal soms te connecten als je al geconnect ben?
Dan zou je eerder iets verwachten van
Delphi:
1
2
3
4
5
6
7
8
...
      if client.connected then 
         client.disconnect;

      client.Host:=form2.edit2.Text;
      client.Port:=strtoint(form2.edit1.text);
      client.Connect;
...

  • Cypher87
  • Registratie: Oktober 2004
  • Laatst online: 23-01 17:24
Jah changed is een boolean. En nee het heeft niet met die connect te maken want hij geeft de fout als je de host of port property probeert te veranderen, ligt aan indy naar mijn idee.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 14:02

Tomatoman

Fulltime prutser

Ik vermoed dat je tegen het probleem aanloopt dat je de Host property maar één keer mag instellen. Als je hem daarna nogmaals probeert in te stellen (meestal op een andere waarde), kun je met sommige socket-componenten tegen foutmeldingen aanlopen.
Cypher87 schreef op dinsdag 23 november 2004 @ 17:38:
ik heb het volgende:
code:
1
2
3
4
5
6
7
8
9
if (edit1.Text<>'') and (edit2.Text<>'') then
begin
  try
    form1.client.Host:=edit2.Text; //fout
    form1.client.Port:=strtoint(edit1.text);
    form1.client.Connect;
..
  except end;
end;
Een ietwat offtopic opmerking: als je een try-except-constructie gebruikt, doe je dat om verwachte (voorspelbare) fouten in het except-gedeelte op een nette manier af te handelen. Alle overige fouten leiden tot een onverwachte programma-afloop; daarover dien je de gebruiker te informeren middels een foutmelding. Met jouw code verberg je middels een lege exception handler dat er iets is foutgegaan waar de programmeur niet op had gerekend. De gebruiker ziet geen foutmelding en gaat er daarom (terecht) vanuit dat alles is goedgegaan. Je zet hem daarmee op het verkeerde been. Beter is daarom zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (Edit1.Text <> '') and (Edit2.Text <> '') then
begin
  try
    Form1.Client.Host := Edit2.Text;
  except
    on E: EMijnVerkeerdeHostError do
    begin
      // een voorspelbare fout handel je netjes af, waarna het programma verder gaat
      ShowMessage('Verkeerde hostnaam - de host wordt ingesteld op 127.0.0.1');
      Form1.Client.Host := '127.0.0.1';
    end
    else
      raise; // alle overige fouten kun je niet afhandelen, dus doe je dat ook niet
  end;
  try
    Form1.Client.Port := StrToInt(Edit1.Text);
  except
    Form1.Client.Port := 123; // als de tekst ongeldig is, kies je standaard poort 123
  end;
  Form1.Client.Connect;
end;

Nog een offtopic tip: consequent gebruik van hoofdletters en spaties (liefst volgens de conventies van Delphi) maakt je code leesbaarder.

[ Voor 8% gewijzigd door Tomatoman op 23-11-2004 20:21 ]

Een goede grap mag vrienden kosten.


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Probeer ipv van de try .. finally eens dit

Delphi:
1
2
3
4
if Form2.ShowModal = mrOk then
begin
  ...
end;


Onder de knop zet je dan de code:
Delphi:
1
2
ModalResult = mrOk;
Close;

ShowModal is een functie van TForm, zoek eens in de Delphi help files wat de return waarden zijn, dat is makkelijker dan eigen properties maken.

www.fendt.com | Nikon D7100 | PS5


  • Cypher87
  • Registratie: Oktober 2004
  • Laatst online: 23-01 17:24
Natuurlijk weet ik dat je nog een foutmelding moet laten zien, maar daar was ik nog niet aan toegekomen. Daarnaast vind ik het zelf wel makkelijk werken zonder al die spaties. En wat is daar mis mee zolang het werkt? ;)

  • Cypher87
  • Registratie: Oktober 2004
  • Laatst online: 23-01 17:24
FendtVario schreef op dinsdag 23 november 2004 @ 20:39:
Probeer ipv van de try .. finally eens dit

Delphi:
1
2
3
4
if Form2.ShowModal = mrOk then
begin
  ...
end;


Onder de knop zet je dan de code:
Delphi:
1
2
ModalResult = mrOk;
Close;

ShowModal is een functie van TForm, zoek eens in de Delphi help files wat de return waarden zijn, dat is makkelijker dan eigen properties maken.
Bedankt, had ik nog niet aan gedacht 8)7
Pagina: 1