ComboBox per Hand füllen
Frage zur ComboBox:
ich will drei Sachen zur Auswahl haben (soweit nicht schwer) und der User darf aber noch weiter Sachen dazu schreiben die dann automatisch mit aufgenommen werden. Geht das mit der Combobox oder muss ich da auch noch ein Edit-Feld verwenden? Wenn ich versuche über den Items den neuen Text wieder mit ins DropDownMenü zu schreiben, funzt es nicht. Mir ist leider auch die Logik noch nicht so ganz klar, ob ich erst alles durchzählen muss dann einen dazuschreiben (CBox1.Items.count +1)...und ist das dann auch der selektierte....oder..??? Nachdem ich schon das halbe internet durchgelesen habe, stelle ich die Frage dann doch mal hier :oops: Danke für die Antworten schonmal vorab, Karsten PS: habt's ihr 'ne Buchempfehlung dazu? [edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit] |
Re: Combox per Hand füllen
Ich habe hier eine ComboBox mit Style csDropDown. In deren OnKeyDown habe ich Folgendes:
Delphi-Quellcode:
Meintest Du so etwas?
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin if Key = VK_RETURN then begin if ComboBox1.Items.IndexOf(ComboBox1.Text) < 0 then ComboBox1.Items.Add(ComboBox1.Text); end; end; |
Re: Combox per Hand füllen
Zitat:
Scherz beiseite: Darauf war ich noch gar nicht gekommen. In solchen Situationen mache ich immer einen Knopf neben die Combo, der einen kleinen Listeneditor aufruft. Schließlich muß der Anwender Einträge ja auch wieder löschen können, z.B. wegen Tippfehlern oder so. Mit dem DeddyH seiner Idee würde ein Löschknopf reichen :gruebel: @DeddyH: Muss man danach noch ItemIndex setzen, oder selektiert sich der Eintrag dadurch quasi selber? |
Re: Combox per Hand füllen
Durch den Style csDropDown bleibt der String einfach stehen :zwinker:
|
Re: Combox per Hand füllen
Wenn man dann aber per Items[ItemIndex] darauf zugreifen will, ist kein Item ausgewählt, jedoch kann man den Code ohne weiteres noch durch eine Zeile erweitern:
Delphi-Quellcode:
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin with TComboBox(Sender) do if Key = VK_RETURN then begin if Items.IndexOf(Text) < 0 then Items.Add(Text); ItemIndex := Items.IndexOf(Text); end; end; |
Re: Combox per Hand füllen
Hi,
ich kürz ihn mal wieder...
Delphi-Quellcode:
Mfg
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin with TComboBox(Sender) do if Key = VK_RETURN then if Items.IndexOf(Text) < 0 then ItemIndex := Items.Add(Text); end; FAlter |
Re: Combox per Hand füllen
Übrigens, auch ein "Löschknopf" ist entbehrlich: Mit etwas Geschick benutzt man dazu einfach die Taste "Entf" auf der Tastatur - und schon ist der Eintrag aus der Liste weggezaubert. So funktioniert das z.B. auch in Outlook...
|
Re: Combox per Hand füllen
Die Entf-Taste benutzt man normalerweise zum editieren des Strings selber. Ich finde das nicht besonders intuitiv, die zum löschen von Listeneinträgen herzunehmen.
Oder was meinst du mit "etwas Geschick"? PS: Outlook macht manchmal komische Sachen, deshalb nehme ich Thunderbird <g> |
Re: Combox per Hand füllen
Damit wollte ich vorsichtig andeuten, dass ich dafür ziemlich lange 'rumgefummelt habe bis es funktionierte.
|
Re: ComboBox per Hand füllen
Hi deddyH, und auch alle anderen.
Jo, genau das meinte ich, nur dass beim nächsten Start der Applikation der neue Eintrag wieder zur Verfügung stehen muss. Habe ich bspw. eine neuen Eintrag erstellt wie myTimeZone oder UT + 5, so muss ich das nachher wieder benutzen können. Wie also speichern? In der Ini wäre gut, da es aber dann immer mehr werden müsste der String in der INI iteriert werden, oder? Frage: Wie macht man eine Schleife, die dann über ini.IniWritestring('Standort','Timezone[i]','??'); erstellt? Der eingetragen Wert "myTimeZone", "UT" oder was auch immer ins combobox1.text eingegeben wurde, muss dann in der INI stehen...und beim löschen auch wieder gelöscht werden. :gruebel: http://www.deepskyobserver.de/downloads/comboBox.jpg ------------------------------------------------------------------------------------ btw. falls jemand mal über ein Maskedit Koordinaten einbauen will, hier die Lösung: eigenschaft editMask: !99\°\ 99\'\ 99\";1;_ oder aber den Eintrag unter: C:\Program Files\CodeGear\RAD Studio\5.0\bin\germany.DEM editieren und "Koordinaten | 53° 44' 09" | !99\°\ 99\'\ 99\";1;_" reinkopieren ;-) |
Re: ComboBox per Hand füllen
Die "Ini-Schleife" könnte z.B. so aussehen:
Delphi-Quellcode:
Die Ini hätte dann beispielsweise folgendes Aussehen:
for i := 0 to ComboBox.Items.Count - 1 do
Ini.WriteString('Items',IntToStr(i),ComboBox.Items[i]);
Code:
[Items]
0=UT 1=MESZ 2=MEZ |
Re: ComboBox per Hand füllen
Hi DeddyH,
soweit klappts jetzt.
Delphi-Quellcode:
Das Auslesen der INI muss ins formCreate oder?
procedure TfrmMain.cbox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var ini : TiniFile; i: Integer; begin with TComboBox(Sender) do if Key = VK_RETURN then if Items.IndexOf(Text) < 0 then begin ItemIndex := Items.Add(Text); try {das ist die Schleife zum Erzeugen des Eintrags in der INI } ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'config.ini'); for I := 0 to cbox1.Items.Count - 1 do ini.WriteString('TimeZone',intToStr(i),cbox1.Items[i]); finally ini.Free; end; end; end; Würde das dann so aussehen?
Delphi-Quellcode:
Für heute mach ich erstmal Schluss und werde morgen dann das einlesen mal üben ;-)
try
ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'config.ini'); for I := 0 to cbox1.Items.Count - 1 do cbox1.Items[i] := ini.readString('TimeZone',intToStr(i),cbox1.Items[i]); // Ist diese Zeile so richtig?? finally ini.Free; end; Danke, Karsten__________________________________________________ _______________________ www.deepSkyObserver.de |
Re: ComboBox per Hand füllen
Jo, das macht Sinn.
|
Re: ComboBox per Hand füllen
Hi DeddyH,
ich dachte auch das das Sinn hat, funzt aber leider nicht.
Delphi-Quellcode:
Ich hab's mit F7 durchgesteppt und festgestellt, dass nur die Werte gelesen werden, die schon vorher beim Objekt unter Items >> Strings im Stringlisteneditor eingetragen waren. In der INI stehen aber 10 Stück, also wird die INI nicht ausgelesen. Ist die Schleife falsch oder wie kann ich das rausfinden? Weiß gerade mal wieder nicht weiter.. :gruebel:
procedure TfrmMain.FormCreate(Sender: TObject);
var ini : TiniFile; I: integer; begin try ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'config.ini'); for I := 0 to cbox1.Items.Count - 1 do begin cbox1.Items[i] := ini.ReadString('TimeZone',intToStr(i),cbox1.Items[i]); //combobox mit den Werten aus der INI befüllen showMessage(intToStr(i)); end; finally ini.Free; end; end; Gruß, Karsten |
Re: ComboBox per Hand füllen
Das liegt an:
Delphi-Quellcode:
du liest hier nur so viele Einträge aus der ini, wie eh schon in der Combobox drin sind. Was du brauchst, ist die Anzahl aller Werte in der INI.
for I := 0 to cbox1.Items.Count - 1 do
|
Re: ComboBox per Hand füllen
Versuch es mal mit
Delphi-Quellcode:
procedure TfrmMain.FormCreate(Sender: TObject);
var ini : TiniFile; begin ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'config.ini'); try Ini.ReadSectionValues('TimeZone',cbox1.Items); finally ini.Free; end; end; |
Re: ComboBox per Hand füllen
Nein der Fehler passiert beim Abspeichern. Es werden nur Werte in die ini geschrieben, die nachträglich eingefügt werden. Um alle so wie geplant einlesen zu können, müssen alle Werte in die ini geschrieben werden.
Grüße, Messie |
Re: ComboBox per Hand füllen
HI deddyH,
jetzt habe ich den lustigen Effekt, dass beim Abspeichern alles doppelt angzeigt wird und einmal mehr in die INI gespeichert wird. Wenn ichs drei mal aufrufe siehts wie folgt aus: [TimeZone] 0=0=0=UT 1=1=1=MESZ 2=2=2=MEZ 3=3=3=myTimeZone1 4=4=4=myTimeZone2 5=5=5=myTimeZone3 6=6=6=myTimeZone4 7=7=7=myTimeZone5 8=8=8=myTimeZone6 9=9=9=myTimeZone7 Hi Messi, ich verstehe nicht so ganz was du meinst, aber habe nach diesem Ergebnis so eine dunkle Ahnung was du jetzt meinen könntest. |
Re: ComboBox per Hand füllen
*Oops*, dann bleibt wohl nur, ReadSectionValues auf eine temporäre Stringliste anzuwenden und dort je Zeile alles bis zum Gleichheitszeichen rauszulöschen. Anschließend den Items zuweisen. Wenn jemand einen besseren Vorschlag hat, immer her damit, mir gefällt das so nämlich auch nicht, hab aber heute irgendwie ein Brett vor dem Kopf.
|
Re: ComboBox per Hand füllen
Moin, Moin,
na, das hieße an den Symptomen herumzudoktern. Wie messie schon bemerkte: Der Fehler entsteht ja beim Speichern. Ist der Code aus #12 noch aktuell? Idee: Vor dem Speichern zunächst die Section komplett löschen. |
Re: ComboBox per Hand füllen
nee, ich bin gerade am Fummel, denn das geht hier ja eigentlich um eine TStrinliste.. habe schon weiter Hilfe eingespannt und poste nachher mal das Ergebnis (oder die erneute Frage :roll: wenn ichs nicht raff).
Das ist der Momentane stand:
Delphi-Quellcode:
Ich muss aber leider gleich los und kann dann wohl erst später weitermachen :cry:
procedure TfrmMain.FormCreate(Sender: TObject);
var ini : TiniFile; I: integer; begin try ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'config.ini'); Ini.ReadSectionValues('TimeZone',cbox1.Items); finally ini.Free; end; end; Bis später, Karsten |
Re: ComboBox per Hand füllen
Ok, aber ich meinte den Code zum Speichern der INI-Werte! Was mir auch sehr ungüstig erscheint: Warum soll die INI im OnKeyDown der Combobox gespeichert werden?? Das ist wohl kaum das richtige Event...
|
Re: ComboBox per Hand füllen
Weil mir das Event vorgeschlagen wurde (und erstmal funktioniert) und "onChange" glaube ich auch nicht das richtige Event ist, oder?
|
Re: ComboBox per Hand füllen
Von wem wurde Dir das vorgeschlagen? Gestern hattest Du noch gefragt, ob FormCreate und FormDestroy die passenden Events seien. Diesen Post hast Du ja mittlerweile editiert.
|
Re: ComboBox per Hand füllen
Hi, unter FormCreate lief es irgendwie nicht, und auf dem Event OnDestroy würde nur der letzte Eintrag weggeschrieben, aber nicht alle. Deswegen entschied ich mich das so zu machen :wink: wollte keinem zu Nahe treten.
|
Re: ComboBox per Hand füllen
Versteh ich jetzt nicht. Versuch doch mal, ob die Schleife zum Speichern im OnClose funktioniert (sollte sie eigentlich).
|
Re: ComboBox per Hand füllen
So hab ichs in ne anwendung von mir gemacht. Ich vieleicht Verbesserungs- und Vereinfaschungsfähig.
Delphi-Quellcode:
oder wenn du die Anwendung beendest werden alle Forms destroyed.
procedure TForm1.Button1Click(Sender: TObject);
var Zeilen : Integer; begin Inifile.WriteInteger('Signatur','SignaturZeilen',Memo1.Lines.Count); for Zeilen := 0 to Memo1.Lines.Count - 1 do Inifile.WriteString('Signatur','Signatur' + IntToStr(Zeilen),Memo1.Lines[Zeilen]); end; procedure TForm1.FormCreate(Sender: TObject); var Zeilen : Integer; Zeilen1 : Integer; begin Zeilen1 := Inifile.ReadInteger('Signatur','SignaturZeilen',0); Memo1.clear; for Zeilen := 0 to Zeilen1 - 1 do Memo1.Lines.Add(Inifile.ReadString('Signatur','Signatur' + IntToStr(Zeilen),'')); end; end. Deshalb OnDestroy :mrgreen: |
Re: ComboBox per Hand füllen
Hi DeedyH
ich hab's gemacht und es funktioniert..brat mir doch einer einen Storch...(ach lieber nicht, der ist gerade bei uns unterwegs :-) ) Komische Seiteneffekte? Habe Delphi2007pro auf Vista Busi. unter VMWare 6.x laufen..
Delphi-Quellcode:
Frage noch: warum kommt das "ini:=TIniFile.create(~" vor das "try"? Ich hatte es bisher immer mit ins try reingenommen.
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
var ini: Tinifile; i : integer; begin ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'config.ini'); try for I := 0 to cbox1.Items.Count - 1 do ini.WriteString('TimeZone',intToStr(i),cbox1.Items[i]); finally ini.Free; end; end; |
Re: ComboBox per Hand füllen
Damit es keine Exceptions wegen Datei nicht gefunden oder so gibt und dan nicht die Variable im speicher bleibt :mrgreen:
|
Re: ComboBox per Hand füllen
Der finally-Block wird auf jeden Fall angesprungen. Nimmst Du nun das Erzeugen der Ini mit in den try-Block und das geht schief, wird anschließend versucht, ein Objekt freizugeben, das gar nicht existiert -> Folgefehler.
|
Re: ComboBox per Hand füllen
okay, das ist logisch :idea:
muss nun leider weg und kann erst morgen weitermachen. Schonmal danke an alle und bis später, Karsten |
Re: ComboBox per Hand füllen
Hallo,
ich hab mir zwar schon alles mehrmals durchgelesen und auch in mein programm kopiert aber es klappt einfach nicht. Ich habe eine Combobox und will die mit weiteren Namen füllen und die dann abspeichern. Mein Problem besteht darin, dass die Namen zwar in meiner *.ini Datei sind aber ich sie beim nächsten starten meines Programms nicht mehr in der Combobox habe, die ist dann leer. Außerdem wäre es nicht schlecht wenn ich die im Programm wieder löschen könnte. Wer kann mir das erklären, dass auch ich es verstehe? |
Re: ComboBox per Hand füllen
Hast Du fixe Werte in Deiner Ini oder weißt Du zur Laufzeit nicht, wie die Idents heißen?
|
Re: ComboBox per Hand füllen
ich will die werte selbst im program eintragen können und die sollen dann gespeichert werden, also ich trag die per hand ein. das eingeben und speichern der "Namen" klappt ja schon, aber ich kann die dann nicht mehr auslesen.
|
Re: ComboBox per Hand füllen
Also, wie lese ich aus der ini datei die Items wieder aus und schrebi Sie in die combobox?
|
Re: ComboBox per Hand füllen
Besser Textdatei verwenden. Dann kannst du direkt mit .SaveToFile()/.LoadFromFile() arbeiten
|
Re: ComboBox per Hand füllen
so jetzt klappts, hab mir jetzt zum nten mal alles sachen im froum über Combobox durchgelesen und jetzt kapier ichs. Juhuuuu :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 Uhr. |
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