Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler: AccessViolation, nur warum... (https://www.delphipraxis.net/76299-fehler-accessviolation-nur-warum.html)

Chaosente 1. Sep 2006 16:04


Fehler: AccessViolation, nur warum...
 
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, XpMan, StdCtrls, Menus, OleCtrls, SHDocVw_TLB, ComCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Memo1: TMemo;
    ComboBox1: TComboBox;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    MainMenu1: TMainMenu;
    Main1: TMenuItem;
    Label5: TLabel;
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    ProgressBar1: TProgressBar;
    Label6: TLabel;
    Verlauf1: TMenuItem;
    Beenden1: TMenuItem;
    ffnen1: TMenuItem;
    Lschen1: TMenuItem;
    procedure Lschen1Click(Sender: TObject);
    procedure ffnen1Click(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure WebBrowser1ProgressChange(ASender: TObject; Progress,
      ProgressMax: Integer);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
pagecontrol1.ActivePage:=tabsheet2;
TOleControl(Webbrowser1).Visible := False;
form1.DoubleBuffered:=true;
Combobox1.Items.Add('mth.Main');
Combobox1.Items.Add('mth.Alternative');
Combobox1.Items.Add('mth.Club');
Combobox1.Items.Add('mth.Electro');
Combobox1.Items.Add('mth.Black');
Combobox1.Items.Add('mth.Break');
Combobox1.Items.Add('mth.House');
Combobox1.ItemIndex:=0;
Memo1.Text:='';
WebBrowser1.Navigate('http://www.shouted.fm/index.php');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.OleObject.document.forms.item(1).elements.item('name').value:=Edit1.Text;
WebBrowser1.OleObject.document.forms.item(1).elements.item('alter').value:=Edit3.Text;
WebBrowser1.OleObject.document.forms.item(1).elements.item('wohnort').value:=Edit2.Text;
WebBrowser1.OleObject.document.forms.item(1).elements.item('stream').selectedIndex:=ComboBox1.ItemIndex;
WebBrowser1.OleObject.document.forms.item(1).elements.item('nachricht').value:=memo1.Text;
WebBrowser1.OleObject.document.forms.item(1).submit;
end;

procedure TForm1.WebBrowser1ProgressChange(ASender: TObject; Progress,
  ProgressMax: Integer);
begin
if webbrowser1.ReadyState = 0 then begin
progressbar1.Position:=20;
end
else if webbrowser1.ReadyState = 1 then begin
progressbar1.Position:=35;
end
else if webbrowser1.ReadyState = 2 then begin
progressbar1.Position:=60;
end
else if webbrowser1.ReadyState = 3 then begin
progressbar1.Position:=100;
pagecontrol1.ActivePage:=tabsheet1;
end
end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.ffnen1Click(Sender: TObject);
begin
ShowMessage('Noch nicht implementiert');
end;

procedure TForm1.Lschen1Click(Sender: TObject);
begin
ShowMessage('Noch nicht implementiert');
end;

end.
Ich bekomme ne Fehlermeldung in der Steht was von EAccessviolation... keine ahnung was mir das sagen soll....

Matze 1. Sep 2006 16:07

Re: Komische Fehlermeldung!!!
 
Hi,

bei welchem Ereignis bzw. in welcher Zeile tritt der Fehler auf?

Und nur als Hinweis: Ich würde im OnCreate nie Komponenten verarbeiten, denn es ist nicht garantiert, dass diese bereits erzeugt wurden.

Bernhard Geyer 1. Sep 2006 16:18

Re: Komische Fehlermeldung!!!
 
Zitat:

Zitat von Matze
Und nur als Hinweis: Ich würde im OnCreate nie Komponenten verarbeiten, denn es ist nicht garantiert, dass diese bereits erzeugt wurden.

Alles was in der IDE im Formular definiert ist und per DFM gestream wird, ist im OnCreate-Event schon vorhanden.
Hattest Du schon mal Probleme und kannst du dies in einem Testprojekt nachvollziehbar gestalten.

Matze 1. Sep 2006 16:58

Re: Komische Fehlermeldung!!!
 
Zitat:

Zitat von Bernhard Geyer
Alles was in der IDE im Formular definiert ist und per DFM gestream wird, ist im OnCreate-Event schon vorhanden.
Hattest Du schon mal Probleme und kannst du dies in einem Testprojekt nachvollziehbar gestalten.

Ja ich hatte damit schon Probleme, vor allem, wenn es viele Komponenten waren. Doch so auf die schnelle kann ich kein Testprojekt erstellen, da es nur sporadisch aufgetreten ist, sorry.

Bernhard Geyer 1. Sep 2006 17:55

Re: Komische Fehlermeldung!!!
 
Zitat:

Zitat von Matze
Zitat:

Zitat von Bernhard Geyer
Alles was in der IDE im Formular definiert ist und per DFM gestream wird, ist im OnCreate-Event schon vorhanden.
Hattest Du schon mal Probleme und kannst du dies in einem Testprojekt nachvollziehbar gestalten.

Ja ich hatte damit schon Probleme, vor allem, wenn es viele Komponenten waren. Doch so auf die schnelle kann ich kein Testprojekt erstellen, da es nur sporadisch aufgetreten ist, sorry.

Kann ich mir nur 2 Gründe vorstellen:

1, Du hast sehr viele Controls und du läufst in Resourcenprobleme

2, Die Controls versuchen schon beim Zugriff auf Properties mit Windowshandles zu arbeiten die es evtl. noch nicht haben.

sakura 1. Sep 2006 17:57

Re: Komische Fehlermeldung!!!
 
:warn: Ändere bitte den Titel. "Komische Fehlermeldung" ist nicht aussagekräftig :roll:

...:cat:...

Prototypjack 1. Sep 2006 19:03

Re: Komische Fehlermeldung!!!
 
Moin!
Kann jetzt sein, dass ich kompletten Blödsinn rede, ich mache selten was mit OLEObjecten dieser Art.

Aber darf ich trotzdem eine Frage stellen?
Wieso schreibst du:
Delphi-Quellcode:
TOleControl(Webbrowser1).Visible := False;
Aber sprichst den TWebBrowser sonst immer direkt an?
Kann da der Fehler liegen?

Gruß,
Max

Chaosente 2. Sep 2006 11:27

Re: Komische Fehlermeldung!!!
 
Delphi-Quellcode:
TOleControl(Webbrowser1).Visible := False;
Ja da hab ich mich am anfang auch gewundert, aber wenn man die Visible eigenschaft über

Delphi-Quellcode:
Webbrowser1.visible:=false;
anspreicht reagiert der webbrowser nicht! das ist also wohl nicht der fehler!

Allerdings wennich das programm im debugger anhalte, zeigt er mir folgende zeile an!

Delphi-Quellcode:
WebBrowser1.OleObject.document.forms.item(1).elements.item('name').value:=Edit1.Text;
da muss also irgendwo der fehler dirn sein, ich hab nur keinen plan warum! oder muss ich ein editfeld gesondert ansprechen, wenn es auf einem tabsheet vom pagecontrol liegt? das wär das einzige was cih mir im moment vorstellen könnte!

Daniel 2. Sep 2006 11:28

Re: Komische Fehlermeldung!!!
 
Hallo Ente,

Du wurst gestern schon darum gebeten, den Titel Deines Thema zu ändern. Komische Meldungen erhalten viele von uns und keiner kann sich etwas Rechtes darunter vorstellen.

Ein aussagekräftiger Titel ist der erste Schritt zu einer passenden Lösung.

Prototypjack 2. Sep 2006 11:35

Re: Fehler: AccessViolation, nur warum...
 
Moin,
Also, wie du bereits feststellen konntest wird die Fehlersuche nicht einfach.
Ich schlage einfach mal vor du verstreust ein paar Breakpoints(Ich hoffe du weisst was ich meine) in deinem Code.
Damit kannst du den Fehler leicht ausmachen.
Sag' dann nochmal bescheid.
Gruß,
Max

Chaosente 2. Sep 2006 12:24

Re: Fehler: AccessViolation, nur warum...
 
Nein ich weis leidernicht was breakpoints sind! Für hilfe wär ich dankbar!

Ps: Ich hab den Titel doch schon geändert, mehr information zum fehler kann cih leoder nciht geben, weil ich selbst nicht mehr über den fehler weis!


Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project2.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 00460A3F in Modul 'Project2.exe'. Lesen von Adresse 00000000' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Hab hier noch mal die genauer Fehler meldung!

Zitat:

WebBrowser1.OleObject.document.forms.item(1).eleme nts.item('name').value:=Edit1.Text;
Und auf diese Zeile verweist er...

Prototypjack 2. Sep 2006 18:58

Re: Fehler: AccessViolation, nur warum...
 
Aber es muss nicht unbedingt die richtige Zeile sein, auf die er verweisst.

Brechpunkte(Breakpoints) setzt in dem du links bei der Zeile einen Mausklick ausfürst(Da wo die Zahlen sind).
Dann sollte sich dort ein roter Punkt befinden und die Zeile eine andere Farbe haben.

Breakpoints halten den Debugger dort an wo du die Zeile markiert hast, wenn du also:
Delphi-Quellcode:
procedure TFrom1.CustomButton(Sender: TObject);
begin
  Showmessage('Hallo');
  Showmessage('Hallo2');
end;
hast und den Breakpoint auf die Zeile mit Hallo2 in der Showmessage setzt, dann hält das Programm an und zeigt dir die Zeile bevor er Hallo2 ausgibt.
Wenn du dann wieder auf F9 drückst läuft die Applikation weiter und dein Hallo2 wird ausgegeben.

Du kannst jetzt folgendes machen:
Setze Breakpoints vor diesen 2 Zeilen:
Delphi-Quellcode:
WebBrowser1.OleObject.document.forms.item(1).elements.item('name').value:=Edit1.Text;
WebBrowser1.OleObject.document.forms.item(1).elements.item('alter').value:=Edit3.Text;
Dann lässt du dein Programm laufen. Wenn es vor dem Anhalten in der ersten Zeile kracht, liegt der Fehler nicht dort, sonder wird bereits früher ausgelöst.
Wird bei der ersten Zeile unterbrochen, du lässt das Programm weiterlaufen und dann kracht es, bevor er bei der zweiten Zeile anhält, kannst du dir ziemlich sicher sein, dass der Fehler in der ersten Zeile liegt.

Mein Gott, ich hoffe das war einigermassen verständlich ;)
Wenn du genauere Ergebnisse hast meld' dich wieder, ok? :)

Gruß,
Max

Lasse2002 2. Sep 2006 19:48

Re: Fehler: AccessViolation, nur warum...
 
Du greifst auf die Controls von WebControl1 zu bevor diese existieren. Probier doch mal folgendes:

Delphi-Quellcode:
procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
begin
  if webbrowser1.readystate >= 3 then
  begin
    pagecontrol1.ActivePage:=tabsheet1;
    ProgressBar1.Position := 100;
  end;
end;

procedure TForm1.WebBrowser1ProgressChange(ASender: TObject; Progress,
  ProgressMax: Integer);
begin
if webbrowser1.ReadyState = 0 then begin
progressbar1.Position:=20;
end
else if webbrowser1.ReadyState = 1 then begin
progressbar1.Position:=35;
end
else if webbrowser1.ReadyState = 2 then begin
progressbar1.Position:=60;
end
else if webbrowser1.ReadyState = 3 then begin
progressbar1.Position:=90;
end
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz