AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Client Area von Formular disablen

Client Area von Formular disablen

Ein Thema von s.h.a.r.k · begonnen am 30. Dez 2010 · letzter Beitrag vom 31. Dez 2010
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
Ort: Offingen
3.159 Beiträge
 
Delphi XE Professional
 
#1

Client Area von Formular disablen

  Alt 30. Dez 2010, 14:24
Ich suche gerade nach eine Möglichkeit, die Client Area einer Form zu deaktivieren -- schaut das Bild im Anhang an, dann wisst ihr, was mit Client Area gemeint ist. Ich könnte auch alle Komponenten auf ein Panel platzieren und PanelXYZ.Enabled := False; setzen, was aber für mich nicht brauchbar ist. Ich habe keinerlei Informationen über das Formular selbst, daher soll die Lösung eben so allgemein wie nur möglich sein.

Ebenso soll das Fenster selbst immer noch bewegbar bleiben, ebenso in der Größe änderbar! Bisher habe ich leider keinerlei Message oder sonst eine Idee gefunden, die nur die Client Area disabled.

Quelle des Bildes.
Miniaturansicht angehängter Grafiken
nonclient_003.jpg  
Armin
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k (30. Dez 2010 um 14:28 Uhr) Grund: Titel angepasst
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.179 Beiträge
 
Delphi XE5 Professional
 
#2

AW: Client Area von Formular disablen

  Alt 30. Dez 2010, 14:51
Die Antwort ist hier:
http://delphihaven.wordpress.com/201...stom-titlebar/

MSDN:
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

DWM gibts erst ab Vista!
Für XP musst du das anders lösen.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
Ort: Offingen
3.159 Beiträge
 
Delphi XE Professional
 
#3

AW: Client Area von Formular disablen

  Alt 30. Dez 2010, 15:03
Ich glaube nicht, dass da die Lösung zu finden sind, auf die ich anspiele. Ich habe nich vor in den Non-Client-Bereich etwas zu zeichnen. Ich will nur den Client-Bereich "sperren" -- als Beispiel dazu habe ich ja das mit dem Panel erwähnt. Befinden sich Komponenten auf dem Panel und ich setze die Enabled-Eigenschaft des Panels auf False, so kann ich die Komponenten darauf nicht mehr nutzen. Das gleiche will ich für das Formular haben, allerdings soll es noch möglich sein, das Formular in der Position und größe zu ändern.
Armin
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.172 Beiträge
 
#4

AW: Client Area von Formular disablen

  Alt 31. Dez 2010, 10:36
Moin,

mir ist nichts bekannt was genau das erreicht, da der Clientbereich bekanntlich kein eigenes Fenster ist.

Ein TPanel wäre in der Tat ein Lösungsansatz.

Aber wenn ich mir die Frage so anschaue, geht es doch darum alle Bedienelemente zu deaktivieren usw., oder? Warum dann nicht mit MSDN-Library durchsuchenEnumWindows über alle Kindfenster gehen und die eines nach dem anderen deaktivieren. Wenn dann bspw. noch das Problem wäre, daß einige Kindfenster bereits deaktiviert sind und du deshalb deren aktuellen Status speichern mußt, kannst du das entweder unkompliziert über eine Liste in deinem Programm oder über Fenstereigenschaften (MSDN-Library durchsuchenSetProp und MSDN-Library durchsuchenGetProp aus user32.dll) lösen.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
Ort: Offingen
3.159 Beiträge
 
Delphi XE Professional
 
#5

AW: Client Area von Formular disablen

  Alt 31. Dez 2010, 12:03
Das mit dem deaktivieren habe ich mir auch schon angeschaut, finde aber nicht, dass es eine schöne Lösung ist, eben aus besagten Gründen bzgl. evtl. schon deaktivieren Elementen. Wobei ich diese EnumWindows-Methode noch nicht kannte, die könnte die Sache einfacher machen. Ich habe dabei aber leider die Befürchtung, dass dieses Verhalten unter Umständen irgendwelche Seiteneffekte hervorrufen kann, z.B. wenn ich einen wichtigen Timer deaktivere. Für meinen speziellen Fall würde das schon klappen, aber unter Umständen nicht allgemeingültig.

