![]() |
dynamische listen--> HILFE ! ! !
ich hab es ewig lange versucht aber ich krieg es einfach nicht hin. Vielleicht haut die Ausgabe nicht hin oder die database - aber ich hab absolut keinen Plan!!!
die prozedur soll einfach aus einen Edit Fenster einen Wert herauslesen und am Ende einer dynamischen Liste einfügen. Hier is das Hauptformular
Delphi-Quellcode:
hier ist die database
unit UTMaster;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, UTData, UTDAavdBL, StdCtrls; type TForm1 = class(TForm) StringGrid1: TStringGrid; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; add: TEdit; wo: TEdit; was: TEdit; Button6: TButton; at: TEdit; delete: TEdit; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private d:TDAavdBL; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin d:=TDAavdBL.create; d.Create; StringGrid1.ColCount:=d.length; end; procedure TForm1.FormDestroy(Sender: TObject); begin d.Destroy; d.free; end; // hier kommen noch mehr prozeduren procedure TForm1.Button3Click(Sender: TObject); VAR i:integer; begin d.add(add.text); FOR i:=1 TO d.length DO StringGrid1.Cells[i,0]:=d.at(i); end; end.
Delphi-Quellcode:
und das is die UTData:
unit UTDAavdBL;
interface uses UTData; Type TDAavdBL = class (TObject) protected first:PList; //erstes Element current:Plist; //aktuelles Element public constructor Create; procedure DelAll; function Empty:boolean; function length:integer; function EndOfList:boolean; procedure add(u:TData); function at(n:integer):TData; destructor Destroy; override; end; implementation { TDAavdBL } constructor TDAavdBL.Create; begin inherited; first:=NIL; current:=NIL; end; function TDAavdBL.Empty; begin IF first=NIL THEN result:=true ELSE result:=false; end; function TDAavdBL.EndOfList; BEGIN IF (empty) OR (Current^.next=NIL) THEN result:=true ELSE result:=false; END; function TDAavdBL.length; BEGIN result:=0; IF NOT Empty THEN BEGIN current:=first; result:=1; WHILE current^.next<>NIL DO BEGIN result:=result+1; current:=current^.next; END; END; END; function TDAavdBL.at; VAR i:integer; BEGIN IF (n<=length) AND (n>0) AND (NOT empty) THEN BEGIN current:=first; FOR i:=0 TO n-1 DO BEGIN result:=current.inhalt; current:=current^.next; END; END ELSE result:=''; END; destructor TDAavdBL.Destroy; BEGIN delall; inherited; END; procedure TDAavdBL.add; VAR m:Plist; BEGIN IF empty THEN BEGIN new(m); m^.next:=NIL; m^.inhalt:=u; first:=m; END ELSE BEGIN new(m); m^.next:=NIL; m^.inhalt:=u; current:=first; WHILE NOT EndOfList DO current:=current^.next; current^.next:=m; END; END; end.
Delphi-Quellcode:
BITTE HELFT MIR SONST LAUF ICH NOCH AMOK ! ! ! :wall: :wall: :wall: :wall: :wall: :wall:
unit UTData;
interface Type TData=string; PList=^TKnoten; TKnoten=record inhalt:TData; next:PList; end; VAR dummy:TKnoten; implementation initialization dummy.next:=NIL; dummy.inhalt:=''; end. |
Re: dynamische listen--> HILFE ! ! !
Kannst du noch sagen, wo der Fehler / das Problem liegt?
|
Re: dynamische listen--> HILFE ! ! !
naja das programm gibt nichts aus und stürzt ab und zu ab.
|
Re: dynamische listen--> HILFE ! ! !
Erstens, verwende [ delphi]-Tags und nicht [ code]. Dadurch wird es wie in Delphi formatiert.
Zweitens, hänge bei so viel Code die Units als Anhang an, anstatt den Post seeeehr lang zu machen. Drittens, hast du mal versucht das Projekt zu debuggen? [edit]Da war jemand wieder schneller[/edit] |
Re: dynamische listen--> HILFE ! ! !
was bringt eigentlich:
Delphi-Quellcode:
für was ist die 2te zeile gut?
d := TDAavdBL.create;
d.Create; |
Re: dynamische listen--> HILFE ! ! !
Schau mal in die Deklaration der Klasse, dort setzt er in Create zwei Pointer auf nil.
|
Re: dynamische listen--> HILFE ! ! !
Liste der Anhänge anzeigen (Anzahl: 1)
o.k. hier is der Anhang
p.s. die abstürze sind eingeplant :-D |
Re: dynamische listen--> HILFE ! ! !
Zitat:
Außerdem:
Delphi-Quellcode:
Du musst dich entscheiden: Destroy oder Free. Du kannst nämlich nur eines aufrufen, das andere wird danach einen Zugriffsfehler bringen.
procedure TForm1.FormDestroy(Sender: TObject);
begin d.Destroy; d.free; end; Ich hab im Moment keine Zeit die Add-Routine genau durchzudenken, das mach ich später. Aber nur um das Prog richtig zu verstehen, wenn du auf den ersten Button (add) klickst, dann soll er eine Zahl in die dynamische Liste laden? Und übrigens, warum verwendest du nicht eine dynamische Liste vom Typ
Delphi-Quellcode:
Die Länge setzt du mit SetLength(Array, Länge), der Index beginnt bei 0.
type
dynListe = array of Typ; |
Re: dynamische listen--> HILFE ! ! !
moin,
Seh ich das richtig, dass das eine einfachverknüpfte lineare Liste werden soll? Wie StefanDP schon erwähnt hat ist das d.create IMHO überflüssig/unsinnig/falsch da der constructor create eine Klassenmethode ist und somit nur auf die Klasse angewendet wird, sprich d := TDAavdBL.create reicht vollkommen. |
Re: dynamische listen--> HILFE ! ! !
na ich wollte mit hilfe von listen ein dynamisches array simulieren!!
|
Re: dynamische listen--> HILFE ! ! !
hm, also außer den bereits erwähnten Fehlern mit create & free seh ich jetzt auf Anhieb keine mehr.
Es stellt sich mir nun aber die Frage wozu das ganze?! entweder ich verwende ein dynamisches array oder ich lass es. (es sei den du hast vor noch eine "löschen"-Funktion einzubauen ... das würde dann in der Tat etwas mehr Sinn machen. |
Re: dynamische listen--> HILFE ! ! !
Zitat:
soweit ich es mitgekriegt habe ist d.free allgemein zur freigabe des speichers von der datenbasis und d.destroy ist ein prozeduren aufruf (frag mich aber nicht was es genau macht) |
Re: dynamische listen--> HILFE ! ! !
d.destroy führt soviel ich weiß fast das gleiche aus wie d.free, aber ich kann mich an den genauen Unterschied nicht mehr erinnern :oops: Ein Aufruf (destroy oder free) ist vollkommen genug, ich verwende normal immer free.
|
Re: dynamische listen--> HILFE ! ! !
wenn mich nicht alles täuscht ruft free destroy auf, oder umgekehrt ...
|
Re: dynamische listen--> HILFE ! ! !
ok, für Schulaufgaben hab ich immer Verständniss ... die sind selten sinnvoll ;)
|
Re: dynamische listen--> HILFE ! ! !
Zur Klärung: Free ruft Destroy auf, es knallt aber keine Zugriffsverletzung, wenn das Objekt schon nil ist.
Also nie direkt Destroy verwenden, sondern immer Free. Oder auch FreeAndNil(Object). |
Re: dynamische listen--> HILFE ! ! !
free ruft destroy auf, falls das object "created" wurde. falls nicht, passiert gar nichts. destroy gibt böse fehler aus, falls das object nicht erstellt wurde. daher faustregel:
immer free verwenden! woviel erstmal dazu |
Re: dynamische listen--> HILFE ! ! !
naja, da lag ich ja fast richtig ;)
ich hab im Übrigen auch die Fehler gefunden: 1. d.create und d.destroy löschen! 2. Wo immer bei dir folgendes auftaucht, wie folgt abändern:
Delphi-Quellcode:
mal neben bei, wäre eine Listbox oder ein memo nicht praktischer?
StringGrid1.RowCount := d.length; // <-- Du hast vergessen die ANzahl der Zeilen anzupassen ... deswegen wurde nix ausgegeben
FOR i:=1 TO d.length DO StringGrid1.Cells[0,i-1]:=d.at(i); // <-- zudem hast du die Zeilen und Spalten vertauscht, immer erst X, dann Y // außerdem fangt ein Stringgrid immer bei 0 an |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz