Delphi-PRAXiS

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?

Aviator 25. Mai 2017 13:00

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

Zitat von SneakyBagels (Beitrag 1372724)
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.

Also diese Denkweise finde ich mehr als fragwürdig. :shock:

Natürlich gibt man Instanzen (egal welcher Art) immer wieder frei wenn man sie nicht benötigt. Außerdem hat man es sich bei der Freigabe der Form gespart, dass man zuvor geänderte Felder (Edit, ComboBox, ...) wieder auf einen Standardwert zurücksetzen muss, usw.

Also Objekte sollte man immer freigeben.

SneakyBagels 25. Mai 2017 13:18

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

Natürlich gibt man Instanzen (egal welcher Art) immer wieder frei wenn man sie nicht benötigt. Außerdem hat man es sich bei der Freigabe der Form gespart, dass man zuvor geänderte Felder (Edit, ComboBox, ...) wieder auf einen Standardwert zurücksetzen muss, usw.
Nur wenn man davon keine Ahnung hat dann sollte man das nutzen was Delphi einem anbietet:
Forms automatisch erzeugen und automatisch freigeben und nicht selber daran rumwerkeln.

haentschman 25. Mai 2017 13:28

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

:shock: Ich hatte nicht ein großes Projekt erwartet.
Delphi-Quellcode:
procedure TMain.FNeuerArtikeloeffnen;
begin
   TNeuerArtikel.Create(Self); // hier z.B.
end;
Du hast ein Chaos in den Instanzen. Du erzeugst ständig neue Forms und gibst sie nur über Main(Owner = Self) Close frei. :? Auch wenn ich auch für die dynamischen Forms bin,
hier würde ich das nicht empfehlen. :roll:

1. Alle Forms automatisch erzeugen lassen mit Hide oder Visible := False = nicht sichtbar.
2. Statt xxx.Create(Self) nur xxx.Show des entsprechenden Forms ausführen.
3. Danach wieder die Form ausblenden mit Hide oder Visible := False.

...dann schaun wir mal weiter.

PS: Ich gehe jetzt ein ECHTES :cheers: trinken. Auf meinen Ehrentag... 8-) Ich schaue dann mal später wieder rein.

SneakyBagels 25. Mai 2017 13:30

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

1. Alle Forms automatisch erzeugen lassen mit Hide = nicht sichtbar.
2. Statt xxx.Create(Self) nur xxx.Show des entsprechenden Forms ausführen.
3. Danach wieder die Form ausblenden mit Hide.
Exakt. Vereinfacht das Ganze sehr!

MCOP2001DE 25. Mai 2017 13:34

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
Ok danke werde ich versuchen.

Aviator 25. Mai 2017 13:42

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

Zitat von SneakyBagels (Beitrag 1372742)
Zitat:

Natürlich gibt man Instanzen (egal welcher Art) immer wieder frei wenn man sie nicht benötigt. Außerdem hat man es sich bei der Freigabe der Form gespart, dass man zuvor geänderte Felder (Edit, ComboBox, ...) wieder auf einen Standardwert zurücksetzen muss, usw.
Nur wenn man davon keine Ahnung hat dann sollte man das nutzen was Delphi einem anbietet:
Forms automatisch erzeugen und automatisch freigeben und nicht selber daran rumwerkeln.

Warum wirst du eigentlich bei jedem der nicht deiner Meinung ist immer direkt aggressiv und greifst die Leute (verbal) an. Wo ist dein Problem. Jede Methode hat Vor- und Nachteile. Und das ist kein Grund direkt pampig zu werden.

Du gehörst für mich schon seit deiner letzten Aktion zu denjenigen, mit denen man besser keine Diskussion anfängt. Da gibt es so einige Spezialisten hier im Forum. Es bringt ja eh nichts. Auch hier wieder genau das gleiche Verhalten. Und diese Meinung hat sich gerade wieder verstärkt. :roll:

SneakyBagels 25. Mai 2017 13:53

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

Warum wirst du eigentlich bei jedem der nicht deiner Meinung ist immer direkt aggressiv und greifst die Leute (verbal) an
:shock: wo bitte bin ich aggressiv?

Zitat:

Warum wirst du eigentlich bei jedem der nicht deiner Meinung ist immer direkt aggressiv und greifst die Leute (verbal) an
Dir steht es frei mir nicht zu antworten, was du aber dennoch tust.

Demnach müsstest du eigentlich auch haentschman anmeckern, denn er ist auch nicht deiner Meinung - in DIESEM Fall.

stalkingwolf 29. Mai 2017 14:31

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
ich würde das nicht beim formclose durchführen sondern beim click auf den Button.
Die neue Form wird doch sicherlich modal geöffnet und danach kann man auf das Modalresult der 2ten Form reagieren.

Formcloses zu verlangsamen hat bei uns zu einigen komischen verhalten von Fenstern geführt.
Z.b das die Form noch sichtbar war, aber nicht mehr vorhanden. Beim erneuten click auf schließen ( auch das X von Windows ) hagelte es Zugriffsverletzungen.

formclose benutze ich nur noch zum aufräumen meiner form und evtl speichern von Konfigurationen.

himitsu 29. Mai 2017 14:55

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
Drum Erwähnte ich auch OnCloseQuery (vordem Schließen).

Zitat:

Zitat von stalkingwolf (Beitrag 1372900)
formclose benutze ich nur noch zum aufräumen meiner form und evtl speichern von Konfigurationen.

Aber nur von Dingen, die im OnShow geladen/erstellt wurden.
Alles Andere gehört in Destroy, wenn es im Create erstellt wurde.

stalkingwolf 31. Mai 2017 08:20

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
Natürlich ;-)

Wir haben uns das vollstopfen von onCreate aber mittlerweile abgewöhnt. Verzögert den Programmstart und dann kommt nur mimimi von Kunden.
Irgendwo muss man ja die verlorene Zeit der Live Virenscanner wieder reinholen ;-)

EWeiss 31. Mai 2017 10:42

AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
 
Kann mal jemand den Titel anpassen?
Ich lese immer.. Nach dem Scheißen eine Form.. Einfach furchtbar.

gruss

TBx 31. Mai 2017 15:36

AW: Nach dem Schließen eine Form Procdure einer anderen Form ausführen
 
Done.

EWeiss 31. Mai 2017 21:44

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

Zitat von TBx (Beitrag 1373140)
Done.

Danke ;)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 Uhr.

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