Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Beliebiges Löschen in einer Listbox mit Zeigern
Alishaa - Do 29.09.05 16:02
Titel: Beliebiges Löschen in einer Listbox mit Zeigern
Guten Tag ich bin neu hier an dem Board angemeldet und ich hoffe sehr das ich wenigstens hier kompetente Hilfe finde :) . Mein Problem ist das ich einfach nicht weiter komme in Sachen Beliebiges Löschen und einem Sortierten Aufbau der ausgegebenen Dateien.
Ich habe das Programm heute komplett neu geschrieben ...da alte Entwürfe einfach zu undurchsichtig waren.
Ich würde nun gern wissen wie man
a) Beliebige Dateien aus der Listbox löschen kann..
( Möchte eine Zahl in einem Editfeld eingeben und die Löschen , komplett , nicht nur aus der Listbox )
b) Wie man die Datein Sortiert bekommt.. also nicht die Listbox..
( Im Moment habe ich Randomzahlen die ich bei der Eingabe schon sortieren möchte )
Das Programm bis hier hin funktioniert , soweit ich das sehe , einwandfrei...nur wie gesagt versuch schon seit einer Woche eine Lösung zu finden ohne Erfolg.
Vielen Dank :)
au revoir
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: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; Button2: TButton; Edit1: TEdit; Button3: TButton; Button4: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private public end; PDaten = ^TDaten; TDaten = record zahl:integer; next:PDaten; end; var Form1: TForm1; var root,last : PDaten ; implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin root := nil ; last:= nil ; end;
procedure TForm1.Button1Click(Sender: TObject); begin if root = nil then begin new ( root ) ; root^.zahl := random (100)+1; root^.next:= nil ; last:= root ; end else begin new ( last^.next); last := last^.next ; last^.zahl:= random (100)+1 ; last^.next := nil ; end; end;
procedure TForm1.Button2Click(Sender: TObject); var hilf : PDaten ; begin Listbox1.Clear ; hilf:=root; while hilf <> nil do begin Listbox1.items.add (InttoStr ( hilf^.Zahl)); hilf:=hilf^.next;
end; end;
procedure TForm1.Button3Click(Sender: TObject); var hilf , gefunden : PDaten ; begin hilf:= root ; gefunden := nil ; while (hilf <> nil) and ( gefunden = nil ) do begin if StrtoInt ( Edit1.Text ) = hilf^.Zahl then gefunden := hilf ; hilf := hilf^.next ; end; if gefunden = nil then Showmessage ( 'Nichts gefunden .') else showmessage ( 'Die Zahl' + InttoStr(gefunden^.Zahl) + ' wurde gefunden !') end;
procedure TForm1.Button4Click(Sender: TObject); var hilf : PDaten ; begin hilf:= root ; while hilf^.next <> last do begin hilf:=hilf^.next ; end; dispose(last); last:=hilf; last^.next:=nil; end;
end. |
Moderiert von
Klabautermann: Delphi-Tags hinzugefügt.Moderiert von
UGrohne: Topic aus Datenbanken verschoben am Do 29.09.2005 um 20:45
Kroko - Fr 30.09.05 09:48
Hat es einen Grund, warum Du verkettete Listen aufbaust und kein dynamisches Array nimmst?
Ich würde mir das ganze in eine Klasse basteln und damit dann weiter arbeiten oder zumindestens TList verwenden!
mfg
Klabautermann - Fr 30.09.05 11:11
Hallo,
ich wüsste nciht, was an Verketteten Listen auszusetzen ist.
@Alishaa: Da du "doppelte Buchführung" machst (in der Liste und der ListBox) außerdem musst du dir überlegen, was bei mehrfachen auftauchen einer Nummer geschieht. Sollen alle auftauchenden Elemente gelöscht werden oder nicht?
Auf jeden Fall musst du bei der ListBox einfach mit einer Schleife durchgehen und etweder das erste oder jedes Vorkommen der Zahl löschen.
Ber der Verketteten Liste ist es nur in sofern schwieriger, als dass du dir auch das vorhergehende Element merken musst.
Hier eine Variante, die jedes vorkommen löschen sollte, wenn du es in dein Objekt (tForm1) integrierst kannst du den ersten Parameter weg lassen:
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:
| procedure DeleteAllOfNumber(root : pDaten; aNumber : Integer); var runner, last, ToDel : pDaten; begin runner := root; last := root; while (runner <> nil) do begin if (runner^.Zahl = aNumber) then begin ToDel := runner; if (runner = root) then begin root := root^.Next; last := root; end; else last^.Next := runner^.Next; runner := runner^.Next; Dispose(ToDel); end else begin last := runner; runner := runner^.Next; end; end; end; |
Das ganze habe ich im Beitragseditor getippt daher bitte ich eventuelle Fehler zu entschuldiegen, das Prinzieb sollte aber stimmen ;).
Hast du für die Sortierung einen bevorzugten Algorithmus? Ansonsten suche mal nach
BUBBLESORT und versuche das auf eine Verkettete Liste um zu setzen. Wenn du dazu Fragen hast, kannst du dich ja wieder melden.
Gruß
Klabautermann
Kroko - Fr 30.09.05 12:40
Klabautermann hat folgendes geschrieben: |
Hallo,
ich wüsste nciht, was an Verketteten Listen auszusetzen ist.
... |
(1) Ich auch nicht, aber wenn es nicht sein muss, lass ich es lieber
(2) man schleppt je Record 4 Byte mehr mit rum
(3) manche Dinge gehe einfacher/ mache schlechter!
kommt immer darauf an, was man will!
Klabautermann - Fr 30.09.05 14:26
Hallo,
Kroko hat folgendes geschrieben: |
(1) Ich auch nicht, aber wenn es nicht sein muss, lass ich es lieber |
Ich finde sie schnuckelig, auch wenn ich mir das arbeiten durch unervell nutzbare funktionen (add, remove usw.) gerne vereinfache.
Kroko hat folgendes geschrieben: |
(2) man schleppt je Record 4 Byte mehr mit rum |
Und hat keinen ärger mit
fehlerhaften Memory [
http://www.delphi-forum.de/viewtopic.php?p=44621#44621] Management, welches den Speicherbedarf eines Arrays verdoppelt wenn man es um nur 1 Element vergrößert ;).
Aber natürlich ist das, wie alles andere auch Geschmackssache.
Gruß
Klabautermann
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!