AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kein Zugriff mehr auf Formular

Ein Thema von Puddi · begonnen am 27. Sep 2005 · letzter Beitrag vom 30. Sep 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Puddi
Puddi

Registriert seit: 25. Sep 2005
20 Beiträge
 
Delphi 2005 Architect
 
#1

Kein Zugriff mehr auf Formular

  Alt 27. Sep 2005, 22:23
Ahoi!

Ich hoffe, ich bin hier im richtigen Forum gelandet. Ich hätte da ein Problem, das mir bereits so einiges an Kopfzerbrechen bereitet hat. Vielleicht könnte mir ja jemand behilflich sein.

In meinem Hauptformular (Form1) wird per Knopfdruck ein weiteres Fenster (Form5) per ShowModal-Methode geöffnet.

Delphi-Quellcode:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  IF OpenDialog1.Execute
  THEN BEGIN
         AssignFile(Datei,OpenDialog1.FileName);
         Form5:=TForm5.Create(Self);
         TRY
           Form5.ShowModal;
         FINALLY BEGIN
                   Form5.Release;
                   Form5:=NIL;
                 END;
         END;
       END;
end;
In diesem Fenster soll die im OpenDialog ausgewählte Datei bearbeitet werden können. Bei einem Knopfdruck auf einen Button dieses Fensters soll nun eine Prozedur gestartet werden, die den gewählten Text in einer bestimmten Weise verarbeiten soll. Dazu muß zuerst eine Datenbank (Temp) gelöscht werden. Während der Löschung dieser Datenbank wird Form6 (ein Bitte-Warten-Fenster) per Show-Methode angezeigt. Nach der Löschung soll es automatisch geschlossen werden. Nach dieser Schließung soll dann Form3 angezeigt werden. Dieses Formular gibt den Fortschritt des eigentlichen Textverarbeitungsprozesses wieder.

Delphi-Quellcode:
procedure TForm5.BitBtn1Click(Sender: TObject);
begin
  IF MessageDlg('Die bestehende temporäre Datenbank wird dadurch gelöscht. Fortfahren?',mtWarning,mbOkCancel,0) = mrOK
  THEN BEGIN
         Form6:=TForm6.Create(Self);
         TRY
           Form6.Show;
           WITH Temp DO BEGIN
                          Active:=FALSE;
                          EmptyTable;
                          Active:=TRUE;
                        END;
         FINALLY BEGIN
                   Form6.Release;
                   Form6:=NIL;
                 END;
         END;
         Form3:=TForm3.Create(Self);
         TRY
           Form3.ShowModal;
         FINALLY BEGIN
                   Form3.Release;
                   Form3:=NIL;
                 END;
         END;
       END;
end;
Der Prozess selbst wird durch das OnShow-Ereignis von Form3 gestartet.

Delphi-Quellcode:
procedure TForm3.FormShow(Sender: TObject);
begin
  { hier ist dann meine tolle Prozedur }  
  { ... }  
  Form3.Close; // wenn fertig, soll das Fenster automatisch geschlossen werden
end;
Mein Problem ist nun folgendes: nach Betätigung des Buttons, der meine tolle Prozedur startet, wird diese plangemäß ausgeführt. Ob Form6 ordnungsgemäß geschlossen und released wird kann ich nicht erkennen, die Datenbank wird jedenfalls ordnungsgemäß geleert. Komischerweise wandert mein Programm aber daraufhin in den Hintergrund, und Delphi wird das aktive Programm. Wenn ich nun per Taskleisten-Klick mein Programm wieder in den Vordergrund hole, werden Form5 und dahinter Form1 wieder sichtbar. Form5 reagiert nun allerdings nicht mehr auf meine Eingaben. Auch ein Zugriff auf Form1 ist nicht mehr möglich. Es scheint fast so, als ob ein anderes Fenster außer Form1 oder Form5 noch modalen Charakter hat, dieses aber nicht mehr sichtbar ist. Ich hätte aber gerne, dass ich nach Beendigung der Prozedur wieder auf Form5 vollen Zugriff habe, dass dieses also wieder das aktuelle modale Fenster ist.

Um das Problem zu lösen hab ich erst einmal den Block, der Form6 anzeigt und die Datenbank löscht, entfernt. Das Ergebnis ist dann aber, dass Form3 (das Fortschrittsfenster) sich nicht mehr automatisch schließt. Wenn ich es per Systemmenü schließe, schließt sich danach auch automatisch Form5, und das möchte ich eigentlich nicht. Form1 reagiert aber wenigstens auf meine Eingaben.

Hat jemand eine Idee? Schätze mal, es handelt sich um einen relativ banalen Fehler. Aber irgendwie komm ich hohle Nuss nicht drauf .

Ich hab den restlichen Code, der meiner Meinung nach nichts mit dem Problem zu tun haben kann, rausgelöscht. Bei Bedarf reich ich den kompletten Quelltext gerne nach.

Danke vorab für Eure Bemühungen!
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Kein Zugriff mehr auf Formular

  Alt 28. Sep 2005, 06:15
Tschaaaaa ..... also im Moment fällt mir kein "echter" Bug auf. Nur ein paar Sachen, die ich anders machen würde, die aber auch nicht die Ursache dieses Fehlers sein dürften. Du könntest ja ma den Code hochladen. Vielleicht finden wir dann was.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Kein Zugriff mehr auf Formular

  Alt 28. Sep 2005, 07:03
Hallo Puddi,

herzlich willkommen in der Delphi-PRAXiS.

Den Aufruf von Form.Close() im Ereignis OnShow() der Form solltest du dir unbedingt abgewöhnen.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.073 Beiträge
 
Delphi 12 Athens
 
#4

Re: Kein Zugriff mehr auf Formular

  Alt 28. Sep 2005, 08:02
Da dat Programm ja irgendwo zu hängen scheint ... hast du es denn auch mal Schrittweise abgearbeitet?


Und um marabu's Hinweis zu befolgen:

Delphi-Quellcode:
Form3:=TForm3.Create(Self);
TRY
  Form3.Show;
  Form3.tolleProzedur; // statt in OnShow eine eigenständige Routine aufrufen
FINALLY BEGIN
  Form3.Release;
  Form3:=NIL;
END;


PS: i kann mi och noch an 'nen "bescheuerten" Versuch von mir erinnern
... Free innerhalb der Komponente ('s war zufällig och in 'nen Form)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Touchdown

Registriert seit: 17. Feb 2003
227 Beiträge
 
#5

Re: Kein Zugriff mehr auf Formular

  Alt 28. Sep 2005, 08:41
Release ist mir relativ unbekannt und es scheint dir Probleme zu machen.

Aus dem Speicher scheinen die Formulare jedenfalls nicht zu sein, nehm doch zu testen mal .free
function getallfornothing: TGoldesel;
begin
result := TGoldesel.create;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Puddi
Puddi

Registriert seit: 25. Sep 2005
20 Beiträge
 
Delphi 2005 Architect
 
#6

Re: Kein Zugriff mehr auf Formular

  Alt 28. Sep 2005, 10:21
Danke erstmal für die vielen Hinweise!

Ich habe nun, wie von marabu und himitsu vorgeschlagen, den Aufruf von Form3 (das Fortschrittsfenster) wie oben angegeben abgeändert. Und es hat in der Tat etwas gebracht : die Prozedur wird ordnungsgemäß abgearbeitet und Form3 hinterher geschlossen, das Programm reagiert danach auch wieder. Allerdings wird danach auch Form5 geschlossen, und das sollte eigentlich nicht passieren .

Eine andere Frage bleibt auch noch, diese ist aber eher zweitrangig (Hauptsache das Programm läuft so wie es soll): Ich möchte nämlich gerne, dass Form1 Form5 modal öffnet und Form5 dann Form3 modal öffnet (und dass dann beim Schließen von Form3 automatisch Form5 das aktive modale Fenster wird etc.). Ändere ich in dem von Euch genannten Aufruf von Form3 die Methode auf ShowModal, so entsteht wieder das "Programm-reagiert-nicht-Problem" .

Ich stelle Euch besser mal den kompletten Quelltext zur Verfügung, das hilft Euch wahrscheinlich eher als meine Ausführungen hier . Für die Ausführung der Prozedur solltet Ihr die Datei "test.txt" auswählen, die ebenfalls im Verzeichnis vorhanden ist - andere Dateien könnten Probleme verursachen .

P.S. Ich weiss, dass mein Programmierstil nicht der schönste bzw. effektivste ist. Ich gehöre mehr zu den "Hauptsache-es-läuft-einigermaßen-egal-wie-Hobby-Programmierern". Für Verbesserungsvorschläge hab ich aber jederzeit ein offenes Ohr.
Angehängte Dateien
Dateityp: rar uv_212.rar (862,8 KB, 11x aufgerufen)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Kein Zugriff mehr auf Formular

  Alt 28. Sep 2005, 19:47
Hi Puddi,

die Freigabe von Form6 funktioniert - du kannst da nur nicht soviel sehen, weil alles so schnell geht. Ein ShowMessage('pause') vor dem Form6.Release gibt dir Gelegenheit dich zu überzeugen. Beim anschließenden Aufruf von Form3 versuchst du die gleiche Vorgehensweise, aber das muss gewaltig schief gehen, da du die Form3 bereits in der Methode TextVerarbeiten() mit Form3.Close() zerstörst, bevor du dann im Anschluß daran die Methode Release() mit einem ungültigen Form-Pointer aufrufst. Nimm die Zeile Form3.Close aus der Methode raus und das seltsame Verhalten auf deinem Rechner könnte behoben sein. Wenn nicht schauen wir weiter.

