![]() |
Eingabebeschränkung f. eine Gruppe EditControls u. m.
Hi @all,
in einer GroupBox sind 4 Edits vom Typ TEditCurr (extended); 1 davon ist für den user disabled, da es seinen Wert nur über eine Comboboxauswahl erhält. Zuerst möchte ich die Eingabemöglichkeit auf Zahlen beschränken. Ich habe Beispiele für einzelne Editfelder in der DP gefunden - bekomme es aber nicht hin, dass es für eine Gruppe von EditControls funktioniert, d.h. ohne die Eingabebeschränkung für jedes Edit-Feld einzeln zu schreiben. Vor dem Speichern soll dann geprüft werden, ob die Editfelder gültige Werte enthalten (sprich ".Value > 0"). Wenn eines der Felder leer ist, soll eine Messagebox erscheinen, die darauf hinweist dass ein Feld leer ist (geil wäre, wenn man exakt auf das Feld, welches leer ist hinweisen könnte). Das oder die leer(en) Feld(er) sollen dann eine andere Farbe erhalten, bis sie einen gültigen Wert erfahren haben. bisher sieht der Code (dank der Hilfe von DP - wohlgemerkt!) so aus:
Delphi-Quellcode:
Mit diesem Code habe ich also nur die Prüfung , ob ein Wert enthalten ist; jedoch nicht ... den gewünschten Rest.procedure TForm1.cxButton2Click(Sender: TObject); var a : Extended; i : Integer; begin a := 1; for i := 0 to Form1.cxGroupBox5.ControlCount -1 do begin if (Form1.cxGroupBox5.Controls[i] is TEditCurr) then a := a* (TEditCurr(Form1.cxGroupbox5.Controls[i].Value); end; if a = 0 then begin ShowMessage('Es müssen noch folgende Felder ausgefüllt werden : ...'); end else begin ShowMessage('Änderungen übernehmen?') // noch ohne Funktion end; end; Hat jemand Vorschläge? Freue mich sehr auf Eure Antworten VG Emilio |
Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.
Hi,
am einfachsten kannst du dein Problem lösen, wenn du einfach deine Gruppe als Array abspeicherst. Für die Validierung der Werte kannst du dann einfach über das Array iterieren und die Integritätsprüfung für jedes Edit durchführen. Übergibst du ein Edit einfach als Parameter, kannst du zu dem super abstrahieren. Du prüfst dann in einer Methode nur, ob ein Edit (das übergebene) einen gültigen Wert enthält und sonst ... (zeichnest du es in einer anderen Farbe) Gruß Der Unwissende |
Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.
Zitat:
Danke für Deinen Tipp. Uff,was meine schlauen Bücher über Arrays hergeben ist eher ein bischen dünne - oder aber ich kapiers nicht weils zu einfach ist ... :gruebel: Ich recherchiere mal weiter; Falls Du Zeit für ein Beispiel hättest, würde ich mich sehr freuen. VG Emilio |
Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.
|
Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.
Zu deinen Arrays gibt es eigentlich gar nicht so viel zu sagen. Wenn du (wovon ich mal ausgehe) alle Edits schon zu Designzeit kennst, dann kannst du es sehr statisch angehen.
Für den Fall, dass du die Edits dynamisch (zur Laufzeit) erstellst, so kannst du mittels FindControl (Controls sind nocht spezieller aller Components) nach allen Edits suchen. Arrays gibt es nun wiederum in zwei "Fassungen", statisch und dynamisch. Bei statischen Arrays steht die Größe von Anfang an fest, du legst die einfach mittels
Delphi-Quellcode:
an. Du erzeugst Felder (Arrays) der Größe, die in den eckigen Klammern stehen. Für den ersten Fall kannst du dann auf alle Felder zwischen 0 und 200 zugreifen. Der Index kann beginnen wo du es festlegst. Im letzten Fall hast du eine Matrix (Array of Array).
var Array1 : Array[0..200] of String;
Array2 : Array[10..20] of Integer; Array3 : Array[0..1, 0..1] of Char; Möchtest du auf ein Feld zugreifen, so geschieht das über den Index, du schreibst nur eine Zahl in eine eckige Klammer
Delphi-Quellcode:
Was nicht geht sind Zugriffe auf die 0 oder 11 (halt alles ausserhalb der Grenzen).
var array1 : Array[1..10] of Char;
begin array1[1] := 'H'; array1[2] := 'a'; ... end; Bei dynamischen Arrays steht die Größe nicht fest. Sie kann auch jederzeit geändert werden. Ganz wichtig für dynamische Arrays, sie sind immer Null indiziert. Ihre Größe legst du mit setLength(array, length) fest. Mittels high(array) bekommst du den letzten gültigen Index, mittels length(array) die Gesamtlänge. Wichtig ist hier zu beachten, dass length die Länge angibt. Da dass Array 0 indiziert ist, kannst du also nur auf Werte zwischen 0 und length(array) - 1 zugreifen. Für dich wäre es also wichtig einfach ein Array vom Typ TEdit anzulegen. Einfaches Beispiel wäre hier in das OnCreate-Ereignis etwas aufzunehmen wie
Delphi-Quellcode:
Wenn du Edits global (z.B. im private Teil deiner übergeordneten Klasse) anlegst, dann kannst du von jeder Methode der Klasse auf dieses Array zugreifen. Sollen nun alle Eingaben validiert werden, kannst du das leicht mit zwei Methoden machen.
// sollte ohne das var in den private Teil deines Forms
var Edits : Array of TEdit; .... // in der onCreate setLength(Edits, ANZAHL_DEINER_EDITS); Edits[0] := Edit1; // hoffentlich sinnvoller benannt Edits[1] := Edit2; ....
Delphi-Quellcode:
Das ist es eigentlich auch schon. Ist jetzt ein wenig umständlich erklärt, hilft dir aber vielleicht weiter. An sich solltest du immer sehr abstrakt arbeiten, dass macht vieles leichter (ist aber ein Thema für sich). Also hier meine ich damit wirklich nur, dass du von den konkreten Edits abstrahieren kannst, die du gerade validieren möchtest. Codewiederholung führt immer leicht zu Fehlern bei Änderungen. Deshalb sollte sich wiederholender Code immer (möglichst) in eine eigene Methode.
procedure validate(const Edit : TEdit);
begin if Trim(Edit.Text) = '' then begin Edit.Color := clRed; // oder was auch immer end else ... end; procedure validateAll; var i : Integer; begin for i := low(self.Edits) to high(self.Edits) do begin validate(Edits[i]); end; end; Gruß Der Unwissende |
Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.
@ der Unwissende,
vielen Dank für Deine Antwort. Ich werds heute abend mal versuchen; vermute jedoch schon Schwierigkeiten, denn auf der Form sind außer den genannten noch weitere Edits. Es sollen aber nur die in der Groupbox behandelt werden. :gruebel: Der einzige Weg, auf dem es mir gelungen ist, diese "rauszufischen" ist der in meinem Code beschriebene. Ein weiteres Problem, welches mich auch mit dem Vorschlag von Luckie verfolgt, sehe ich auch hier auf mich zukommen: die eingesetzten Edits sind vom Typ TEditCurr, also Format Extended. Mit Edit.Text := xy is hier nicht, es gibt Edit.Value. Also, Emilio ist ja nicht doof - ersetze .Text mit .Value und siehe da: bisher habe ich bei allen versuchen immer irgendwann die Meldung "inkompatible Typen String und Integer" oder ... "Extended und Integer" oder ähnliche erhalten und trotz eifrigem hin und her formatieren nicht sauber wegbekommen. :wall: Aber halt: Probleme erst lösen, wenn sie da sind - ich probiers erstmal und Danke nochmals. VG Emilio |
Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.
Hai Emilio,
eventuell ist es in diesem Fall auch nicht falsch mit einer TObjectList zu arbeiten und dort die Componenten um die es geht einzutragen.
Delphi-Quellcode:
uses
Contnrs; var editlist : TObjectList; // Das natürlich in den privat Abschnitt der TForm. procedure TForm1.FormCreate(Sender: TObject); begin editlist := TObjectList.Create; editlist.Add(Edit1); editlist.Add(Edit2); editlist.Add(Edit3); end; procedure TForm1.FormDestroy(Sender: TObject); begin editlist.Free; end; procedure TForm1.CheckEdits; var ndx: Integer; begin for ndx := 0 to Pred(EditList.Count) do begin with (EditList.Items[ndx] as TEdit) do begin if (Text = '') then begin ShowMessage('blubb'); Color := clred; SetFocus; break; end; end; end; end; procedure TForm1.AllEditOnChange(Sender: TObject); begin with (Sender as TEdit) do begin if (text <> '') then begin Color := clWhite; end; end; end; procedure TForm1.btn1Click(Sender: TObject); begin CheckEdits; end; |
Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.
Also ich hab diese Aufgabenstellung etwas theoretischer gelöst. ;)
Ich habe eine abstrakte Hauptklasse TValidator, davon erben dann verschiedene Prüfungen, beispielsweise TPLZValidator, TRegExpValidator etc. Jedem der Validator wird zur Designtime ein Control zugeordnet. Beim Validieren werden über die Controls-Liste alle Abkommen von TValidator rausgesucht und ausgewertet. Alle Fehlermeldungen werden in einen String gepackt und in einer MessageBox angezeigt. Code kann ich leider keinen posten, aber ich hoffe es ist auch so klar geworden ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 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 by Thomas Breitkreuz