Delphi-PRAXiS

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 16:37


Editfeld mit automatischer Listbox
 
Hallo,

ich will folgendes erreichen : Clickt der User ein bestimmtes Editfeld an, so soll automatisch eine Listbox aufgehen, aus der er einen Wert auswählen kann. Kriege es aber nur mit einem separaten Button hin. Sobald dieser gedrückt wird, erscheint die Listbox. Beser wäre es, die käme automatisch.

Gruß
Hansa

sakura 5. Okt 2002 16:46

Nimm doch eine normale ComboBox und füge diesen Code in das OnEnter Ereignis ein.

Code:
  if not ComboBox1.DroppedDown then
    ComboBox1.DroppedDown := True;

Daniel B 5. Okt 2002 17:12

Hi,

entschuldige, aber Deine beschreibung für eine ComboBox ist einfach herrlich...
:mrgreen: :mrgreen: :hello: :lol: :hello: :mrgreen: :mrgreen:

Grüsse, Daniel :hi:

Luckie 5. Okt 2002 17:19

EWigentlich steht es so fast im PSDK (zu mindest sinngemaäß):
Zitat:

A combo box consists of a list and a selection field. The list presents the options that a user can select and the selection field displays the current selection.
Wer ist dafür, dass sich Hansa in die Ecke stellt und sich eine Runde schämt? *handheb*

@Hansa: Falls wir dich falsch verstanden haben sorry. Einfach nicht ernst nehmen mein Posting. :wink:

Daniel B 5. Okt 2002 17:25

Hi,

so, jetzt langst aber wieder. Wir wollen Ihn ja nciht verscheuchen.
Es könnte ja sein das er wirklich ein Edit haben will. Immerhin hat ein Edit kein Pfeil zum Aufklappen.
Drunter könnte man eine Listbox setzen mit "unvisible" und wenn er was macht, dann soll sie wieder "visibilisiert" werden. :roll:
Wäre ja Denkbar und möglich.

Grüsse, Daniel :hi:

@Luckie: Schämen sollte er sich wirklich nicht dafür.




[edit]edit by Admin[/edit]

Luckie 5. Okt 2002 17:28

War ja nur ein Scherz.

Hansa 5. Okt 2002 18:34

Hi,

oje, was ist das denn ?

wer redet denn hier von einer Combobox? 8) 8) 8)

Hier nochmals die Frage :

Zitat:

ich will folgendes erreichen : Clickt der User ein bestimmtes Editfeld an, so soll automatisch eine Listbox aufgehen, aus der er einen Wert auswählen kann
Das Feld hat absolut nichts mit der Listbox zu tun !!!!!
Habe es jetzt so hin gekriegt, daß die Listbox aufgeht, sobald das Editfeld angeclickt wird. Das Problem hat sich jetzt nur etwas verlagert: Die Box soll dann aufgehen (und zwar AUTOMATISCH !!), sobald der Cursor in dem Feld steht, auch ohne anclicken! Gehe ich mit der Tastatur in das Feld, geht sie noch NICHT auf.

Daniel B:
Zitat:

Immerhin hat ein Edit kein Pfeil zum Aufklappen.
EBEN !! Wenigstens einer, der mitdenkt. :mrgreen:

Es geht um eine Eingabemaske mit so 100-200 Feldern auf ca. 3 bis 4 Seiten verteilt, mache ich das nicht absolut narrensicher und einfach schreiben irgenwelche Deppen nur Mist da rein!! Die Combobox ist schon zuviel. Das ganze noch mit SQL und ca. 10 Stammtabellen.

@Luckie: Wer lesen kann ist klar im Vorteil, hehe :mrgreen:

Gruß
Hansa

Luckie 5. Okt 2002 18:38

OnEnter und OnExit schon probiert? Wie sieht dein Code denn bisher aus?

Aber ehrlich gesagt, warum keine Combobox? Die macht doch genau das, wass du willst oder nicht?

Daniel B 5. Okt 2002 18:47

Hi Luckie,

weil es nunmal nicht so aussieht. Die ListBox geht auch an einer anderen Stelle auf dem Formular auf. Er hat nicht gesagt das es drunter sein muss. Und er wollte ja ein Edit und keine ComboBox. Den Unterschied kennt er sehr wohl.

Aber das OnEnter wird Ihm weiter helfen.
Wobei ich nciht verstehe, warum er nciht selbst drauf gekommen ist.

Grüsse, Daniel :hi:

Luckie 5. Okt 2002 18:50

Code:
[b]procedure[/b] TForm1.Edit1Enter(Sender: TObject);
[b]begin[/b]
  Listbox1.Visible := TRUE;
[b]end[/b];

[b]procedure[/b] TForm1.Edit1Exit(Sender: TObject);
[b]begin[/b]
  Listbox1.Visible := FALSE;
[b]end[/b];

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:

City Light 16. Okt 2002 13:05

Ich hab da mal was probiert..

Code:
procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  ListBox1.Visible := True;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  Edit1.Text := ListBox1.Items.Strings[ListBox1.ItemIndex];
  ListBox1.Visible := False;
end;
Ich hoffe ich konnte dir helfen?

MFG

Hansa 16. Okt 2002 18:28

Hi CityLight,

das da sieht gut aus, :dancer2: kann es aber erst morgen ausprobieren. Wenn der Mauscursor über das Feld wandert -> Listbox auf ? Das würde der Dümmste kapieren, sofern es auch ohne Maus, also mit Tastatur so geht. Jetzt habe ich das aber erst mal zurückgestellt. Zuviele Programm-Baustellen. :mrgreen:

Gruß
Hansa

City Light 19. Okt 2002 10:44

Mit der Tastatur würde es dann so gehen...
Code:
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  ListBox1.Visible := True;
end;
Gruß
City Light


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:41 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