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.
