Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Nach dem Schließen eine Form Procdure einer anderen Form ausführen (https://www.delphipraxis.net/192849-nach-dem-schliessen-eine-form-procdure-einer-anderen-form-ausfuehren.html)

MCOP2001DE 25. Mai 2017 03:56


Nach dem Schließen eine Form Procdure einer anderen Form ausführen
 
Guten Morgen

Ich bin schon seit einigen Tagen auf der suche nach einer Methode wie ich beim schließen einer Form eine Procedure in einer anderen Form ausführen kann.
Hintergrund ist der es gibt eine Form Bestellung in der werden die Artikel eingetragen klickt man auf Speichern wird überprüft ob der Artikel in der DB vorhanden ist sollte er nicht vorhanden sein öffnet sich einen zweite Form in der zusätzliche Informationen für den Artikel eingetragen werden und der Artikel in die DB aufgenommen wird. Nun soll die Form wieder geschlossen werden und die Überprüfung erneut gestartet werden. Dieser Ablauf soll solange wiederholt werden bis alle 10 Eingabe spalten geprüft sind und dann die Daten in der DB gespeichert werden.
Bei dem folgenden Code bekomme ich die Fehlermeldung "Access Violation":
Schließen:
Delphi-Quellcode:
procedure TNeuerArtikel.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := Cafree;
  Bestellung.BestellungNeuerArtikelLaden;
end;
Form aufrufen:
Delphi-Quellcode:
if eBezeichnung1.Text <> '' then
    begin
      if ID1 = 0 then
        begin
          SpalteNeuerArtikel := 1;
          Main.Artikelbezeichnung := eBezeichnung1.Text;
          Main.Artikelnr := eArtikelnummer1.Text;
          Main.Preis := eEinzelpreis1.Text;
          Main.Lieferant := eLieferant1.Text;
          Main.FNeuerArtikeloeffnen;
         end;
    end;
Delphi-Quellcode:
procedure TMain.FNeuerArtikeloeffnen;
begin
   TNeuerArtikel.Create(Self);
end;
Wo liegt mein Denkfehler kann mir jemand Helfen?

Gruß Mcop2001de

himitsu 25. Mai 2017 08:09

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
So ganz seh ich jetzt nicht durch.

Beim Schließen welcher Form knallt es jetzt? ( TNeuerArtikel? )
In welcher der Zeilen knallt es? ( es soll Leute geben, die nutzen doch tatsächlich ihren Debugger, hab ich mal gehört :stupid: )
Wo steht der zweite Code? ( soll das etwa BestellungNeuerArtikelLaden sein? )
Warum nicht im OnCloseQuery prüfen, also VOR dem Schließen?

PS: "Zugriffsverletztung bei Adresse $00000xx" deutet darauf hin, dass DU irgendwo auf eine Methode oder ein Feld (Variable) eines nichtexistierenden Objektes (nil) zugreifen willst.
Tipp: Strg+C funktioniert fast überall (bei den Meldungen im Compilerlog und auch bei Dialogen) und schon hat man etwas als "Text" zum hier rein koppieren.

haentschman 25. Mai 2017 08:12

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
Moin...8-)
Delphi-Quellcode:
procedure TMain.FNeuerArtikeloeffnen;
begin
   TNeuerArtikel.Create(Self);
end;
...das muß schon mal schiefgehen. :roll: Hänge mal das komplette (!) Projekt als ZIP hier an. Da können wir besser deine Logik beurteilen und dir helfen. :P

himitsu 25. Mai 2017 08:28

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
Zitat:

Zitat von haentschman (Beitrag 1372710)
...das muß schon mal schiefgehen.

Per se ist dieser Co. nicht probleematisch.
Kommt drauf an "wann" FNeuerArtikeloeffnen aufgerufen wird.

TNeuerArtikel hängt an TMain(Self) und wird dieses TMain geschlossen, dann nimmt es dieses TNeuerArtikel mit über den Jordan.

Außerdem hängt die VCL Forms nicht nur als Owner, sondern z.B. auch via implizitem PopupParent an die gerade "aktive" Form und wird jene Form geschlossen, dann nimmt sie ihre Child ebenfalls mit.
> Neue Forms anzeigen "NACHDEM" die Form von eben weg ist und nicht "WÄHREND" sie grade verschwindet.
Delphi-Quellcode:
ActiveForm.Close; // Die Form, welche grade den Eingabefokus hat
ShowDialog(...); // oder TXyzForm.Create+Show
So ein Code macht immer viel Spaß, da dieses Close die erste Form nicht sofort schließt, sondern das erst beim nächsten "ProcessMessages" passiert, also nachdem sich die neue Form/Dialog an die ActiveForm gehängt hat.

