![]() |
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 |
Nimm doch eine normale ComboBox und füge diesen Code in das OnEnter Ereignis ein.
Code:
if not ComboBox1.DroppedDown then
ComboBox1.DroppedDown := True; |
Hi,
entschuldige, aber Deine beschreibung für eine ComboBox ist einfach herrlich... :mrgreen: :mrgreen: :hello: :lol: :hello: :mrgreen: :mrgreen: Grüsse, Daniel :hi: |
EWigentlich steht es so fast im PSDK (zu mindest sinngemaäß):
Zitat:
@Hansa: Falls wir dich falsch verstanden haben sorry. Einfach nicht ernst nehmen mein Posting. :wink: |
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] |
War ja nur ein Scherz.
|
Hi,
oje, was ist das denn ? wer redet denn hier von einer Combobox? 8) 8) 8) Hier nochmals die Frage : Zitat:
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:
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 |
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? |
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: |
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]; |
Hi Luckie,
mußt nur lesen ! :P
Code:
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.
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; 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 |
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 |
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: |
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 |
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. |
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 |
Hallo:
Da war doch noch was : Zitat:
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. |
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). |
Moin Chris,
Zitat:
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 |
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: |
Ich hab da mal was probiert..
Code:
Ich hoffe ich konnte dir helfen?
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; MFG |
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 |
Mit der Tastatur würde es dann so gehen...
Code:
Gruß
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState); begin ListBox1.Visible := True; end; City Light |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz