Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 463
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mo 26.05.14 14:58 
Ein freundliches Hallo an alle,

bin am Wchenende über einen seltsamen Effekt gestolpert:

In einem umfangreichen Projekt mit diversen Units habe ich ein Formular, dass mit der Enwicklungsumgebung (Delphi 4) erstellt wurde. Es ist getestet und eigentlich abgehakt. Am Wochenende wollte ic die Funktion, die mit dem Formular zusammenhängt verwenden. Statt des Formulars erschien jedoch eine Fehlermeldung. Bei der Ursachenforschung zeigte es sich das einige Anzeigeobjekte, die vor dem Aufruf eingestellt werden oder Anfangswerte erhalten nil sind (TEdit), daher die Fehlermeldung. Die "Procedure FormShow" bekommt dach der Übersetzung keine kleinen blauen Punkte und Breakpoints sind "durchkreuzt" (Siehe Bild 2, Bild 1 zeigt die Punkte)

Hat jemand einen Tipp? Habe ich Mist gebaut, Speicher Objekte, oder wird fehlerhafter Weise der Teil wegoptimiert, oder ist das ein Compilerfehler? Kann ich etwas tun um diesen Teil des Programmes zum Laufen zu bringen?

Im Moment bin ich etwas Ratlos, da ich Compilerdirektiven probiert und zulezt erstellte Module auskommentiert habe.

Hoffe jemand hat einen Tipp und Grüße von der sonnigen Nordsee

Peter
Einloggen, um Attachments anzusehen!
baumina
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: Mo 26.05.14 15:26 
Wenn du keine blauen Punkte bekommst und auch keinen BreakPoint setzen kannst, bedeutet das im Allgemeinen, dass dein Programm diesen Teil des Quellcodes niemals durchlaufen kann / wird.

Ich tippe mal drauf, dass du versehentlich im Objektinspektor beim Formular bei den Ereignissen die Zuweisung für OnShow (FormShow) gelöscht hast.
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 463
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mo 26.05.14 17:34 
Danke baumina,

trifft aber leider nicht zu. Die Routine ist eingetragen und das Formular wird modal aufgerufen. Was mich aber komplett irritiert ist der Umstand dass "Edit2" bereits nach "Application.CreateForm" nil ist. Wäre das erst später könnte es vielleicht ein Speicherproblem sein.

Grüße von der Nordsee

Peter
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18689
Erhaltene Danke: 1619

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.05.14 20:51 
Modal und Application.CreateForm? Das hört sich seltsam an. :gruebel:

Wenn man irgendwo im Programm ein Formular modal benutzt, sieht das normalerweise so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  MyForm: TForm2;
begin
  MyForm := TForm2.Create(Self);
  try
    if IsPositiveResult(MyForm.ShowModal) then
      MyForm....
  finally
    MyForm.Free;
  end;

Eine Möglichkeit dafür, dass das nil ist, ist, dass im Konstruktor eine Exception auftritt. Denn dann wird das Objekt, in diesem Fall das Formular, nicht fertig erzeugt. Das sollte aber beim Debuggen zu sehen sein, da Delphi dort anhält.

// EDIT:
Du könntest alles andere aus dem Projekt herauswerfen und schauen, ob es irgendwann geht. Wenn nicht, kannst du das Rumpfprojekt am Ende ja einfach einmal hier posten.
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 463
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Di 27.05.14 09:11 
Hallo jaenicke,

Dank auch Dir. Das Formular ist mit der Entwicklungsumgebung aufgebaut und wurde automatisch in der Projektdatei erstellt. Das ganze hat auch schon mal funktioniert! Daher bin ich ja so erstaunt, dass es jetzt nicht meht geht.

Mit dem Abspecken habe ich es schon versucht, aber der Kern des Prototypen stammt noch aus der Zeit, als ich die Entwicklungsumgebung erforscht und viel herumprobiert habe. Da sind diese Möglichkeiten begrenzt. Aber Du bringst mich damit auf die Idee eine kleine Testumgebung zu schaffen. Wenn dort alles funktioniert, bleiben zwar Fragezeichen aber vielleich grenzt das die Möglichkeiten schon mal ein. Eine Exception ist außer beim Zugriff auf Edit2 nichr aufgetreten.

Ich werde berichten, was bei der Testumgebung heraus kommt.

Grüße von der Nordseee

Peter
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 463
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Di 27.05.14 10:38 
Ein freundliches Hallo an alle,

hier nun die Ergebnisse meiner Versuche:

