Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Durch ListBox1-Auswahl ListBox2-Auswahlmöglichkeiten festlegen (https://www.delphipraxis.net/185336-durch-listbox1-auswahl-listbox2-auswahlmoeglichkeiten-festlegen.html)

qiLy4n 1. Jun 2015 16:14

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

Mikkey 1. Jun 2015 16:21

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.

qiLy4n 1. Jun 2015 16:29

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

Mikkey 1. Jun 2015 16:36

AW: Durch ListBox1-Auswahl ListBox2-Auswahlmöglichkeiten festlegen
 
Zitat:

Zitat von qiLy4n (Beitrag 1303816)
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).

Einem ListBoxItem läst sich ein Pointer zuweisen, den man selbstverständlich auch auf eine Funktion zeigen lassen kann.

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.

p80286 1. Jun 2015 17:20

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

Mit Hilfe dieser Daten füllst Du dann deine Listboxen.

Gruß
K-H

Sir Rufo 1. Jun 2015 19:03

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.

qiLy4n 2. Jun 2015 16:33

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:

qiLy4n 2. Jun 2015 16:37

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

Neutral General 2. Jun 2015 16:47

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

qiLy4n 6. Jun 2015 10:36

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:
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;
Eigentlich simple af.

Thread kann geschlossen werden :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 Uhr.
Seite 1 von 2  1 2      

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