In Editfeld schreiben

Tobias K.

Erfahrenes Mitglied
moin


Ich habe eine Dialogfeld basierende Anweundung geschrieben.
Durch den Klick auf ein Button wird ein neues ( von mir erstelltes) Dialogfeld erstellt.
In diesem hab ich ein Eingabefeld, das ich mit einem Wert füllen will, den ich mir vorher aus einer Datei hole.


Das Problem ist das ich Updatedata nicht verwenden kann, weil der Dialog nicht von OnInitDialog kommt oder so....
SetWindowText() geht leider auch nciht.

Was kann ich noch machen?


mfg
umbrasaxum
 
UpdateData macht doch intern auch nix anderes als SetWindowText.

Du holst dir mit GetDlgItem über die ID ein HWND (oder CWnd*), oder merkst dir das Handle beim dynamischen Erstellen.

Mit dem CWnd ist es einfach pWnd->SetWindowText und mit dem HWND ::SetWindowText( hWnd, xxx ).

[rant]Ich arbeite grundsätzlich nicht mit UpdateData, weil es immer alles updated, und noch ein paar andere Probleme mit sich bringt[/rant]
 
moin


GetDlgItem werde ich mir mal merken. Den rest wusste ich.

Habe jetrzt festgestellt, das ich einen ganz anderen Fehler gemacht hab, und zwar scheint es als darf man UpdateData und SetWindowText nicht in Konstruktor benutzen, warum ist das so?



Code:
IMPLEMENT_DYNAMIC(CEinstellungenDlg, CDialog)
CEinstellungenDlg::CEinstellungenDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CEinstellungenDlg::IDD, pParent)
	, csSpeicherpfad(_T(""))
	, csBenutzer(_T(""))
{
	

}

Hier wird das Dialogfeld initialisiert.
Nun könnte ich von der Funktion aus, die das Dialogfeld aufruft, gleich entsprechende Werte mitgeben (für csSpeicherpfad und csBenutzer).
Ich würde das aber lieber alles in der CEinstellungenDlg Klasse machen.


mfg
umbrasaxum
 
Zuletzt bearbeitet:
Da ist eins der Probleme von UpdateData ja schon:

Wenn die Dialog-Klasse erzeugt wird, wird der Dialog aber noch nicht erzeugt. Gerade im Constructor gibt es alle keine gültigen HWNDs.
Die einzelnen Controls bzw. Updatedata kannst du erst in WM_INITDIALOG (bzw. innerhalb OnInitDialog) benutzen. Vorher wirst du auf die beliebten Asserts treffen.

csSpeicherPfad und csBenutzer sind CString-Members? Sind die an die Controls gebunden oder nur einfache Member. Die kannst du eigentlich vorher schon initialisieren (also auch im Constructor), ich weiss allerdings nicht, was passiert, wenn die zugeordneten Controls initialisiert werden.
 
moin


Ja die gehören zu bestimmten Controls ( Editfelder ) und ja es sind CStrings.
Und wie gesagt ich möchte das die Editfelder gleich beim erscheinen des Dialogfelds mit Werten aus einer Datei versehen werden.

Wie ich die Werte aus der Datei krieg ist nciht das Problem nur das anzeigen in den Editfeldern.


mfg
umbrasaxum
 
Wie Endurion schon sagte, für Initialisierungen ist OnInitDialog() zuständig.
Ebenso kannst du DoDataExchange verwenden. Das ist abhängig davon, was du in deinem Dialog tust.
DoDataExchange wird ja auch aufgerufen, wenn du in deinem Dialog OnUpdate() aufrufst:
Transfer von den C++ Members in die Controls bei UpdateData(FALSE)
Transfer von den Controls in die C++Members bei UpdateData(TRUE)

Bei dir heisst dies, dass der Inhalt der C++ Member, die du vorher bereits mit Daten belegt hast (z.B. im Constructor), in die entsprechenden Controls übertragen wird.

UpdateData(FALSE) wird auch von der CDialog::OnInitialUpdate() aufgerufen -> aufpassen in OnInitDialog, dass du zuerst die Basisklasse aufrufst, da deine Menber sonst nicht entsprechend vorbelegt sind.

Willst du also Daten von deinen Controls in C++ Member und umgekehrt transferieren während der Laufzeit des Dialogs, so musst du dies in DoDataExchange tun, da OnInitDialog ja nur einmal aufgerufen wird.

Der Normalfall ist, das beim Erzeugen des Dialogs UpdateData(FALSE) und beim Beenden mit OnOk() UpdateData(TRUE) aufgerufen.
UpdateData kannst du aber natürlich auch im Dialog selbst aufrufen, wenn dies notwendig ist.


Wenn du Initialisierungen vornehmen willst, die nur beim Erzeugen des Dialogs vorzunehmen sind, wirst du dies in OnInitDialog() tun.

C++ vs. Windows-Dialog:
Die C++ Klasse kapselt dir nur Methoden und Variablen, die für die Erzeugung und den Betrieb von Dialogen benötigt werden (um uns das Leben zu vereinfachen :) ). Der Windows Dialog (das Fenster) wird erst bei DoModal() bzw. Create() erzeugt. Das bedeutet, dass dein C++ Objekt bereits existiert, wenn noch kein Fenster erzeugt wurde und noch keine Fenster/Controls vorhanden sind. Das heisst weiter, dass Methoden, die auf das Fenster und seine Controls bezogen sind, erst nach dem Erzeugen des Dialogs Gültigkeit haben.

Gruss
Dora
 
moin


Hab es jetzt hinbekommen:
Code:
void CEinstellungenDlg::Aktualisieren(void)
{
	char temp[101];

	CWnd* pWnd[2];
	pWnd[0] = GetDlgItem(IDC_SPEICHERPFAD);
	pWnd[1] = GetDlgItem(IDC_BENUTZER);


	std::fstream datei;
	datei.open("einstellungen.eptb");

	datei.getline(temp, 100);
	pWnd[0]->SetWindowText(temp);

	datei.getline(temp, 100);
	pWnd[1]->SetWindowText(temp);

	datei.close();
}

Die Funktion starte ich von DoDataExchange aus.

Danke euch beiden.


mfg
umbrasaxum
 
Zurück