AGB  ·  Datenschutz  ·  Impressum  







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

KeepFocus mit Btnclick verlassen

Ein Thema von traudl · begonnen am 5. Mai 2006 · letzter Beitrag vom 8. Mai 2006
Antwort Antwort
traudl

Registriert seit: 22. Jun 2004
Ort: Lauterach
37 Beiträge
 
Delphi 7 Enterprise
 
#1

KeepFocus mit Btnclick verlassen

  Alt 5. Mai 2006, 15:34
Hallo DPler ich hab folgendes Problem ich habe eine procedure geschrieben bei der bei Falscheingabe der Focus behalten wird. Der Nachteil, auch wenn ich einen Button drücke wird der Focus auf dem Editfeld behalten, Wie kann ich es programmieren, dass bei bitbtnclick der FOcus nicht behalten wird ??

Delphi-Quellcode:
procedure TPgmFrm.EditExit(Sender: TObject); // beim verlassen von EditFeld Aufruf von KeepFocus
begin
      KeepFocus((Sender as TEdit));
end;
Delphi-Quellcode:
procedure TPgmFrm.KeepFocus(e: TEdit); // Focus behalten und Inhalt prüfen
var i, iVal: integer;
    s: String;
    sl: TStringList;
begin
      s:= e.Name;
      sl:= TStringList.Create; // I wird aus Name (z.B. Edit_1) generiert
      splitString(s, '_', sl);
      i:= StrToInt(sl[1]);
      if not (i = 1) and not (i = 5) and not
         (i = 10) and not (i = 16) and not (i = 17) then begin
         s:= e.Text;
         if CheckZero(s) = True then begin // Wenn Feld leer oder Null ist
            ShowMessage(s);
            e.SetFocus;
         end;
      end;
      sl.Free;

end;

Hat jemand eine Idee?
Ich weiß nix mehr

Bitte helft mir.
Udo Kinscherf
Ich versuche mein Bestes, aber im Moment reichts noch nicht.
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#2

Re: KeepFocus mit Btnclick verlassen

  Alt 5. Mai 2006, 16:15
Hallo,

würde mir eine Variable CheckIt: Boolean erstellen. Wenn Du den BitBtn drückst, setzt du CheckIt auf False.
Im OnEnter-Event des Edits setzt Du CheckIt auf True.
KeepFocus rufst Du dann nur auf, wenn CheckIt=True ist.

Edit: vergiss das ganz schnell - das OnKlick-Event des BitBtn wird ja erst nach dem Verlassen aufgerufen :-/
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: KeepFocus mit Btnclick verlassen

  Alt 5. Mai 2006, 16:16
Zitat von traudl:
Hallo DPler ich hab folgendes Problem ich habe eine procedure geschrieben bei der bei Falscheingabe der Focus behalten wird.
Das würde ich nicht so machen.
Der Benutzer wird dadurch in seinen Möglichkeiten viel zu stark eingeschränkt.
Beispiel:
er möchte ein Formular mit 10 Felder mit Daten bestücken.
Einige Daten kopiert er sich mit Copy&Paste aus einem Excel Dokument.
Er klickt aus Versehen nun in Feld Nummer 8 und kommt nicht mehr raus,
weil er keine Ahnung hat, wie ein korrekter "Warehouse code" aussehen muss.
Ziemlich blöd; ohne KeepFocus könnte er die anderen Felder ausfüllen,
einen Screenshot machen und irgendjemand (dich) um Hilfe bitten.

