Inhaltsverzeichnis
Eingabefelder (TEdit)
Einleitung
Eingabefelder dienen der Interaktion mit dem Anwender. Er kann dort Texte oder Zahlenwerte in ein Feld eintragen, welche beim Klick auf einen Button im ablaufenden Programm weiterverarbeitet werden.
Es ist zu beachten, dass der Inhalt eines TEdit-Steuerelements im ersten Schritt immer eine Zeichenfolge ist. Zahlen sind erst nach der Umwandlung mit der StrToInt-Funktion in einen Integerwert für Berechnungen verwendbar.
In der Standardeinstellung ist das Feld einzeilig. Diese Eigenschaft lässt sich anders konfigurieren (MultiLine). Die Anzahl der Zeichen, die das Feld akzeptiert ist ebenfalls einstellbar. So lässt sich unter anderem vermeiden, dass Anwender größere Zahlen eintragen, als später im Programm zu verarbeiten sind.
Codebeispiel
Dieses Beispiel stammt aus dem AddOn SLX - Kategorie Rekord
. Es holt aus der Datenbank für alle Fahrzeuge die zugeordneten Kategorie und zeigt 10 davon auf dem Formular an. Sämtliche Anzeigen sind Objekte vom Typ TLabel.
Es existiert ein Eingabefeld (TEdit), das es dem Anwender erlaubt die Kategorie einzugeben, für die der Rekord geladen werden soll.
Das Feld wird mit der Kategorie vorbelegt, in der sich die meisten der eingestellten Fahrzeuge befinden.
Nach einem Klick auf den Button, wird der weitere Code auf Basis der gewählten Kategorie ausgeführt.
var form : TForm; e1 : TEdit; fine: Boolean; //----------------------------------------------------------------------- // Formular für Kategorie Auswahl aufrufen procedure KategorieWaehlen; var b : TButton; l1, l2, l3, l4, l5, l6 : TLabel; MyLabel : Array[1..30] of TLabel; j : Integer; k : Integer; i : Integer; begin form := TForm.Create(nil); form.Caption := 'Kategorie auswählen'; form.BorderStyle := bsDialog; form.Hint := 'Wählen Sie hier die Kategorie, ' + 'für die Sie den Rekord anzeigen möchten.'; form.Position := poScreenCenter; form.SetBounds(0,0,410,440); l1 := TLabel.Create(f); l1.Name := 'Label1'; l1.Parent := form; l1.Caption := 'ID'; l1.Font.Name := 'Arial'; l1.Font.Height := -19; l1.Font.Style := fsBold; l1.Layout := tlCenter; l1.AutoSize := False; l1.SetBounds(25,10,70,25); l2 := TLabel.Create(f); l2.Name := 'Label2'; l2.Parent := form; l2.Caption := 'Kategorie'; l2.Font.Name := 'Arial'; l2.Font.Height := -19; l2.Font.Style := fsBold; l2.Layout := tlCenter; l2.AutoSize := False; l2.SetBounds(100,10,195,25); l3 := TLabel.Create(f); l3.Name := 'Label3'; l3.Parent := form; l3.Caption := '(Anzahl)'; l3.Font.Name := 'Arial'; l3.Font.Height := -19; l3.Font.Style := fsBold; l3.Layout := tlCenter; l3.AutoSize := False; l3.SetBounds(300,10,95,25); l4 := TLabel.Create(f); l4.Name := 'Label4'; l4.Caption := '________________________________________________________'; l4.Parent := form; l4.Font.Name := 'Arial'; l4.Font.Height := -12; l4.Font.Color := clGray; l4.AutoSize := False; l4.Layout := tlCenter; l4.SetBounds(18,25,368,20); l5 := TLabel.Create(f); l5.Name := 'Label5'; l5.Parent := form; l5.Caption := '________________________________________________________'; l5.Font.Name := 'Arial'; l5.Font.Height := -12; l5.Font.Color := clGray; l5.SetBounds(18,335,368,20); l6 := TLabel.Create(f); l6.Name := 'Label6'; l6.Parent := form; l6.Caption := 'KategorieID:'; l6.Font.Name := 'Arial'; l6.Font.Height := -13; l6.Font.Style := fsBold; l6.Layout := tlCenter; l6.AutoSize := False; l6.SetBounds(20,365,90,35); e1 := TEdit.Create(f); e1.Name := 'Textfeld1'; e1.Parent := form; e1.Font.Name := 'Arial'; e1.Font.Size := -20; e1.Font.Style := fsBold; e1.Text := cpGetStringVar('KategorieMaxCount'); e1.SetBounds(110,365,85,35); b := TButton.Create(f); b.Name := 'Button1'; b.Parent := form; b.Caption := 'Rekord laden'; b.Font.Name := 'Arial'; b.Font.Size := -15; b.Font.Style := fsBold; b.SetBounds(225,365,160,35); // Handler, wenn der Button geklickt wird b.OnClick := @ButtonClick; fine := False; // ab hier werden bis zu 30 TLabel dynamisch erzeugt // Abfrage für max. 10 Kategorien with NewQUERYStat do begin sql.Clear; sql.Text := 'SELECT FzKategorieID, ' + 'FzKategorieName, ' + 'count(FzKategorieID) AS AnzahlInKategorie ' + 'FROM slxCategoryRecordsTmp ' + 'GROUP BY FzKategorieID ' + 'ORDER BY AnzahlInKategorie DESC ' + 'LIMIT 10'; Open; First; // Wählt die ID der Kategorie mit den meisten Zuordnungen e1.Text := IntToStr(FieldByName('FzKategorieID').AsInteger); // Variablen initialisieren j := 7; k := 0; i := 1; // die Tabelle für max 10 Kategorien dynamisch erzeugen while not EoF do begin // Feld 1 für Datensatz-Feld "KategorieID" MyLabel[j+0] := TLabel.Create(f); with MyLabel[j+0] do begin Name := 'Label'+IntToStr(j+0); Parent := f; Caption := IntToStr( FieldByName('FzKategorieID').AsInteger ); Font.Name := 'Arial'; Font.Size := -16; Font.Color := clRed; SetBounds(26,45+(k*30),64,30); end; // Kategorien in Package-Variable speichern cpSetIntegerVar('FzKategorieID'+IntToStr(i), FieldByName('FzKategorieID').AsInteger); // Feld 2 für Datensatz-Feld "KategorieName" MyLabel[j+1] := TLabel.Create(f); with MyLabel[j+1] do begin Name := 'Label'+IntToStr(j+1); Parent := f; Caption := FieldByName('FzKategorieName').AsString; Font.Name := 'Arial'; Font.Size := -16; SetBounds(102,45+(k*30),195,30); end; // Feld 3 für Datensatz-Feld "AnzahlDatensaetzeInKategorie" MyLabel[j+2] := TLabel.Create(f); with MyLabel[j+2] do begin Name := 'Label'+IntToStr(j+2); Parent := f; Caption := IntToStr( FieldByName('AnzahlInKategorie').AsInteger ); Font.Name := 'Arial'; Font.Size := -16; SetBounds(302,45+(k*30),90,30); end; // Kategorie mit den meisten Zuordnungen if j = 7 then begin cpSetStringVar('KategorieMaxCount', IntToStr(FieldByName('FzKategorieID').AsInteger)); end; k := k + 1; // Abstand der Zeilen erhöhen j := j + 3; // alle 3 Felder neue Zeile beginnen i := i + 1; // Zähler um +1 erhöhen Next; // Nächster Datensatz end; // END while - not EOF Free; end; // END with - newQueryStat // Formular anzeigen cpShow(f); while not fine do begin // kurze Wartezeit cpSleep(50); // Kurz bevor der RBS geschlossen wird (Event BeforeClose), wird die // Variable CloseForm gesetzt und das Formular geschlossen, falls es // zu diesem Zeitpunkt noch geöffnet ist if cpGetIntegerVar('CloseForm') = 99 then begin fine := True; end; end; // Objektresourcen wieder freigeben cpFormFree(f); end; // END procedure - Formular anzeigen // ---------------------------------------- // ---------------------------------------- // Handler, wenn Button geklickt wurde procedure ButtonClick(Sender: TButton); begin // Ergebnis der Eingabe aus dem Formular speichern cpSetIntegerVar('GewaehlteKategorieID', StrToInt(e1.Text)); // Kategorienamen zur ID holen with newQueryStat do begin sql.Clear; sql.Text := 'SELECT Fahrzeug, FzTypID, FzTypName, ' + 'FzKategorieID, FzKategorieName ' + 'FROM slxCategoryRecordsTmp ' + 'WHERE FzKategorieID = :KategorieID '; ParamByName('KategorieID').AsInteger := cpGetIntegerVar('GewaehlteKategorieID'); Open; First; // Kategorienamen zur ID speichern cpSetStringVar('GewaehlteKategorieName', FieldByName('FzKategorieName').AsString); Free; end; // Button hat die OK-Funktion form.ModalResult := mrOk; // Formular nach Klick auf Button schließen fine := True; end; // END procedure - ButtonClick // --------------------------------------------------------------------------- ... begin ... // Formular anzeigen KategorieWaehlen; ... end.
Gut zu sehen ist auch, dass die Label, in denen die gefundenen Daten zu sehen sind, dynamisch generiert werden.