AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit TList

Ein Thema von stevewilson · begonnen am 21. Okt 2006 · letzter Beitrag vom 21. Okt 2006
Antwort Antwort
Seite 1 von 2  1 2      
stevewilson

Registriert seit: 21. Okt 2006
16 Beiträge
 
Delphi 7 Professional
 
#1

Probleme mit TList

  Alt 21. Okt 2006, 13:42
Hallo,

bin momentan beim Entwickeln eines Musik-CD-Verwaltungsystems unter Delphi.
Ich verwende dabei bewusst(!) keine Datenbankkomponenten, sondern speichere die CDs in eine TList, die ich dann später in eine Datei schreiben will. Ich habe aber schon Probleme beim Aufruf von:

cdList.add(cd) ist die Liste leer, das kann ich sehr gut im Debugger am Eintrag () sehen, wobei ich beim Zufügen von 2 Elementen auf die Indizes 0 und 1 zugreifen kann, mir der spätere Aufruf von:

cd := cdList[0]; oder auch:

Delphi-Quellcode:
Code:
cd := TCD(cdList[1]);
aber nichts neues zurückliefert, sondern das beibehalten wird, was vorher in "cd" drin stand.

Hier der gesamte Quellcode:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, Grids, StdCtrls, Contnrs;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Beenden1: TMenuItem;
    Hilfe1: TMenuItem;
    Info1: TMenuItem;
    ListBox1: TListBox;
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Edit4: TEdit;
    Label4: TLabel;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Speichern1: TMenuItem;
    Speichernals1: TMenuItem;
    Beenden2: TMenuItem;
    Neu1: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Button8: TButton;
    procedure Info1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Beenden2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TCd = class(TObject)
    interpreter : string;
    albumTitle : string;
    genre : string;
    songTitles : TStringList;
  private
    procedure setValues(interpreter, albumTitle, genre : string);
    procedure addTitel(songTitles : TStringList);
end;

var
  cd : TCd;
  cdList : TList;

procedure TForm1.Info1Click(Sender: TObject);
begin
  //messageBox();
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  //Zeilen benennen
  with stringGrid1 do
  begin
    colWidths[0] := 30; //Breite der fixen Nr-Spalte verringern
    cells[0, 0] := 'Nr.';
    cells[1, 0] := 'Interpret';
    cells[2, 0] := 'Albumtitel';
    cells[3, 0] := 'Genre';
    options := [goFixedVertLine, goFixedHorzLine, goHorzLine,
                goVertLine, goColSizing];
    //goColSizing = Spaltenbreite einstellbar
    //goVertLine/goHorzLine = Gitternetz-Linien erscheinen
  end;
  cdList := TList.create; //richtig?
  cd := TCD.create;
end;


procedure TForm1.Button5Click(Sender: TObject);
begin
  close;
end;

//Zum Bearbeiten und Erstellen einer CD
procedure TCd.setValues(interpreter, albumTitle, genre : string);
begin
  cd.interpreter := interpreter;
  cd.albumTitle := albumTitle;
  cd.genre := genre;
end;

//Zum Hinzufügen von Titeln zur aktuellen CD
procedure TCd.addTitel(songTitles : TStringList);
begin
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  cd.free;
  cdList.free;
end;

//Button "CD hinzufuegen"
procedure TForm1.Button1Click(Sender: TObject);
var s : TStringList;
begin
  cd.setValues(edit1.text, edit2.text, edit3.text);
{  s.create;
  s.add('a');
  cd.songTitles := s;}

  cdList.add(cd); //funktioniert nicht??
  stringGrid1.cells[1, 1] := cd.interpreter;
  stringGrid1.cells[2, 1] := cd.albumTitle;
  stringGrid1.cells[3, 1] := cd.genre;
  edit1.text := intToStr(stringGrid1.rowCount);

end;

procedure TForm1.Beenden2Click(Sender: TObject);
begin
  close;
end;


procedure TForm1.Button8Click(Sender: TObject);
begin
  cd := cdList[0]; //geht nicht??
  stringGrid1.cells[1, 3] := cd.interpreter;
  stringGrid1.cells[2, 3] := cd.albumTitle;
  stringGrid1.cells[3, 3] := cd.genre;
  cd := TCD(cdList[1]); //geht auch nicht??
  stringGrid1.cells[1, 4] := cd.interpreter;
  stringGrid1.cells[2, 4] := cd.albumTitle;
  stringGrid1.cells[3, 4] := cd.genre;

end;


