Auswahl ähnlich Pulldownmenü

Rund um die LCL und andere Komponenten
Antworten
Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Auswahl ähnlich Pulldownmenü

Beitrag von Joachim Raap »

[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!
Zuletzt geändert von Joachim Raap am Do 7. Mai 2020, 21:33, insgesamt 1-mal geändert.

Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: Auswahl ähnlich Pulldownmenü

Beitrag von Swirl »

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.

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

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Auswahl ähnlich Pulldownmenü

Beitrag von Joachim Raap »

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???

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Auswahl ähnlich Pulldownmenü

Beitrag von Joachim Raap »

Nachtrag:
Löschen oder ändern soll hier überhaupt nicht möglich sein - es darf nur ausgewählt werden

Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: Auswahl ähnlich Pulldownmenü

Beitrag von Swirl »

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...

Code: Alles auswählen

while not Query.Eof do
     begin
     Writeln('ID: ', Query.FieldByName('Name').AsInteger, 'Name: ' +
                                   Query.FieldByName('Name').AsString);
     Query.Next;
     end;
Statt Writeln (usw) würde bei dir stehen...

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;
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.
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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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ü

Beitrag von af0815 »

LookUpCombobox ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: Auswahl ähnlich Pulldownmenü

Beitrag von Swirl »

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

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Auswahl ähnlich Pulldownmenü

Beitrag von Joachim Raap »

[qStatt Writeln (usw) würde bei dir stehen...

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;
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!

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Auswahl ähnlich Pulldownmenü

Beitrag von Joachim Raap »

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...

Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: Auswahl ähnlich Pulldownmenü

Beitrag von Swirl »

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...

Code: Alles auswählen

while not FMLogIn.SQLQuery1.EOF do
...immer noch ein "First"

Code: Alles auswählen

FMLogIn.SQLQuery1.First
while not FMLogIn.SQLQuery1.EOF do
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.
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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ü

Beitrag von af0815 »

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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Auswahl ähnlich Pulldownmenü

Beitrag von Joachim Raap »

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.....

Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: Auswahl ähnlich Pulldownmenü

Beitrag von Swirl »

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
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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ü

Beitrag von af0815 »

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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

TheRealHades
Beiträge: 11
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ü

Beitrag von TheRealHades »

Joachim Raap hat geschrieben:
Do 7. Mai 2020, 12:37
habe es mal ausprobiert und auf meine Programmierung angepaßt:

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;  
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...
Das Query muss doch noch geöffnet werden damit es Daten liefert.
Also vor dem while ein

Code: Alles auswählen

 FMLogIn.SQLQuery1.Open
setzen

Antworten