AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Eingabebeschränkung f. eine Gruppe EditControls u. m.
Thema durchsuchen
Ansicht
Themen-Optionen

Eingabebeschränkung f. eine Gruppe EditControls u. m.

Ein Thema von Emilio · begonnen am 13. Mär 2006 · letzter Beitrag vom 14. Mär 2006
Antwort Antwort
Emilio

Registriert seit: 14. Dez 2003
65 Beiträge
 
#1

Eingabebeschränkung f. eine Gruppe EditControls u. m.

  Alt 13. Mär 2006, 14:12
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:

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;
Mit diesem Code habe ich also nur die Prüfung , ob ein Wert enthalten ist; jedoch nicht ... den gewünschten Rest.

Hat jemand Vorschläge?
Freue mich sehr auf Eure Antworten

VG
Emilio
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.

  Alt 13. Mär 2006, 14:18
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
  Mit Zitat antworten Zitat
Emilio

Registriert seit: 14. Dez 2003
65 Beiträge
 
#3

Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.

  Alt 13. Mär 2006, 20:06
Zitat von Der_Unwissende:
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)
@ Der Unwissende
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 ...

Ich recherchiere mal weiter; Falls Du Zeit für ein Beispiel hättest, würde ich mich sehr freuen.

VG
Emilio
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.

  Alt 13. Mär 2006, 20:15
Für dein zweites Problem:
http://www.michael-puff.de/Developer...Component.html
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#5

Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.

  Alt 13. Mär 2006, 22:15
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:
var Array1 : Array[0..200] of String;
    Array2 : Array[10..20] of Integer;
    Array3 : Array[0..1, 0..1] of Char;
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).

Möchtest du auf ein Feld zugreifen, so geschieht das über den Index, du schreibst nur eine Zahl in eine eckige Klammer
Delphi-Quellcode:
var array1 : Array[1..10] of Char;
begin
  array1[1] := 'H';
  array1[2] := 'a';
  ...
end;
Was nicht geht sind Zugriffe auf die 0 oder 11 (halt alles ausserhalb der Grenzen).

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:
// 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;
  ....
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.

Delphi-Quellcode:
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;
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.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Emilio

Registriert seit: 14. Dez 2003
65 Beiträge
 
#6

Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.

  Alt 14. Mär 2006, 09:37
@ 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. 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.

Aber halt: Probleme erst lösen, wenn sie da sind - ich probiers erstmal und Danke nochmals.

VG
Emilio
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.

  Alt 14. Mär 2006, 09:54
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;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Eingabebeschränkung f. eine Gruppe EditControls u. m.

  Alt 14. Mär 2006, 10:05
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz