| Autor |
Beitrag |
tempuss
      
Beiträge: 29
xp, vista
Delphi 7 Personal
|
Verfasst: Di 01.04.08 02:20
Hallo Delphi-Freunde!
Möchte mir eine kleine CD-Datenbank schreiben.
Wenn ich eine CD einlege und dann das Prog starte,
wird die CD eingelesen und ausgewertet.
Bei schon vorhandenem Eintrag in der CD-Datei soll ein <MessageDlg> darüber informieren.
Bevor das Formular erscheint, kommt die Meldung:
Im Projekt CD_Prog.exe ist eine Exception der Klasse EInvalidOperation aufgetreten.
Meldung: 'Ein deaktiviertes oder unsichtbares Fenster kann nicht den Focus erhalten'.
Prozess wurde angehalten... (Bild ist als Datei eingefügt)
Verstehe schon, worum es geht, denke ich.
Gibt es nicht eine Möglichkeit, den Focus erst zu setzen, wenn das jeweilige Fenster sichtbar ist?
Oder einen anderer Weg?
Vielen Dank vorweg!
Gruß Uli Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Di 01.04.2008 um 23:38
Einloggen, um Attachments anzusehen!
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 01.04.08 09:22
Ohne Quellcode können wir da nicht groß helfen..
Tipp: Du versuchst den Fokus auf ein deaktiviertes Objekt zu setzen, also z.B:
Delphi-Quelltext 1: 2:
| Edit1.Enabled := false; Edit1.SetFocus; |
|
|
oldmax
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: Di 01.04.08 12:20
Hi
Ich glaub, wenn im OnCreate oder einer im OnCreate aufgerufenen Procedure des Formulares ein Focus gesetzt wird, passiert auch diese Fehlermeldung. Setzt den Befehl "SetFocus" mal ins OnShow. Soweit ich weis, ist der Aufbau des Formulares noch nicht fertig. Ich kanns leider nicht nachvollziehen, da ich hier ohne Delphi bin.....
Gruß oldmax
_________________ Zier dich nich so, ich krieg dich schon....
|
|
tempuss 
      
Beiträge: 29
xp, vista
Delphi 7 Personal
|
Verfasst: Di 01.04.08 23:07
Hallo Leute!
Danke Euch für die Antworten!
oldmax: OnShow könnte klappen, kann's leider nicht testen,
da ich die Komponente <MessageDlg> einfach nur so aufrufe:
Delphi-Quelltext 1: 2: 3:
| if MessageDlg('CD ['+N+'] schon vorhanden! Einträge Überschreiben?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then _overwrite:=TRUE |
Der MessageDialog existiert nicht als Komponente im Formular.
Auf diese Weise kann ich doch nichts über den ObjectInspector regeln.
Konnte keine passende Komponente mit Abfrage finden.
Was kann man sonst noch zur Abfrage nutzen?
Sonst baue ich mir was zusammen, 'zu Fuß'.
Ich habe die kostenlose Version Delphi 7 personal.
Könnte es sein, dass deswegen so ein Dialog fehlt?
Kann ich mir zwar nicht vorstellen, denn so was Besonderes ist das nicht.
Aber ich bin Delphi-Anfänger. War immer mit TP7 zugange.
DANKE NOCHMAL!!!
Gruß Uli
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 02.04.08 09:01
Zeig uns doch einfach mal die komplette Prozedur..
|
|
tempuss 
      
Beiträge: 29
xp, vista
Delphi 7 Personal
|
Verfasst: Mi 02.04.08 21:08
Hallo Leute!
Hier der Code, in welchem die Exception auftritt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| procedure check_double; var F: TextFile; i:integer; s,N0,N,SN:string; begin _overwrite:=FALSE; assignFile(F,'C:\CDs.dat'); try {$I-} reset(F); {$I+} _ioFehler:=ioResult; if _ioFehler=0 then begin while not eof(F) do begin N:=''; readln(F,s); if (copy(s,1,2)='sn') then begin SN:=copy(s,3,8); for i:=1 to length(s) do begin if (copy(s,12+i,1)<>'"') then N:=N+copy(s,12+i,1) else break; end; if (N=_sname) then begin if (SN=_snummer) then if MessageDlg('CD ['+N+'] schon vorhanden! Einträge Überschreiben?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then _overwrite:=TRUE; exit; end; end; end; end; finally closeFile(F); end; end; |
Die Procedure wird immer dann aufgerufen,
nachdem neue CD über <GetFilesInDirectory> und <FindFirst> eingelesen wurde.
Der Fehler tritt besonders dann auf, wenn CD eingelegt wird und dann das Prog gestartet wird.
Die Prog-Oberfläche ist noch nicht aufgebaut, wenn der MessageDialog schon erscheinen will, denke ich.
Könnte den Fehler vermeiden, wenn ich immer erst das Prog starte, dann auf Oberfläche warte und
dann die CD einlege.
Es sollte doch eine Komponente für eine Ja/Abbrechen - Abfrage in der Komponentenpalette geben?
Die könnte man dann doch in den Objecteigenschaften auf OnShow/SetFocus setzen, oder?
Ufff...
Gruß Uli
|
|
oldmax
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: Do 03.04.08 06:39
Hi
Nun, überleg mal, ob eventuell die Procedur aus irgendeinem Ereignis heraus aufgerufen wird.
Beipiel
du hast eine Radiogroup auf der Form und setzt das Onchange-Ereignis mit dem Aufruf einer Procedure.
In der Formcreate setzt du den ItemIndex mit einem Startwert und löst das OnChange -Ereignis aus. Damit erfolgt der Aufruf der Procedure und das, bevor dein Programm richtig initialisiert ist. Abhilfe:
In Formcreate alle OnChange- Ereignisse auf NIL setzen und am Ende wieder zuweisen.
so etwa in dieser Form
Im Objektinspektor den Eintrag der Ereignisroutine kopieren
In FormCreate mit
Delphi-Quelltext 1:
| MyRadiogroup.OnChange:=Nil; |
beginnen und am Ende wieder mit
Delphi-Quelltext 1:
| MyRadiogroup.OnChange:=.... |
zuweisen.
Vielleicht ist das der Grund und die Abhilfe.
Gruß oldmax
_________________ Zier dich nich so, ich krieg dich schon....
|
|
tempuss 
      
Beiträge: 29
xp, vista
Delphi 7 Personal
|
Verfasst: Do 03.04.08 23:13
Hallo oldmax!
Ich habe die Proc gerade geschrieben und rufe sie per <check_double> aus FormCreate heraus auf.
Sie wird garantiert nirgendwo anders aufgerufen, das wüsste ich.
Ich staune nur, dass Borland sowas überhaupt zulässt.
Sicher liegt der Fehler bei mir, nicht bei Borland.
Nur dass man sich darum so explizit kümmern muss?
Gibt es evtl. eine Möglichkeit, eine Ja|Nein Abfrage als Komponente zu setzen?
Dann ließe sich über seine Eigenschaft sicher was einstellen- onShow setFocus?
Ansonsten nehme ich den MessageDlg raus, dann ist der Fehler weg.
Müsste mir dann eine andere Ja|Nein Abfrage ausdenken.
Gruß Uli
|
|
|