Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Probleme beim Programmstart
read - Fr 10.12.04 12:58
Titel: Probleme beim Programmstart
..oder Logikfehler?
Hallo zusammen, ich hätte mal 'ne Frage
und zwar lasse ich beim Programmstart überprüfen, ob eine bestimmte Datei vorhanden ist
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.FormCreate(Sender: TObject); var newfile: String; begin newfile :=ExtractFileDrive(Application.exeName); label2.Caption :=(newfile); if not FileExists(label2.Caption+'\eupec\Config\Mitarbeiter.csv') then begin ShowMessage('Installation wurde nicht korrekt ausgeführt oder Datei beschädigt') end; |
soweit sogut...das läuft auch alles
will ich das ganze erweitern..nämlich, wenn die Datei vorhanden ist das er mir ein anderes Fenster öffnet
Delphi-Quelltext
1: 2: 3: 4: 5:
| else beginn form1.Hide; form2.show; end; |
bekomme ich eine Fehlermeldung:"Im Projekt Projekt1.exe ist eine Exception der Klasse EAccessViolation aufgetreten.Meldung Zugriffsverletzung bei Adresse......"
was mach ich falsch????
Bin für jede Hilfe dankbar
Marco
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt.
jasocul - Fr 10.12.04 13:05
Mach das mal im FormActivate oder im FormShow.
Stübi - Fr 10.12.04 13:06
Hallo
Hast du es so erweitert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.FormCreate(Sender: TObject); var newfile: String; begin newfile :=ExtractFileDrive(Application.exeName); label2.Caption :=(newfile); if not FileExists(label2.Caption+'\eupec\Config\Mitarbeiter.csv') then begin ShowMessage('Installation wurde nicht korrekt ausgeführt oder Datei beschädigt') end; else beginn form1.Hide; form2.show; end; |
denn dort dürfte kein ; stehen
Gruss Stübi
read - Fr 10.12.04 13:10
Hallo Stübi
... nein, das Semikolon hab ich schon weggelassen. Es steht halt nur deswegen im Quelltext, da er jetzt ja erst einmal dort endet
@jasocul
welchen Unterschied würde das denn bringen? - sorry falls es 'ne dumme Frage ist
hab's mit OnShow probiert...slebes resultat :cry:
jasocul - Fr 10.12.04 13:10
@stübi:
Dann hätte der Compiler schon meckern müssen.
Das Problem dürfte folgendes sein:
Im FormCreate ist die HauptForm noch nicht wirklich da. Sie wird ja gerade erst erzeugt. Wenn dann ein andere Form angezeigt werden soll, kann es eine Schutzverletzung geben.
jasocul - Fr 10.12.04 13:14
read hat folgendes geschrieben: |
welchen Unterschied würde das denn bringen? - sorry falls es 'ne dumme Frage ist |
Du musst folgendes bedenken:
Das OnActivate wird auch aufgerufen, wenn das Programm im Hintergrund war (mehrere Anwendungen aktiv).
Das OnShow kann auch durch andere Vorgänge angestoßen werden.
Ich habe das immer so gelöst, dass ich im FormCreate eine Variable (FirstTime) auf True gesetzt habe und diese dann im entsprechenden anderen Ereignis (OnActivate) Abfrage und dann auf False setze.
MartinPb - Fr 10.12.04 13:21
Der Fehler ist korrekt. Du stellest die Anweisung in OnCreate des Form1. Das sagt mir, daß das das Programm gerade gestartet wird. Zu dieser Zeit ist das Objekt Form2 noch garnicht da. Wahrscheinlich geht das Programm hier der Reihe nach: zuerst OnCreate des Form1 und dann das OnCreate des Form2. Da du aber bereits in OnCrate des Form1 Form2 aufrufst, geht der Schuß ins leere. Du mußt zuerst ein Formular erstellen befor du es aufrufen kannst.
Was du machen kannst ist die Reihenfolge in der Projektdatei (MeinProjekt.DPR) ändern. So ist es wahrscheinlich:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.Run; end. |
So muß es sein:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| begin Application.Initialize; Application.CreateForm(TForm2, Form2); Application.CreateForm(TForm1, Form1); Application.Run; end. |
Hier wird zuerst das OnCreate des Form2 ausgeführt.
read - Fr 10.12.04 13:23
Hallo Peter
Habe den Quelltext erst in OnShow gepackt...selbes Problem
und jetzt ins OnActivate....neueste Fehlermeldung:"Eigenschaft Visible kan in OnShow oder OnHide nicht verändert werden"........?????????????
gruß
Marco
bug0815 - Fr 10.12.04 13:25
Die Formulare werden immer in der Reihenfolge erzeugt, wie sie im Projektquelltext stehen. Dadurch ergibt sich das Problem, dass die Form die aufgerufen werden soll noch nicht existiert.
Projectquelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| program beispiel;
uses Forms, fe_login in 'fe_main.pas' , fe_info in 'fe_login.pas' , {$R *.res}
begin Application.Initialize; Application.Title := 'Beispiel'; Application.HelpFile := ''; Application.CreateForm(TMain, Main); <span style="font-style: italic">*1</span> Application.CreateForm(TLogin, Login); <span style="font-style: italic">*2</span> Application.Run; end. |
In diesen Beispiel könnte die Form
Main*1 während des Creates nicht die Form
Login*2 aufrufen, da diese noch nicht erzeugt worden ist.
jasocul - Fr 10.12.04 13:26
read hat folgendes geschrieben: |
Habe den Quelltext erst in OnShow gepackt...selbes Problem
und jetzt ins OnActivate....neueste Fehlermeldung:"Eigenschaft Visible kan in OnShow oder OnHide nicht verändert werden"........?????????????
|
Dann probier mal Martins Lösung, die sollte nach meiner Einschätzung funtkionieren.
Bei mir war es dann doch noch etwas anders, da ich meine Formen erst zur Laufzeit erzeuge.
read - Fr 10.12.04 13:35
Hallo Martin
die Sache bringt mich leider auch net so richtig weiter - hab's grad ausprobiert - da ich dann von form2 net zu form1 zurückkehren kann
vielleicht mal kurz worum's dabei geht...das Programm(form1) soll eigentlich ständig laufen...sollte es aber aus welchen Gründen auch immer beendet worden sein, soll beim starten sich ein Fenster(form2) öffnen, in welchem der Name eines Mitarbeiters eingegeben wird um das ganze dan mit Datum und Uhrzeit in ein Tabelle zu schreiben
während der laufzeit form1 wird das ganze per Button oder/und Zeitsteuerung gesteuert.
es geht mir halt nur darum das man beim Programmstart "gezwungen" wird dieses fenster zu sehen und zu "bearbeiten"
ich hoffe es ist halbwegs verständlich
gruß
marco
jasocul - Fr 10.12.04 13:40
Nur mal ein Test: Lass mal das Form1.Hide weg. Wenn das funktioniert, könntest du auch die Form2 so umstellen, dass du sie mit Form2.ShowModal zeigst. Solange die dann angezeigt wird, kann man sowieso nicht zu Form1 wechseln.
Christian S. - Fr 10.12.04 13:50
Hallo!
Bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Delphi-Forum.de Richtlinien:
Richtlinien hat folgendes geschrieben: |
1.2 Beiträge
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]
|
Einfach oben bei Deinem ersten Beitrag auf "Edit" klicken und den Titel ändern. Dank Dir!
Grüße
Christian :-)
read - Fr 10.12.04 13:50
Haare ausrauf :D
nee klappt leider auch net...also ich hab jetzt einfach mal das Form1.hide weggelassen geht leider auch net
bin grad am überlegen, ob ich's net anders mache
habe ja 'nen Button, mit welchem ich die form2 ohne Problem aktivieren kann... vielleicht mach ich's ja so, das beim Start erstmal alle anderen Funktionen gesperrt sind, bis dieser Button betätigt wird
danke Euch allen trotzdem für Eure Mühe und Hilfe
Gruß
Marco
read - Fr 10.12.04 13:54
Hi Christian...
....sorry, kommt net mehr vor
gruß
Marco
Stübi - Fr 10.12.04 14:07
@read and jasocul:
Ist mir eingefallen als ich unterwegs nach Hause war dass meine Antwort falsch war.
Anderer Ansatz: Mit Hide wird die Form meines Wissens unsichtbar gemacht, wie kann man eine Form die noch gar nicht sichtbar ist schon wieder unsichtbar machen? Folglich würde ja OnShow, OnActivate und OnCreate alle nicht gehen, weil (schon wieder) meines Wissens erst nach OnShow (oder während) die Form angezeigt wird. Könnte man die Form nicht auch einfach visible auf False setzten?
Gruss Stübi
jasocul - Fr 10.12.04 14:10
@stübi:
Deswegen hatte ich ihm geschrieben, dass er das Form1.Hide mal rausnehmen soll.
@read:
Vielleicht solltest du das nochmal in den Ereignissen OnActivate und OnShow testen, falls du das noch nicht versucht hast.
read - Fr 10.12.04 14:13
@stübi
wieso, form1 ist doch bereits sichtbar....bzw wird es ja mit OnCreate oder OnShow dargestellt (OnShow müßte man meines wissens nach doch mit "wenn dargestellt" übersetzen)
gruß
Marco
@peter
hab ich auch schon probiert :cry: ... mit selben ergebnissen
gruß
Marco
Stübi - Fr 10.12.04 14:21
OnShow würde ich mit "bei Zeigen" oder "wärend zeigen" bezeichnen, wenn du in einem OnShow-Ereigniss eine Breakpoint setzt's ist die Form noch nicht sichtbar. Du müsstes rausfinden wann alle 3 Ereigniss fertig sind und dann deine Prüfung machen. Oder nicht mit Hide verstecken sondern mit Visible und False.
Sonst ändere mal bei deinem Projekt wo alles erzeugt wird (weiss grad nicht wie es heisst) die Create um deiner 2 Forms, so dass Form 2 zuerst kreiert wird und Form 1 erst danach. (Form2 soltest du aber noch wärend dem Programmieren auf visible := False setzten)
Gruss stübi
jasocul - Fr 10.12.04 14:28
Ich habe gerade nochmal eines meiner alten Projekte rausgekramt. Dort habe ich es im OnActivate gemacht. Dort wird eine zweite Form angezeigt (mit Show). Die hat als FormStyle fsStayOnTop und ist ansonsten ein normales Fenster. Es ist in der Erstellungsliste auch erst nach der Hauptform aufgeführt.
Das funktioniert bei mir völlig problemlos. Ich befürchte, dass du den Fehler an der falschen Stelle suchst. Nimm mal zum Test eine neue Form, die nichts beinhaltet und versuche diese anzeigen zu lassen.
Wenn das nicht weiter hilft, musst du das Projekt mal zur Verfügung stellen, damit man das durchchecken kann.
read - Fr 10.12.04 15:15
@jasocul und alle anderen, welche mir bis jetzt geholfen haben...und villeicht noch wollen
es ist zwar net das komplette project, aber der teil, welcher den fehler verursacht
http://www.read-this.de/Haupt.exe
es ist ein selbstentpackendes archiv und im anleitung.txt hab ich noch 'n paar hinweise reingepackt
gruß
marco
jasocul - Fr 10.12.04 17:14
Damits ein Ende hat, mein Änderungs-Vorschlag:
In unit1 folgende Änderungen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| public FirstTime : Boolean; end; ... procedure TForm1.FormCreate(Sender: TObject); var newfile: String; begin FirstTime := True; ... procedure TForm1.FormActivate(Sender: TObject); begin if FirstTime then begin form2.ShowModal; FirstTime := False; end; end; |
Ich empfehle dir, dass komplett mit ShowModal für Form2 zu machen. Dann sparst du dir das gehampel mit Hide und Show. Das brauchtest du vermutlich nur, um dem Anwender das Wechseln zwischen den Formen unmöglich zu machen. Das bekommst du mit ShowModal genauso gut hin.
Die anderen Tipps mit der Veränderung der Reihenfolge habe ich mal getestet. Das funktioniert bei mir nicht, weil dadurch auch die Hauptform geändert wird. Aber das habe ich nicht gründlich geprüft.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!