AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Problem beim Löschen aus einer TempList
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim Löschen aus einer TempList

Ein Thema von lblbw · begonnen am 2. Feb 2005 · letzter Beitrag vom 6. Feb 2005
Antwort Antwort
lblbw

Registriert seit: 2. Feb 2005
Ort: Liebenwalde
6 Beiträge
 
#1

Problem beim Löschen aus einer TempList

  Alt 2. Feb 2005, 21:45
Hallo,

ich habe eine Firma, die Anzeigetafeln für den Kampfsport entwickelt und herstellt.
Die Kämpfer werden von der Software erfasst. Diese müssen dann zum wiegen, ob sie auch noch die gleiche Gewichtsklasse haben. Dabei kann es vorkommen, das noch Kämpfer nachgetragen werden müssen. Nun will ich diese Kämpfer nach Vereine sortieren. Aber die nachgetragenen Kämpfer stehen dann in der ListBox als seperater Verein drin. Die soll aber verhindert werden, und da ist mein Problem, entweder ist der Listenindex außerhalb oder das Programm stützt ab. Der Quelltext löscht die vorhanden doppelte Vereine, soweit sie alle untereinander stehen.

...
Delphi-Quellcode:
I:=0;
J := 0;
repeat
I := J;
repeat
Text1 := TempList2[I]
if Text1 = Templist2[I+1] then
begin
 TempList2.Delete(I+1);
end
else
begin
 I := I+1;
end;
until I = TempList2.Count-1;
J := J+1;
until J = TempList2.Count-1;
ListBox4.Items:=TempList2
Wusste jetzt nicht, wo ich das reinschreiben sollte
  Mit Zitat antworten Zitat
Benutzerbild von atreju2oo0
atreju2oo0

Registriert seit: 5. Dez 2003
Ort: Berlin
289 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Problem beim Löschen aus einer TempList

  Alt 2. Feb 2005, 22:54
Irgendwie weiß ich immer noch nicht was genau das Problem ist...
Aber ich tipp mal so ins blaue hinein...

Falls im eigentlich letzten Durchgang der Schleife noch was gelöscht wird dann bringt

until I = TempList2.Count-1;

leider nix. Vielmehr müsste es dann heißen

until I >= TempList2.Count-1;

Genauso natürlich in der Abfrage darunter. Aber ob das des Rätsels Lösung ist weiß ich nicht, da ich keine Ahnung
habe was I, J oder TempList ist...
Außerdem ist es der Übersicht halber besser einzurücken...
Beschreibs einfach noch nen bissle genauer.
Thomas
  Mit Zitat antworten Zitat
lblbw

Registriert seit: 2. Feb 2005
Ort: Liebenwalde
6 Beiträge
 
#3

Re: Problem beim Löschen aus einer TempList

  Alt 3. Feb 2005, 20:26
Ich will die Vereine sortiert angeben, nur soll jeder jeweils nur 1 mal erscheinen, da ist das Problem. Wenn ein Kämpfer nachgetragen wird, dann erscheint dieser, als seperater Verein. D.h. es erscheinen 2 Vereine mit dem selben Namen. Und da liegt mein Problem.

edit: I,J sind Integerzahlen, TempList sind Strings
Brauche es dringends, wenns geht bis morgen früh
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Problem beim Löschen aus einer TempList

  Alt 4. Feb 2005, 10:35
Zitat von lblbw:
Ich will die Vereine sortiert angeben, nur soll jeder jeweils nur 1 mal erscheinen, da ist das Problem. Wenn ein Kämpfer nachgetragen wird, dann erscheint dieser, als seperater Verein. D.h. es erscheinen 2 Vereine mit dem selben Namen. Und da liegt mein Problem.
Da kann man in in einer (For-)Schleife die Templist durchlaufen und (vor dem Eintragen) prüfen, ob der Verein schon eingetragen ist. Falls dies der Fall ist, trägt man den Verein nicht nochmals ein; wenn er nicht vorhanden ist, dann trägt man ihn in die Liste ein.

MfG
Binärbaum
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
lblbw

Registriert seit: 2. Feb 2005
Ort: Liebenwalde
6 Beiträge
 
#5

Re: Problem beim Löschen aus einer TempList

  Alt 4. Feb 2005, 21:47
nein, so meinte ich das nicht. Nehmen wir mal jetzt diese Liste:, die er mir anzeigt
  • JLC
  • GHS
  • HJC
  • OBJ

So und dann wird beim wiegen ein Kämpfer nachgetragen, die unter ein unterprogramm eingetragen werden muss. Als beispiel jetzt ein Kämpfer wird von GHS nachgetragen. Soll er jetzt wieder nach den Vereinen laden, dann entsteht folgende Liste:
  • JLC
  • GHS
  • HJC
  • OBJ
  • GHS
.

UND das ist das Problem
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: Problem beim Löschen aus einer TempList

  Alt 4. Feb 2005, 22:21
Schon mal was von Binary Trees gehört. Das wäre für dich eine Idealle lösung.
Hier ein Beispiel :
Delphi-Quellcode:
type
  PbinNode = ^TbinNode;
  TbinNode = packed record
    Word:string; // Frei auszuwählende Variablen und deren Typen...
    Number:integer; // Frei auszuwählende Variablen und deren Typen...
    left_child : PbinNode;
    right_child : PbinNode;
    parent : PbinNode;
  end;

function FindNode( p : Pbinnode; _text_ : string; var Node:pbinnode ):boolean;
function FindNode_n( p : Pbinnode; _text_ : string; var Node:pbinnode ):boolean;

function AddNode( p : Pbinnode; _text_ : string; parent_ : Pbinnode = nil):PbinNode;
procedure TreePrint( p : PbinNode);

var
  WordList : TStringList; // must be cleared before use of TreePrint procedure --->WordList.Clear;
                          // it is automatic created and destroyed..

implementation

(*
  Finds a node with the condition '_text_' = p^.Word.
  Returns true if the word _text_ exists in the tree
*)


// normal, no recursion, witch is much better

function FindNode_n( p : Pbinnode; _text_ : string; var Node:pbinnode ):boolean;
 var tempnode : Pbinnode;
begin
 tempnode := p; // not really necessary or yes ? I think yes because p is a pointer...

 find_counter := 0;

 while (true) do
 begin

  inc (find_counter);

  if tempnode = nil then // if we are in a dead end
          begin // if so, nothing found
           Result := False;
           Node := nil;
           Exit;
          end;

  if _text_ = tempnode^.Word then // we fond it
        begin
         Node := tempnode;
         Result := True;
         Exit;
        end;

  // look on left
  if _text_ < tempnode^.Word
        then tempnode := tempnode^.left_child

  else
  // look on right
  tempnode := tempnode^.right_child;

 end;
end;

function FindNode( p : Pbinnode; _text_ : string; var Node:pbinnode ):boolean; // recursive
begin
 inc (find_counter);
 if p = nil then
 begin // nothing found
  Result := False;
  Node := nil;
 end

        else
         // we found it
         if _text_ = p^.Word then
                begin
                 Node := p;
                 Result := true;
               end
        else
        // look on left
        if (_text_ < p^.Word) then Result := FindNode(p^.left_child, _text_, Node )

        else
        // look on right
        Result := FindNode(p^.right_child, _text_, Node);
end;

function AddNode( p : Pbinnode; _text_ : string; parent_ : Pbinnode = nil):PbinNode;
begin
  if p = nil then
  begin
    New(p);
    p^.Word := _text_;
    p^.Number := 1;
    p^.left_child := nil;
    p^.right_child := nil;
    p^.parent := parent_;
    inc(count);
  end

  else
        if (_text_ = p^.Word) then
                 Inc(p^.Number)// nothing happens
  else
        if (_text_ < p^.Word) then
                 p^.left_child := AddNode(p^.left_child, _text_, p)
  else
         p^.right_child := AddNode(p^.right_child,_text_, p);
  result := p;
end;

(*
Puts the content of the tree in a string list as a sorted list of entries
No dupicates are found in created list
*)


procedure TreePrint( p : PbinNode); // 0,1,2,3,4,5,6....
begin
  if (p <> nil) then
  begin
    TreePrint(p^.left_child);
    WordList.Add(p^.Word);
    TreePrint(p^.right_child);
  end;
end;

initialization

 WordList := TStringList.Create();
 WordList.Clear(); // there is no real need for this but never the less

finalization

 WordList.Free();
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#7

Re: Problem beim Löschen aus einer TempList

  Alt 4. Feb 2005, 22:53
Du kannst von vorneherein verhindern, dass Duplikate von der ListBox akzeptiert werden:
Delphi-Quellcode:
ListBox.Items.Sorted := True; // ist Voraussetzung für die nächste Zeile
ListBox.Items.Duplicates := dupIgnore; // keine doppelten Einträge
Als Nebeneffekt ist die ListBox dann alphabetisch sortiert...

Gruß, teebee
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#8

Re: Problem beim Löschen aus einer TempList

  Alt 6. Feb 2005, 19:31
Habe gerade schmerzlich bemerken müssen, dass es 'Duplicates' in einer ListBox leider nicht gibt. Ist also Quatsch, was ich oben geschrieben habe...
Aber so geht es natürlich auch:
Delphi-Quellcode:
If ListBox.Items.IndexOf(sVerein)=-1 Then
  ListBox.Items.Add(sVerein);
Gruß, teebee
  Mit Zitat antworten Zitat
lblbw

Registriert seit: 2. Feb 2005
Ort: Liebenwalde
6 Beiträge
 
#9

Re: Problem beim Löschen aus einer TempList

  Alt 6. Feb 2005, 20:27
danke für eure Hilfen, habe den Quellcode von Teebee eingebaut, und sie funktioniert danke.
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:25 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