![]() |
Durch ListBox1-Auswahl ListBox2-Auswahlmöglichkeiten festlegen
Servus, um schnell zum Punkt zu kommen ->
Problem: > Ich will einen sehr optionsreichen Einheiten-Umrechner erstellen. > Da viele Einheiten zur Auswahl stehen, möchte ich den Benutzer in einer ListBox das Land, zu dem die entsprechende Einheit gehört, auswählen lassen und dadurch definieren, welche Einheiten in der zweiten ListBox aufgeführt sind (Bsp.: Deutschland > Bayerische Elle, Bamberger Elle,...); andersherum auch für die Zielmaße. > Bisherige Ideen waren leider vergeblich. Momentan bringe ich alle Einheiten in eine Liste und würde später mit if ListBox1.Itemindex:=3 then Listbox2.Itemindex[x].Enabled/Disabled und/oder Visible:=true/false versuchen, die Einheiten-Liste durch die Länder-Liste angenehm anpassen zu lassen (ich bin mir absolut nicht sicher, ob das überhaupt zulässige Befehle sind). Zum einen ist das sehr viel Aufwand und zum anderen wird es, wie vorherige Versuche, wahrscheinlich auch nicht funktionieren. > Mein Lehrer weiß leider auch nicht weiter und irgendwo muss man ein ja eigentlich so simples Programm ja auch selbst (oder zumindest nur mit Hilfe des Forums) programmieren können. Danke bereits für Ideen |
AW: Durch ListBox1-Auswahl ListBox2-Auswahlmöglichkeiten festlegen
So etwas gibt es zuhauf, sogar mit mehr als zwei Kaskaden
Beispiel: Auswahl Bundesland -> Auswahl Stadt -> Auswahl Straße Du brauchst Nur mit dem Belegen der Optionen der zweiten Auswahlliste warten, bis ein Eintrag der ersten Lite gewählt wurde. Dann gehst Du Deine Daten durch und füllst die zweite Listbox. Wird die Auswahl der ersten Box geändert, wird zuerst die zweite geleert und anschließend mit den relevanten Einträgen gefüllt. Du brauchst Dir nur etwas Geeignetes für die Organisation der zugrundeliegenden Daten ausdenken. |
AW: Durch ListBox1-Auswahl ListBox2-Auswahlmöglichkeiten festlegen
Danke für die schnelle Antwort.
Ja, das hatte ich auch schon ausprobiert, doch kenne weder ich (nach langem Googlen) noch mein Lehrer den Befehl, einer ListBoxItemIndex-Position etwas zuzuweisen (in diesem Fall eine Rechnung). |
AW: Durch ListBox1-Auswahl ListBox2-Auswahlmöglichkeiten festlegen
Zitat:
Das ist aber kein guter Stil! Besser ist es die Rechnung in dem geeignet organisierten Datenbereich unterzubringen. Der Listbox-Eintrag enthält lediglich einen Wert, über den Du Dein geeignetes Datenobjekt wiederfindest. |
AW: Durch ListBox1-Auswahl ListBox2-Auswahlmöglichkeiten festlegen
Was Mikkey sehr diplomatisch angedeutet hat, in die Listbox gehören keine Daten!
Sondern nur ihre Repräsentation! Das zumindestens sollte auch deinem Lehrer klar sein! Was eine Möglichkeit wäre:
Code:
Mit solchen Records könntest du ein Array oder eine Liste füllen. Ggf. erweiterst Du den Record noch um einen eindeutigen Identifier falls einzelne Records verwechselt werden könnten.
Type
tEinheitstyp=(Laenge,Flaeche,Volumen,Geschwindigkeit) tMyrec : record Land : String[20]; Typ : tEinheitstyp EinheitsName:String[20]; Formel: ... hier könnte zb. der Name einer Formel für die Berechnung aus/in eine Zwischengröße stehen z.B. Miles/h -> m/s end; Mit Hilfe dieser Daten füllst Du dann deine Listboxen. Gruß K-H |
AW: Durch ListBox1-Auswahl ListBox2-Auswahlmöglichkeiten festlegen
Liste der Anhänge anzeigen (Anzahl: 1)
Mal auf die Schnelle dahingetippt um das Prinzip zu zeigen
(Source und EXE im Anhang)
Delphi-Quellcode:
unit Form.Main;
interface uses System.Generics.Collections, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TCountry = class private FCountryCode: Integer; FName: string; public constructor Create( const ACountryCode: Integer; const AName: string ); property CountryCode: Integer read FCountryCode; property name: string read FName; end; TConverter = class private FCountryCode: Integer; FName: string; public constructor Create( const ACountryCode: Integer; const AName: string ); property CountryCode: Integer read FCountryCode; property name: string read FName; end; TForm1 = class( TForm ) ConverterListBox: TListBox; CountryComboBox: TComboBox; procedure CountryComboBoxChange( Sender: TObject ); procedure ConverterListBoxClick( Sender: TObject ); private FCountries: TList<TCountry>; FSelectedCountry: TCountry; FConverters: TList<TConverter>; FSelectedConverters: TList<TConverter>; FSelectedConverter: TConverter; procedure PopulateCountries; procedure PopulateSelectedConverters; public procedure AfterConstruction; override; procedure BeforeDestruction; override; end; var Form1: TForm1; implementation {$R *.dfm} uses EnumQuery; { TForm1 } procedure TForm1.AfterConstruction; begin inherited; FCountries := TObjectList<TCountry>.Create( ); FCountries.Add( TCountry.Create( 1, 'Deutschland' ) ); FCountries.Add( TCountry.Create( 2, 'USA' ) ); FConverters := TObjectList<TConverter>.Create( ); FConverters.Add( TConverter.Create( 1, 'Meter' ) ); FConverters.Add( TConverter.Create( 1, 'Kilometer' ) ); FConverters.Add( TConverter.Create( 2, 'Meilen' ) ); FConverters.Add( TConverter.Create( 2, 'Inch' ) ); FSelectedConverters := TList<TConverter>.Create( ); PopulateCountries; PopulateSelectedConverters; end; procedure TForm1.BeforeDestruction; begin inherited; FreeAndNil( FSelectedConverters ); FreeAndNil( FConverters ); FreeAndNil( FCountries ); end; procedure TForm1.ConverterListBoxClick( Sender: TObject ); begin if ConverterListBox.ItemIndex < 0 then FSelectedConverter := nil else FSelectedConverter := FSelectedConverters[ ConverterListBox.ItemIndex ]; end; procedure TForm1.CountryComboBoxChange( Sender: TObject ); var Item: TConverter; begin if CountryComboBox.ItemIndex < 0 then FSelectedCountry := nil else FSelectedCountry := FCountries[ CountryComboBox.ItemIndex ]; FSelectedConverter := nil; FSelectedConverters.Clear; FSelectedConverters.AddRange( TEnumQuery.SelectFrom<TConverter>( FConverters, function( AConverter: TConverter ): Boolean begin Result := Assigned( FSelectedCountry ) and ( AConverter.CountryCode = FSelectedCountry.CountryCode ); end ) ); PopulateSelectedConverters; end; procedure TForm1.PopulateCountries; var Item: TCountry; begin CountryComboBox.Items.BeginUpdate; try CountryComboBox.Items.Clear; for Item in FCountries do begin CountryComboBox.Items.Add( Item.name ); end; CountryComboBox.ItemIndex := FCountries.IndexOf( FSelectedCountry ); finally CountryComboBox.Items.EndUpdate; end; end; procedure TForm1.PopulateSelectedConverters; var Item: TConverter; begin ConverterListBox.Items.BeginUpdate; try ConverterListBox.Items.Clear; for Item in FSelectedConverters do begin ConverterListBox.Items.Add( Item.name ); end; ConverterListBox.ItemIndex := FSelectedConverters.IndexOf( FSelectedConverter ); finally ConverterListBox.Items.EndUpdate; end; end; { TCountry } constructor TCountry.Create( const ACountryCode: Integer; const AName: string ); begin inherited Create; FCountryCode := ACountryCode; FName := AName; end; { TConverter } constructor TConverter.Create( const ACountryCode: Integer; const AName: string ); begin inherited Create; FCountryCode := ACountryCode; FName := AName; end; end. |
AW: Durch ListBox1-Auswahl ListBox2-Auswahlmöglichkeiten festlegen
Danke für die Hilfe.
Sorry, ich kenne absolut keinen der Befehle, hab aber das Grundprinzip verstanden und erkannt. Ich werd in der Schule gucken, ob meine Methode irgendwie funktioniert. Ansonsten muss ich wohl diesen Code kopieren. Wenn ich ihn bis dahin völlig durchschaut habe, brauch ich vllt doch kein so schlechtes Gewissen zu haben :drunken: |
AW: Durch ListBox1-Auswahl ListBox2-Auswahlmöglichkeiten festlegen
Übrigens: Nein, leider ist meinem Lehrer so etwas nicht klar. Sonst hätte er uns sicherlich auch etwas mehr beibringen bzw erklären können oder gleich auf unsere Idee entsprechend reagiert...
|
AW: Durch ListBox1-Auswahl ListBox2-Auswahlmöglichkeiten festlegen
Ich glaube sowieso mittlerweile dass jeder der mal einen 3-tägigen Anfängerkurs im Programmieren in der VHS absolviert hat Informatiklehrer werden kann.
90% aller Informatiklehrer die ich hatte (sowohl in der Oberstufe als auch in meiner Ausbildung) oder von denen ich gehört habe scheinen tatsächlich nicht mehr zu können bzw. haben oft sogar weniger Ahnung von was sie reden als ihre Schüler :roll: Ich kann nur hoffen dass sich das irgendwann mit den zukünftigen Generationen ändern wird und vor allem, dass die Lehrer anderer Fachbereiche kompetenter sind :roll: (was nicht so einfach zu beurteilen ist wenn man von dem Fachbereich nicht schon vorher Ahnung hatte...) |
AW: Durch ListBox1-Auswahl ListBox2-Auswahlmöglichkeiten festlegen
Hi und danke nochmal für die Antworten.
Habe es letztendlich doch durch weiteres Suchen herausgefunden, wie ich das Problem mit meinem 'Können' beheben kann.
Code:
Eigentlich simple af.
case ComboBox1.ItemIndex of
0: begin ComboBox3.Items.Clear; ComboBox3.Items.Add('m'); ComboBox3.Items.Add('km'); end; 1: begin ComboBox3.Items.Clear; ComboBox3.Items.Add('x'); ComboBox3.Items.Add('y'); end; Thread kann geschlossen werden :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 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