AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Editfeld mit Dropdownmenü

Ein Thema von KahPee · begonnen am 24. Dez 2009 · letzter Beitrag vom 24. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von KahPee
KahPee

Registriert seit: 12. Mai 2009
214 Beiträge
 
Turbo Delphi für Win32
 
#1

Editfeld mit Dropdownmenü

  Alt 24. Dez 2009, 09:49
Hallo,

nachdem ich jetzt eine Idee bekommen habe wie ich mit .ini-Dateien umgehe, steht das nächste Problem an. Und zwar habe ich vor, dass bei einem Editfeld ein Dropdown menü erscheint. Dabei sollen in dem Dropdownmenü Vorschläge aus einer Liste der Ini-Datei (einer Section) angeboten werden. Wie beim normalen Autovervollständigen sollen dann auch immer nur die Vorschläge angezeigt werden, die durch die schon eingegebenen Buchstaben nicht ausgeschlossen sind.
Ich habe eine solche Komponente nicht finden können :-/. Bzw. Ich weis nicht wie sie heißt.

Vielen Dank schonmal im vorraus.

Kahpee
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Editfeld mit Dropdownmenü

  Alt 24. Dez 2009, 09:58
Hi,

du suchst bestimmt die Komponente Delphi-Referenz durchsuchenTComboBox, mit gesetzter AutoDropDown-Property.
  Mit Zitat antworten Zitat
Blackheart

Registriert seit: 4. Mai 2005
846 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Editfeld mit Dropdownmenü

  Alt 24. Dez 2009, 10:03
Das es nicht nur bei der Idee bleibt Ini Tutorial
Blackheart
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Editfeld mit Dropdownmenü

  Alt 24. Dez 2009, 10:05
Und dann noch dem OnChange-Event der Combobox das hier zuweisen.
Delphi-Quellcode:
procedure TForm13.ComboBox1Change(Sender: TObject);
var
  selstart, sellength, i: Integer;
  edCombobox : TComboBox;

begin
  edComboBox := Sender as TComboBox;

  selstart := edComboBox.SelStart;
  sellength := edComboBox.SelLength;
  edCombobox.Items.BeginUpdate;
  try
    edCombobox.Items.Clear;
    for i := 0 to Memo1.Lines.Count - 1 do
      if (edComboBox.Text = '') or (Pos(edComboBox.Text, StringList_Vorschlaege[i]) = 1) then
        edComboBox.Items.Add(memo1.Lines[i]);
  finally
    edComboBox.items.endUpdate;
  end;
  edComboBox.SelStart := selstart;
  edComboBox.SelLength := sellength;

end;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von KahPee
KahPee

Registriert seit: 12. Mai 2009
214 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Editfeld mit Dropdownmenü

  Alt 24. Dez 2009, 12:06
Hallo,
vielen Dank schon mal für die Antworten.
Was genau soll Memo1 sein? Ich habe bei mir gar kein Memo! Kann ich die Liste auch irgendwie anders einlesen?

Was genau bedeutet "Pos" an dieser Stelle?:
Pos(edComboBox.Text, StringList_Vorschlaege[i]) Der ganze Befehl/Vergleich ist mir unklar und ich hab das gefühl, dass genau der entscheident ist

Warum die variablen Selstart und Sellength? Die Variable wird doch nie verändert. Oder doch?


Die Liste der Vorschläge ist in einer Ini in folgender Form:
Delphi-Quellcode:
[Liste]
anzahleinträge=5
1=Albert
2=Heinz
3=Ludwig
4=Mathilda
5=Hartmund

Wie muss das dann aussehen? Muss ich die Liste erstmal auslesen uns zwischenspeichern?
Ich hab schon mal die "Sorte"-Option aktiviert damit das ganze in alphabetischer Reihenfolge angezeigt wird.
Vielen Dank schon mal im voraus für weitere Hilfestellungen

Kahpee
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Editfeld mit Dropdownmenü

  Alt 24. Dez 2009, 12:56
Hallo,

ich kann dir die Delphi-Reference ans Herz legen. Da findest du viele Antworten zu deinen Fragen:
Delphi-Referenz durchsuchenPos, Delphi-Referenz durchsuchenSelStart, Delphi-Referenz durchsuchenSelLength.

Pos prüft, ob ein String in einem anderen enthalten ist bzw. gibt den Index zurück. SeltStart und SelLength sind keine Variablen in dem Sinne. Hier wird festgelegt, von wo bis wo ein Text markiert werden soll. Aber das steht alles in der Delphi-Reference bzw. in der Delphi-Hilfe.

Deine ini-Inhalte musst du in die ComboBox einlesen.
Das von alzaimar erwähnte TMemo ist nur ein Beispiel. Statt des Memos musst du eben die Inhalte der Ini-Datei auslesen und der ComboBox hinzufügen (eine kleine For-Schleife reicht hier aus).
  Mit Zitat antworten Zitat
Benutzerbild von KahPee
KahPee

Registriert seit: 12. Mai 2009
214 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Editfeld mit Dropdownmenü

  Alt 24. Dez 2009, 13:22
