![]() |
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:
Form aufrufen:
procedure TNeuerArtikel.FormClose(Sender: TObject; var Action: TCloseAction);
begin Action := Cafree; Bestellung.BestellungNeuerArtikelLaden; end;
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:
Wo liegt mein Denkfehler kann mir jemand Helfen?
procedure TMain.FNeuerArtikeloeffnen;
begin TNeuerArtikel.Create(Self); end; Gruß Mcop2001de |
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. |
AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
Moin...8-)
Delphi-Quellcode:
...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
procedure TMain.FNeuerArtikeloeffnen;
begin TNeuerArtikel.Create(Self); end; |
AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
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. 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:
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.
ActiveForm.Close; // Die Form, welche grade den Eingabefokus hat
ShowDialog(...); // oder TXyzForm.Create+Show |
AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
Zitat:
|
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; |
AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
Hallo himitsu
zu deine Anmerkung Zitat:
|
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.
|
AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
Hallöle...:P
Die Preisfrage ist, wo
Delphi-Quellcode:
deklariert ist.
SpalteNeuerArtikel
...deshalb solltest du das Projekt anhängen. :? Ansonsten raten wir in 20 Seiten immer noch weiter. :? PS: Zitat:
|
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? |
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. Also Objekte sollte man immer freigeben. |
AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
Zitat:
Forms automatisch erzeugen und automatisch freigeben und nicht selber daran rumwerkeln. |
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:
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,
procedure TMain.FNeuerArtikeloeffnen;
begin TNeuerArtikel.Create(Self); // hier z.B. end; 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. |
AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
Zitat:
|
AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
Ok danke werde ich versuchen.
|
AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
Zitat:
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: |
AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
Zitat:
Zitat:
Demnach müsstest du eigentlich auch haentschman anmeckern, denn er ist auch nicht deiner Meinung - in DIESEM Fall. |
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. |
AW: Nach dem schleißen eine Form Procdure einer anderen Form ausführen
Drum Erwähnte ich auch OnCloseQuery (vordem Schließen).
Zitat:
Alles Andere gehört in Destroy, wenn es im Create erstellt wurde. |
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 ;-) |
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 |
AW: Nach dem Schließen eine Form Procdure einer anderen Form ausführen
Done.
|
AW: Nach dem Schließen eine Form Procdure einer anderen Form ausführen
Zitat:
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 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