![]() |
Delphi- Combobox
Hi Leute,
ich bin neu hier und hab auch gleich mal eine Frage bzgl. Delphi7. Ich möchte für mich ein Programm erstellen, wo ich aus einer Combobox Dinge auswählen, diese Dinge dann für eine ganz bestimmte Zahl stehen, mit der ich dann weiter rechnen kann... Mh... weiß nicht recht, ob ihr das jetzt verstanden habt, was ich möchte... Meine Frage ist einfach, wie sag ich dem Programm, dass es nur mit den Zahlen in der Combobox rechnen soll und ebend nicht mit den Wörtern bzw. Buchstaben die auch noch zwecks Übersichtlichkeit drin stehen?!? Oder muss ich da sogar ein anderes Werkzeug anstatt dieser Combobox nehmen? mfg Hoffe auf Hilfe... [edit=Phoenix]Angabe zur Sprache von .NET auf Win32 geändert. Mfg, Phoenix[/edit] |
Re: Delphi- Combobox
Hallo und Willkommen in der DP :dp:,
geht es hier wirklich um .NET? Falls nicht: Du kannst in den Items der ComboBox auch Objekte hinterlegen. Da diese ja eigentlich nur Zeiger und diese wiederum nur Zahlen sind, kannst Du diese Zahlen (als gefakte Objekte dann) in diesen Items hinterlegen. Oder Du bildest wirklich Objekte, dann ist das einfacher zu verstehen. Ein Beispiel für Letzteres (aus dem Kopf, daher ohne Gewähr):
Delphi-Quellcode:
[edit] Add: Du musst natürlich daran denken, diese Objekte auch später wieder freizugeben. [/edit]
type
TMyClass = class private FBezeichnung: string; FZahl: integer; public property Bezeichnung: string read FBezeichnung write FBezeichnung; property Zahl: integer read FZahl write FZahl; end; ... procedure TMainForm.ButtonAddClick(Sender: TObject); var MyClass: TMyClass; begin MyClass := TMyClass.Create; MyClass.Bezeichnung := 'Wuppdi'; MyClass.Zahl := 42; DieComboBox.Items.AddObject(MyClass.Bezeichnung, MyClass); end; |
Re: Delphi- Combobox
Zitat:
Delphi 7 ist ganz althergebrachte Win/32 Entwicklung. Ich ändere das mal, aber achte in Zukunft bitte darauf, wie Du Deine Threads markierst. Zudem gehört eine Frage zu einer Komponente der VCL (in dem Fall zur Combobox) auch in die VCL-Sparte. Auch hier bitte in Zukunft auf die richtige Zuordnung achten. |
DP-Maintenance
Dieses Thema wurde von "Phoenix" von "Sonstige Fragen zu Delphi" nach "VCL / WinForms / Controls" verschoben.
Falsche Sparte |
Re: Delphi- Combobox
Zitat:
Ich musste eine Sprache angeben... kp was das für eine Sprache ist... Wird einfach nur mit dem Programm Delphi7 geschrieben. Wie hinterlege ich Objekte in den Items? Ich möcht es nochmal etwas anders ausdrücken: Die Combobox soll in etwa so funktionieren: Ich wähle aus verschiedenen Sachen eines aus, z.b. Grünschnitt-Abfall der was weiß ich 3euro kostet... Nun steht in der Combobox Grünschnitt und dahinter 3euro. Mit den 3euro soll gerechnet werden... Bei mir kommt immer die Fehlermeldung: Im Projekt ... ist eine Exception der Klasse EConvertError aufgetreten. Meldung:"Bauschutt- Boden- Gemsich 9,50" ist keine gültige Gleitkommazahl. Prozess wurde angehalten. :( |
Re: Delphi- Combobox
Delphi-Quellcode:
with ComboBox1 do
begin AddItem('Grünabschnitt (3 Euro)', Ptr(3)); {...} end; Zugriff zum Beispiel so:
Delphi-Quellcode:
Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
|
Re: Delphi- Combobox
Wenn es sich um Gleitkommazahlen handelt, musst Du den von mir beschriebenen Weg gehen (Klasse deklarieren, instanzieren und über AddObject der ComboBox hinzufügen).
|
Re: Delphi- Combobox
Ich hab da ne Idee:
Delphi-Quellcode:
Als kleiner Denkanstoß :stupid:
type
TItem = class private FBezeichnung: string; FPreis: Single; public function ToString(): string; constructor Create(aBezeichnung: String; aPreis: Single) property Bezeichnung: string read FBezeichnung write FBezeichnung; property Preis: Single read FPreis write FPreis; end; var items: Array of TItem; // evtl. ins Form // Im OnCreate oder so folgendes: setlength(items, 2); items[0] := TItem.Create('Grünschnitt', 3); items[1] := TItem.Create('Keks', 0.50); for i := 0 to High(items) do ComboBox1.Items.Add(items[i].ToString()) //--------------------- // Zugreifen kannste dann ungefähr so: if ComboBox.ItemIndex > -1 then showmessage(inttostr(items[ComboBox1.ItemIndex].Preis)); Damit sind dann auch Daten und Anzeige getrennt ;) |
Re: Delphi- Combobox
Und welchen Mehrwert gegenüber AddObject() soll das bringen?
|
Re: Delphi- Combobox
Hmmm ...
Wenn man z.B. statt ner Combobox ne Listview verwenden möchte, weil man festgestellt hat, dass die Leute lieber alle Möglichkeiten sehen wollen oder weil man die Preise untereinander stehen haben will - dann braucht man so nur die eine Stelle ändern, in der das Array in die Combobox eingefügt wird. Aber ja, die Lösungen sind quasi equivalent :stupid: |
Re: Delphi- Combobox
Ich hab jetzt bissel was versucht, doch die Fehlermeldung erscheint immer noch. Ich muss euch auch dazu sagen, dass ich ein totaler Delphi Noob bin... Könnt ihr mir die Schritte im Einzelnen erklären? Denn so komm ich nicht wirklich weiter...
|
Re: Delphi- Combobox
Zeig doch mal, was Du versucht hast.
|
Re: Delphi- Combobox
Das war mein anfänglicher Quellcode:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) GroupBox1: TGroupBox; ComboBox1: TComboBox; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Label4: TLabel; Label5: TLabel; procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button3Click(Sender: TObject); begin close; end; procedure TForm1.Button2Click(Sender: TObject); var a,b,c:integer; begin a:=strtoint(combobox1.Text); b:=strtoint(edit1.Text); c:=a*b; edit2.Text:=inttostr(c) end; end. Nun siehts so aus, weil ich schon wieder viel gelöscht habe, weil es einfach nicht funzte:
Delphi-Quellcode:
Du hast eine Procedure vorhins geschrieben, wo soll ich die hinmachen? Einfach nur reinschreiben? Das hat ich vorhins auch und es hat dennnoch nicht geklappt...
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) TMyClass = class GroupBox1: TGroupBox; ComboBox1: TComboBox; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Label4: TLabel; Label5: TLabel; procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private FBezeichnung: string; FZahl: integer; { Private-Deklarationen } public property Bezeichnung: string read FBezeichnung write FBezeichnung; property Zahl: integer read FZahl write FZahl; { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button3Click(Sender: TObject); begin close; end; procedure TForm1.Button2Click(Sender: TObject); var a,b,c:integer; begin a:=strtoint(combobox1.Text); b:=strtoint(edit1.Text); c:=a*b; edit2.Text:=inttostr(c) end; end. |
Re: Delphi- Combobox
Da hast Du aber Einiges durcheinandergeworfen. Zunächst einmal ist die Klasse kein "Teil" des Formulars, sondern eine eigenständige Klasse.
Delphi-Quellcode:
Dann musst Du irgendwann (z.B. bei Klick eines Buttons) diese Klasse instanzieren (d.h. ein Objekt dieser Klasse anlegen) und den Items der ComboBox hinzufügen. Damit ist diese Instanz dann in den Comboboxitems hinterlegt. Beispiel:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMyClass = class private FBezeichnung: string; FZahl: integer; { Private-Deklarationen } public property Bezeichnung: string read FBezeichnung write FBezeichnung; property Zahl: integer read FZahl write FZahl; { Public-Deklarationen } end; TForm1 = class(TForm) GroupBox1: TGroupBox; ComboBox1: TComboBox; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Label4: TLabel; Label5: TLabel; procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); end;
Delphi-Quellcode:
Spätestens beim Zerstören des Formulars musst Du diese Instanzen dann auch wieder freigeben, sonst produzierst Du ein Speicherleck.
procedure TForm1.ButtonHinzufuegenClick(Sender: TObject);
//Variable des Typs der oben deklarierten Klasse var MyClass: TMyClass; begin //Anlegen der Instanz MyClass := TMyClass.Create; //Ändern der Eigenschaften dieser Instanz MyClass.Bezeichnung := Edit1.Text; MyClass.Zahl := StrToIntDef(Edit2.Text,0); //Speichern der Instanz in den Items ComboBox1.Items.AddObject(MyClass.Bezeichnung {das kann auch ein beliebiger anderer String sein},MyClass); end;
Delphi-Quellcode:
Auf ein bestimmtes Objekt kannst Du über den ItemIndex der ComboBox zugreifen.
procedure TForm1.FormDestroy(Sender: TObject);
var i: integer; begin //von hinten nach vorn durchgehen und Objekte freigeben for i := ComboBox1.Items.Count - 1 downto 0 do ComboBox1.Items.Objects[i].Free; end;
Delphi-Quellcode:
Ich hoffe, das hilft Dir weiter.
procedure TForm1.ComboBox1Change(Sender: TObject);
var aObject: TObject; begin //Objekt holen aObject := ComboBox1.Items.Objects[ComboBox1.ItemIndex]; //ist das Objekt überhaupt zugewiesen? if Assigned(aObject) then //wenn ja, in TMyClass wandeln und das "Zahl"-Feld ausgeben ShowMessage(IntToStr((aObject as TMyClass).Zahl)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 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