Grüße vom marabu

PS: Blödsinn - du hattes keine CloseAction angegeben, also wurde bei Form3.Close() nur ein Hide() ausgeführt. Wenn ich das Programm bei mir laufen lasse, dann bleibt es im Vordergrund und Delphi wird nicht nach vorne geholt...
  Mit Zitat antworten Zitat
Benutzerbild von Puddi
Puddi

Registriert seit: 25. Sep 2005
20 Beiträge
 
Delphi 2005 Architect
 
#8

Re: Kein Zugriff mehr auf Formular

  Alt 28. Sep 2005, 23:04
Du hast Recht, mein Programm wandert tatsächlich nicht mehr in den Hintergrund. Vielleicht war noch eine andere Anwendung o.Ä. dafür verantwortlich, am Sourcecode hatte ich sonst nichts geändert (glaub ich jedenfalls ).

Okay, den

Form3.Close; -Befehl habe ich entfernt. Das Problem bleibt nach wie vor bestehen: Form3 wird trotzdem geschlossen .

Verstehe ich Dich da jetzt richtig, dass der Aufruf von Form3 so nun doch okay ist?

Delphi-Quellcode:
Form3:=TForm3.Create(Self);
TRY
  Form3.Show;
  Form3.TextVerarbeiten;
FINALLY BEGIN
          Form3.Release;
          Form3:=NIL;
        END;
END;
Dachte mir ursprünglich, dass Form3 nach Beendigung von TextVerarbeiten ja nur geschlossen und nicht destroy-ed wird (es also noch da ist, aber halt nicht sichtbar). Somit müsste "Form3.Release;" ja möglich sein. Aber das ist glaub ich das, was Du meintest.

In einer älteren Version lief das mal problemlos. Keine Ahnung, warum ich das wieder verbockt hab .
  Mit Zitat antworten Zitat
Benutzerbild von Puddi
Puddi

Registriert seit: 25. Sep 2005
20 Beiträge
 
Delphi 2005 Architect
 
#9

Re: Kein Zugriff mehr auf Formular

  Alt 29. Sep 2005, 21:22
Ich hab grad noch mal den Debugger drüberlaufen lassen, die Situation lässt sich wie folgt zusammenfassen:

Form1 erzeugt Form5 modal (klappt problemlos):

Delphi-Quellcode:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  IF OpenDialog1.Execute
  THEN BEGIN
         AssignFile(Datei,OpenDialog1.FileName);
         Form5:=TForm5.Create(Self);
         TRY
           Form5.ShowModal;
         FINALLY BEGIN
                   Form5.Release;
                   Form5:=NIL;
                 END;
         END;
       END;
 end;
Form5 öffnet dann auf Knopfdruck Form6 und schließt diese nach Löschung der Datenbank wieder. Danach wird automatisch Form3 erzeugt und die dazugehörige Prozedur "TextVerarbeiten" ausgeführt (klappt soweit beides problemlos):

Delphi-Quellcode:
procedure TForm5.BitBtn1Click(Sender: TObject);
begin
  IF MessageDlg('Die bestehende temporäre Datenbank wird dadurch gelöscht. Fortfahren?',mtWarning,mbOkCancel,0) = mrOK
  THEN BEGIN
         Form6:=TForm6.Create(Self);
         TRY
           Form6.Show;
           WITH Temp DO BEGIN
                          Active:=FALSE;
                          EmptyTable;
                          Active:=TRUE;
                        END;
         FINALLY BEGIN
                   Form6.Release;
                   Form6:=NIL;
                 END;
         END;
         Form3:=TForm3.Create(Self);
         TRY
           Form3.Show;
           Form3.TextVerarbeiten;
         FINALLY BEGIN
                   Form3.Release;
                   Form3:=NIL;
                 END;
         END;
       END;
end;
Komisch ist nun, dass Form5 automatisch released wird, und zwar unmittelbar nachdem auch Form3 released wurde. Form5 soll aber geöffnet bleiben (am besten modal) .

Schulligung wenn ich nerve, aber der Fehler steckt in einer Schlüsseltelle des Programms. Leider kann ich erstmal nicht weitermachen, solange dieser Fehler noch da ist.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Kein Zugriff mehr auf Formular

  Alt 29. Sep 2005, 22:42
Hi Puddi,

Zitat von Puddi:
Form5 soll aber geöffnet bleiben
na dann setze mal im Object Inspector Form5.BitBtn1.ModalResult auf mrNone...

Grüße vom marabu
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 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