| Autor | 
Beitrag | 
neuling321 
        
 
Beiträge: 18 
 
Win10prof 
Delphi 10 Seattle Prof. 
 | 
Verfasst: So 22.05.16 20:38 
 
Hallo
 
ich habe mir eine Prozedur gemacht, die meine 
 TEdit Felder auf Inhalt prüfen soll.
 Das funktioniert auch, ich habe nur eine frage zu der Reihenfolge.
 Die TEdit Felder werden mir, wenn Sie leer sind, nach einer Reihenfolge angezeigt die 
 ich nicht ganz nachvollziehen kann. Kann man auf die Reihenfolge Einfluss nehmen?
 		                                                          Delphi-Quelltext                                	 															1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
  				 | 									procedure TForm1.CheckFelder; var   I : integer;   NameOfObject : string;
  begin   for I := 0 to componentcount -1  do   begin     if (Components[I] is TEdit) then     begin       if (TEdit(form1.components[I]).Text) = '' then       begin         NameOfObject := Components[I].name;         if (NameOfObject <> 'txtprogname') AND (NameOfObject <> 'txtprognr') then         begin           delete(NameOfObject,1,3);           showmessage('Bitte Feld ' + AnsiUpperCase(NameOfObject) + ' ausfüllen');         end;       end;     end;   end; end;					 				 | 			 		 	  Moderiert von  Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 24.05.2016 um 13:31 
 
 | 
 | 
mandras 
        
 
Beiträge: 434 
Erhaltene Danke: 107 
 
Win 10 
Delphi 6 Prof, Delphi 10.4 Prof 
 | 
Verfasst: Mo 23.05.16 00:07 
 
Was meinst Du mit "wenn sie leer sind" (zur Entwurfs/Laufzeit?)
 
 Die Reihenfolge ist unabhängig davon sein ob sie leer sind oder nicht.
 
 Wird wirklich eine bestimmte Reihenfolge hinsichtlich .components gewünscht 
 müßte man das Formular per ALT-F12 bearbeiten, hat aber keine endgültige Sicherheit daß
 die so gemachte Reihenfolge stets erhalten bleibt.
 
 Also nochmals die Frage: Reihenfolge in welcher Hinsicht und vor allem: Wofür? 
 
 | 
 | 
Frühlingsrolle 
Ehemaliges Mitglied
 
Erhaltene Danke: 1 
 
 
 
 | 
Verfasst: Mo 23.05.16 01:08 
 
- Nachträglich durch die Entwickler-Ecke gelöscht - 
 
 | 
 | 
Nersgatt 
        
 
Beiträge: 1581 
Erhaltene Danke: 279 
 
 
Delphi 10 Seattle Prof. 
 | 
Verfasst: Mo 23.05.16 06:02 
 
Ich würde das etwas anders lösen. Mach doch eine Liste mit Controls, die überprüft werden sollen.
 
 Deklariere z.B. eine TList<TEdit> als private Variable des Formulars. Im FormCreate erstellst Du die Variable und fügst alle Felder, die überprüft werden sollen der Liste in der gewünschten Reihenfolge hinzu.
 
 In Deinem FeldChecker benutzt Du dann nicht mehr form1.Components sondern Deine private Liste der zu überprüfenden Felder.
 So kannst Du auch komfortabel ein Feld hinzufügen, ohne gezwungenermaßen zu prüfen. Vielleicht hast Du ja mal ein Feld, das auch leer bleiben darf. 
_________________ Gruß, Jens
 Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
 
 | 
 | 
jaenicke 
        
 
Beiträge: 19326 
Erhaltene Danke: 1749 
 
W11 x64 (Chrome, Edge) 
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus 
 | 
Verfasst: Mo 23.05.16 07:54 
 
Ich würde da auch gleich eine zweite Liste mit einer Bezeichnung füllen, damit nicht nur der Name der Komponente angezeigt werden kann.
 
	   Frühlingsrolle hat folgendes geschrieben  : | 	 		  | Ich vermute mal, er meint in welcher Reihenfolge ein Control den Fokus beim Tabulieren erhält. | 	 
 Nein, er meint die Reihenfolge, in der die Controls auf Leerheit    geprüft und dementsprechend dem Bediener gemeldet werden. Das kann der TabOrder entsprechen, muss aber nicht.  
 
 | 
 | 
