Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Fehlermeldung bei Prozeduraufruf aus einem anderen Formular


Jakane - Mi 19.09.12 10:18
Titel: Fehlermeldung bei Prozeduraufruf aus einem anderen Formular
Hallo liebe Delphi-Helfer :)

ich habe ein MDI-Haupt-Formular (fm1) und ein reagierendes MDI-Formular (fm2) mit 2 Edit-Feldern.
Mit Tfm2.Create(Self) erstelle und öffne ich das 2. Formular.
Wenn ich dann auf den Hinzu-Schalter auf dem 1. Formular drücke, seh ich mein ShowMessage und dann eine Fehlermeldung:

Im Projekt Test22.exe ist eine Exception der Klasse C0000005 aufgetretten. Meldung: 'access violation at 0x0045bf66: read of address 0x000002e0'. Prozeß wurde angehalten.

Weiss einer wie das zustande kommt und wie man das beheben kann?

Danke für die Hilfe :)


Delphi-Quelltext
1:
2:
3:
4:
procedure Tfm1.btnHinzuClick(Sender: TObject);
begin
  fm2._Hinzu;
end;


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure Tfm2._Hinzu;
begin
  ShowMessage('Test');
  if not edName.Enabled then
  begin
    edName.Enabled:= True;
    edPasswort.Enabled:= True;
  end;
end;


PS: Nein, ich möchte den Schalter Hinzu nicht auf fm2 haben.

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Sybok Factor - Mi 19.09.12 10:50

Zitat:
PS: Nein, ich möchte den Schalter Hinzu nicht auf fm2 haben.
???

Access Violation zeigt meist an, dass du ein Objekt ansprichst, dass nicht vorhanden ist. Ist das Formular erzeugt / vorhanden?


jaenicke - Mi 19.09.12 10:58

user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Mit Tfm2.Create(Self) erstelle und öffne ich das 2. Formular.
Und du packst das auch in die Variable fm2? (Denn sonst ist die schlicht leer.)
Und du hast auch nur ein Formular vom Typ Tfm2? (Denn sonst ist in der Variablen ja nur eines der Formulare, nämlich das zuletzt erstellte, und das existiert vielleicht gar nicht mehr.)


Jakane - Mi 19.09.12 12:25

Ich sehe das Formular mit seinen 2 Edit-Feldern.
Packe ich eine CheckBox auf fm2, kann ich die auch anklicken.
FormCreate stellt das Formular auch auf maximiert ein.

Das kann soweit ich weiss, nur ein Formular das auch wirklich existiert.


mandras - Mi 19.09.12 12:34

Wie jaenicke schon schrieb:

> Und du packst das auch in die Variable fm2

Wenn Du das Formular erzeugst ist es erstmal da und zeigt sich.
Um auf dessen Elemente zuzugreifen mußt Du aber irgendeine Variable haben in der der Verweis auf das erzeugte Formular steht.


Jakane - Mi 19.09.12 12:38

Ich hatte auch eine Variable, aber die falsche :lol:

Danke für die Hilfe.


Jakane - Fr 21.09.12 14:35

Jetzt bekomm ich schon wieder diese Fehlermeldung.
Allerdings hat sie diesmal eine seltsame Eigenart...

Ich rufe die Funktion auf:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TfmHaupt._Formular_laden(Index: Integer);
var
  f : Integer;
begin
  // Formular erstellen / füllen
  ShowMessage('');
  if psAktivesFormular <> nil then
  begin
    MessageDlg('Es ist bereits ein Formular offen.', mtInformation, [mbOK], 0);
    EXIT;
  end;
...

Ohne das ShowMessage = Fehlermeldung
ShowMessage('') = keine Fehlermeldung
ShowMessage('.') = keine Fehlermeldung
ShowMessage('..') = keine Fehlermeldung
ShowMessage('...') = Fehlermeldung
ShowMessage('abc') = keine Fehlermeldung
ShowMessage('abcd') = Fehlermeldung
ShowMessage('123') = keine Fehlermeldung
ShowMessage('1234') = Fehlermeldung

Gibt es dafür auch eine Erklärung?

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Narses - Fr 21.09.12 14:51

Moin!

user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TfmHaupt._Formular_laden(Index: Integer);
var
  f : Integer;
begin
  // Formular erstellen / füllen
Soll der Kommentar andeuten, dass da Code steht? Wenn ja, welcher? :lupe:

user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Ohne das ShowMessage = Fehlermeldung
Was soll "Fehlermeldung" genau bedeuten? :nixweiss:

cu
Narses


Jakane - Fr 21.09.12 15:04

user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:

Im Projekt Test22.exe ist eine Exception der Klasse C0000005 aufgetretten. Meldung: 'access violation at 0x0045bf66: read of address 0x000002e0'. Prozeß wurde angehalten.


Es ist immer die selbe Fehlermeldung.


Delphi-Quelltext
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:
procedure TfmHaupt._Formular_laden(Index: Integer);
var
  f : Integer;