Korrekte Vorgehensweise wäre:
Erst wenn der Benutzer einen Button, Menupunkt (oder allgemein eine Action) auslöst,
werden die Dateneingaben überprüft.
Delphi-Quellcode:
procedure TForm1.CheckUserData;
begin
   if Edit1.Text = 'then
   begin
      Edit1.SetFocus;
      raise Exception.Create('Seriennummmer fehlt!');
   end
   else if not IsNumericControl(Edit2) then
  begin
     Edit2.SetFocus;
     raise Exception.Create("Anzahl falsch/fehlt!');
end;
end;
Bei speziellen Eingabe hilft TMaskEdit, TDateTimePicker oder ähnlich spezialisierte Controls.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Loki77
Loki77

Registriert seit: 21. Feb 2006
Ort: Trier
132 Beiträge
 
Delphi XE2 Enterprise
 
#4

Re: KeepFocus mit Btnclick verlassen

  Alt 5. Mai 2006, 16:16
Hallo!
Delphi-Quellcode:
procedure TPgmFrm.KeepFocus(e: TEdit); // Focus behalten und Inhalt prüfen
var i, iVal: integer;
    s: String;
    sl: TStringList;
begin
      s:= e.Name;
      sl:= TStringList.Create; // I wird aus Name (z.B. Edit_1) generiert
      splitString(s, '_', sl);
      i:= StrToInt(sl[1]);
      if not (i = 1) and not (i = 5) and not
         (i = 10) and not (i = 16) and not (i = 17) then begin
         s:= e.Text;
         if CheckZero(s) = True then begin // Wenn Feld leer oder Null ist
            ShowMessage(s); // Wenn hier kein begin ... end steht
            e.SetFocus; // wird ja automatisch die 2.Zeile immer ausgeführt!
         end;
      end;
      sl.Free;

end;
Also:

Delphi-Quellcode:
procedure TPgmFrm.KeepFocus(e: TEdit); // Focus behalten und Inhalt prüfen
var i, iVal: integer;
    s: String;
    sl: TStringList;
begin
      s:= e.Name;
      sl:= TStringList.Create; // I wird aus Name (z.B. Edit_1) generiert
      splitString(s, '_', sl);
      i:= StrToInt(sl[1]);
      if not (i = 1) and not (i = 5) and not
         (i = 10) and not (i = 16) and not (i = 17) then begin
         s:= e.Text;
         if CheckZero(s) = True then begin // Wenn Feld leer oder Null ist
         begin
            ShowMessage(s);
            e.SetFocus;
         end;
       end;
      end;
      sl.Free;

end;
So sollte es klappen... (nicht getestet)

Gruß Philipp
"What I cannot create, I do not understand."
-Richard P. Feynman
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#5

Re: KeepFocus mit Btnclick verlassen

  Alt 5. Mai 2006, 16:28
[quote="Loki77"]Hallo!
Delphi-Quellcode:
         if CheckZero(s) = True then begin // Wenn Feld leer oder Null ist
            ShowMessage(s); // Wenn hier kein begin ... end steht
            e.SetFocus; // wird ja automatisch die 2.Zeile immer ausgeführt!
         end;
      end;
      sl.Free;

end;
Also:

Delphi-Quellcode:
         if CheckZero(s) = True then begin // Wenn Feld leer oder Null ist
         begin
            ShowMessage(s);
            e.SetFocus;
         end;
       end;
      end;
      sl.Free;

end;
Jetzt haben wir aber doppelt gemoppelt hier mit 2 begins.... Das kommt daher wenn man das Begin nicht sauber unter das If schreibt!!!
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Benutzerbild von Loki77
Loki77

Registriert seit: 21. Feb 2006
Ort: Trier
132 Beiträge
 
Delphi XE2 Enterprise
 
#6

Re: KeepFocus mit Btnclick verlassen

  Alt 5. Mai 2006, 16:32
upps....
Moderator, bitte Betrag von loki77 löschen...
Zur Entschuldigung: Hab´gleich Feierabend und bin in Eile!
"What I cannot create, I do not understand."
-Richard P. Feynman
  Mit Zitat antworten Zitat
traudl

Registriert seit: 22. Jun 2004
Ort: Lauterach
37 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: KeepFocus mit Btnclick verlassen

  Alt 8. Mai 2006, 10:12
Hallo DPler,

erstmal Danke für Eure Vorschläge, hab mir die Antworten alle durchgelesen. Mein Problem ist das nicht in jedem Editfeld das gleiche drinstehen kann. z.B. ein Feld beinhaltet Werte von ... bis, ein anderes 100, 135, 155, usw..., Das nächste wieder eine Int64. Kann man das ganze mit einem Handle abfangen ??

Hab einen geschrieben, aber der bleibt immer stehen mit dem Fehler Listenindex überschreitet maximum (-1)

Delphi-Quellcode:
function FocusIsBtn(RootControl: TWinControl): boolean;
var
  iHandle,
  iCnt : integer;
  conControl : TControl;
begin
  result := false;
  iHandle := GetFocus;
  iCnt := -1;
  while (iCnt < RootControl.ControlCount) do
  begin
    inc(iCnt);
    if not (RootControl.Controls[iCnt] is TWinControl) then //Hier kommt der Fehler, Root Control liefert immer den Wert 1
      continue;
    if Integer((RootControl.Controls[iCnt] as TWinControl).Handle) = iHandle then
      break;
  end;
  if not (RootControl.Controls[iCnt] is TWinControl) or
     (Integer((RootControl.Controls[iCnt] as TWinControl).Handle) <> iHandle) then
    exit;
  conControl := RootControl.Controls[iCnt] as TWinControl;
  if (conControl is TButton) then
    result := true;
end;

Danke

Udo Kinscherf
Ich versuche mein Bestes, aber im Moment reichts noch nicht.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: KeepFocus mit Btnclick verlassen

  Alt 8. Mai 2006, 10:26
Zitat von traudl:
erstmal Danke für Eure Vorschläge, hab mir die Antworten alle durchgelesen.
Wirklich, meine (#3) auch ?
Die Idee mit dem Erzwingen des Focus ist ein Sackgasse!!
Und das Windows-Handle ist sowieso ungeeignet, da es von Windows frei vergeben wird.
Dagegen kann das Property Tag vom Programmierer vergeben werden; damit liese sich schon etwas anstellen.
Andreas
  Mit Zitat antworten Zitat
traudl

Registriert seit: 22. Jun 2004
Ort: Lauterach
37 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: KeepFocus mit Btnclick verlassen

  Alt 8. Mai 2006, 11:13
Hallo Shmia,

klar hab ich deine Anwort gelesen, deshalb hab ich ja auch die Auflistung geschrieben. Ich hatte gehofft es gibt eine einfachere Methode als jedes Event einzeln abzufangen. Andererseits hat dein Vorschlag auch einen riesen Vorteil, der mir eben erst einfällt. Wenn ich die Actions über eine Property, wie von dir Vorgeschlagen, abfange kann ich diese für alle Actions verwenden. Hat was, danke. Wenn man vorm Wald steht sieht man die Bäume nicht mehr.

Danke für die Idee



Udo Kinscherf
Ich versuche mein Bestes, aber im Moment reichts noch nicht.
  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 08:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz