Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Binärer Baum mit Klasse (https://www.delphipraxis.net/187549-binaerer-baum-mit-klasse.html)

ford42 8. Dez 2015 14:07

Delphi-Version: 5

Binärer Baum mit Klasse
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hey,

ich soll einen binären Baum mithilfe einer Klasse erstellen. Jedoch sind meine Methoden (vor allem (bzw glaube nur) beim löschen) verbuggt. Wenn ich schnell irgendwas eingebe, dies dann lösche kommt manchmal eine Fehlermeldung (z.B. Ungültige Zeigeroperation), jedoch kann ich dies nicht hilfreich nachstellen, sodass ich sehe an welcher Stelle genau was falsch ist (wenn ich es langsam und überlegt löscht, kommt kein Fehler). Oo

Kann mir bitte jemand helfen oder einen Tipp geben? :)

Vielen Dank
LG ford42

ub60 8. Dez 2015 20:56

AW: Binärer Baum mit Klasse
 
Zitat:

Zitat von ford42 (Beitrag 1323747)
Jedoch sind meine Methoden (vor allem (bzw glaube nur) beim löschen) verbuggt.

Das Problem ist eher, Du hast gar keine Methoden (außer Create und Destroy). Zumindest nicht in Deiner Klasse. Damit wird das Ganze sehr unübersichtlich. Du solltest Dir zuerst einmal überlegen, was Deine Baum-Klasse können soll und dann Methoden dafür (innerhalb der Klasse) entwerfen, nicht innerhalb des Formulars.
Ein weiterer Design-Fehler ist das Ansprechen des aktuellen Formulars innerhalb Deiner Klasse, z.B. hier:
Code:
constructor TNodeTest.Create;
begin
  inherited; //hierdurch wird der ursprüngliche Konstruktor aufgerufen
  Form4.RE_Status.SelAttributes.Color := clGreen;
  Form4.RE_Status.Lines.Add('$' + IntToStr(Integer(self)) +  ' wurde erstellt');
  Form4.RE_Status.SelAttributes.Color := clBlack;
  Inc(Form4.NodeI);
end;
Die Ausgabe der Daten über das Formular hat in der Klasse nichts zu suchen. Eventuell könnte man an die Klasse ein Element des Formulars als Parameter übergeben; so wie Du es gemacht hast, ist es leider sehr unübersichtlich, fehleranfällig und nicht leicht auf andere Probleme (oder Formulare) anpassbar.
Überlege Dir einfach einmal, was Du alles ändern müsstest, wenn der Baum auf einem anderen Formular laufen soll...

ub60

ford42 9. Dez 2015 07:13

AW: Binärer Baum mit Klasse
 
Ja, da hast du Recht.
Das ist (vor allem) so unübersichtlich geworden, da ich es davor mit records und Pointer gemacht habe und es dann zu ner Klasse umwandeln sollte....

Aber dann bau ich es mal um (da deine Argumente, vor allem dein letztes (anderes Formular) natürlich Sinn ergeben! :)

ford42 10. Dez 2015 12:06

AW: Binärer Baum mit Klasse
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich scheiter gerade an den Klassenmethoden.

Also ich muss ja z.B. class procedure Einfuegen(eingabe: String) als Klassenmethode defenieren (da es ja nur einmal vorkommen darf) oder?

Und wie kann ich die dann in der Unit für die Gui aufrufen? :o


Dankeschön
LG ford42

SMO 10. Dez 2015 13:13

AW: Binärer Baum mit Klasse
 
Zitat:

Zitat von ford42 (Beitrag 1323955)
Ich scheiter gerade an den Klassenmethoden.

Also ich muss ja z.B. class procedure Einfuegen(eingabe: String) als Klassenmethode defenieren (da es ja nur einmal vorkommen darf) oder?

Ist dir der Unterschied zwischen Klasse und Objekt klar? Klassen sind quasi die Baupläne, Objekte die Realisierung (Instanzen der Klasse).
Klassenmethoden operieren auf der Klasse und haben daher nur Zugriff auf allgemeine Dinge und andere Klassenmethoden und Klassenvariablen. Aber nicht auf normale Felder einer Objektinstanz, auf denen normale Methoden operieren.
Eine Methode wie "Einfügen" ist mit ziemlicher Sicherheit keine Klassenmethode, sondern eine normale, da du dir sonst die Möglichkeit versperrst, mehrere Objekte (Instanzen) dieser Klasse zu haben, die unterschiedliche Werte eingefügt bekommen können.

Deine aktuelle Deklaration von TNodeTest scheint mir also ziemlich falsch. Mach mal überall das "class" Präfix weg.
Übrigens:

