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 Listbox von unten füllen (https://www.delphipraxis.net/55438-listbox-von-unten-fuellen.html)

der olli 20. Okt 2005 21:40


Listbox von unten füllen
 
Hallo,

wir besprechen im Moment im Informatikunterricht den Datentyp "Stapel". Dazu wird ja bekanntlich das neueste Element zu oberst angezeigt - nun hat heute unser Lehrer gesagt, dass es günstig wäre, die Listbox von unten zu füllen (also erstes Element erscheint am Boden, zweites darüber; ohne, dass man, wie normalerweise, das oberste Element erst nach unten verschieben muss, damit das neue eingefügt werden kann) - allerdings wusste er nicht, wie. Da ich auch keine Ahnung habe, frage ich einfach mal in die Runde, ob das zu realisieren ist (mit Delphi 4) und wenn ja, wie? Danke!

Gruß,
Olli

glkgereon 20. Okt 2005 21:44

Re: Listbox von unten füllen
 
ich würde einfach das neue nur ganz oben einfügen (weil einfacher)

letztendlich kommt aber dasselbe raus wie du meinst (hoffe ich doch)

dazu musst du folgenden Befehl nutzen:
Delphi-Quellcode:
ListBox1.Items.Insert(0,S);
Damit fügst du S an der Position 0 ein, also ganz oben.#

Edit:
Ich würde wenn möglich davon absehen wirklich die Items zu "stapeln" weil du dann mehrere Probleme hast:
erstens müsstest du (um es vernünftig zu machen) komplett das OnPaint überschreiben
zweitens wüsste ich nicht was du machst wenn der Stapel an der "decke" ankommt...Hochscrollen? unten bleiben?

so ist es vielleicht nicht sooo perfekt, aber einfach und völlig ausreichend :)

lizardking 20. Okt 2005 22:00

Re: Listbox von unten füllen
 
Zitat:

Zitat von der olli
nun hat heute unser Lehrer gesagt, dass es günstig wäre, die Listbox von unten zu füllen (also erstes Element erscheint am Boden, zweites darüber; ohne, dass man, wie normalerweise, das oberste Element erst nach unten verschieben muss, damit das neue eingefügt werden kann) - allerdings wusste er nicht, wie.

Auch wenn das nicht wirklich weiterhilft : Man sollte alle Lehrer in einer Listbox speichern, erstmal vorsichtshalber ein Listbox.Clear ausfuehren und nur Elemente hinzufuegen, bei denen das Property "qualified" auf True gesetzt ist hinzufuegen.

Sorry, fuer sowas hab ich irgendwie kein Verstaendnis. Als Lehrer eine Aufgabe stellen, bei der ich selbst nicht Bescheid weiss ? Naja, Jedem das Seine.

der olli 20. Okt 2005 22:40

Re: Listbox von unten füllen
 
Der Lehrer hat es uns ja nicht als Aufgabe gestellt, sondern gesagt, wenn jemand es wüsste, solle er es sagen. Es wäre nicht notwendig, aber er wolle es wissen.

lizardking 20. Okt 2005 23:06

Re: Listbox von unten füllen
 
Zitat:

Zitat von der olli
Der Lehrer hat es uns ja nicht als Aufgabe gestellt, sondern gesagt, wenn jemand es wüsste, solle er es sagen. Es wäre nicht notwendig, aber er wolle es wissen.

Ich hab mir jetzt mal ungefaehr 5 Minuten Zeit genommen:

Delphi-Quellcode:
ListBox1.Items.Insert(ListBox1.Items.Count,inttostr(i));
Fuegt den Inhalt von i am Ende und

Delphi-Quellcode:
ListBox1.Items.Insert(0,inttostr(i));
am Anfang einer ListBox ein.

Sowas sollte ein Lehrer auch in messbarer Zeit koennen.

Lannes 20. Okt 2005 23:33

Re: Listbox von unten füllen
 
Hallo,

wie wäre es den damit :mrgreen:,etwas Abwechslung ist ja nicht schlecht am späten Abend :wink:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ListBox1.Style := lbOwnerDrawFixed;
  ListBox1.IntegralHeight := True;
  ButtonClearClick(self);//damit beim Start gleich alles ok ist
end;

//ListBox mit leeren Zeilen bis zum Ende füllen
procedure TForm1.ButtonClearClick(Sender: TObject);
var z : integer;
begin
  ListBox1.Clear;
  for z := 0 to Round(ListBox1.Height/ListBox1.ItemHeight)-1 do
    ListBox1.Items.Add('');
  //Tag wird zum Nachhalten der beschriebenen Items gebraucht
  ListBox1.Tag := Round(ListBox1.Height/ListBox1.ItemHeight)-1;