JoelH 
        
 
Beiträge: 806 
Erhaltene Danke: 17 
 
Win10 
Delphi Alexandria 11.2 Patch 1 
 | 
Verfasst: Mo 23.05.16 11:42 
 
Ich benutz für sowas immer die Tag Eigenschaft der Komponenten. 
_________________ mfg. Joel
  
 | 
 | 
neuling321   
        
 
Beiträge: 18 
 
Win10prof 
Delphi 10 Seattle Prof. 
 | 
Verfasst: Di 24.05.16 19:49 
 
Hallo
 
 Danke für die Antworten.
 
 Ja so wie jaenicke das gesagt hat so meine ich das. Durch den TapOrder lässt sich das nicht steuern.
 Wie meint ihr das mit der Liste? 
 
 | 
 | 
Nersgatt 
        
 
Beiträge: 1581 
Erhaltene Danke: 279 
 
 
Delphi 10 Seattle Prof. 
 | 
Verfasst: Di 24.05.16 20:55 
 
	   neuling321 hat folgendes geschrieben  : | 	 		  | Wie meint ihr das mit der Liste? | 	  
Welche Delphiversion benutzt Du? Davon hängt ab, wie man den Vorschlag mit der Liste am besten umsetzt.
 Trag die Version am besten in Deinem Profil ein.  
_________________ Gruß, Jens
 Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
 
 | 
 | 
neuling321   
        
 
Beiträge: 18 
 
Win10prof 
Delphi 10 Seattle Prof. 
 | 
Verfasst: Di 24.05.16 21:25 
 
 | 
 | 
jaenicke 
        
 
Beiträge: 19326 
Erhaltene Danke: 1749 
 
W11 x64 (Chrome, Edge) 
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus 
 | 
Verfasst: Di 24.05.16 22:57 
 
Dann kannst du ja Generics verwenden. Ein Beispiel: 		                                                          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:
  				 | 									type   TMainForm = class(TForm)   ...   private     FNonEmptyEdits: TList<TEdit>;     FNonEmptyEditDescriptions: TList<string>;   end;
    FNonEmptyEdits := TList<TEdit>.Create;   FNonEmptyEditDescriptions := TList<string>.Create;
    FNonEmptyEdits.Add(edtExample1);   FNonEmptyEditDescriptions.Add('Beispiel-Edit 1');   FNonEmptyEdits.Add(edtExample2);   FNonEmptyEditDescriptions.Add('Beispiel-Edit 2');
    FNonEmptyEdits.Free;   FNonEmptyEditDescriptions.Free;
  procedure TMainForm.CheckFelder; var   i: integer; begin   for i := 0 to FNonEmptyEdits.Count - 1 do     if FNonEmptyEdits[i].Text = '' then       ShowMessage('Bitte Feld ' + FNonEmptyEditDescriptions[i] + ' ausfüllen'); end;					 				 | 			 		 	  Du führst also eine Liste mit den zu prüfenden TEdit-Komponenten (hier edtExample1 und edtExample2) und eine zweite Liste mit den anzuzeigenden Feldnamen. So kannst du immer eine Liste von TEdit-Komponenten in der gewünschten Reihenfolge prüfen und zusätzlich einen richtigen Text dazu anzeigen statt nur den Komponentennamen, der ja relativ limitiert ist (keine Leerzeichen, ...).  
 
 Für diesen Beitrag haben gedankt: Nersgatt
 | 
 | 
Nersgatt 
        
 
Beiträge: 1581 
Erhaltene Danke: 279 
 
 
Delphi 10 Seattle Prof. 
 | 
Verfasst: Mi 25.05.16 13:18 
 
Genau so hab ich das gemeint.     
Im obersten USES-Abschnitt muss noch  Generics.Collections hinzugefügt werden.  
_________________ Gruß, Jens
 Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
 
 | 
 | 
neuling321   
        
 
Beiträge: 18 
 
Win10prof 
Delphi 10 Seattle Prof. 
 | 
Verfasst: So 29.05.16 06:33 
 
Vielen Dank klappt super    
 
 | 
 | 
neuling321   
        
 
Beiträge: 18 
 
Win10prof 
Delphi 10 Seattle Prof. 
 | 
Verfasst: So 29.05.16 06:48 
 
Nun habe ich doch noch ein Problem, ich habe in dem Programm noch
 Memo und Comboboxen, die ich auch abfragen möchte.
 Nun wird es aber kompliziert mit der abfrage, da die Felder alle
 gemischt sind. Kann man den Objekten nicht irgendwie einen Index zuweisen? 
 
 | 
 | 
jaenicke 
        
 
Beiträge: 19326 
Erhaltene Danke: 1749 
 
W11 x64 (Chrome, Edge) 
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus 
 | 
Verfasst: So 29.05.16 09:03 
 
Dann fällt mir eine andere Möglichkeit ein... ich bin grad am Handy, ich schreibe nachher etwas dazu. 
 
 | 
 | 
jaenicke 
        
 
Beiträge: 19326 
Erhaltene Danke: 1749 
 
W11 x64 (Chrome, Edge) 
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus 
 | 
Verfasst: So 29.05.16 11:00 
 
Es gibt viele Möglichkeiten. Eine davon ist eine Prüfklasse zu schreiben, die von einer gemeinsamen Basisklasse abgeleitet ist. Dadurch wird die Information zu der entsprechenden Komponente beim Aufruf nicht mehr benötigt.
 
Beispiel: 																	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: 58: 59: 60:
  				 | 									type   TCustomCheckText = class   private     FText: string;   public     constructor Create(const AText: string);     function Check: Boolean; virtual; abstract;     property Text: string read FText;   end;
    TCheckEditText = class(TCustomCheckText)   private     FEdit: TCustomEdit;   public     constructor Create(const AEdit: TCustomEdit; const AText: string);     function Check: Boolean; override;   end;
    TCheckComboText = class(TCustomCheckText)   private     FComboBox: TComboBox;   public     constructor Create(const AComboBox: TComboBox; const AText: string);     function Check: Boolean; override;   end;
  implementation
 
 
  function TCheckEditText.Check: Boolean; begin   Result := FEdit.Text <> ''; end;
  constructor TCheckEditText.Create(const AEdit: TCustomEdit; const AText: string); begin   inherited Create(AText);   FEdit := AEdit; end;
 
 
  function TCheckComboText.Check: Boolean; begin   Result := FComboBox.Text <> ''; end;
  constructor TCheckComboText.Create(const AComboBox: TComboBox; const AText: string); begin   inherited Create(AText);   FComboBox := AComboBox; end;
 
 
  constructor TCustomCheckText.Create(const AText: string); begin   FText := AText; end;					 				 | 			 		 	  
Und die Benutzung: 																	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:
  				 | 									  private     FNonEmptyChecks: TList<TCustomCheckText>;     procedure CheckFelder;
 
  procedure TMainForm.CheckFelder; var   i: integer;   MessageText: string; begin   MessageText := '';   for i := 0 to FNonEmptyChecks.Count - 1 do     if not FNonEmptyChecks[i].Check then       MessageText := MessageText + #13#10 + 'Bitte Feld ' + FNonEmptyChecks[i].Text + ' ausfüllen';   ShowMessage(MessageText); end;
  procedure TMainForm.btnStartClick(Sender: TObject); begin   CheckFelder; end;
  procedure TMainForm.FormCreate(Sender: TObject); begin   FNonEmptyChecks := TList<TCustomCheckText>.Create;
    FNonEmptyChecks.Add(TCheckEditText.Create(edtExample1, 'Beispiel-Edit Nummer 1'));   FNonEmptyChecks.Add(TCheckEditText.Create(memExample, 'Beispiel-Memo'));   FNonEmptyChecks.Add(TCheckComboText.Create(cboExample, 'Beispiel-Combobox'));   FNonEmptyChecks.Add(TCheckEditText.Create(edtExample2, 'Beispiel-Edit Nummer 2')); end;
  procedure TMainForm.FormDestroy(Sender: TObject); begin   FNonEmptyChecks.Free; end;					 				 | 			 		 	   
 
 | 
 | 
neuling321   
        
 
Beiträge: 18 
 
Win10prof 
Delphi 10 Seattle Prof. 
 | 
Verfasst: So 29.05.16 15:10 
 
 | 
 |