Problem mit SetFocus (war: bcb mag mich nicht)
-
arghhh.. ich krieg noch nen rappel.
hallo erstmal,
ich hab ne funktion geschrieben, die von mehreren eventhandlern unter bestimmten bedingungen aufgerufen wird. soweit so gut, nur macht die funktion nicht was sie soll. bei einem OnExit() funktioniert sie einwandfrei, bei einem OnClick() werden zwar die berechnungen und so richtig gemacht, aber das abschließende ->SetFocus() wird ignoriert.
jetzt der hammer! gehe ich alles schritt für schritt im debug modus durch, funktioniert alles einwandfrei!!! jetzt weiß ich nicht weiter, wie ich dem fehler auf die schliche kommen soll.Edit:
Bitte aussagekräftige Überschriften verwenden. Danke![ Dieser Beitrag wurde am 10.02.2003 um 13:48 Uhr von Jansen editiert. ]
-
Wie oft wurde das jetzt mit dem Debug-Modus schon gesagt? Ich dreh gleich durch.
Bitte macht einen Beitrag für die FAQ, das ist ja nicht mehr auszuhalten.
-
hab mich im forum vertan, sorry, aber müßte beim bcb genau das gleiche sein. uninitialisierte variablen...im debug-modus werden alle variablen mit 0 initialisiert im Release-Modus mit willkürlichen Werten!
-
@< > das erklärt aber nicht warum ein ->SetFocus() ignoriert wird, zudem gibts bei mir keine uninitialisierten vars
-
Das hört sich aber nicht nach uninitialisierter Variable an. Wenn alles geht, nur ->SetFocus() nicht...
...vielleicht wird das im Realmodus verhindert? Versuch doch mal
// sollte ansich schon genügen können, ja nach Situation
->BringToFront();
// aber ruhig erst mal stehenlassen
->SetFocus();Beschreib doch mal die Situation.
-
Korrektur:
das feld erhält zwar den focus, aber der cursor ist nicht mehr zu sehen. Erst wenn ich die anwendung in den hintergrund tabbe und anschliessend wieder in den vordergrund hol, ist er wieder da.
edit: ->BringToFront bringt auch keine besserung[ Dieser Beitrag wurde am 10.02.2003 um 14:27 Uhr von DBler editiert. ]
-
Hi,
kannst du eine Code senden ??? Ich hab auch Problem mit TEdit :: OnEnter, OnExit und Modal Dialogs gehabt.
-
@blazek jaroslav
der code ist sehr lang, besonders die drei betroffenen funktionen, deshalb hab ich ihn auf das wichtigste gekürzt, ich hoffe das hilft weiter[cpp]void __fastcall TForm_Main::BTN_UebernehmenClick(TObject *Sender)
{
...// alle erforderlichen Felder ausgefüllt ?
if(Edit_Personalnummer->Text != "" && Edit_Kostenstelle->Text != "" && Edit_Arbeitsgang->Text != ""
&& (DS_AG->FieldByName("vorgangs_kz")->AsInteger == 0 || Edit_Vorgangsnummer->Text != ""))
{
...
// neuer Datensatz
if(DS_BDE->FieldByName("buchungs_kz")->AsInteger == 1 || DS_BDE->AllRecordCount == 0)
{
...
}// alter Datensatz
else
{
...
}
DS_BDE->Post();ClearAllButPersNr();
DisableAllButPersNr();
Edit_Personalnummer->SetFocus();BTN_Uebernehmen->Enabled = False;
BTN_Schichtende->Enabled = False;if(DS_BDE->FieldByName("buchungs_kz")->AsInteger == 1)
{// !!! Hier tritt das problem ein !!!
PersNrVerlassen();
Edit_Arbeitsgang->SetFocus();
}}
// Fehler
else
{
...
}
}
else
UebernehmenError();
}
//------------------------------------------------------------------------------------------------------------void __fastcall TForm_Main::Edit_PersonalnummerExit(TObject *Sender)
{
PersNrVerlassen();
}
//------------------------------------------------------------------------------------------------------------void TForm_Main::PersNrVerlassen()
{
...ClearAllButPersNr(); // alle Label und Editfelder ausser Personalnummer säubern
DisableAllButPersNr();if(Edit_Personalnummer->Text != "")
{
...// Personalnummer vorhanden ?
if(DS_PN->AllRecordCount == 0)
{
... // Fehler
}
// zugehörige Datensätze
else
{
...// Datensatz nicht abgeschlossen, Felder mit vorigen Daten füllen und ergänzen
if(DS_BDE->FieldByName("buchungs_kz")->AsInteger == 0 && DS_BDE->AllRecordCount != 0)
{
...// für diesen Arbeitsgang Vorgang erforderlich ?
if(DS_AG->FieldByName("vorgangs_kz")->AsInteger == 1)
{
...// Vorgangsnummer beschriften
if(DS_BDE->FieldByName("vorgangsnummer")->AsInteger)
{
...
}// Blattnummer beschriften
if(DS_BDE->FieldByName("blattnummer")->AsInteger)
{
...
}
}
// zu editierende Felder freischalten
...
}
// Datensatz abgeschlossen oder nicht vorhanden, neuen Datensatz anlegen
else
{
...
Enable(DBLookupComboBox_Schicht, True);
Enable(Edit_Kostenstelle, True);
...if(DS_BDE->AllRecordCount != 0)
{
// Endzeit letzter Vorgang = Startzeit neuer Vorgang
...// Beschriftung
...Enable(Edit_Arbeitsgang, True); // d.h. ->Enabled = True, ->Color = clWindow
// !!! Hier funktionierts !!!if(GetZeichen() == '\t')
Edit_Arbeitsgang->SetFocus();}
// noch kein Datensatz vorhanden
else
{
...
}
}
}
}
} [/cpp]
edit: anmerkung zu meiner korrektur, das feld erhält den focus, der cursor ist nicht zu sehen, und das OnEnter()-event wird nicht ausgelöst
... so langsam wirds mysteriös[ Dieser Beitrag wurde am 10.02.2003 um 15:51 Uhr von DBler editiert. ]
-
Hi,
diese geht auch nicht..??
ActiveControl = Edit_Arbeitsgang; /*----- oder -----*/ //Edit_Personalnummer->SetFocus(); BTN_Uebernehmen->Enabled = False; BTN_Schichtende->Enabled = False; if(DS_BDE->FieldByName("buchungs_kz")->AsInteger == 1) { PersNrVerlassen(); Edit_Arbeitsgang->SetFocus(); } else Edit_Personalnummer->SetFocus();
@DBler >aber der cursor ist nicht mehr zu sehen
das war auch unserer Problem mit Modal Dialogs und diese war Lösung http://forum.builder.cz/read.php?f=12&i=10276&t=10258
-
Zu Enabled = true gehört auch ein false. Ist in der Fehlersituation das Feld enabled? Versuch doch mal, reinzuschreiben. Der Fehler kann an einer ganz anderen Stelle sitzen.
-
Hast Du mal nachgesehen, ob Du eventuell irgendwo den Cursor abgestellt hast?
-
@<omega-x>
lies mal was hinter dieser zeile steht
Enable(Edit_Arbeitsgang, True);@andidreas
ich wusste nicht mal das das geht, kann mir das auch versehentlich passieren?@blazek jaroslav
ActiveControl hilft nicht weiter, aber das zusätzliche if(){}else{} hats gebracht, jetzt läufts ohne Probleme, auch wenn ichs mir nicht recht erklären kann.danke
-
Hab ich gesehen. Genau deswegen der Hinweis. Die Routine wird ja noch mehrere Funktionen haben. Aber Hauptsache, es klappert jetzt.