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 <> nilAND (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 user profile iconNarses: 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

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.lb(Sender: TObject; D_Listbox: TListbox);
begin
  if (D_Listbox != nilAND (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. :)