haentschman 25. Mai 2017 08:34

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
Zitat:

Per se ist dieser Co. nicht probleematisch.
...so meinte ich das nicht. :wink: Imho fehlen die Grundlagen über Variablen, Instanz, Owner, Parent etc. :? Das kann man nur am Projekt erklären.

MCOP2001DE 25. Mai 2017 09:39

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
Die Variable SpalteNeuerArtikel wird in der Procedure BestellungneuerartikelS1 beschrieben und soll nach dem Schließen der Form NeuerArtikel die 10 Spalten unterscheiden so das die Variablen ID1 - ID10 nur von den Spalten beschrieben werden.
Mit der ID1..10 wird die Artikel_ID aus der Datenbank für jede Spalte zwischen gespeichert.

Das eigentliche Problem scheint die Variabel SpalteNeuerArtikel zusein.
diese wird Hier beschrieben
Delphi-Quellcode:
procedure TBestellung.BestellungneuerartikelS1;
begin
  if eBezeichnung1.Text <> '' then
    begin
      if ID1 = 0 then
        begin
          SpalteNeuerArtikel := 1;
          Main.Artikelbezeichnung := eBezeichnung1.Text;
          Main.Artikelnr := eArtikelnummer1.Text;
          Main.Preis := eEinzelpreis1.Text;
          Main.Lieferant := eLieferant1.Text;
           Main.FNeuerArtikeloeffnen;
         end;

    end;
end;

Der Fehler

Im Projekt VerwaltungV1.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x007dc39a: read of address 0x000006e4' aufgetreten.

wird in der Procedure BestellungNeuerArtikelLaden ausgelöst.

Delphi-Quellcode:
// nach dem schliessen des Frames NeuerArtikel wird die ID neu ermittel
procedure TBestellung.BestellungNeuerArtikelLaden;
begin
  if SpalteNeuerArtikel = 1 then // Hier wird der Fehler Ausgelöst
    begin
      ID1 := Artikelpruefung(eBezeichnung1.Text,eEinzelPreis1.Text,eArtikelnummer1.Text,eLieferant1.Text);
    end;

end;

MCOP2001DE 25. Mai 2017 09:50

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
Hallo himitsu

zu deine Anmerkung
Zitat:

Kommt drauf an "wann" FNeuerArtikeloeffnen aufgerufen wird.

TNeuerArtikel hängt an TMain(Self) und wird dieses TMain geschlossen, dann nimmt es dieses TNeuerArtikel mit über den Jordan.
die Form Main wird nur beim schliessen des gesamten Programms geschlossen die Form ist die MDI Form alle anderen Formen sind MDIChild.

SneakyBagels 25. Mai 2017 11:04

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
Es gibt mittlerweile soviel Arbeitsspeicher... wieso gibt man überhaupt noch Forms frei? Ich gehe einfach mal davon aus, dass es sich hierbei um ein Kleinstprojekt handelt wo das eh vollkommen überflüssig ist Forms freizugeben. Ob diese Kleinstanwendung jetzt 2 MB oder 5 MB belegt ist doch egal.

haentschman 25. Mai 2017 11:56

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
Hallöle...:P

Die Preisfrage ist, wo
Delphi-Quellcode:
SpalteNeuerArtikel
deklariert ist.
...deshalb solltest du das Projekt anhängen. :? Ansonsten raten wir in 20 Seiten immer noch weiter. :?

PS:
Zitat:

die Form ist die MDI Form alle anderen Formen sind MDIChild.
Meine Meinung: Wenn des möglich sein sollte, lasse die MDI Fenster weg. MDI ist imho nicht mehr zeitgemäß. :thumb:

MCOP2001DE 25. Mai 2017 12:39

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
Hallo Haentschman

die Variable wird im private Bereich der Unit frmBestellung deklariert
Im Anhang das bisherige Projekt

gibt es denn eine andere Möglichkeit die Formen innerhalb einer Hauptform dazustellen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 Uhr.
Seite 1 von 3  1 23      

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