bookmark_border[SwiftUI] Bindings

In SwiftUI gibt es sogenannte Bindings. Am Anfang bin ich nicht so ganz damit „zurecht“gekommen. Mittlerweile habe ich schon ein wenig in SwiftUI programmiert und ich möchte euch eine kleine Übersicht der „verfügbaren“ Bindings geben. Welche es gibt und für was sie verwendet werden.

Continue reading „[SwiftUI] Bindings“

bookmark_borderIn eigener Sache

Leider ist in den letzten Wochen und Monaten, eigentlich sogar Jahren hier auf meinem „Codeblog“ nicht viel passiert. Und das ist eigentlich schade. Darum habe ich mir vorgenommen in Zukunft auch hier wieder den ein oder anderen Artikel zu veröffentlichen.

Mittlerweile sammle ich meine Ideen, zu denen ich etwas schreiben möchte auch immer Brav, somit habe ich mittlerweile eigentlich schon eine ganz ordentliche Liste mit Beiträgen, die ich gerne schreiben möchte.

Ihr könnt euch also in nächster Zeit auf Themen rund um das Thema C++, Angular, Datenbanken und auch ein wenig SwiftUI freuen.

bookmark_border[C++] Fensterposition unter Windows speichern und wiederherstellen

Vor einer Weile habe ich gesucht, wie ich die Fensterposition unter Windows speichern und wiederherstellen kann. Und zwar so, wie ich es auch von Windows selber gewohnt bin. Ich habe eine ganze Weile gesucht bis ich das richtige gefunden habe. Das alles funktioniert relativ einfach über die beiden Funktionen GetWindowPlacement() und SetWindowPlacement(). Mein Beispiel habe ich wie immer mit dem  C++ Builder geschrieben, die Codebeispiele sollten aber leicht in andere Sprachen übertragbar sein.

Die Verwendung von SetWindowPlacement() und GetWindowPlacement() hat einen weiteren Vorteil: Wäre ein Dialog (z. B. aufgrund des Austausches eines Bildschirms auf die andere Seite) im nicht mehr sichtbaren Bereich, wird das automatisch erkannt und er erscheint in dem Eck, dass der letzten Position am nächsten ist.

Fensterposition speichern

Für das Speichern der Fensterposition wird als erstes die Struktur WINDOWPLACEMENT benötigt. Wichtig dabei ist, dass die erstellte Variable mit sizeof(WINDOWPLACEMENT) initialisiert wird. Danach werden die Variablen der Struktur mit der Funktion GetWindowPlacement, der man den Handle des aktuellen Dialogs übergibt, befüllt. In rcNormalPosition befinden sich die Position und die Abmessung der entsprechenden Form, für den WindowState wsNormal. Auch wenn die Form maximiert ist, befinden sich in dieser Variable die Werte für den nicht maximierten Zustand. Hat showCmd den Wert WS_MAXIMIZE, dann ist der Dialog maximiert. Hat man alle benötigten Werte ausgelesen, können diese in einer Ini oder wo auch immer abgespeichert werden. Am besten wird das ganze im FormClose ausgeführt.

	// WindowPlacement ueber WinAPI holen
	WINDOWPLACEMENT wp;
	wp.length = sizeof(WINDOWPLACEMENT);
	GetWindowPlacement(this->Handle, &wp);

	// Die Werte fuer die vom Benutzer eingestellte Fensterposition holen
	int top = wp.rcNormalPosition.top;
	int left = wp.rcNormalPosition.left;
	int bottom = wp.rcNormalPosition.bottom;
	int right = wp.rcNormalPosition.right;
	// Pruefen ob das Fenster maximiert ist oder nicht
	bool maximized = wp.showCmd == SW_MAXIMIZE;

	// Die Werte in eine Ini schreiben
	std::auto_ptr<TIniFile> pIniFile(new TIniFile(L".\\Fensterposition.ini"));
	pIniFile->WriteInteger(this->Name, L"top", top);
	pIniFile->WriteInteger(this->Name, L"left", left);
	pIniFile->WriteInteger(this->Name, L"bottom", bottom);
	pIniFile->WriteInteger(this->Name, L"right", right);
	pIniFile->WriteBool(this->Name, L"maximized", maximized);

Fensterposition wiederherstellen

