Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Objektzeiger zuweisen


schlumsch - Di 26.10.04 09:06
Titel: Objektzeiger zuweisen
Hallo allerseits...

also ich bau mir nen Objekt meines Tpys und speichere dieses in `ner Listbox und in einer eigenen Liste vom Typ TList. Dann will ich beim anklicken auf die Listbox einfach nur das das programm meine liste durchsucht und wenn es das gewählte objekt findet (identifiziert nach der Eingenschaft "Name") soll es "Laut geben"
(sowohl die Liste wie auch das Objekt sind vorsichtshalber globale Variablen)
Beim Zugriff auf Tmp_objekt.name krieg ich aber ne Fehlermeldung, weis wer wieso und wie das zu beheben ist?
Tmp_Objekt is doch auch nur ein Zeiger aufs Objekt, genmauso wie der TListinhalt - also müsst ich das doch zuweisen können oder?




Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
Var ToDoObjekt : TToDo;
todo_objekte_liste : TList;
...

procedure TAlarmform.BitBtn_hinzufuegenClick(Sender: TObject);   
begin   
 if todo_objekte_liste = NIL then todo_objekte_liste := TList.create;   
 ToDo_Objekt := TToDo.create;   
 ToDo_Objekt.Kategorie := 'NIL';   
 ToDo_Objekt.Text := 'NIL';   
 ToDo_Objekt.AnzeigeText := 'NIL';   
 ToDo_Objekt.Name := 'NIL';   
 ToDo_Objekt.Kategorie := Edit_todo_kategorie.text; // werte --> Objekt   
 ToDo_Objekt.Anzeigetext :=  Edit_todo_anzeigetext.text;   
 ToDo_Objekt.text :=  Memo_todo_text.Text;   
 todo_objekte_liste.add(ToDo_Objekt);              // objekt --> objekteliste   
 ListBox_todo.items.addobject(ToDo_Objekt.Kategorie + '-->' + ToDo_Objekt.Anzeigetext, ToDo_Objekt);   
 todo_objekt.Name := 'TDO'+inttostr((Listbox_todo.items.IndexOfObject(ToDo_Objekt))); // Objektname abh. von position in Listbox   
 showmessage('Objektname :' + Todo_objekt.name)   
 end;

procedure TAlarmform.ListBox_todoClick(Sender: TObject);   
Var Tmp_Objekt : TToDo;   
             i : word;
begin   
 if Listbox_todo.ItemIndex <> -1 then   
 begin   
  Tmp_Objekt := TToDo.create;   
  for i := 0 to (todo_objekte_liste.count-1do   
  begin   
    Tmp_Objekt := TToDo(todo_objekte_liste.items[i]);   
    if Tmp_Objekt.Name = ('TDO'+inttostr(Listbox_todo.itemindex)) then  // <-- ERROR!!!   
    showmessage('bla');   
  end;   
  Tmp_objekt.free;   
 end;   
end;


Moderiert von user profile iconMotzi: Code- durch Delphi-Tags ersetzt.


dmx - Do 04.11.04 00:29

hallo,

nun, eine instanz deiner TToDo-klasse existiert doch schon. darum brauchst du beim zugriff darauf auch keine neue instanz mit "Tmp_Objekt := TToDo.create;" zu erzeugen.
vorausgesetzt alle zeiger der todo_objekte_liste zeigen auf existierende objekte, aber das sollte eigentlich der fall sein, soweit ich das erkennen kann.

gruß, dmx.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
rocedure TAlarmform.ListBox_todoClick(Sender: TObject);
Var Tmp_Objekt : TToDo;
             i : word;
begin
 if Listbox_todo.ItemIndex <> -1 then
 begin
  //Tmp_Objekt := TToDo.create;
  for i := 0 to (todo_objekte_liste.count-1do
    if TToDo(todo_objekte_liste[i]).Name = ('TDO'+inttostr(Listbox_todo.itemindex)) then
      showmessage('bla');
  //Tmp_objekt.free;
 end;
end;