Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Zeiger auf verschiedene TObjecte mittels einer Variable..
trm - Di 29.06.10 02:39
Titel: Zeiger auf verschiedene TObjecte mittels einer Variable..
Hi.
Im Moment ist mein Kopf leer, daher diese Frage:
Ich habe 2 Listboxen (Listbox1 und Listbox2.
Diese möchte ich je nach Gebrauch nutzen.
Aber statt zweimal den gleichen Code für jede Listbox zu schreiben, wollte ich einen Zeiger nutzen und entsprechend auf listbox1 oder listbox2 setzen.
Nur leider klappt folgendes nicht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| var Dummy_ListBox: ^TListBox; begin
Dummy_ListBox := nil; if ListBox1.Visible then Dummy_ListBox := @ListBox1; if ListBox2.Visible then Dummy_ListBox := @ListBox2; if Dummy_ListBox = nil then Exit;
if Sender = Panel_Delete then Dummy_ListBox^.DeleteSelected;
Dummy_ListBox.Free;
end; |
Wo ist denn mein Denkfehler :( ?
Gruß Mathias
Edit:
Das hier geht auch nicht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var Dummy_ListBox: TObject; begin
Dummy_ListBox := nil; if ListBox1.Visible then Dummy_ListBox := ListBox1; if ListBox2.Visible then Dummy_ListBox := ListBox2; if Dummy_ListBox = nil then Exit;
if Sender = Panel_Delete then (Dummy_ListBox as TListBox).DeleteSelected; |
MaPsTaR - Di 29.06.10 03:05
Hallo,
was bedeutet "klappt nicht" und "geht nicht"??
Könntest du noch kurz beschreiben WAS nicht geht, Fehlermeldungen nennen, ...??
EDIT:
vielleicht ist das die Lösung für dein Problem:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var Dummy_ListBox: Pointer; begin Dummy_ListBox := nil; if ListBox1.Visible then Dummy_ListBox := @ListBox1; if ListBox2.Visible then Dummy_ListBox := @ListBox2; if Dummy_ListBox = nil then Exit;
if Sender = Panel_Delete then TListBox(Dummy_ListBox^).DeleteSelected;
Dummy_ListBox := nil; end; |
Hab aber noch nicht so oft mit Pointern gespielt, kann sein, dass es noch schöner oder effektiver geht...
Bei mir hat es jedenfalls so geklappt.
Gruß Matthias
elundril - Di 29.06.10 04:55
Wenn man schon Referenzen hat, warum dann nicht mit denen herumspielen anstatt wie wild mit Pointern um sich zu schießen?
folgender Code funktioniert bei mir perfekt. (wenn man schon ne eigene procedure macht, kann man ja eigentlich auch die Listbox als Parameter übergeben, dann würd man sich den mist mit den referenzen sparen)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.lb(sender: TObject); var Dummy_ListBox: TListBox;
begin Dummy_ListBox := nil; if ListBox1.Visible then Dummy_ListBox := ListBox1; if ListBox2.Visible then Dummy_ListBox := ListBox2; if Dummy_ListBox = nil then Exit;
if (Sender = Panel_Delete) then Dummy_ListBox.items.add('a'); end; |
weil mir gerade fad ist, hier noch die variante mit dem parameter:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.lb(Sender: TObject; D_Listbox: TListbox); begin if (D_Listbox <> nil) AND (Sender = Panel_Delete) then D_Listbox.items.add('a'); end; |
Das .items.add('a'); hab ich beiden Fällen verwendet um zu sehen ob der code überhaupt was macht. Natürlich geht da auch jeder andere Befehl einer Listbox.
trm - Di 29.06.10 09:55
Danke für Eure Hilfe.
Leider hat weder das eine, noch das andere geholfen.
Bei Dummy_Listbox.Deleteselected; passiert einfach gar nichts = funktioniert nicht.
Bei einer anderen Aufgabe (den markierten Eintrag erhalten) kommt eine Fehlermeldung, dass der Listenindex das Maximum (-1) überschreitet, obwohl in der betreffenden Listbox etwas drin steht (Beispiel mit der Variante von MaPsTaR).
Delphi-Quelltext
1:
| TListBox(Dummy_ListBox^ ).Items[TListBox(Dummy_ListBox^).ItemIndex] := InputBox('', '', TListBox(Dummy_ListBox^).Items[TListBox(Dummy_ListBox^).ItemIndex]); |
Und elundril, Deine Möglichkeit hatte ich auch schon ausprobiert - da passiert gar nichts, es erscheint noch nicht mal eine Fehlermeldung.
Mein System: Windows7x64, Delphi7
Danke + Gruß
Mathias
---
Moderiert von
Narses: Beiträge zusammengefasst---
Edit:
Ich bin ein Depp :(
Es lag die ganze Zeit an mir.
Ich hatte aus Versehen zweimal dei gleiche Listbox zugewiesen. Und genau die eine war bisher leer, weil ich die nicht zum Testen benutzt hatte.
Heute morgen war ich schon zu müde.
Tut mir echt leid, dass ich mal wieder Eure Zeit verschwendet habe.
Hiermit habe ich jetzt ermittelt, welche Listbox ich überhaupt über den Pointer anspreche:
Delphi-Quelltext
1:
| showmessage(TListBox(Dummy_ListBox^).Name ); |
Damit hat sich die ganze Saxche erst einmal erledigt und alle Beispiele funktionieren.
Danke für Eure Hilfe und Geduld.
~Mathias
Hidden - Di 29.06.10 13:24
elundril hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.lb(Sender: TObject; D_Listbox: TListbox); begin if (D_Listbox != nil) AND (Sender = Panel_Delete) then D_Listbox.items.add('a'); end; | |
Natürlich müsste man unter Delphi noch <> nehmen, statt !=(afaik nur C-Syntax) :zwinker:
lg,
PS: Oh, gerade zum erte Mal einen schwarzen kasten gesehen :shock: Beitrag entfernt.^^
elundril - Di 29.06.10 15:47
:oops: Upps, das passiert dann wohl wenn man gerade dabei ist C++ zu lernen. Habs mal oben korrigiert. :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!