In die Combobox sollte das doch nicht eingelesen werde oder? Weil die Liste wird ja zwischen drin immer gecleart.. Gibt es denn eine Variable die ich benutzen könnte? (Typ Tstring?) Oder muss ich das mit einem unsichtbaren Memo oder einer unsichtbaren Listbox realisieren?

KahPee
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Editfeld mit Dropdownmenü

  Alt 24. Dez 2009, 13:28
Aus dem Kopf getippselt und ungetestet irgendwie sowas:

Delphi-Quellcode:
var
  i: Integer;
  EntryNum: Integer;
  EntryValue: string;

MyIni := TIniFile.Create(...);
try
  // read number of entries
  EntryNum := MyIni.ReadInteger('Liste', 'anzahleinträge', 0);

  MyComboBox.Items.Clear;
  MyComboBox.Items.BeginUpdate;
  
  // add items
  for i := 1 to EntryNum do
  begin
    EntryValue := MyIni.ReadString('Liste', IntToStr(i), '');
    if ((EntryValue != '') and (Pos(EntryValue, MyEdit.Text) > 0)) then
      MyComboBox.Items.Add(EntryValue);
  end;
  MyComboBox.Items.EndUpdate;
finally
  FreeAndNil(MyIni);
end;
Um nicht laufend auf die Ini-Datei zugreifen zu müssen, kannst du diese einmalig in eine TStringList einlesen und daraus dann die ComboBox füllen.
Das Prinzip ist dabei das gleiche: Die StringList in einer Schleife durchgehen, Werte prüfen und ggf. hinzufügen.
  Mit Zitat antworten Zitat
Benutzerbild von KahPee
KahPee

Registriert seit: 12. Mai 2009
214 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Editfeld mit Dropdownmenü

  Alt 24. Dez 2009, 13:53
Delphi-Quellcode:
procedure Tform2.Autocomplete(Combobox: TCombobox);
var
  selstart, sellength,i: Integer;
  EntryNum: Integer;
  EntryValue: string;
  statistic: TiniFile;
begin
  statistic:= TIniFile.Create(ExtractFilePath(ParamStr(0))+'statistic.ini');
try
  // read number of entries
  EntryNum := statistic.ReadInteger('Playerlist', 'count', 0);
  selstart := Combobox.SelStart;
  sellength := Combobox.SelLength;
  Combobox.Items.Clear;
  Combobox.Items.BeginUpdate;

  // add items
  for i := 1 to EntryNum do
  begin
    EntryValue := statistic.ReadString('Playerlist', IntToStr(i), '');
    if ((EntryValue = '') or (Pos(EntryValue, Combobox.Text) > 0)) then
    begin
     Combobox.Items.Add(EntryValue);
    end;
  end;

  Combobox.Items.EndUpdate;
finally
  statistic.Free;
  Combobox.SelStart := selstart;
  Combobox.SelLength := sellength;
  showmessage(inttostr(entrynum)+entryvalue); // gibt immer "3Bert" aus

end;
end;
Und die existierende ini dazu:
Delphi-Quellcode:
[Playerlist]
count=3
1=Hartmund
2=Albert
3=Bert
eingebunden durch:
Delphi-Quellcode:
procedure TForm2.CBplayer1Change(Sender: TObject);
 begin
  Autocomplete(sender as Tcombobox);
end;
So das hab ich draus gemacht. Aber im Moment wird eine leeres Dropdownmenü angezeigt, ohne einen einzigen Eintrag. Außerdem wird der Eintrag den man eintippt immer gleich gelöscht, nach durchlauf der prozedur. Die Datei heißt auch wirklich "statistic.ini" und liegt im selben Ordner wie die .exe .

mfg Kahpee
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Editfeld mit Dropdownmenü

  Alt 24. Dez 2009, 14:23
if ((EntryValue = '') or (Pos(EntryValue, Combobox.Text) > 0)) then Das bedeutet, wenn EntryValue leer ist ODER einen Teilstring enthält, wird EntryValue in die ComboBox eingefügt. Wieso sollte ein Leerstring in die ComboBox eingefügt werden? Das passiert somit auch bei jedem Versuch, aus der ini zu lesen, der fehlschlägt, da der Standardwert ein Leerstring ist.
Es ist imho auch Quatsch, in Pos() den Inhalt der ComboBox zu vergleichen. Denn diese leerst du und füllst sie anschließend. Du musst natürlich mit deinem Suchbegriff (Edit.Text) vergleichen.

Lasse dir mal EntryValue ausgeben.

Zugegeben, ich habe "!=" im Code geschrieben. In Delphi heißt es "<>", also:

if ((EntryValue <> '') and (Pos(EntryValue, MyEdit.Text) > 0)) then Oder hier:
showmessage(inttostr(entrynum)+entryvalue); // gibt immer "3Bert" aus Natürlich gibt das immer "3Bert" aus, da du die Ausgabe nach Ablauf der Schleife machst. Damit wird immer der letzte Wert ausgegeben. Wenn du das innerhalb der Schleife aufrufst, sieht das schon anders aus.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 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