Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Editfeld mit automatischer Listbox (https://www.delphipraxis.net/994-editfeld-mit-automatischer-listbox.html)

Hansa 5. Okt 2002 19:58

Hi Luckie,

mußt nur lesen ! :P

Code:
procedure TForm1.KGnrEnter(Sender: TObject);
begin
  // KGListBox.Visible := true;
  KGlistBox.Show;
  WITH DataModul.KGdatensatz DO BEGIN
    Active := false;
    SelectSQL [0] := 'SELECT * FROM KG8';
    Active := true;
    while not EOF do begin
      KGlistBox.Items.Add(FieldByName('NR').AsString + ' ' +
                          FieldByName('BEZ').AsString);
      next;
    end;
  end;
end;

procedure TForm1.KGnrExit(Sender: TObject);
begin
  KGlistBox.Clear;
  // KGlistBox.visible := false;
  KGlistBox.Hide;
end;
Aktiv ist im Code meine Variante, weil die noch kürzer ist. :mrgreen: Die von Luckie ist die auskommentierte. Die funktionieren aber trotzdem total gleich!! Anscheinend machen Show und Hide nichts anderes, als visible auf true bzw. false zu setzen.

Das KGlistBox.Clear hat mit Bildschirm usw. nichts zu tun ! Es muß im OnExit die Datenmenge, die in der Listbox angezeigt werden soll, wieder leer machen, da diese in OnEnter erzeugt wird. Fehlt diese Zeile füllt sich die Box bei jedem OnEnter immer mehr mit Duplikaten.


Das wars dann wohl. :hello:

Die Combobox will ich nicht verwenden, da es für den Anwender einen Arbeitsschritt mehr macht und ansonsten nichts bringt.

Gruß
Hansa

Hansa 5. Okt 2002 20:09

Editfeld für Eingaben sperren
 
Hi,

Jetzt hab ich noch was. Wie kriege ich es hin, daß in ein Editfeld nach der ersten Eingabe nichts mehr geändert werden soll ? Na klar, ich setze im OnExit Event ein ReadOnly. Bewege ich mich aber mit Tab über den Bildschirm, geht er trotzdem noch in das Feld, ändern kann man zwar nix, aber er geht auch nicht in das nächste editierbare Feld.

Gruß
Hansa

Daniel B 5. Okt 2002 20:15

Hi Hansa,

setze es doch einfach auf: Edit1.Enabled := False;
Damit kommst Du auch nicht mit dem Tab rein und das ReadOnly kannst Du Dir dann auch sparen.
Und wenn Du es wieder brauchst, dann setze es einfach wieder auf True.

Grüsse, Daniel :hi:

Hansa 5. Okt 2002 20:42

Hi Daniel B,

habe mich verschrieben. Meinte natürlich enabled und nicht R/O. Hab jetzt im Quelltext nachgeschaut, steht richtig drin. Nachdem ich enabled auf false gesetzt habe, habe ich anscheinend nicht wieder compiliert. :oops: Gehen tuts schon trichtig.

Gruß
Hansa

Christian Seehase 5. Okt 2002 21:43

Moin Hansa,

nur noch einmal kurz zur ComboBox Variante die Sakura gepostet hat.
Wenn Du die mit dem ComboBox Style csDropDownList kombinierst, hast Du auch den Effekt, dass der User nichts eingeben kann. Das Edit Feld ist dann auch nicht beschreibbar.

Um zu verhindern, das jemand mit dem Tabulator in ein Feld kommt könntest Du auch TabStop auf false setzen. Dann würde das Feld auch übersprungen werden.

Hansa 6. Okt 2002 00:39

Hi Christian,

das mit der Combobox ist interessant, seh ich mir mal an. Das wäre aber so ungefähr das gleiche, wie mit meiner Listbox.

Hinzu kommt aber noch folgendes : Will in irgendeiner Box die Nr UND die Bezeichnung unterbringen, z.B.

1 Privatkunde
2 Rabattkunde
etc.

Es geht halt darum, daß die Oma damit zurecht kommt und auch die flinke Tippse. Die Tippse kommt einmal die Woche, hat die Nummern im Kopf und hackt sie ein. Die Oma braucht ohne Aufwand eine Hilfestellung.

In der Listbox habe ich es so gemacht, daß die nr und bez zu einem string gekoppelt werden. Das ist nicht sehr elegant, weil ich dann das Auswahlfeld wieder auseinanderreißen muß, da der Zugriff auf die DB nur über die Nr. läuft. Wegen eventuell gleicher Bez. SQL muß das ganze dann auch noch kapieren.

Um dies zu vermeiden, habe ich auch ein Grid in Betracht gezogen. Wie gesagt, die ComboBox muß ich mir nochmal anschauen.

Gruß
Hansa

Hansa 6. Okt 2002 00:58

Hallo:

Da war doch noch was :

Zitat:

Wenn Du die mit dem ComboBox Style csDropDownList kombinierst, hast Du auch den Effekt, dass der User nichts eingeben kann
Du meinst, dann geht die ComboBox von alleine auf? Aha, sehr gut, aber nicht für diesen Zweck. Die Sperre des Editfeldes ist für die Kundennr. gedacht. Sobald diese den DS selektiert hat, soll alles verfügbar sein, NUR NICHT die Kundennr. selbst.

Das Auswahlfeld soll er ja nutzen können, um die KG-Nr., die eventuell falsch eingegeben wurde zu korrigieren ! Er soll nur nicht die Nr. einfach so ändern.

Stelle meinen code mal hier rein. Kommentare willkommen :
Code:
unit KGform;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, FIBQuery, pFIBQuery, StdCtrls, Mask, DBCtrls,
  ComCtrls;

type
  TForm1 = class(TForm)
    Label2: TLabel;
    KGlistBox: TDBListBox;
    KuAnrede: TDBedit;
    KuName: TDBEdit;
    KuStrasse: TDBEdit;
    KuOrt : TDBedit;
    KuNr: TEdit;
    KGnr: TEdit;
    Label1: TLabel;
    procedure FormShow(Sender: TObject);
    procedure KUnrExit(Sender: TObject);
    procedure KGnrEnter(Sender: TObject);
    procedure KGnrExit(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

USES DataMod;

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  KGlistBox.Hide;
  KuNr.SetFocus;
end;

procedure TForm1.KUnrExit(Sender: TObject);
begin
  IF KuNr.Text <> '' THEN BEGIN
    WITH DataModul.KuDatensatz DO BEGIN
      active := false;
      SelectSQL [0] := 'SELECT * FROM KUNDE8 WHERE NR = ' + KuNr.text;
      active := true;
      IF IsEmpty THEN BEGIN
        ShowMessage ('Kunde existiert nicht !');
        KuNr.SetFocus;
      END
      ELSE BEGIN
        KuNr.enabled := false; // Kunden-Nr. nicht editierbar
{
        WITH DataModul.KGdatensatz DO BEGIN
          Active := false;
          SelectSQL [0] := 'SELECT * FROM KG8 WHERE ID = ' +
            FieldByName('IDKGH').AsString;
          Active := true;
          IF NOT IsEmpty THEN
            Label1.Caption := '(' + FieldByName('BEZ').AsString + ')';
        END;
}
        KuAnrede.SetFocus;      // erstes editierbares Feld
      END;
    END
  END
  ELSE BEGIN
    ShowMessage ('Kunden-Nr. muß eingegeben werden !');
    KuNr.SetFocus;
  END
end;

procedure TForm1.KGnrEnter(Sender: TObject);
begin
  KGlistBox.Show;
  WITH DataModul.KGdatensatz DO BEGIN
    Active := false;
    SelectSQL [0] := 'SELECT * FROM KG8';
    Active := true;
    while not EOF do begin
      KGlistBox.Items.Add(FieldByName('NR').AsString + ' ' +
                          FieldByName('BEZ').AsString);
      next;
    end;
  end;
end;

procedure TForm1.KGnrExit(Sender: TObject);
begin
  KGlistBox.Clear;
  KGlistBox.Hide;
  IF KGnr.Text <> '' THEN WITH DataModul.KGdatensatz DO BEGIN
    Active := false;
    SelectSQL [0] := 'SELECT * FROM KG8 WHERE NR = ' + KGnr.text;
    Active := true;
    IF NOT IsEmpty THEN
      Label1.Caption := '(' + FieldByName('BEZ').AsString + ')';
  END;
end;

end.

Christian Seehase 6. Okt 2002 02:05

Moin Hansa,

ich meinte, dass man in das Editfeld einer ComboBox mit csDropDownList nichts eingeben kann, was nicht in der Liste zu finden ist.

Bei Deiner Erklärung wozu Du es brauchst, erscheint ein StringGrid/ListView aber auch nicht verkehrt.

Was mir allerdings nicht ganz einleuchtet:
Warum zeigst Du erst die Listbox an, und füllst sie dann?
Das würde ich umgekehrt machen (egal, welches Control Du dafür verwendest).

Hansa 6. Okt 2002 02:16

Moin Chris,

Zitat:

Warum zeigst Du erst die Listbox an, und füllst sie dann?
Das würde ich umgekehrt machen (egal, welches Control Du dafür verwendest).
Ja, das ist Blödsinn, Danke für den Tip. Will im Moment wenigstens überhaupt etwas sehen, wie ist egal. Bei Millionen Feldern wäre das aber doch schlimm. :bounce2:

Aber bei meiner Interbase DB mit bisher 5 Datensätzen (oder sind es 4 ?) 8) fällt es (noch) nicht auf. Wird morgen direkt geändert.

Gruß
Hansa

Daniel B 6. Okt 2002 10:00

Hallo Hansa,

noch eine kleinigkeit zur ComboBox.
Jeder Eintrag hat einen ItemIndex.
Du willst das jeder Eintrag auch eine Zahl hat.
Dazu könntest Du diesen Index nutzen.
Immer wenn Du ein neuen Eintrag einfügst, dann nimmst Du den Index des vorherigen +1 und setzt es zu einem String zusammen, dann nur noch einfügen und schon hast Du das Ergebnis Zahl + Name Autom. erzeugt.

Grüsse, Daniel :hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:01 Uhr.
Seite 2 von 3     12 3      

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