Analog zum speichern, wird das wiederherstellen der Fensterposition gemacht. Viel Erklärung braucht es dazu nicht mehr. Das wiederherstellen der Position passiert einfach in umgedrehter Reihenfolge. Am besten ruft man den Code im FormShow auf. DefaultMonitor sollte am besten auf dmDesktop gestellt werden. Beim Standardwert dmActiveForm wird der Dialog auf dem Bildschirm geöffnet, auf dem ein aktives Formular des aktuellen Programms geöffnet ist. Bei dmDesktop hingegen, wird der Dialog auf dem Monitor geöffnet, auf dem er auch zuletzt geschlossen wurde.

	// dmDekstop, damit die Form immer auf dem Monitor aufgeht, wo sie auch als
	// letztes geoeffnet war
	this->DefaultMonitor = dmDesktop;

	// Aktuelles WindowPlacement ueber WinAPI holen
	WINDOWPLACEMENT wp;
	wp.length = sizeof(WINDOWPLACEMENT);
	GetWindowPlacement(this->Handle, &wp);

	// Die frueher gespeicherten Werte aus der Ini holen
	std::auto_ptr<TIniFile> pIniFile(new TIniFile(L".\\Fensterposition.ini"));
	int top = pIniFile->ReadInteger(this->Name, L"top", this->Top);
	int left = pIniFile->ReadInteger(this->Name, L"left", this->Left);
	int bottom = pIniFile->ReadInteger(this->Name, L"bottom", this->Top + this->Height);
	int right = pIniFile->ReadInteger(this->Name, L"right", this->Left + this->Width);
	bool maximized = pIniFile->ReadBool(this->Name, L"maximized", false);

	// Die Werte setzen
	wp.rcNormalPosition.top = top;
	wp.rcNormalPosition.left = left;
	wp.rcNormalPosition.bottom = bottom;
	wp.rcNormalPosition.right = right;

	// Falls das Fenster beim letzten mal maximiert war
	// -> jetzt auch wieder maximieren
	if (maximized)
		wp.showCmd = SW_MAXIMIZE;

	// Und zum Schluss die WindowsPosition wieder ueber die WinAPI setzen
	SetWindowPlacement(this->Handle, &wp);

Wenn ihr noch Fragen habt, immer her damit! Ansonsten viel Spaß beim ausprobieren.

bookmark_borderC++ Kompilierzeiten optimieren

Der ein- oder andere von euch wird das wohl kennen. Ihr arbeitet an einem Projekt und ändert etwas an einer Header-Datei. Ihr fügt z. B. eine neue Variable hinzu. Danach kompiliert das ganze Projekt erstmal wieder 2 Minuten, obwohl ihr nicht wirklich viel gemacht habt. Ich habe schon seit einer ganzen Weile einen Artikel auf meiner Leseliste und bin nun endlich dazugekommen ein wenig rein zu lesen. Continue reading „C++ Kompilierzeiten optimieren“

bookmark_borderWindows 10, 100% Datenträgerauslastung?

Ich hatte vor ein paar Wochen das Problem, dass mein Rechner sich öfters mal einige Denkminuten gönnte, trotz SSD und (halbwegs) aktuellen Prozessor. Continue reading „Windows 10, 100% Datenträgerauslastung?“

bookmark_borderWindows 10 braucht (zu) viel Arbeitsspeicher?

Ich weiß, der Blog läuft unter der Domain „chris-codeblog.de“, doch ich werde nun auch öfter Themen Posten die allgemein mit dem PC zusammenhängen.

Ich hatte vor kurzem das Problem, dass mein Windows 10-Notebook plötzlich Unmengen an RAM verbraucht hat, offensichtlich aber kein laufendes Programm so viel gebraucht hat. Continue reading „Windows 10 braucht (zu) viel Arbeitsspeicher?“

bookmark_borderWie kann ich einen Windows-Hook registrieren?

Heute möchte ich euch zeigen wie man einen Windows-Hook registrieren kann. Erstmal eine kurze Erklärung was ein Hook ist bzw. für was er verwendet wird. Continue reading „Wie kann ich einen Windows-Hook registrieren?“

bookmark_border[C++] Ein paar C++11 Features vorgestellt

Heute möchte ich euch ein paar nette Features des C++11 Standards vorstellen. Wie schon am Anfang erwähnt möchte ich nach und nach Beiträge die ich zum Thema Programmierung geschrieben habe aus chris-blog.com übernehmen. Dies ist einer davon.
Continue reading „[C++] Ein paar C++11 Features vorgestellt“

bookmark_borderMit FireMonkey auf Windows-Messages reagieren

Vor einer Weile stand ich vor folgendem Problem. Ich möchte wenn Windows heruntergefahren wird eine bestimmte Aktion in meiner Anwendung ausführen (falls diese gerade noch läuft). Seitens Windows gibt eine Windows-Message (WM_QUERYENDSESSION). Standardmäßig kann Firemonkey ja nicht auf solche Messages reagieren. Nach ein wenig suchen, habe ich allerdings eine Möglichkeit gefunden. Diese möchte ich euch in diesem Artikel zeigen. Continue reading „Mit FireMonkey auf Windows-Messages reagieren“

bookmark_borderRad Studio XE7

Vor ein paar Tagen hat Embarcadero die neueste Version ihrer Entwicklungsumgebung – Rad Studio XE7 veröffentlicht. Das Hauptaugenmerk lag dabei – wie zu erwarten – wieder auf der Cross-Platform-Entwicklung.
Continue reading „Rad Studio XE7“