Auswahl ähnlich Pulldownmenü
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Auswahl ähnlich Pulldownmenü
[gelöst] Hallo,
ich möchte gern, daß beim Anklicken eines Feldes (derzeit ist das ein Editfeld - kann aber natürlich geändert werden), ein "Auswahlmenü" geöffnet wird, aus dem dann etwas ausgewählt werden kann. Anders als z.B. bei einer Combobox will ich aber die Auswahlpunkte nicht statisch vorgeben sonden es soll so sein, daß z.B. Auswahlmöglichkeiten, die in einem anderen Programmteil bearbeitet worden sind, ausgewählt werden können.
Ich weiß - ich kann nicht gut erklären......
Ein Beispiel:
In einem Programmteil (oder Unit) pflege ich z.B. Automarken -> Audi, Mercedes, VW, Skoda.
Wenn ich nun besagtes Feld anklicke, dann möchte ich, daß aus den gepflegten Marken (Audi, Mercedes, VW, Skoda) eine ausgewählt werden kann - aber eben nur von diesen (hier ist keine Erweiterung möglich). Wird dann irgendwann z,.B. Seat hinzugefügt, so soll Seat natürlich auch auswählbar sein - wird Audi geläscht, so steht Audi für eine Auswahl auch nicht mehr zur Verfügung.
Kann man mich verstehen und noch besser - wie macht man so etwas?
Danke vielmals!
ich möchte gern, daß beim Anklicken eines Feldes (derzeit ist das ein Editfeld - kann aber natürlich geändert werden), ein "Auswahlmenü" geöffnet wird, aus dem dann etwas ausgewählt werden kann. Anders als z.B. bei einer Combobox will ich aber die Auswahlpunkte nicht statisch vorgeben sonden es soll so sein, daß z.B. Auswahlmöglichkeiten, die in einem anderen Programmteil bearbeitet worden sind, ausgewählt werden können.
Ich weiß - ich kann nicht gut erklären......
Ein Beispiel:
In einem Programmteil (oder Unit) pflege ich z.B. Automarken -> Audi, Mercedes, VW, Skoda.
Wenn ich nun besagtes Feld anklicke, dann möchte ich, daß aus den gepflegten Marken (Audi, Mercedes, VW, Skoda) eine ausgewählt werden kann - aber eben nur von diesen (hier ist keine Erweiterung möglich). Wird dann irgendwann z,.B. Seat hinzugefügt, so soll Seat natürlich auch auswählbar sein - wird Audi geläscht, so steht Audi für eine Auswahl auch nicht mehr zur Verfügung.
Kann man mich verstehen und noch besser - wie macht man so etwas?
Danke vielmals!
Zuletzt geändert von Joachim Raap am Do 7. Mai 2020, 21:33, insgesamt 1-mal geändert.
- Swirl
- Beiträge: 99
- Registriert: Fr 7. Aug 2015, 14:05
- OS, Lazarus, FPC: Win 11 / Mint 22.1 / Lazarus 36 / FPC 3.2.2
- CPU-Target: x86_64, ARM Cort.-A7
- Wohnort: Schwerte NRW
Re: Auswahl ähnlich Pulldownmenü
Wäre das eine Lösung? Habe das Füllen der Combo-Box auf ein Button1.Click gelegt.
Du erledigst das natürlich dort, wo du (i. d. Beisp:) Mercedes, VW... erzeugst.
Du erledigst das natürlich dort, wo du (i. d. Beisp:) Mercedes, VW... erzeugst.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
ComboBox1.Clear;
ComboBox1.Items.Add('Erster Eintrag');
ComboBox1.Items.Add('Zweiter Eintrag');
ComboBox1.Items.Add('Noch ein Eintrag');
// und so weiter...
ComboBox1.Items.Delete(hier ein Index deiner Wahl); // falls was gelöscht werden muss
// beim Löschen aber aufpassen, dass kein "nicht vorhandener" Index (Eintrag) gelöscht wird
ComboBox1.ItemIndex := 1; // trägt dann das erste (nicht das nullte) Item in's Auswahlfeld ein
end;
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Auswahl ähnlich Pulldownmenü
Hallo, tut mir leid - das verstehe ich nicht wirklich (noch Anfänger).
Die "Marken" stehen in einer Datenbank (MySQL) und sind - wie gesagt - dynamisch (heute sind es 5, morgen 10 übermorgen 3). Insofern kann ich die Items von der Anzahl her doch gar nicht definieren???
Die "Marken" stehen in einer Datenbank (MySQL) und sind - wie gesagt - dynamisch (heute sind es 5, morgen 10 übermorgen 3). Insofern kann ich die Items von der Anzahl her doch gar nicht definieren???
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Auswahl ähnlich Pulldownmenü
Nachtrag:
Löschen oder ändern soll hier überhaupt nicht möglich sein - es darf nur ausgewählt werden
Löschen oder ändern soll hier überhaupt nicht möglich sein - es darf nur ausgewählt werden
- Swirl
- Beiträge: 99
- Registriert: Fr 7. Aug 2015, 14:05
- OS, Lazarus, FPC: Win 11 / Mint 22.1 / Lazarus 36 / FPC 3.2.2
- CPU-Target: x86_64, ARM Cort.-A7
- Wohnort: Schwerte NRW
Re: Auswahl ähnlich Pulldownmenü
Nur Geduld - ggf. nähern wir uns langsam einer Lösung...
Mit einem SELECT Statement holst du dir ja per TSQLQuery alle Marken aus der Datenbank.
Siehe https://wiki.freepascal.org/SqlDBHowto/de für weitere Erklärungen. (nach ShowData
suchen) Entscheidend ist der Abschnitt...
Statt Writeln (usw) würde bei dir stehen...
Und zu deinem Nachtrag:
Löschen MUSS schon möglich sein, da du ja deine ComboBox-Einträge
offensichtlich aus einer Datenbank nimmst. Und da kann sich was verändern.
Und mit Löschen meine ich Löschen aus der ComboBox (ComboBox.Clear)
bevor du alles was hineingehört, wieder durch Items.Add hineinfügst.
Mit einem SELECT Statement holst du dir ja per TSQLQuery alle Marken aus der Datenbank.
Siehe https://wiki.freepascal.org/SqlDBHowto/de für weitere Erklärungen. (nach ShowData
suchen) Entscheidend ist der Abschnitt...
Code: Alles auswählen
while not Query.Eof do
begin
Writeln('ID: ', Query.FieldByName('Name').AsInteger, 'Name: ' +
Query.FieldByName('Name').AsString);
Query.Next;
end;
Code: Alles auswählen
while not Query.Eof do
begin
ComboBox1.Items.Add(Query.FieldByName('Automodell').AsString);
// "Query" steht hier für die Bezeichnung deines TSQLQuery.
Query.Next;
end;
Löschen MUSS schon möglich sein, da du ja deine ComboBox-Einträge
offensichtlich aus einer Datenbank nimmst. Und da kann sich was verändern.
Und mit Löschen meine ich Löschen aus der ComboBox (ComboBox.Clear)
bevor du alles was hineingehört, wieder durch Items.Add hineinfügst.
Zuletzt geändert von Swirl am Mi 6. Mai 2020, 21:19, insgesamt 2-mal geändert.
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2
- af0815
- Lazarusforum e. V.
- Beiträge: 6763
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Auswahl ähnlich Pulldownmenü
LookUpCombobox ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- Swirl
- Beiträge: 99
- Registriert: Fr 7. Aug 2015, 14:05
- OS, Lazarus, FPC: Win 11 / Mint 22.1 / Lazarus 36 / FPC 3.2.2
- CPU-Target: x86_64, ARM Cort.-A7
- Wohnort: Schwerte NRW
Re: Auswahl ähnlich Pulldownmenü
Falls du es dann sofort gleich »data aware« machen möchtest, suche in den Wikis nach TDBComboBox.
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Auswahl ähnlich Pulldownmenü
[qStatt Writeln (usw) würde bei dir stehen...
Und zu deinem Nachtrag:
Löschen MUSS schon möglich sein, da du ja deine ComboBox-Einträge
offensichtlich aus einer Datenbank nimmst. Und da kann sich was verändern.
Und mit Löschen meine ich Löschen aus der ComboBox (ComboBox.Clear)
bevor du alles was hineingehört, wieder durch Items.Add hineinfügst.
[/quote]
ja, dann haben wir uns hinsichtlich des löschens falsch verstanden - ich meinte, daß löschen oder ändern des Datensatzes an anderer Stelle erledigt wird.
Werde es mal probieren. Danke erst einmal!
Code: Alles auswählen
while not Query.Eof do
begin
ComboBox1.Items.Add(Query.FieldByName('Automodell').AsString);
// "Query" steht hier für die Bezeichnung deines TSQLQuery.
Query.Next;
end;
Löschen MUSS schon möglich sein, da du ja deine ComboBox-Einträge
offensichtlich aus einer Datenbank nimmst. Und da kann sich was verändern.
Und mit Löschen meine ich Löschen aus der ComboBox (ComboBox.Clear)
bevor du alles was hineingehört, wieder durch Items.Add hineinfügst.
[/quote]
ja, dann haben wir uns hinsichtlich des löschens falsch verstanden - ich meinte, daß löschen oder ändern des Datensatzes an anderer Stelle erledigt wird.
Werde es mal probieren. Danke erst einmal!
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Auswahl ähnlich Pulldownmenü
habe es mal ausprobiert und auf meine Programmierung angepaßt:
procedure TFMArtStamm.ComboBox1Click(Sender: TObject);
begin
FMLogIn.ConnectDB;
FMLogIn.SQLQuery1.SQL.Text:='select * from art_grp where Grp_Loesch=0 order by Grp_Nr;';
while not FMLogIn.SQLQuery1.EOF do
begin
ComboBox1.Items.Add(FMLogIn.SQLQuery1.FieldByName('Grp_Nr').AsString); // wie kann man in die gleiche Zeile noch einen Text einfügen??
FMLogIn.SQLQuery1.Next
end;
FMLogIn.CloseDB;
end;
Allerdings bleibt die ComboBox leer. Kannst Du einen Fehler erkennen?
Und noch was: Gibt es irgendwo eine Erläuterung, was man mit den einzelnen "Boxen" aus Standard, Additional etc machen kann und was die Eigenschaften bedeuten/bewirken (in Deutsch)? Kann auch gern ein Buch sein...
procedure TFMArtStamm.ComboBox1Click(Sender: TObject);
begin
FMLogIn.ConnectDB;
FMLogIn.SQLQuery1.SQL.Text:='select * from art_grp where Grp_Loesch=0 order by Grp_Nr;';
while not FMLogIn.SQLQuery1.EOF do
begin
ComboBox1.Items.Add(FMLogIn.SQLQuery1.FieldByName('Grp_Nr').AsString); // wie kann man in die gleiche Zeile noch einen Text einfügen??
FMLogIn.SQLQuery1.Next
end;
FMLogIn.CloseDB;
end;
Allerdings bleibt die ComboBox leer. Kannst Du einen Fehler erkennen?
Und noch was: Gibt es irgendwo eine Erläuterung, was man mit den einzelnen "Boxen" aus Standard, Additional etc machen kann und was die Eigenschaften bedeuten/bewirken (in Deutsch)? Kann auch gern ein Buch sein...
- Swirl
- Beiträge: 99
- Registriert: Fr 7. Aug 2015, 14:05
- OS, Lazarus, FPC: Win 11 / Mint 22.1 / Lazarus 36 / FPC 3.2.2
- CPU-Target: x86_64, ARM Cort.-A7
- Wohnort: Schwerte NRW
Re: Auswahl ähnlich Pulldownmenü
Mir sind 2 Sachen aufgefallen:
1: die ComboBox wird nicht gefüllt, indem sie angeklickt wird. Theoretisch ist das zwar möglich, normalerweise wird das aber "woanders" gemacht. E.g. dort, wo der Artikelstamm geändert wird, oder meinetwegen beim Form.Show, etc.
2: ich setze vor das...
...immer noch ein "First"
Ich bin mir nicht sicher, ob das wirklich nötig ist. Muss ich mal testen...
Bevor ich hier von den Datenbankcracks geschlachtet werde: versuch's mal mit einer TDBComboBox, die du über eine TDataSource-Komponente mit dem DataSet (deine SQLQuery1) verbindest.
Und noch'n Tip: Ich arbeite unter SQLite sehr gerne mit dem SQLIteStudio. Bei mir läuft das unter Windows und Linux. Ohne Schnörkel und absolut zu empfehlen.
1: die ComboBox wird nicht gefüllt, indem sie angeklickt wird. Theoretisch ist das zwar möglich, normalerweise wird das aber "woanders" gemacht. E.g. dort, wo der Artikelstamm geändert wird, oder meinetwegen beim Form.Show, etc.
2: ich setze vor das...
Code: Alles auswählen
while not FMLogIn.SQLQuery1.EOF do
Code: Alles auswählen
FMLogIn.SQLQuery1.First
while not FMLogIn.SQLQuery1.EOF do
Bevor ich hier von den Datenbankcracks geschlachtet werde: versuch's mal mit einer TDBComboBox, die du über eine TDataSource-Komponente mit dem DataSet (deine SQLQuery1) verbindest.
Und noch'n Tip: Ich arbeite unter SQLite sehr gerne mit dem SQLIteStudio. Bei mir läuft das unter Windows und Linux. Ohne Schnörkel und absolut zu empfehlen.
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2
- af0815
- Lazarusforum e. V.
- Beiträge: 6763
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Auswahl ähnlich Pulldownmenü
Ein paar Grundlagen, wie Code Tags setzen, die Grundlagen der Datenbank Komponenten setze ich mal voraus. Zusätzlich noch wie man im Code Breakpoints setzt.
Wenn keine Daten kommen, dann setze ich in die Routine mal einen Breakpoint und schau, ob die überhaupt angesprungen wird. Und wenn nicht, dann muss ich mir was überlegen dazu.
Grundlegend kann man bei Datenbanken mit den Datenbankkomponenten arbeiten, dann muss man sich auch an die Spielregeln dieser halten, oder man macht es im Code. Dann sollte man sich vorher mal überlegen was man wo benötigt.
Bei den Datenbankkomponenten muss man auch wissen, das ein Dataset verschiedene Zustände haben kann und nicht alles geht in jedem Zustand. Die meisten Komponenten benötigen eine Abfrage (Query) und eine entsprechende DataSource Komponente die man am die Komponente anbindet.
Die DBLookupCombobox hat zum Beispiel 2 Datensourcen. Die eine, die Listsource füllt die ComboBox mit den Werten (werden über das ListField definiert), die man später auswählen kann. In das Dataset, das über die DataSource angebunden ist (+ DataField) wird definiert wo die Daten herkommen für die ANzeige (Status des Dataset = dsBrowse) oder wo die ausgewählten Daten hingeschrieben werden (Sataus des Dateset = dsEdit, dsInsert).
Den Status des Datasets kann man mit dem DBNavigator für Testzwecke mal ändern. Einfach 1 Connection, 1 SQLTransaction, 2 Queries, 2 Datasets, 1 DBGrid, 1 DB Navigator und eine DBLookupCombox verbinden und man kann hervorragend testen ob seine Ideen funktionieren. Ausserdem kann man dieses minimal Beispiel gut im Forum als Source posten und dazu die richtigen Fragen stellen.
Wenn keine Daten kommen, dann setze ich in die Routine mal einen Breakpoint und schau, ob die überhaupt angesprungen wird. Und wenn nicht, dann muss ich mir was überlegen dazu.
Grundlegend kann man bei Datenbanken mit den Datenbankkomponenten arbeiten, dann muss man sich auch an die Spielregeln dieser halten, oder man macht es im Code. Dann sollte man sich vorher mal überlegen was man wo benötigt.
Bei den Datenbankkomponenten muss man auch wissen, das ein Dataset verschiedene Zustände haben kann und nicht alles geht in jedem Zustand. Die meisten Komponenten benötigen eine Abfrage (Query) und eine entsprechende DataSource Komponente die man am die Komponente anbindet.
Die DBLookupCombobox hat zum Beispiel 2 Datensourcen. Die eine, die Listsource füllt die ComboBox mit den Werten (werden über das ListField definiert), die man später auswählen kann. In das Dataset, das über die DataSource angebunden ist (+ DataField) wird definiert wo die Daten herkommen für die ANzeige (Status des Dataset = dsBrowse) oder wo die ausgewählten Daten hingeschrieben werden (Sataus des Dateset = dsEdit, dsInsert).
Den Status des Datasets kann man mit dem DBNavigator für Testzwecke mal ändern. Einfach 1 Connection, 1 SQLTransaction, 2 Queries, 2 Datasets, 1 DBGrid, 1 DB Navigator und eine DBLookupCombox verbinden und man kann hervorragend testen ob seine Ideen funktionieren. Ausserdem kann man dieses minimal Beispiel gut im Forum als Source posten und dazu die richtigen Fragen stellen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Auswahl ähnlich Pulldownmenü
af0815 -> tut mir leid, was Du da geschrieben hast ist bestimmt richtig aber ich verstehe nichts davon (vielleicht später).
Aber das ist wohl ein generelles Problem daß die, die es können immer meinen, Andere müßten das auch wissen und holen sie nicht auf deren Wissen ab. Sicher gut gemeint aber für mich in keiner Weise nachvollziehbar.....
Aber das ist wohl ein generelles Problem daß die, die es können immer meinen, Andere müßten das auch wissen und holen sie nicht auf deren Wissen ab. Sicher gut gemeint aber für mich in keiner Weise nachvollziehbar.....
- Swirl
- Beiträge: 99
- Registriert: Fr 7. Aug 2015, 14:05
- OS, Lazarus, FPC: Win 11 / Mint 22.1 / Lazarus 36 / FPC 3.2.2
- CPU-Target: x86_64, ARM Cort.-A7
- Wohnort: Schwerte NRW
Re: Auswahl ähnlich Pulldownmenü
Hallo Joachim,
hänge mal deinen gesamten Projektordner hier als ZIP 'rein. Die Ordner "Lib" und "Backup" im Projektordner kannst du vorher löschen.
Ich denke, über das Wochenende werden wir dann ein gutes Stück weiter kommen.
Gruß,
Michael
hänge mal deinen gesamten Projektordner hier als ZIP 'rein. Die Ordner "Lib" und "Backup" im Projektordner kannst du vorher löschen.
Ich denke, über das Wochenende werden wir dann ein gutes Stück weiter kommen.
Gruß,
Michael
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2
- af0815
- Lazarusforum e. V.
- Beiträge: 6763
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Auswahl ähnlich Pulldownmenü
Was kapierst du von meinen ersten beiden Absätzen nicht ?
Und im letzten Absatz habe ich die Komponenten einer Testapp umrissen, mit der man deine Problemstellung testen und IMHO auch lauffähig machen kann.
Du wirst langfristig zu keiner Lösung kommen, wenn du dein Problem nicht vereinfacht darstellen kannst. Wennst du dir die Arbeit nicht maxhst, wir dir langfristig keiner wirklich helfen können. Wobei es immer Hilfe zur Selbsthilfe ist.
Und im letzten Absatz habe ich die Komponenten einer Testapp umrissen, mit der man deine Problemstellung testen und IMHO auch lauffähig machen kann.
Du wirst langfristig zu keiner Lösung kommen, wenn du dein Problem nicht vereinfacht darstellen kannst. Wennst du dir die Arbeit nicht maxhst, wir dir langfristig keiner wirklich helfen können. Wobei es immer Hilfe zur Selbsthilfe ist.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 12
- Registriert: So 10. Feb 2013, 13:01
- OS, Lazarus, FPC: Windows 10 20H2 (L 2.2.2 FPC 3.2.2)
- CPU-Target: 64Bit
- Wohnort: Ottendorf-Okrilla
Re: Auswahl ähnlich Pulldownmenü
Das Query muss doch noch geöffnet werden damit es Daten liefert.Joachim Raap hat geschrieben: Do 7. Mai 2020, 12:37 habe es mal ausprobiert und auf meine Programmierung angepaßt:Allerdings bleibt die ComboBox leer. Kannst Du einen Fehler erkennen?Code: Alles auswählen
procedure TFMArtStamm.ComboBox1Click(Sender: TObject); begin FMLogIn.ConnectDB; FMLogIn.SQLQuery1.SQL.Text:='select * from art_grp where Grp_Loesch=0 order by Grp_Nr;'; while not FMLogIn.SQLQuery1.EOF do begin ComboBox1.Items.Add(FMLogIn.SQLQuery1.FieldByName('Grp_Nr').AsString); // wie kann man in die gleiche Zeile noch einen Text einfügen?? FMLogIn.SQLQuery1.Next end; FMLogIn.CloseDB; end;
Und noch was: Gibt es irgendwo eine Erläuterung, was man mit den einzelnen "Boxen" aus Standard, Additional etc machen kann und was die Eigenschaften bedeuten/bewirken (in Deutsch)? Kann auch gern ein Buch sein...
Also vor dem while ein
Code: Alles auswählen
FMLogIn.SQLQuery1.Open