Delphi-Quellcode:
// statt:
      class var NodeI: Integer;
      class var wAendern: Integer;
      class var PWurzelNode: TNodeTest;
      class var PStandNode: TNodeTest;
      class var PParentNode: TNodeTest;
// geht auch einfach:
      class var
        NodeI: Integer;
        wAendern: Integer;
        PWurzelNode: TNodeTest;
        PStandNode: TNodeTest;
        PParentNode: TNodeTest;

// und statt
if PWurzelNode <> nil then
// kann man auch schreiben
if Assigned(PWurzelNode) then

// ist absolut gleichwertig, Assigned() testet auf <> nil, nur damit du es mal gesehen hast

ford42 10. Dez 2015 14:00

AW: Binärer Baum mit Klasse
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke, das war mir so nicht klar. Ich habe es davor anders verstanden. :angel2:

Der Tipp mit Assigned ist auch sehr hilfreich, da es Tipparbeit erspart. :D

Würdet ihr jetzt noch was ändern, oder passt es soweit? :)

Mavarik 10. Dez 2015 15:17

AW: Binärer Baum mit Klasse
 
Zitat:

Zitat von ford42 (Beitrag 1323983)
Würdet ihr jetzt noch was ändern, oder passt es soweit? :)

Abgesehen von der Formatierung?

Hast Du noch Form4 in der Klasse.
Char 'r' und 'l' ???
Warum Class var... Sollte man - bis auf wenige stellen - drauf verzichten.

" if Form4.Loeschen('alles') then "


Sorry aber den Code kann man kaum lesen!

ford42 11. Dez 2015 07:59

AW: Binärer Baum mit Klasse
 
Liste der Anhänge anzeigen (Anzahl: 1)
Erstmal dankeschön. :)

Zitat:

Zitat von Mavarik (Beitrag 1324004)
Abgesehen von der Formatierung?

Was findest du an der Formatierung nicht schön? :)

Zitat:

Zitat von Mavarik (Beitrag 1324004)
Hast Du noch Form4 in der Klasse.

Hast Recht, hab ich nun geändert.

Zitat:

Zitat von Mavarik (Beitrag 1324004)
Char 'r' und 'l' ???

da steht r für rechts und l für links. Da habe ich Char genommen, da Char weniger verbraucht als ein String. War das ein falscher Gedanke?

Zitat:

Zitat von Mavarik (Beitrag 1324004)
Warum Class var... Sollte man - bis auf wenige stellen - drauf verzichten.

Weil es davor nicht funktioniert hat und ich dachte, dass es sonst pro Objekt eine sperate Variable/Variablenwert gibt und das will ich ja nicht oder liege ich da falsch?

Zitat:

Zitat von Mavarik (Beitrag 1324004)
" if Form4.Loeschen('alles') then "

Ich weiß, dass ist unschön gelöst, aber ich weiß nicht wie ich es an der Stelle besser lösen kann. :gruebel:
Kann mir da bitte jemand weiterhelfen/einen Tipp geben? :)

Zitat:

Zitat von Mavarik (Beitrag 1324004)
Sorry aber den Code kann man kaum lesen!

Brauchst dich nicht entschuldigen, nur aus Kritik kann ich lernen, deshalb habe ich ja hier nachgefragt! :)

Dankeschön :)

EDIT: Die LoescheUndFuegeEin-Methode war bei der vorherigen verbuggt

Mavarik 11. Dez 2015 10:58

AW: Binärer Baum mit Klasse
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von ford42 (Beitrag 1324076)
Erstmal dankeschön. :)

Zitat:

Zitat von Mavarik (Beitrag 1324004)
Abgesehen von der Formatierung?

Was findest du an der Formatierung nicht schön? :)

Entspricht nicht so dem "Üblichen"... Ok Ich formatieren meinen Source auch anders als die Norm...

Um sowas wie "Rechts" und "Links" zu speichern nimm einen eigenen Typen...

Delphi-Quellcode:
Type
  TLaufrichtung = (lrKeine,lrRechts,lrLinks);
Es ist im Zip Nie die Datei BaumklasseUnit.dfm dabei... Daher kann man es nicht testen - jedenfalls nicht so einfach

ford42 11. Dez 2015 11:50

AW: Binärer Baum mit Klasse
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok dankeschön.
Habs nun mit dem Typen gemacht. :)

Und nun ists auch mit der BaumklasseUnit.dfm verpackt. :D

LG ford42


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:38 Uhr.
Seite 1 von 2  1 2      

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