Wie erwartet funktioniert das Fromular, wenn ich es aus einer anderen Umgebung anspreche. In dem Prototypen fehlen jedoch Objekte und es tritt eine Exception auf. Ich habe daraufhin die Reihenfolge der Erzeugung geändert. Das Ergebnis ist, dass jetzt Fehler an anderer Stelle auftreten. So ist z.B. "Edit1" vorhanden, aber "Edit1.Enabled" nicht und löst eine Exception aus. Es sieht so aus, als ob die Datenstruktur des Objektes zersägt wäre. Stack??

Freundliche Grüße von der sonnigen Nordsee

Peter
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 165
Erhaltene Danke: 42



BeitragVerfasst: Di 27.05.14 11:53 
Das hört sich für mich so an, als wenn du auf eine globale Form-Variable zugreifst (z.B. Form1).
Die Variable zeigt aber auf ein Formular, das bereits zerstört wurde.

Diese Variablen sind eigentlich Relikte, zumindest waren sie nie für modale Formulare geeignet.
Ein modales Formular sollte beim Programmstart nicht automatisch erzeugt werden (wenn doch, ändern).

Ein Beispiel wie man mit modalen Formularen arbeitet hat jaenicke bereits gebracht.
Zugriffe auf das Formular sind dort nur im try .. finally zulässig.
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 463
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Di 27.05.14 15:13 
Hallo Blup,

danke für Deine Antwort. Mit dem dynamischen Erzeugen des Formulars habe ich inzwischen auch experementiert. Damit scheint es zu funktionieren.

Anscheinend gibt es Probleme wenn die Anzahl der Formulare zu groß wird. Wenn ich Delphi schließe und habe viele Editier-Fenster geöffnet bekommt Delphi beim Start Probleme und meldet eine Exception. Irgend wann viel mir auf, dass die Formulare, die sonst aufgelistet wurden nun nicht mehr in der Liste erscheinen. Es war nur noch ein Formular da. Bisher habe ich diesen Effekt ignoriert, anscheinend war das der Begin der Probleme. Ich werde einige der selten benötigten Formulare dynamisch erzeugen, alles testen, wenn ich die Formularliste wieder sehe und dann berichten.

Das die automatisch erzeugten Formulare nicht für modale Anzeige geeignet sind kann ich nicht bestätigen, denn lange Zeit hat es funktioniert. Näheres berichte ich nach den Versuchen.

Grüße von der wolkigen Nordsee

Peter
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18689
Erhaltene Danke: 1619

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 27.05.14 16:06 
Prinzipiell macht es wenig Sinn alle Formulare automatisch erstellen zu lassen, einfach weil das den Start der anwendung unnötig verzögert. Normalerweise sollte man nur das Hauptformular und ggf. sehr wenige andere nur einmal parallel genutzte (!!) Formulare automatisch erzeugen.

Wenn das selbe Formular mehrfach erzeugt wird, darf es nicht automatisch erstellt werden und auch nicht die globale Variable genutzt werden. (Die globale Variable sollte ohnehin nach Möglichkeit nicht genutzt werden.)
Das mehrfache Erzeugen meinte auch user profile iconBlup.
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 463
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mo 11.01.16 16:35 
Ein freundliches Hallo an alle,

inzwischen habe ich einiges herausgefunden, nachdem sich weitere seltsame Effekte eingestellt haben. Anscheinend ist eine Menge Sand im Getriebe meines Betriebssystems. Mein Kompiler bekommt ab und zu Änderungen an der Quelle nicht mit und Übersetzt sie daher auch nicht. Inzwischen wird auch öfter mal eine Unit zum 2. mal geöffnet und es erscheint die Frage "Quelltext geändert, neu laden?". Manchmal wird dann eine eingefügte Zeile nicht übersetzt, auch nicht, wenn ich die Unit noch einmal neu speichere. Dann hilft nur: Delphi beenden und neu starten. Nun werde ich mein Bertriebssystem neu machen, und wenn alle Programme installiert sind ein Image ziehen.

Grüße von der Nordsee

Peter
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18689
Erhaltene Danke: 1619

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 11.01.16 19:51 
Das hört sich eher danach an als ob vielleicht eine gleichnamige Datei an anderer Stelle liegt und diese statt der anderen benutzt wird.

Es kann aber auch durchaus ein Fehler in Delphi sein. Delphi 4 galt ja als relativ fehlerbehaftete Version.

Am Betriebssystem wird es eher nicht liegen, aber eine Neuinstallation kann sicher nicht schaden.

_________________
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 404
Erhaltene Danke: 23



BeitragVerfasst: Di 12.01.16 07:42 
Ein beliebter Fehler, der zu solchen Effekten führen kann ist (ich hab grad mal von Dir geklaut, jaenicke):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  MyForm: TForm2;
begin
  MyForm.Create(Self);
  try
    if IsPositiveResult(MyForm.ShowModal) then
      MyForm....
  finally
    MyForm.Free;
  end;