![]() |
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. |
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 :-/ |
Re: KeepFocus mit Btnclick verlassen
Zitat:
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:
Bei speziellen Eingabe hilft TMaskEdit, TDateTimePicker oder ähnlich spezialisierte Controls.
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; |
Re: KeepFocus mit Btnclick verlassen
Hallo!
Delphi-Quellcode:
Also:
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;
Delphi-Quellcode:
So sollte es klappen... (nicht getestet)
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; Gruß Philipp |
Re: KeepFocus mit Btnclick verlassen
[quote="Loki77"]Hallo!
Delphi-Quellcode:
Also:
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;
Delphi-Quellcode:
Jetzt haben wir aber doppelt gemoppelt hier mit 2 begins.... Das kommt daher wenn man das Begin nicht sauber unter das If schreibt!!!
if CheckZero(s) = True then begin // Wenn Feld leer oder Null ist
begin ShowMessage(s); e.SetFocus; end; end; end; sl.Free; end; |
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 |
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: |
Re: KeepFocus mit Btnclick verlassen
Zitat:
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. |
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 04:15 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