end.
Gruß
stevewilson
  Mit Zitat antworten Zitat
Kinimod8

Registriert seit: 9. Jan 2004
Ort: Barsbüttel
317 Beiträge
 
Delphi 6 Personal
 
#2

Re: Probleme mit TList

  Alt 21. Okt 2006, 14:16
Schau' dir vieleicht erst mal das TList-Tutorial der DSDT an.
Dominik Peters
  Mit Zitat antworten Zitat
stevewilson

Registriert seit: 21. Okt 2006
16 Beiträge
 
Delphi 7 Professional
 
#3

Re: Probleme mit TList

  Alt 21. Okt 2006, 15:29
Hallo,

sorry, aber das hilft mir nicht weiter, jetzt ich aus CD einen pointer gemacht, mit:

Delphi-Quellcode:
var
  cd : ^TCd;
Aber das hier wirft auch wieder ne Invalidpointer-Exception:

cdList.add(cd); Das muss doch sowieso ohne Pointer gehen, die TList verwendet doch schon nen Pointerarray
in seiner inneren Struktur.

Wobei, die add-methode ja schon nen Pointer will...
Aus dem Tutorium werde ich nicht schlauer...
Gruß
stevewilson
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Probleme mit TList

  Alt 21. Okt 2006, 15:31
Arbeite doch einfach mit der TObjectList aus der Unit Contnrs.
Oder mit der von meiner Homepage
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
stevewilson

Registriert seit: 21. Okt 2006
16 Beiträge
 
Delphi 7 Professional
 
#5

Re: Probleme mit TList

  Alt 21. Okt 2006, 15:54
Ja, schön,

hätte ich ja gerne gemacht. aber dann schreibt er in cdList wieder nix rein,
der fehler muss irgendwo in der "procedure TForm1.Button1Click(Sender: TObject)" sein.

guckt euch das mal an:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, Grids, StdCtrls, Contnrs;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Beenden1: TMenuItem;
    Hilfe1: TMenuItem;
    Info1: TMenuItem;
    ListBox1: TListBox;
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Edit4: TEdit;
    Label4: TLabel;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Speichern1: TMenuItem;
    Speichernals1: TMenuItem;
    Beenden2: TMenuItem;
    Neu1: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Button8: TButton;
    procedure Info1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Beenden2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TCd = class(TObject)
    interpreter : string;
    albumTitle : string;
    genre : string;
    songTitles : TStringList;
  private
    procedure setValues(interpreter, albumTitle, genre : string);
    procedure addTitel(songTitles : TStringList);
end;

var
  cd : TCd;
  cdList : TObjectList;

procedure TForm1.Info1Click(Sender: TObject);
begin
  //messageBox();
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Zeilen benennen
  with stringGrid1 do
  begin
    colWidths[0] := 30; //Breite der fixen Nr-Spalte verringern
    cells[0, 0] := 'Nr.';
    cells[1, 0] := 'Interpret';
    cells[2, 0] := 'Albumtitel';
    cells[3, 0] := 'Genre';
    options := [goFixedVertLine, goFixedHorzLine, goHorzLine,
                goVertLine, goColSizing];
    //goColSizing = Spaltenbreite einstellbar
    //goVertLine/goHorzLine = Gitternetz-Linien erscheinen
  end;
  cdList := TObjectList.create; //richtig?
  cd := TCD.create;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  close;
end;

//Zum Bearbeiten und Erstellen einer CD
procedure TCd.setValues(interpreter, albumTitle, genre : string);
begin
  cd.interpreter := interpreter;
  cd.albumTitle := albumTitle;
  cd.genre := genre;
end;

//Zum Hinzufügen von Titeln zur aktuellen CD
procedure TCd.addTitel(songTitles : TStringList);
begin
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  cd.free;
  cdList.free;
end;

//Button "CD hinzufuegen"
procedure TForm1.Button1Click(Sender: TObject);
var s : TStringList;
begin
  cd.setValues(edit1.text, edit2.text, edit3.text);
{  s.create;
  s.add('a');
  cd.songTitles := s;}

  cdList.add(cd); //funktioniert nicht??
  stringGrid1.cells[1, 1] := cd.interpreter;
  stringGrid1.cells[2, 1] := cd.albumTitle;
  stringGrid1.cells[3, 1] := cd.genre;
  edit1.text := intToStr(stringGrid1.rowCount);
end;

