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.



Start - FAQ - Glossar - Sitemap - Impressum

 
cockpit-xp/addon/formulare/tedit.txt · Zuletzt geändert: 2020/11/28 12:16 (Externe Bearbeitung)