Und TPanel will ich eigentlich nicht nutzen, da ein paar Programmierer evtl. folgendes machen: TForm(Button1.Parent).Caption := 'Test'; . Setze ich dynamisch ein Panel ein, so funktioniert dieser Quellcode evtl. nicht mehr. Ich weiß zwar nicht, wie oft sowas auftauchen kann, aber bei sowas bin ich dann doch gerne vorsichtig.
Armin
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Client Area von Formular disablen

  Alt 31. Dez 2010, 12:14
Und wenn du einfach auf wm_nchittest reagierst und da hterror zurück gibst oder im schlimmsten Fall httransparent
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.172 Beiträge
 
#7

AW: Client Area von Formular disablen

  Alt 31. Dez 2010, 12:16
z.B. wenn ich einen wichtigen Timer deaktivere.
Ein Timer ist kein Fenster!

Es geht also um eine Komponente?
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
Ort: Offingen
3.159 Beiträge
 
Delphi XE Professional
 
#8

AW: Client Area von Formular disablen

  Alt 31. Dez 2010, 12:23
Und wenn du einfach auf wm_nchittest reagierst und da hterror zurück gibst oder im schlimmsten Fall httransparent
Das verstehe ich noch nicht ganz. Muss mir erst die Message WM_NCHITTEST anschauen

z.B. wenn ich einen wichtigen Timer deaktivere.
Ein Timer ist kein Fenster!

Es geht also um eine Komponente?
Achso... Ich meinte, dass das die einzelnen Komponenten, die ein Handle haben durchgeht.
Armin
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.172 Beiträge
 
#9

AW: Client Area von Formular disablen

  Alt 31. Dez 2010, 12:26
Achso... Ich meinte, dass das die einzelnen Komponenten, die ein Handle haben durchgeht.
Die Frage ob es um eine Komponente geht war unabhängig von der Bemerkung, daß ein Timer kein Fenster ist.

Fenster haben logischerweise ein Handle und du kannst sie mit o.g. Funktion listen. Alle üblichen Komponenten sind damit abgedeckt, aber sowas wie ein TLabel wäre nicht abgedeckt da es "nur" auf sein Elternfenster gezeichnet wird. Es ist kein echtes Fenster im Windows-Sinne.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
Ort: Offingen
3.159 Beiträge
 
Delphi XE Professional
 
#10

AW: Client Area von Formular disablen

  Alt 31. Dez 2010, 12:35
Ich sollte wohl noch den Sinn des ganzen erklären, da eine einfache Lösung wohl direkt nicht zu existieren scheint. Und zwar programmiere ich ein Overlay-Fenster, welches sich (semitransparent) über das "Parent"-Fenster legt. Beispielanwendung dafür wäre z.B. ein Ladescreen, oder von mir aus auch ein Login-Screen. Der Borderstyle des Overlays ist bsNone und das Overlay-Formular ist genau so groß, wie der Client-Bereich der darunter liegenden Form. Beide Formulare sollen fokusierbar sein, sodass auf dem Overlay gearbeitet werden und das Hauptformular verschoben bzw. in der Größe verändert werden kann -- das Overlay-Formular setzt automatisch immer die exakte Größe und Position, sodass es immer den Client-Bereich überdeckt.

Nun ist es aber eben so, dass wenn ich dann auf das "Parent"-Window klicke ich den Fokus auf die Controls dort setze, d.h. ein User kann mit Tab etc. den Fokus ändern und evtl. ungewünschte Aktionen ausführen. Im Falle eines Ladescreens wäre sowas unter Umständen sehr fatal, da die Parent-Form ja dann auf Daten arbeiten will, die erst geladen werden. Ein anderes Problem wären Shortcuts, aber um das Problem habe ich mich noch nicht gekümmert. So viel zu meinen Gedankengängen bisher.

Daher eben auch die Idee, die Client Area zu "sperren", analog zu den Elementen auf einem Panel, die gesperrt sind, wenn ich Panel.Enabled auf False setze.
Armin
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf