Autor Beitrag
traudl
Hält's aus hier
Beiträge: 10

Win 2000, Win XP
Delphi 7 Enterprise
BeitragVerfasst: 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:
ausblenden volle Höhe Delphi-Quelltext
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);  // Focus behalten und Inhalt prüfen
var s, sSplit: String;
    iValue: Integer;
begin
    i:= e.TabOrder;
    s:= e.Text;
  If (s = ''or (s='0'and (i <> 11// leeres Feld  oder Spindelverdrehung
    then begin
    e.SetFocus;
    MessageDlg(cr,mtWarning,[mbOK],0)
    end;
  If s <> ''      // Feld prüfen
    then begin
    s:= s + '.';  // Punkt anfügen
    sSplit := s;  // Zerlegen und nach . weglassen
    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 < 0or (iValue > 360then
    begin
    MessageDlg(IntToStr(ivalue)+' '+crSP,mtWarning,[mbOK],0);
    e.SetFocus;
    end;
    end
    else
    If i = 12
    then begin
    If not (iValue=20and not (iValue=80and not (iValue=100and not (iValue=155)
    and not(iValue=135and not (iValue = 392and not (iValue = 400//Kopfversätze
    then begin
    MessageDlg(IntToStr(ivalue)+' '+crKV,mtWarning,[mbOK],0);
    e.SetFocus;
    end;
    end
    else
    If i = 14
    then begin
    If (iValue < 54or (iValue > 59then
    begin
    MessageDlg(IntToStr(ivalue)+' '+crNP,mtWarning,[mbOK],0);
    e.SetFocus;
    end;
    end;
    end;
end;


und hier die procedure zum Aufruf:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm6.EditExit(Sender: TObject);
begin
    KeepFocus((Sender as TEditNew));
end;


Heir wird das Edit Feld erstellt.

ausblenden 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 user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext
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);  // Focus behalten und Inhalt prüfen  
var s, sSplit: String;  
    iValue: Integer;  
begin  
  i:= e.TabOrder;  
  s:= e.Text;  
  If (s = ''or (s='0'and (i <> 11then// leeres Feld  oder Spindelverdrehung  
  begin  
    e.SetFocus;  
    MessageDlg(cr,mtWarning,[mbOK],0)  
  end;  

  If s <> '' then     // Feld prüfen  
  begin  
    s:= s + '.';  // Punkt anfügen  
    sSplit := s;  // Zerlegen und nach . weglassen  
    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 < 0or (iValue > 360then  
      begin  
        MessageDlg(IntToStr(ivalue)+' '+crSP,mtWarning,[mbOK],0);  
        e.SetFocus;  
      end;  
    end else  

      If i = 12 then 
      begin  
        If not (iValue=20and 
     not (iValue=80and 
     not (iValue=100and 
     not (iValue=155and 
     not (iValue=135and 
     not (iValue = 392and 
     not (iValue = 400then //Kopfversätze  
        begin  
          MessageDlg(IntToStr(ivalue)+' '+crKV,mtWarning,[mbOK],0);  
          e.SetFocus;  
       end;  
    end else  
      If i = 14 then 
      begin  
        If (iValue < 54or (iValue > 59then  
        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 :oops:

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Mo 20.12.04 21:10 
So, hab hier ne Funktion geschrieben (ja, mir is langweilig *gg*):

ausblenden 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 10

Win 2000, Win XP
Delphi 7 Enterprise
BeitragVerfasst: Di 21.12.04 11:02 
Hallo MrSaint,

als erstes vielen Dank. Ich bekomme jetzt den Fehler "ungültige Typenumwandlung"

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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"

ausblenden 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 10

Win 2000, Win XP
Delphi 7 Enterprise
BeitragVerfasst: Di 21.12.04 14:32 
Hallo hab mein Profil upgedatet,

Der Fehler kommt mit dem neuen Source genau an der gleichen Stelle.

ausblenden 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  {<-- Hier bleibt er Stehen und bringt den Fehler}
      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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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 :) ):
ausblenden volle Höhe Delphi-Quelltext
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;


  // Handle des Controls holen, welchges gerade den Focus hat
  iHandle := GetFocus;
  iCnt := -1;


  // jetzt suchen wir das Control mit diesem Handle
  while (iCnt < RootControl.ControlCount) do
  begin
    inc(iCnt);


    // wenn das aktuelle Control kein TWinControl ist, so wird es übersprungen,
    // weil es dann kein Feld "Handle" hat!
    if not (RootControl.Controls[iCnt] is TWinControl) then
      continue;


    // nun das Handle überprüfen
    if Integer((RootControl.Controls[iCnt] as TWinControl).Handle) = iHandle then
      break;
  end;


  // haben wir ein Control mit richtigem Handle gefunden?
  if not (RootControl.Controls[iCnt] is TWinControl) or
     (Integer((RootControl.Controls[iCnt] as TWinControl).Handle) <> iHandle) then
    exit;


  // das ist unser gefundenes Control :)
  conControl := RootControl.Controls[iCnt] as TWinControl;


  // ist das nun ein TBitBtn?
  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 :oops:

_________________
"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 Threadstarter
Hält's aus hier
Beiträge: 10

Win 2000, Win XP
Delphi 7 Enterprise
BeitragVerfasst: 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