Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi dynamische listen--> HILFE ! ! ! (https://www.delphipraxis.net/22733-dynamische-listen-hilfe.html)

brutus 22. Mai 2004 15:49


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:
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.
hier ist die database

Delphi-Quellcode:
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.
und das is die UTData:

Delphi-Quellcode:
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.
BITTE HELFT MIR SONST LAUF ICH NOCH AMOK ! ! ! :wall: :wall: :wall: :wall: :wall: :wall:

StefanDP 22. Mai 2004 15:55

Re: dynamische listen--> HILFE ! ! !
 
Kannst du noch sagen, wo der Fehler / das Problem liegt?

brutus 22. Mai 2004 15:57

Re: dynamische listen--> HILFE ! ! !
 
naja das programm gibt nichts aus und stürzt ab und zu ab.

alcaeus 22. Mai 2004 15:57

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]

StefanDP 22. Mai 2004 15:58

Re: dynamische listen--> HILFE ! ! !
 
was bringt eigentlich:

Delphi-Quellcode:
d := TDAavdBL.create;
d.Create;
für was ist die 2te zeile gut?

alcaeus 22. Mai 2004 15:59

Re: dynamische listen--> HILFE ! ! !
 
Schau mal in die Deklaration der Klasse, dort setzt er in Create zwei Pointer auf nil.

brutus 22. Mai 2004 15:59

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

alcaeus 22. Mai 2004 16:08

Re: dynamische listen--> HILFE ! ! !
 
Zitat:

Zitat von brutus
p.s. die abstürze sind eingeplant :-D

Welche Abstürze?

Außerdem:
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
d.Destroy;
d.free;
end;
Du musst dich entscheiden: Destroy oder Free. Du kannst nämlich nur eines aufrufen, das andere wird danach einen Zugriffsfehler bringen.
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:
type
  dynListe = array of Typ;
Die Länge setzt du mit SetLength(Array, Länge), der Index beginnt bei 0.

xineohp 22. Mai 2004 16:09

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.

brutus 22. Mai 2004 16:11

Re: dynamische listen--> HILFE ! ! !
 
na ich wollte mit hilfe von listen ein dynamisches array simulieren!!

xineohp 22. Mai 2004 16:27

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.

brutus 22. Mai 2004 16:51

Re: dynamische listen--> HILFE ! ! !
 
Zitat:

Zitat von xineohp
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.

naja eigentlich ist es ja eine schulaufgabe (ich sehe auch keinen sinn darin).
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)

alcaeus 22. Mai 2004 17:07

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.

xineohp 22. Mai 2004 17:25

Re: dynamische listen--> HILFE ! ! !
 
wenn mich nicht alles täuscht ruft free destroy auf, oder umgekehrt ...

xineohp 22. Mai 2004 17:26

Re: dynamische listen--> HILFE ! ! !
 
ok, für Schulaufgaben hab ich immer Verständniss ... die sind selten sinnvoll ;)

Chewie 22. Mai 2004 17:31

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).

nailor 22. Mai 2004 17:31

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

xineohp 22. Mai 2004 17:43

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:
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
mal neben bei, wäre eine Listbox oder ein memo nicht praktischer?


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