Autor Beitrag
tempuss
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

xp, vista
Delphi 7 Personal
BeitragVerfasst: 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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 01.04.2008 um 23:38
Einloggen, um Attachments anzusehen!
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
Edit1.Enabled := false;
Edit1.SetFocus;
oldmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

xp, vista
Delphi 7 Personal
BeitragVerfasst: 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:
ausblenden 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 user profile iconNarses: Delphi-Tags hinzugefügt
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mi 02.04.08 09:01 
Zeig uns doch einfach mal die komplette Prozedur..
tempuss Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

xp, vista
Delphi 7 Personal
BeitragVerfasst: Mi 02.04.08 21:08 
Hallo Leute!

Hier der Code, in welchem die Exception auftritt:
ausblenden volle Höhe Delphi-Quelltext
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; // _overwrite ist global, für SpeicherProcedure
assignFile(F,'C:\CDs.dat');
try {$I-} reset(F); {$I+}
    _ioFehler:=ioResult;
    if _ioFehler=0 then
       begin
       while not eof(F) do
             begin N:='';    //      CD-SN      CD-Name  Einträge im RootVerz.
             readln(F,s);               // CD-Eintrag(1.Zeile)= sn12345678 "Name..." Einträge: 123
             if (copy(s,1,2)='sn'then // CD-SerienNr. /Name /Einträge in akt. Zeile
                begin
                SN:=copy(s,3,8); // SerienNr. auslesen
                for i:=1 to length(s) do // Name auslesen
                    begin
                    if (copy(s,12+i,1)<>'"'then // Name zu Ende, wenn 2.<">
                       N:=N+copy(s,12+i,1)
                       else break; // Name zu Ende
                    end;
                if (N=_sname) then // akt.Name(CDs.dat) = Name(eingelgte CD)? 
                   begin
                   if (SN=_snummer) then // SerienNr.(CDs.dat) = SerienNr.(eingelgte CD)? 
{Hier kommt Fehler}   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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
MyRadiogroup.OnChange:=Nil;					

beginnen und am Ende wieder mit
ausblenden Delphi-Quelltext
1:
MyRadiogroup.OnChange:=.... // wieder hineinkopieren					

zuweisen.
Vielleicht ist das der Grund und die Abhilfe.

Gruß oldmax

_________________
Zier dich nich so, ich krieg dich schon....
tempuss Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

xp, vista
Delphi 7 Personal
BeitragVerfasst: 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