Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi KeepFocus mit Btnclick verlassen (https://www.delphipraxis.net/68793-keepfocus-mit-btnclick-verlassen.html)

traudl 5. Mai 2006 14:34


KeepFocus mit Btnclick verlassen
 
:? 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.

s-off 5. Mai 2006 15:15

Re: KeepFocus mit Btnclick verlassen
 
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 :-/

shmia 5. Mai 2006 15:16

Re: KeepFocus mit Btnclick verlassen
 
Zitat:

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.

Loki77 5. Mai 2006 15:16

Re: KeepFocus mit Btnclick verlassen
 
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

Mackhack 5. Mai 2006 15:28

Re: KeepFocus mit Btnclick verlassen
 
[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!!!

Loki77 5. Mai 2006 15:32

Re: KeepFocus mit Btnclick verlassen
 
upps.... :wall:
Moderator, bitte Betrag von loki77 löschen... :oops:
Zur Entschuldigung: Hab´gleich Feierabend und bin in Eile! :-D

traudl 8. Mai 2006 09:12

Re: KeepFocus mit Btnclick verlassen
 
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

:coder:

shmia 8. Mai 2006 09:26

Re: KeepFocus mit Btnclick verlassen
 
Zitat:

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.

traudl 8. Mai 2006 10:13

Re: KeepFocus mit Btnclick verlassen
 
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

:dancer:

:hello:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:58 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