| 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?
 		Moderiert von                       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;
 |   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:
 
 | typeTMainForm = 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:
 
 | typeTCustomCheckText = 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:
 
 |   privateFNonEmptyChecks: 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 
 | 
|  |