begin
  // Formular erstellen / füllen
  ShowMessage('');
  if psAktivesFormular <> nil then
  begin
    MessageDlg('Es ist bereits ein Formular offen.', mtInformation, [mbOK], 0);
    EXIT;
  end;
  // ListBox Formulare füllen
  if Index = -1 then
  begin
    lbFormularName.Items.Clear;
    lbFormularCaption.Items.Clear;
    For f:= 0 to OLMenue.Count - 1 do
    begin
      _Formular_laden(f);
      lbFormularName.Items.Add(psAktivesFormular.Name);
      lbFormularCaption.Items.Add(psAktivesFormular.Caption);
      psAktivesFormular.Close;
      psAktivesFormular:= nil;
    end;
    pLoginAnwender.Visible:= False;
    EXIT;
  end;
  // Formular laden
  Case Index of
    00: fmStammArtikel:= TfmStammArtikel.Create(Self);
    01: fmStammArtikelbewertungen:= TfmStammArtikelbewertungen.Create(Self);
    02: fmStammArtikelgruppen:= TfmStammArtikelgruppen.Create(Self);
    03: fmStammMengeneinheiten:= TfmStammMengeneinheiten.Create(Self);
    04: fmStammLagerorte:= TfmStammLagerorte.Create(Self);
    05: fmStammEinkaufsquellen:= TfmStammEinkaufsquellen.Create(Self);
    06: fmStammKalender:= TfmStammKalender.Create(Self);
    07: fmStammLieferanten:= TfmStammLieferanten.Create(Self);
    08: fmStammLieferantenbewertungen:= TfmStammLieferantenbewertungen.Create(Self);
    09: fmFertigungEssen:= TfmFertigungEssen.Create(Self);
    10: fmFertigungEssensplan:= TfmFertigungEssensplan.Create(Self);
    11: fmFertigungHausaufgaben:= TfmFertigungHausaufgaben.Create(Self);
    12: fmFertigungTermine:= TfmFertigungTermine.Create(Self);
    13: fmLagerArtikeleingang:= TfmLagerArtikeleingang.Create(Self);
    14: fmLagerArtikeleingangsuebersicht:= TfmLagerArtikeleingangsuebersicht.Create(Self);
    15: fmLagerArtikeluebersicht:= TfmLagerArtikeluebersicht.Create(Self);
    16: fmEinkaufBedarfslisten:= TfmEinkaufBedarfslisten.Create(Self);
    17: fmEinkaufUebersicht:= TfmEinkaufUebersicht.Create(Self);
    18: fmEinkaufPreise:= TfmEinkaufPreise.Create(Self);
    19: fmEinkaufFestkosten:= TfmEinkaufFestkosten.Create(Self);
    20: fmVerkaufLohnGehalt:= TfmVerkaufLohnGehalt.Create(Self);
    21: fmVerkaufSonstige:= TfmVerkaufSonstige.Create(Self);
    22: fmVerkaufUmsatzstatistik:= TfmVerkaufUmsatzstatistik.Create(Self);
    23: fmKalkulationNeueRezepte:= TfmKalkulationNeueRezepte.Create(Self);
    24: fmSystemAnwenderkonto:= TfmSystemAnwenderkonto.Create(Self);
    25: fmSystemDesign:= TfmSystemDesign.Create(Self);
    26: fmSystemAdministator:= TfmSystemAdministator.Create(Self);
  end;
  Case Index of
    00: psAktivesFormular:= fmStammArtikel;
    01: psAktivesFormular:= fmStammArtikelbewertungen;
    02: psAktivesFormular:= fmStammArtikelgruppen;
    03: psAktivesFormular:= fmStammMengeneinheiten;
    04: psAktivesFormular:= fmStammLagerorte;
    05: psAktivesFormular:= fmStammEinkaufsquellen;
    06: psAktivesFormular:= fmStammKalender;
    07: psAktivesFormular:= fmStammLieferanten;
    08: psAktivesFormular:= fmStammLieferantenbewertungen;
    09: psAktivesFormular:= fmFertigungEssen;
    10: psAktivesFormular:= fmFertigungEssensplan;
    11: psAktivesFormular:= fmFertigungHausaufgaben;
    12: psAktivesFormular:= fmFertigungTermine;
    13: psAktivesFormular:= fmLagerArtikeleingang;
    14: psAktivesFormular:= fmLagerArtikeleingangsuebersicht;
    15: psAktivesFormular:= fmLagerArtikeluebersicht;
    16: psAktivesFormular:= fmEinkaufBedarfslisten;
    17: psAktivesFormular:= fmEinkaufUebersicht;
    18: psAktivesFormular:= fmEinkaufPreise;
    19: psAktivesFormular:= fmEinkaufFestkosten;
    20: psAktivesFormular:= fmVerkaufLohnGehalt;
    21: psAktivesFormular:= fmVerkaufSonstige;
    22: psAktivesFormular:= fmVerkaufUmsatzstatistik;
    23: psAktivesFormular:= fmKalkulationNeueRezepte;
    24: psAktivesFormular:= fmSystemAnwenderkonto;
    25: psAktivesFormular:= fmSystemDesign;
    26: psAktivesFormular:= fmSystemAdministator;
  end;
end;


bummi - Fr 21.09.12 17:02


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  if psAktivesFormular <> nil then
  begin
    MessageDlg('Es ist bereits ein Formular offen.', mtInformation, [mbOK], 0);
    EXIT;
  end;

  // ListBox Formulare füllen
  if Index = -1 then
  begin
    lbFormularName.Items.Clear;
    lbFormularCaption.Items.Clear;
    For f:= 0 to OLMenue.Count - 1 do
    begin
      _Formular_laden(f);
      lbFormularName.Items.Add(psAktivesFormular.Name);
      lbFormularCaption.Items.Add(psAktivesFormular.Caption);
      psAktivesFormular.Close;
      psAktivesFormular:= nil;


Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt
Moderiert von user profile iconMartok: Highlight-Tags hinzugefügt