Autor Beitrag
mexx
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Do 06.07.06 09:24 
Hallo,

mit ListBox.Items.Append(String) füge ich einer ListBox einen Eintrag hinzu. Ich möchte aber nicht, dass die Eintäge unten hinzugefügt werden, sondern immer oben. Wie kann ich das machen, ohne den Index nach dem Append zu ändern?

_________________
Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Do 06.07.06 09:33 
schau mal nach

Items.Insert

C.
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Do 06.07.06 09:48 
Dann muss ich ja den Index des bestehenden Eintrages ändern. Das ist ungünstig und bei vielen Einträgen sicherlich Ressourcenaufwendig!

_________________
Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Do 06.07.06 10:09 
hmm ? moment... du willst einen eintrag irgendwo in deiner Liste einfügen, aber dafür darf sich der Index nicht verschieben ? das haut nicht wirklich hin ;) denn wenn du was einfügst, verschiebt sich der Index aller nachfolgenden Einträge o_O

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, dummy : Integer;

begin
  Randomize;
  lbx.Items.BeginUpdate;
  try
    lbx.Clear;

    for i := 0 to 1000 do 
      lbx.Items.Add(IntToStr(i));

    for i := 0 to 200 do begin
      dummy := Random(1000);
      lbx.Items.Insert(
                       lbx.Items.IndexOf(IntToStr(dummy - 1)) + 1,
                       IntToStr(dummy)
                      );

      if i mod 50 = 0 then
        Application.ProcessMessages
    end;

  finally
    lbx.Items.EndUpdate;
  end;
end;


daher mal so als Tip...
BeginUpdate und EndUpdate verwenden... und wenn du den neuen Wert NACH einem bestimmten Eintrag setzen willst, dann mach es so wie ich oben mit IndexOf(..)+1... wenn es VOR dem bestehenden Eintrag sein soll, dann lass das +1 weg ;)
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Do 06.07.06 10:10 
Dann muss ich ja den Index des bestehenden Eintrages ändern. Das ist ungünstig und bei vielen Einträgen sicherlich Ressourcenaufwendig!

_________________
Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Do 06.07.06 10:12 
Ich glaube Du hast mich verstenden. Ich will meinen Eintrag einfach nur oben haben nicht unten in der Liste, sondern immer oben drauf!

_________________
Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Do 06.07.06 10:16 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
  lbx.Items.BeginUpdate;  
  try  
    lbx.Clear;  

    for i := 0 to 200 do begin  
      dummy := Random(1000);  
      lbx.Items.Insert(0, IntToStr(dummy));  
    end;  
 
  finally  
    lbx.Items.EndUpdate;  
  end;


obiger code fügt dir 200 zufällige Zahlen immer an den Anfang deiner Liste an...
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Do 06.07.06 10:22 
Ok, nochmal.

Ich habe folgende Inhalte. a,b,c,d,e,...
Ungewiss wieviele, also ist eine for-schleife schon mal unmöglich!

Wenn ich nun ListBox.Items.Append(String) mache, habe ich eine Liste, die jeden Eintrag nacheinander von oben nach unten auflistet.

a
b
c
d
e
...

Ich möchte aber

...
e
d
c
b
a

Keine Vorschleife mit kein zufälligen Index, weil die Daten ja nicht irgendwo stehen sollen und auch keine alphabetische Sortierung, weil a,b,c,d,e,... nur ein Beispiel waren und die Daten keine Sortierung erlauben.

_________________
Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Do 06.07.06 10:44 
antwort siehe oben:

ausblenden Delphi-Quelltext
1:
  lbx.Items.Insert(0, neues_item);					



Ich hatte das in eine Schleife gepackt hatte, um dir zu demonstrieren, wie man es mit VIELEN Items macht... und wenn du es mit mehreren Items machst, bietet sich nun mal eine Schleife an... dabei solltest du dann auch BeginUpdate..try..finally..EndUpdate..End benutzen...

denke, ein bißchen Transferleistung sollte ich ja erwarten können... etwas denken hilft manchmal weiter...
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Do 06.07.06 10:52 
Bei Deiner Methode steht doch dann jeder Eintrag an irgendeiner Stelle! So ist das nicht gewollt. Wenn ich die Schaltfläche drücke, soll einfach nur der nächste Eintrag oben hinzugefügt werden!

_________________
Das Unsympathische an den Computern ist, dass sie nur ja oder nein sagen können, aber nicht vielleicht.
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Do 06.07.06 11:09 
nein... bei mir wird der neue eintrag IMMER OBEN angefügt
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Do 06.07.06 11:24 
lbx.Items.Insert(0, neues_item);

die 0 ist die Position, an der das neue Item eingefügt werden soll... 0 ist das oberste Item in der Listbox...