procedure TForm1.Beenden2Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
  cd := TCD(cdList[0]); //geht nicht??
  stringGrid1.cells[1, 3] := cd.interpreter;
  stringGrid1.cells[2, 3] := cd.albumTitle;
  stringGrid1.cells[3, 3] := cd.genre;
  cd := TCD(cdList[1]); //geht auch nicht??
  stringGrid1.cells[1, 4] := cd.interpreter;
  stringGrid1.cells[2, 4] := cd.albumTitle;
  stringGrid1.cells[3, 4] := cd.genre;
end;

end.
Gruß
stevewilson
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Probleme mit TList

  Alt 21. Okt 2006, 16:14
Dein Problem liegt einfach nur darin, dass du nur eine Instanz für den Eintrag (cd) anlegst. Wenn du nur eine Instanz hast, liegt in TList auch in beiden Einträgen die selbe Instanz. Somit überschreibst du dir selber die Daten beim zuweisen. Du brauchst pro Eintrag eine eigene Instanz der Klasse TCd.
  Mit Zitat antworten Zitat
stevewilson

Registriert seit: 21. Okt 2006
16 Beiträge
 
Delphi 7 Professional
 
#7

Re: Probleme mit TList

  Alt 21. Okt 2006, 16:18
Hallo,

ist das denn dann richtg? Irgendwie bekomme ich jetzt eine EAccesViolation


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var s : TStringList;
begin
  cd := TCD.create;
  cd.setValues(edit1.text, edit2.text, edit3.text);
{  s.create;
  s.add('a');
  cd.songTitles := s;  }

  cdList.add(cd); //funktioniert nicht??
  stringGrid1.cells[1, 1] := cd.interpreter;
  stringGrid1.cells[2, 1] := cd.albumTitle;
  stringGrid1.cells[3, 1] := cd.genre;
  edit1.text := intToStr(stringGrid1.rowCount);
  cd.free;
end;
Gruß
stevewilson
  Mit Zitat antworten Zitat
stevewilson

Registriert seit: 21. Okt 2006
16 Beiträge
 
Delphi 7 Professional
 
#8

Re: Probleme mit TList

  Alt 21. Okt 2006, 16:22
Hab jetzt diesen Teil auch angepasst:

Delphi-Quellcode:
procedure TForm1.Button8Click(Sender: TObject);
begin
  cd := TCD.create;
  cd := TCD(cdList[0]); //geht nicht??
  stringGrid1.cells[1, 3] := cd.interpreter;
  stringGrid1.cells[2, 3] := cd.albumTitle;
  stringGrid1.cells[3, 3] := cd.genre;
  cd.free;
  cd := TCD.create;
  cd := TCD(cdList[1]); //geht auch nicht??
  stringGrid1.cells[1, 4] := cd.interpreter;
  stringGrid1.cells[2, 4] := cd.albumTitle;
  stringGrid1.cells[3, 4] := cd.genre;
  cd.free;
end;
aber jetzt schreibt er nichts mehr in die Stringgrid.
Gruß
stevewilson
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Probleme mit TList

  Alt 21. Okt 2006, 16:26
Mal eine Frage zu diesem Code:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var s : TStringList;
begin
  cd := TCD.create;
  cd.setValues(edit1.text, edit2.text, edit3.text);
{  s.create;
  s.add('a');
  cd.songTitles := s;  }

  cdList.add(cd); //funktioniert nicht??
  stringGrid1.cells[1, 1] := cd.interpreter;
  stringGrid1.cells[2, 1] := cd.albumTitle;
  stringGrid1.cells[3, 1] := cd.genre;
  edit1.text := intToStr(stringGrid1.rowCount);
  cd.free;
end;
Wenn du oben die Instanz anlegst und der Liste hinzufügst, aber unten mit cd.Free die Instanz wieder freigibst - was meinst du denn, liegt in der Liste drinne?

Richtig - ein Verweis auf die Instanz die nicht mehr existiert, da du diese ja mit Free schon freigegeben hast. Somit kannst du schlecht nochmal irgendwas aus der Liste wieder rausholen...
  Mit Zitat antworten Zitat
stevewilson

Registriert seit: 21. Okt 2006
16 Beiträge
 
Delphi 7 Professional
 
#10

Re: Probleme mit TList

  Alt 21. Okt 2006, 16:34
Ja, das dachte ich mir schon. Aber wie kriege ich das dann hin, ohne einen Array für "cd" zu verwenden?
es muss doch irgendwie möglich sein, ohne pointer bzw. dynamische arrays zu verwenden, ich wollte streng objektorientiert programmieren...
Gruß
stevewilson
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:08 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