end;

procedure TForm1.ButtonEintragClick(Sender: TObject);
begin
  if ListBox1.Tag = 0 then//oben angekommen
    begin
    ListBox1.Items[0] := Edit1.Text;
    ListBox1.Items.Insert(0,'');//leere Zeile oben anlegen für kommende Eintrag
    end
    else
      begin
      ListBox1.Items[ListBox1.Tag] := Edit1.Text;>//nach oben füllen
      ListBox1.Tag := ListBox1.Tag-1;
      end;
end;
//damit man nicht oberhalb der Einträge eine Markierung sieht
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
    if odFocused in State then
      begin
      if Listbox1.Items[Index] = '' then
        Listbox1.Canvas.Brush.Color := Listbox1.Color;
      Listbox1.Canvas.FillRect(Rect);          
      Listbox1.Canvas.TextOut(Rect.Left,Rect.Top,Listbox1.Items[Index]);
      if Listbox1.Items[Index] = '' then
        begin
        ListBox1.ItemIndex := -1;
        DrawFocusRect(Listbox1.Canvas.Handle,Rect);//Focusrechteck entfernen
        end;
      end
      else
        begin
        Listbox1.Canvas.FillRect(Rect);          
        Listbox1.Canvas.TextOut(Rect.Left,Rect.Top,Listbox1.Items[Index]);
        end;
end;

SirThornberry 20. Okt 2005 23:35

Re: Listbox von unten füllen
 
@lizardking: du hat das ganze wohl nicht richtig verstanden. Es geht nicht darum Items am Anfang einzufügen sondern das die Listbox von unten (vom unteren Rand des Controls) nach oben (oberer Rand des Controls) gefüllt wird. Einzige Möglichkeit die ich sehe um den Effekt zu erzielen wäre die Listbox mit leeren Items zu füllen und dann von unten her die Beschriftung zu ändern. Wenn also in der Listbox 5 Einträge im sichtbaren Bereich platz haben.
Delphi-Quellcode:
var LCount: Integer;
begin
  for LCount := 1 to 5 do
    ListBox1.Items.Add('');
und zum von unten her "füllen"
Delphi-Quellcode:
var LCount: Integer;
begin
  for LCount := 4 downto 0 do
  begin
    ListBox1.Items.Strings[LCount] := inttostr(5 - LCount);
    Application.ProcessMessages;
    Sleep(1000);
  end;
Dadurch sollte der Effekt entstehen das die Listbox von unten her gefüllt wird (ungetestet)

lizardking 21. Okt 2005 06:37

Re: Listbox von unten füllen
 
Zitat:

Zitat von SirThornberry
@lizardking: du hat das ganze wohl nicht richtig verstanden. Es geht nicht darum Items am Anfang einzufügen sondern das die Listbox von unten (vom unteren Rand des Controls) nach oben (oberer Rand des Controls) gefüllt wird.

Ups... okay, dann nehme ich alles zurueck und behaupte das Gegenteil ;-)

Kroko1999 21. Okt 2005 07:13

Re: Listbox von unten füllen
 
Zitat:

Zitat von lizardking
...
Auch wenn das nicht wirklich weiterhilft : Man sollte alle Lehrer in einer Listbox speichern, erstmal vorsichtshalber ein Listbox.Clear ausfuehren und nur Elemente hinzufuegen, bei denen das Property "qualified" auf True gesetzt ist hinzufuegen.


Sorry, fuer sowas hab ich irgendwie kein Verstaendnis. Als Lehrer eine Aufgabe stellen, bei der ich selbst nicht Bescheid weiss ? Naja, Jedem das Seine.

Es gibt immer und überall solche und solche. Daher nicht alle sonder nur fast alle :-D !

richard_boderich 21. Okt 2005 10:43

Re: Listbox von unten füllen
 
Der Lehrer wollte wohl andeuten das es effizienter waere das listbox oder listview von unten zu fuellen. um unnoetiges scrollen zu vermeiden.

also

1. muss die anzahl der elemente (zu speicherne items) vorher genau bekannt sein.

und

2. wenn es mehr sind als du du, bei der groeße deines listboxes darstellen kannst, musst du sowieso scrollen. naehmlich alles item 1 feld runter. haengt natuerlich von font und schriftgroeße ab.

3. sinn wuerde das ganze nur machen , wenn man die elemente ohne vcl sysncro einfuegen koennte
und erst nach dem befuellen die vcl anzeige aktiviert

Richard


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 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