Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ComboBox per Hand füllen (https://www.delphipraxis.net/115030-combobox-per-hand-fuellen.html)

lore 4. Jun 2008 16:30


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]

DeddyH 4. Jun 2008 16:35

Re: Combox per Hand füllen
 
Ich habe hier eine ComboBox mit Style csDropDown. In deren OnKeyDown habe ich Folgendes:
Delphi-Quellcode:
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;
Meintest Du so etwas?

bluesbear 4. Jun 2008 17:08

Re: Combox per Hand füllen
 
Zitat:

Zitat von lore
PS: habt's ihr 'ne Buchempfehlung dazu?

Nein, aber wir haben DeddyH :duck:
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?

DeddyH 4. Jun 2008 17:10

Re: Combox per Hand füllen
 
Durch den Style csDropDown bleibt der String einfach stehen :zwinker:

Fussball-Robby 4. Jun 2008 17:14

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;

FAlter 4. Jun 2008 17:39

Re: Combox per Hand füllen
 
Hi,

ich kürz ihn mal wieder...

Delphi-Quellcode:
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;
Mfg
FAlter

taaktaak 4. Jun 2008 17:42

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

bluesbear 4. Jun 2008 17:55

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>

taaktaak 4. Jun 2008 18:07

Re: Combox per Hand füllen
 
Damit wollte ich vorsichtig andeuten, dass ich dafür ziemlich lange 'rumgefummelt habe bis es funktionierte.

lore 4. Jun 2008 19:26

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

DeddyH 5. Jun 2008 07:20

Re: ComboBox per Hand füllen
 
Die "Ini-Schleife" könnte z.B. so aussehen:
Delphi-Quellcode:
for i := 0 to ComboBox.Items.Count - 1 do
  Ini.WriteString('Items',IntToStr(i),ComboBox.Items[i]);
Die Ini hätte dann beispielsweise folgendes Aussehen:
Code:
[Items]
0=UT
1=MESZ
2=MEZ

lore 5. Jun 2008 19:44

Re: ComboBox per Hand füllen
 
Hi DeddyH,
soweit klappts jetzt.
Delphi-Quellcode:
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;
Das Auslesen der INI muss ins formCreate oder?

Würde das dann so aussehen?

Delphi-Quellcode:
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;
Für heute mach ich erstmal Schluss und werde morgen dann das einlesen mal üben ;-)


Danke,
Karsten__________________________________________________ _______________________
www.deepSkyObserver.de

DeddyH 5. Jun 2008 20:08

Re: ComboBox per Hand füllen
 
Jo, das macht Sinn.

lore 6. Jun 2008 10:13

Re: ComboBox per Hand füllen
 
Hi DeddyH,
ich dachte auch das das Sinn hat, funzt aber leider nicht.
Delphi-Quellcode:
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;
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:

Gruß,
Karsten

tomsel 6. Jun 2008 10:20

Re: ComboBox per Hand füllen
 
Das liegt an:

Delphi-Quellcode:
for I := 0 to cbox1.Items.Count - 1 do
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.

DeddyH 6. Jun 2008 10:24

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;

messie 6. Jun 2008 10:25

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

lore 6. Jun 2008 10:38

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.

DeddyH 6. Jun 2008 10:43

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.

taaktaak 6. Jun 2008 11:18

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.

lore 6. Jun 2008 11:24

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:
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;
Ich muss aber leider gleich los und kann dann wohl erst später weitermachen :cry:

Bis später,
Karsten

taaktaak 6. Jun 2008 11:29

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

lore 6. Jun 2008 12:00

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?

DeddyH 6. Jun 2008 12:05

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.

lore 6. Jun 2008 12:23

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.

DeddyH 6. Jun 2008 12:31

Re: ComboBox per Hand füllen
 
Versteh ich jetzt nicht. Versuch doch mal, ob die Schleife zum Speichern im OnClose funktioniert (sollte sie eigentlich).

NickelM 6. Jun 2008 12:37

Re: ComboBox per Hand füllen
 
So hab ichs in ne anwendung von mir gemacht. Ich vieleicht Verbesserungs- und Vereinfaschungsfähig.
Delphi-Quellcode:
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.
oder wenn du die Anwendung beendest werden alle Forms destroyed.

Deshalb OnDestroy :mrgreen:

lore 6. Jun 2008 13:01

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:
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;
Frage noch: warum kommt das "ini:=TIniFile.create(~" vor das "try"? Ich hatte es bisher immer mit ins try reingenommen.

NickelM 6. Jun 2008 13:10

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:

DeddyH 6. Jun 2008 13:15

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.

lore 6. Jun 2008 13:21

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

Dark Angel 30. Jun 2008 21:56

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?

DeddyH 1. Jul 2008 07:13

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?

Dark Angel 1. Jul 2008 20:36

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.

Dark Angel 1. Jul 2008 22:20

Re: ComboBox per Hand füllen
 
Also, wie lese ich aus der ini datei die Items wieder aus und schrebi Sie in die combobox?

mkinzler 1. Jul 2008 22:24

Re: ComboBox per Hand füllen
 
Besser Textdatei verwenden. Dann kannst du direkt mit .SaveToFile()/.LoadFromFile() arbeiten

Dark Angel 1. Jul 2008 22:43

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