![]() |
TList + Exception
Hallo erstmal! Ich hoffe mir kann jemand mit dem Problem helfen... Habe schon stundenlang gesucht und ich finde einfach keine Antwort auf meine Frage. Ebenso finde ich überhaupt kein sinnvolles Tutorial, welche einem zeigt, wie man Objekte mit einer TList oder TObjectList passend verwendet. Hoffe mir kann jemand sagen, was falsch ist... Der unten stehende Code zeigt die Klassendeklaration und die Erzeugung der Klasseninstanzen. Na ja einfach mal drüber gucken...
Delphi-Quellcode:
Das sind die OnCreate und OnClose Aufrufe :Kleine Testklasse : type TBenutzer_Objekt = class(TObject) private // FBenutzerStatus : Integer; FBenutzerNummer : Integer; FBenutzername : String; FBenutzervewaltungsliste : TList; Methode : public procedure Baue_Benutzerverwaltungs_Liste(Benutzer_Login_Namen : String); procedure Gebe_Speicher_Fuer_Benutzerverwaltungsliste_Frei; end; Methodenfunktionalität : procedure TBenutzer_Objekt.Baue_Benutzerverwaltungs_Liste(Benutzer_Login_Namen : String); var Temp_Liste : TStringList; // Temporäre Stringliste i : Integer; // Zählvariable Trenner : Integer; // Die Kommatapositionen mit Pos ermitteln PBenutzer_Objekt : ^TBenutzer_Objekt; // Zeiger auf die Klasseninstanzvariable Zu_Extrahierende_String : String; // Stringlisteneintrag wird umkopiert, und dann wird aus dem String gelöscht Benutzername : String; // Temporäre Benutzervariable Benutzernummer : Integer; // Temporäre Benutzervariable begin Temp_Liste := TStringList.Create; // Stringliste erzeugen Temp_Liste.Text := Benutzer_Login_Namen; // Inhalt in die temporäre Stringliste kopieren if FBenutzervewaltungsliste = nil then FBenutzervewaltungsliste := Tlist.Create; Zu_Extrahierende_String := Temp_Liste.Text; // Inhalt umkopieren for i := Temp_Liste.Count-1 downto 0 do // Stringliste durchgehen begin New(PBenutzer_Objekt); // Ein neues Listenobjekt erzeugen Trenner := pos(',',Zu_Extrahierende_String); Benutzername := Copy(Zu_Extrahierende_String,1,Trenner-1); // Benutzernamen kopieren delete(Zu_Extrahierende_String,1,Trenner); Benutzernummer := StrToInt(Copy(Zu_Extrahierende_String,1,4)); // Benutzernummer kopieren PBenutzer_Objekt.FBenutzername := Benutzername; // Benutzernamen zuweisen -> Hier kracht es immer... Wieso? Werde auch nicht aus den Beiträgen hier schlau... PBenutzer_Objekt.FBenutzerNummer := Benutzernummer; // Benutzernummer zuweisen FBenutzervewaltungsliste.Add(PBenutzer_Objekt); // Listenobjekt zur Liste hinzufügen end; FreeAndNil(Temp_Liste); // Speicher freigeben end;
Delphi-Quellcode:
Im OnCreate Event steht das Benutzer_Objekt := TBenutzer_Objekt.Create; Hiermit habe ich doch die Klasseninstanz erzeugt, oder? Im OnClose FreeAndNil(Benutzer_objekt); Wollte zuerst auch ein dynamisches Array verwenden, aber die Tlist eignet sich für den späteren Ausbau einfach mehr. Hoffe jemand wäre bereit mir den Fehler zu erklären oder einen Forumlink oder einen Tutoriallink zu schicken. Danke im voraus Gruß Matthias |
Re: TList + Exception
Du könntest uns noch sagen, welche Exception wo auftritt.
|
Re: TList + Exception
1. durch den code blick ich gar nicht durch
2. was genau hast du in deiner liste? 3. was für eine exception? wo? |
Re: TList + Exception
Delphi-Quellcode:
Da sollte stehen
PBenutzer_Objekt.FBenutzername := Benutzername; // Benutzernamen zuweisen -> Hier kracht es immer... Wieso?
Werde auch nicht aus den Beiträgen hier schlau...
Delphi-Quellcode:
Zur Erklärung: PBenutzer_Objekt ist ein Zeiger, der hat keine Eigenschaft FBenutzername - die hat nur das Objekt auf den der Zeiger zeigt, also PBenutzer_Objekt^.
PBenutzer_Objekt^.FBenutzername := Benutzername;
Insgesamt ist Deine Methode aber nicht sehr zeitgemäß - so hat man 1990 programmiert. Evtl. schreib ich mal den Code um und schick ihn dir gleich. |
Re: TList + Exception
Pointer werden implizit dereferenziert. ;)
|
Re: TList + Exception
Zitat:
Eine Klasse erzeugst Du, indem du ihre Create-Methode aufrufst - das aber von außen und nicht im Create!! Das jetzt genauer zu erklären ist zu aufwendig - schau Dir mal ein gutes Buch oder ein gutes Tutorial über objektorientiertes Programmieren an. |
Re: TList + Exception
Zitat:
|
Re: TList + Exception
tatsächlich, astrein ist das nicht...
@bttb930: Doch, typisierte Pointer, insbesondere auf records, werden beim Zugriff auf Eigenschaften implizit dereferenziert. Aber so wies hier ist machts natürlcih null Sinn.... :lol: |
Re: TList + Exception
Ich versteh jetzt gar nicht mehr. Sorry, aber ich habe hier ein Buch zuhause ... Ungefähr 1000 Seiten. Delphi 4 Kochbuch, dort steht nix drinne...
Wenn mir jemand ein gutes Buch empfehlen kann, dann wäre das sehr hilfreich. In meinem Buch finde ich auch keine Hilfe zu dem Problem. Und die Tutorials sind auch alle sehr schlecht, um das Programmieren mit Klassen und Co zu erlernen... Na ja dann muss ich mich halt gedulden... Danke für die Antwort... Gruß MAtthias |
Re: TList + Exception
So würde ich das machen:
Delphi-Quellcode:
Irgendwie so. Memo ist natürlich ein Memo-Feld auf dem Form. Woher MeineBenutzerListe kommt weiß ich nicht genau - die hast Du ja.
type
TBenutzer = class private FName: string; FNummer: Integer; public constructor: Create(const aString: string); property Name: string read FName; property Nummer: Integer read FNummer; end; TBenutzerListe = class private List: TList; public constructor Create; destructor Destroy; procedure Initialize(const ABenutzerListe: string); function GetBenutzer(I: Integer): TBenutzer; function GetCount: Integer; property Benutzer[i: Integer]: TBenutzer read GetBenutzer; default; property Count: Integer read GetCount; end; constructor TBenutzer.Create(const aString: string); begin FName := Copy(aString, 1, Pos(',', aString)-1); FNummer := StrToInt(Copy(aString, Pos(',', aString)+1, Length(aString))); end; constructor TBenutzerListe.Create; begin inherited; List := TList.Create; end; destrucotr TBenutzerListe.Destroy; begin inherited; List.Free; end; function TBenutzerListe.GetBenutzer(I: Integer): TBenutzer; begin Result := List[i] as TBenutzer; end; function TBenutzerListe.GetCount: Integer; begin Result := List.Count; end; procedure TBenutzerListe.Initialize(const ABenutzerliste: string); var temp: TStringList; i: Integer; begin temp := TStringList.Create; try temp.Text := ABenutzerListe; for i := 0 to temp.Count-1 do List.Add(TBenutzer.Create(temp[i])); finally temp.Free; end; end; procedure FormButton1Click(Sender: TObject); var BenutzerListe: TBenutzerListe; i: Integer; begin BenutzerListe := TBenutzerListe.Create; BenutzerListe.Initialize(MeineBenutzerListe); for i := 0 to BenutzerListe.Count-1 do Memo.Lines.Add(Format('%s -> %d', (BenutzerListe[i].Name, BenutzerListe[i].Nummer])); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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