Autor |
Beitrag |
traudl
Hält's aus hier
Beiträge: 10
Win 2000, Win XP
Delphi 7 Enterprise
|
Verfasst: Mo 20.12.04 15:51
Hallo Leute ich hab ein Problem. Ich habe Editfelder zur Laufzeit erstallen lassen, wegen zentriert usw. und rufe darin eine Prozedur auf damit nur wenn bestimmte Eingabekriterien erfüllt sind der Focus freigegeben wird. Ich möcht aber, daß wenn ein BitBtn gedrückt wird das Feld nicht kontrolliert wird. Wie mache ich das ???
Hier die procedure für den Focus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| procedure KeepFocus(e: TEditNew); var s, sSplit: String; iValue: Integer; begin i:= e.TabOrder; s:= e.Text; If (s = '') or (s='0') and (i <> 11) then begin e.SetFocus; MessageDlg(cr,mtWarning,[mbOK],0) end; If s <> '' then begin s:= s + '.'; sSplit := s; try iValue:= StrToInt(splitString(sSplit, '.',0)); e.Text := IntToStr(iValue); except MessageDlg(crZW,mtWarning,[mbOK],0); e.SetFocus; end; If i = 11 then begin If (iValue < 0) or (iValue > 360) then begin MessageDlg(IntToStr(ivalue)+' '+crSP,mtWarning,[mbOK],0); e.SetFocus; end; end else If i = 12 then begin If not (iValue=20) and not (iValue=80) and not (iValue=100) and not (iValue=155) and not(iValue=135) and not (iValue = 392) and not (iValue = 400) then begin MessageDlg(IntToStr(ivalue)+' '+crKV,mtWarning,[mbOK],0); e.SetFocus; end; end else If i = 14 then begin If (iValue < 54) or (iValue > 59) then begin MessageDlg(IntToStr(ivalue)+' '+crNP,mtWarning,[mbOK],0); e.SetFocus; end; end; end; end; |
und hier die procedure zum Aufruf:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm6.EditExit(Sender: TObject); begin KeepFocus((Sender as TEditNew)); end; |
Heir wird das Edit Feld erstellt.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Edit[i] := TEditNew.Create(Self); Edit[i].Parent := Self; Edit[i].Name := 'Edit'+IntToStr(i); Edit[i].Text :=''; Edit[i].Font.Style := [fsBold]; Edit[i].Font.Name := 'Arial'; Edit[i].Font.Height := 15; Edit[i].TabStop := True; Edit[i].TabOrder := i; Edit[i].OnExit := EditExit; |
Ich wollte es mit einer If Abfrage machen, aber ich weiß nicht wie.
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt.
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mo 20.12.04 20:29
Hi!
benutz doch bitte delphi-Tags für Quellcodes. Und der erste is recht unübersichtlich. ich hab ihn hier mal bisschen strukturiert:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57:
| procedure KeepFocus(e: TEditNew); var s, sSplit: String; iValue: Integer; begin i:= e.TabOrder; s:= e.Text; If (s = '') or (s='0') and (i <> 11) then begin e.SetFocus; MessageDlg(cr,mtWarning,[mbOK],0) end;
If s <> '' then begin s:= s + '.'; sSplit := s; try iValue:= StrToInt(splitString(sSplit, '.',0)); e.Text := IntToStr(iValue); except MessageDlg(crZW,mtWarning,[mbOK],0); e.SetFocus; end; If i = 11 then begin If (iValue < 0) or (iValue > 360) then begin MessageDlg(IntToStr(ivalue)+' '+crSP,mtWarning,[mbOK],0); e.SetFocus; end; end else
If i = 12 then begin If not (iValue=20) and not (iValue=80) and not (iValue=100) and not (iValue=155) and not (iValue=135) and not (iValue = 392) and not (iValue = 400) then begin MessageDlg(IntToStr(ivalue)+' '+crKV,mtWarning,[mbOK],0); e.SetFocus; end; end else If i = 14 then begin If (iValue < 54) or (iValue > 59) then begin MessageDlg(IntToStr(ivalue)+' '+crNP,mtWarning,[mbOK],0); e.SetFocus; end; end;
end; end; |
Was du jetzt aber genau willst, weiß ich nicht so recht... Wann wird denn diese Procedure aufgerufen? So von wegen Fokus abgeben und so.. Wird die im OnKeyDown des Edits aufgerufen?
MrSaint
EDIT: Oh, was in deinem Post übersehen 
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mo 20.12.04 21:10
So, hab hier ne Funktion geschrieben (ja, mir is langweilig *gg*):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| function FocusedControlIsBitBtn(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 (RootControl.Controls[iCnt] as TWinControl).Handle = iHandle then break; end; if (RootControl.Controls[iCnt] as TWinControl).Handle <> iHandle then exit; conControl := RootControl.Controls[iCnt] as TWinControl; if conControl is TBitBtn then result := true; end; |
Die bekommt dir nun heraus ob das aktuelle Element, welches RootControl untergeordnet ist und welches den Fokus hat ein BitBtn ist  Aufruf z.B. so:
Delphi-Quelltext 1: 2: 3: 4:
| if FocusedControlIsBitBtn(Form1) then showmessage('Ja, ist BitBtn') else showmessage('Nein, kein BitBtn fokussiert'); |
Das bei dir einbauen solltest du nun selbst hinbekommen
MrSaint
P.S.: Nochmal ein Post direkt danach von mir, dass nochmal Benachrichtigungs-Mails rausgehen, weil es sonst leicht übersehen werden würde, dass ne Lösung da ist 
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
traudl 
Hält's aus hier
Beiträge: 10
Win 2000, Win XP
Delphi 7 Enterprise
|
Verfasst: Di 21.12.04 11:02
Hallo MrSaint,
als erstes vielen Dank. Ich bekomme jetzt den Fehler "ungültige Typenumwandlung"
Delphi-Quelltext 1:
| if (RootControl.Controls[iCnt] as TWinControl).Handle = iHandle then |
Hast du eine Ahnung warum ?? Habe ich etwas vergessen in den uses? Aber da würde er mir normalerweise einen anderen Fehler bringen.
Dann noch ne Frage, die hat aber mit dem Thema nichts zu tun. Ich würde Delphi gerne von der Pieke auf lernen, so richtig. Weißt Du vieleicht irgendeine Institution die so etwas anbietet, gerne auch ein Fernstudium. Ich finde es super wie man von Euch geholfen bekommt, aber ich würde auch gerne mal einen konstruktiven Beitrag schreiben und nicht immer nur fragen. Gut ich programmiere erst seit 2 Monaten mit Delphi, aber du hast gesehen, nicht besonders strukturiert. Danke für Eure Hilfe
Gruß Udo
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Di 21.12.04 13:15
traudl hat folgendes geschrieben: | als erstes vielen Dank. |
No Prob
Zitat: |
Ich bekomme jetzt den Fehler "ungültige Typenumwandlung"
Delphi-Quelltext 1:
| if (RootControl.Controls[iCnt] as TWinControl).Handle = iHandle then |
|
Hmm... Wo kommt der Fehler denn genau? Was hast du denn für ein Delphi? Also mein D6Pro schluckt das so. (Deine Delphi-Version kannst du übrigens nett im Profil eintragen, dann kann das jeder neben dem Beitrag da so sehn  ). Ich vermute, dass dein Delphi das HWND nicht mit dem Integer vergleichen will, dann versuch mal das:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| function FocusedControlIsBitBtn(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 Integer((RootControl.Controls[iCnt] as TWinControl).Handle) = iHandle then break; end; if Integer((RootControl.Controls[iCnt] as TWinControl).Handle) <> iHandle then exit; conControl := RootControl.Controls[iCnt] as TWinControl; if conControl is TBitBtn then result := true; end; |
Zitat: | Ich würde Delphi gerne von der Pieke auf lernen, so richtig. Weißt Du vieleicht irgendeine Institution die so etwas anbietet, gerne auch ein Fernstudium. Ich finde es super wie man von Euch geholfen bekommt, aber ich würde auch gerne mal einen konstruktiven Beitrag schreiben und nicht immer nur fragen. Gut ich programmiere erst seit 2 Monaten mit Delphi, aber du hast gesehen, nicht besonders strukturiert. |
Hmm.. also ich weiß dir da nichts.. Ich hab mir das alles selber aus Büchern beigebracht.. Delphi an sich hab ich angefangen mit dem Delphi 5 - Grundlagenm und Profiwissen. Damals fand ich's ganz gut, aber wenn ich da heute reinschau, dann is das auch so bissl chaotisch das Buch.. Weiß ncih, wie das nun in neueren Auflagen aussieht (das gibts inzwischen glaub auch für höhere Delphi-Versionen), aber das das ich da hab würd ich heut als "nicht so wirklich gut" beurteilen... Aber so an Kursangeboten oder so weiß ich gerade nichts. Und wenn du dir da was raussuchst, auch vielleicht net grad was, was irgendwie nur ne Woche oder so geht, weil da schneidet man dann vielleicht jedes Thema so n bisschen an, aber so richtig bekommt mans nicht durch..
Aber nu: back to topic
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
traudl 
Hält's aus hier
Beiträge: 10
Win 2000, Win XP
Delphi 7 Enterprise
|
Verfasst: Di 21.12.04 14:32
Hallo hab mein Profil upgedatet,
Der Fehler kommt mit dem neuen Source genau an der gleichen Stelle.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| while (iCnt < RootControl.ControlCount) do begin inc(iCnt); if Integer((RootControl.Controls[iCnt] as TWinControl).Handle) = iHandle then break; end; if Integer((RootControl.Controls[iCnt] as TWinControl).Handle) <> iHandle then exit; conControl := RootControl.Controls[iCnt] as TWinControl; if conControl is TBitBtn then result := true; end; |
Ich benutze D7 EPrise.
Meinst Du es liegt am Handle?
Gruß Udo
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Di 21.12.04 15:11
Ist das ein Compilerfehler oder ein Laufzeitfehler? Also bekommst du den Fehler bereits beim compilieren oder erst, wenn das programm dann läuft?
Wenn es zweiteres ist, versuch mal das (wäre so sowieso sicherer, hab dem Code auch zusätzlich noch n paar Kommentare spendiert  ):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| function FocusedControlIsBitBtn(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 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 TBitBtn) then result := true; end; |
Wenn es allerdings ersteres war, dann weiß ich nicht weiter
MrSaint
EDIT: Klammern im Quelltext richtig gesetzt... Hatte vorher die Systanxprüfung nicht drüber laufen lassen 
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
Zuletzt bearbeitet von MrSaint am Di 21.12.04 16:49, insgesamt 1-mal bearbeitet
|
|
traudl 
Hält's aus hier
Beiträge: 10
Win 2000, Win XP
Delphi 7 Enterprise
|
Verfasst: Di 21.12.04 16:44
Hei Super, das letzte ging. Es waren nicht alle Klammern richtig, aber das Ding geht.
Der Fehler trat immer auf, sowohl im Debug als auch beim starten der EXE.
Danke Dir.
Wenn du mal einen Einfall im Bezug aufs lernen hast, what ever bitte post es mir in privat.
Danke Dir.
Gruß Udo
|
|
|