Autor Beitrag
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Di 29.06.10 02:39 
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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 90
Erhaltene Danke: 4

Win XP
Delphi 7 Enterprise
BeitragVerfasst: 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:
ausblenden 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

_________________
Liebe Kinder, es stimmt ... solnage auch nur der ertse und lezte Bchutsabe rihctig ist und alle andreen Bcuhsatben irgendwie vorahnden sind,
dann knan man es dennonch lesen, also macht nur weiter so, wir verstehen euch schon

Für diesen Beitrag haben gedankt: trm
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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)
ausblenden 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:

ausblenden 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.

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.


Zuletzt bearbeitet von elundril am Di 29.06.10 15:48, insgesamt 1-mal bearbeitet
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: 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).

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Di 29.06.10 13:24 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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.^^

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)

Für diesen Beitrag haben gedankt: trm
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Di 29.06.10 15:47 
:oops: Upps, das passiert dann wohl wenn man gerade dabei ist C++ zu lernen. Habs mal oben korrigiert. :)

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.