wenn bei dir das so nicht funktionieren sollte... hast du vielleicht Sorted oder etwas anderes, dass die Reihenfolge der Items in der Listbox verändert, aktiviert ?
krampi
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 15.01.08 00:12 
Wenn ich zum Thema eine weitere Frage einwerfen darf - (um nicht einen neuen Thread zu öffnen) - wie kann ich ein Item in einer Listbox hinzufügen, wenn diese auf eine Textdatei zurückgreift?
XUDO
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Win-98SE, Win-XP/1
Delphi-7P, Turbo-Pascal-6
BeitragVerfasst: Di 06.01.09 20:26 
user profile iconmexx hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich die Schaltfläche drücke, soll einfach nur der nächste Eintrag oben hinzugefügt werden!


Hallo mexx,
der erste Eintrag in einer Listbox hat immer den Index 0 und der letzte den Index Listbox1.items.Count. Das ist die Anzahl der Einträge -1, da die Liste bei 0 beginnt. Ein neuer Eintrag oben muss also zwangsläufig den Index 0 bekommen.

Du kommst also nicht drumherum anzuweisen: Listbox1.items[0]:=[neuer Eintrag];

Willst du nicht, daß der ursprüngliche Eintrag 0 = items[0] dadurch überschrieben wird und damit "weg" ist, bleibt Dir eine vorher (als vor dem neuen 0-Eintrag) "veranstaltete" Schiebescheife mit dem Endwert .Count nicht erspart, die allen items vom neuen letzten an den Inhalt des "darüberstehenden" items zuweist und damit den alten Nulleintrag in items[1] kopiert, womit dann [0] überschrieben werden darf, ohne Einträge zu verlieren.

Falls irgendwo im Programm ein Array/eine Ordnung existiert, die auf die einzelnen Items bzw. deren Index hinweist, muß hier natürlich ebenfalls "geschoben" werden.

Gruß Udo
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 06.01.09 21:00 
user profile iconXUDO hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconmexx hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich die Schaltfläche drücke, soll einfach nur der nächste Eintrag oben hinzugefügt werden!


Hallo mexx,
der erste Eintrag in einer Listbox hat immer den Index 0 und der letzte den Index Listbox1.items.Count. Das ist die Anzahl der Einträge -1, da die Liste bei 0 beginnt. Ein neuer Eintrag oben muss also zwangsläufig den Index 0 bekommen.
...


Das hat er nach 2 1/2 Jahren bestimmt auch schon rausgefunden ;)

_________________
PROGRAMMER: A device for converting coffee into software.
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mi 07.01.09 15:30 
Mit 0 im obigen Code ist die Stelle in der Listbox angegeben, und nach dem Komma kommt dann die Variable. Also wird es einfach immer vorne angefügt und die hinteren weiter nach hinten verschoben so dass vorne Platz ist.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 07.01.09 16:06 
user profile iconkrampi hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich zum Thema eine weitere Frage einwerfen darf - (um nicht einen neuen Thread zu öffnen) - wie kann ich ein Item in einer Listbox hinzufügen, wenn diese auf eine Textdatei zurückgreift?

Einmal angenommen, du meinst mit "auf eine Textdatei zurückgreifen" "eine Textdatei geladen haben", macht das keinen Unterschied. Du kannats genauso die Prozeduren ListBox1.Items.Add und ListBox1.Items.Insert verwenden.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Do 08.01.09 00:00 
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconkrampi hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich zum Thema eine weitere Frage einwerfen darf - (um nicht einen neuen Thread zu öffnen) - wie kann ich ein Item in einer Listbox hinzufügen, wenn diese auf eine Textdatei zurückgreift?

Einmal angenommen, du meinst mit "auf eine Textdatei zurückgreifen" "eine Textdatei geladen haben", macht das keinen Unterschied. Du kannats genauso die Prozeduren ListBox1.Items.Add und ListBox1.Items.Insert verwenden.


Selbst diese Frage ist schon ein Jahr her..
Man, kann das hier nicht mal jemand zumachen? :P

_________________
PROGRAMMER: A device for converting coffee into software.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 08.01.09 00:31 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Selbst diese Frage ist schon ein Jahr her..
Man, kann das hier nicht mal jemand zumachen? :P

Ahrg, ich seh eine neue Antwort, ein Post von 2008 - klar, wahrscheinlich vom Dezember :autsch:
Blackheart666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Do 08.01.09 01:02 
Wir sind doch hier in einem Forum wo der Sinn darin besteht Fragen zu beantworten, egal wie alt sie sind. Dadurch brauchen andere User die eventuell die selbe Frage haben und die Suche bemühen eine entsprechende Antwort finden (Wenn mann nicht um löschung des Themas bittet, warum auch immer)
"Kopfschüttelsmilie nicht gefunden"

Moderiert von user profile iconNarses: überflüssige Umbrüche entfernt

_________________
Blackheart666
Der Irrsinn ist bei Einzelnen etwas Seltenes, - aber bei Gruppen, Parteien, Völkern, Zeiten die Regel. (Friedrich Nietzsche)