AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Form während Erfassung in Grid blokieren

Ein Thema von ASKtec · begonnen am 25. Feb 2017 · letzter Beitrag vom 27. Feb 2017
Antwort Antwort
ASKtec

Registriert seit: 19. Okt 2007
38 Beiträge
 
#1

Form während Erfassung in Grid blokieren

  Alt 25. Feb 2017, 18:42
Hallo zusammen,

ich habe auf einer Form unter anderem ein TAdvStringGrid von TMS. In diesem Grid kann man Daten zeilenweise erfassen und muss die Erfassung der Zeile mit ENTER abschließen. Nun kommt es zu unerwünschten Nebeneffekten wenn der Anwender mitten in der Erfassung mit der Maus auf der Form "rumklickt"...

Nun meine Frage... Gibt es eine Möglichkeit die gesamte Form bis auf das Grid zu deaktivieren solange das Grid sich im EDIT-Modus befindet ohne dass ich alles manuell per enable := false setzen muss? Ob in dem Grid editiert wird bekomme ich mit, aber wie kann ich verhindern dass der Fokus auf andere Objekte wandert? Ich kenne von einer anderen Applikation ein solches Verhalten. Hier verhält sich das gesamte Programm als ob das Grid Modal angezeigt werden würde sobald ind diesem editiert wird (Ich weiß allerdings nicht welches Grid in dieser Applikation genutzt wird)...

Vielleicht hat ja jemand hier eine Idee wie ich das lösen kann...

Vielen Dank vorab für Eure Unterstützung...

Danke
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Form während Erfassung in Grid blokieren

  Alt 25. Feb 2017, 18:50
Deaktiviere alle Steuerelemente, die nicht angeklickt werden dürfen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Form während Erfassung in Grid blokieren

  Alt 26. Feb 2017, 00:13
Oder prüfe beim OnExit des Grids ob die Bearbeitung abgeschlossen ist. Ist dies nicht der Fall, dann eine Meldung ausgeben "Bitte Bearbeitung abschließen oder Datensatz verwerfen" (oder so was ähnliches) und den Fokus wieder auf das Grid setzen.

Alternativ kannst du die unschönen Nebeneffekte auch noch anders abfangen. Weil die Nebeneffekte erscheinen nur dadurch, dass du nicht alle Eventualitäten beachtet hast und nicht entsprechend darauf reagierst.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.431 Beiträge
 
Delphi 12 Athens
 
#4

AW: Form während Erfassung in Grid blokieren

  Alt 26. Feb 2017, 05:43
Moin...
Zitat:
In diesem Grid kann man Daten zeilenweise erfassen und muss die Erfassung der Zeile mit ENTER abschließen. Nun kommt es zu unerwünschten Nebeneffekten wenn der Anwender mitten in der Erfassung mit der Maus auf der Form "rumklickt"...
...früher hatte ich das auch so. Irgendwann hatte ich keine Lust mehr auf: "Eventualitäten beachten"!

Alternative:
Dafür habe ich mir "Inline Editoren" gebaut. Im Prinzip sind das stinknormale normale modale TForm. Da hat man keine Klickprobleme außerhalb des "Editors". Die werden ganz normal designed oder abgeleitet. Für das Editieren im Grid wird der "Editor" erzeugt, die Positionen/Größe relativ zur Zeile eingestellt und angezeigt. Ich habe mich, für meinen Teil, für die Variante ohne Logik im "Editor" entschieden. Die Daten gehen rein, werden manipuliert, ausgelesen und außerhalb des "Editors" gespeichert. Man kann die Speicherlogik auch im "Editor" unterbringen. Wie man mag. Wenn du dich für diese Variante entscheidest und mehr Editoren brauchst, dann sollte das "Parent" Control dem Editor bekannt sein. Da kannst du die Edits z.B. automatisch entsprechend der Spalte ausrichten.

Der Vorteil ist, das man bei der Eingabe nicht auf die einzelne Zelle beschränkt ist. Da sind auch andere Varianten mit komplexen Objekten möglich.

Angehängte Grafiken
Dateityp: png screen.png (46,5 KB, 31x aufgerufen)

Geändert von haentschman (26. Feb 2017 um 07:37 Uhr)
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#5

AW: Form während Erfassung in Grid blokieren

  Alt 26. Feb 2017, 08:08
ClipCursor

Beispiel:
Delphi-Quellcode:
procedure TForm1.DBGrid1MouseEnter(Sender: TObject);
var
  Rect: TRect;
begin
  Rect.Left := DBGrid1.Left;
  Rect.Top := DBGrid1.Top;
  Rect.Right := DBGrid1.Left + DBGrid1.Width;
  Rect.Bottom := DBGrid1.Top + DBGrid1.Height;
  ClipCursor(@Rect);
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key=#27 then ClipCursor(nil);// ESC
end;
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.431 Beiträge
 
Delphi 12 Athens
 
#6

AW: Form während Erfassung in Grid blokieren

  Alt 26. Feb 2017, 08:28
Moin...
Zitat:
ClipCursor
http://www.delphipraxis.net/dp_refer...65035a3&lib=dp
...ist auch nicht ohne. Da setzt man sich wieder andere Flöhe in den Pelz.
Beispiel:
Zitat:
Kann es sein, dass ClipCursor in einer virtuellen Maschine nicht funktioniert? Aufgefallen ist es mir bei einem meiner eigenen Programme. Unter 2k & XP funktioniert es wunderbar. Gleiche Systeme in Microsofts Virtual PC 2004: ClipCursor hat keinen Effekt. (Ebenso wenig kann man anscheinend die Mouse ausblenden; aber das gehört nicht hier her)
Ich hatte die Frage so verstanden das die Zeile die editiert wird "aktiv" bleibt aber das Grid selbst nicht.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
981 Beiträge
 
Delphi 6 Professional
 
#7

AW: Form während Erfassung in Grid blokieren

  Alt 26. Feb 2017, 09:15
ClipCursor

Beispiel:
Delphi-Quellcode:
procedure TForm1.DBGrid1MouseEnter(Sender: TObject);
var
  Rect: TRect;
begin
  Rect.Left := DBGrid1.Left;
  Rect.Top := DBGrid1.Top;
  Rect.Right := DBGrid1.Left + DBGrid1.Width;
  Rect.Bottom := DBGrid1.Top + DBGrid1.Height;
  ClipCursor(@Rect);
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key=#27 then ClipCursor(nil);// ESC
end;

Hmm..


müsste das nicht eher so sein?

Delphi-Quellcode:
var
  Rect: TRect;
begin
  Rect.TopLeft := ClientToScreen(DBGrid1.BoundsRect.TopLeft);
  Rect.BottomRight := ClientToScreen(DBGrid1.BoundsRect.BottomRight);
  ClipCursor(@Rect);
end;

So bekommt das ClipCursor den tatsächlichen Rect des Grids auf dem Screen.
Ansonsten ist der irgendwo, da Grid-Left in abhängigkeit vom Parent ist und nicht vom Screen...


Edit:

Oder (verkürzt)

Delphi-Quellcode:
var
  Rect: TRect;
begin
  GetWindowRect(DBGrid1.Handle, Rect);
  ClipCursor(@Rect);
end;

Geändert von HolgerX (26. Feb 2017 um 09:36 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz