Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zugriff auf 2 Komponenten (https://www.delphipraxis.net/204282-zugriff-auf-2-komponenten.html)

MicMic 14. Mai 2020 15:32

Delphi-Version: 10.3 Rio

Zugriff auf 2 Komponenten
 
Sorry, mir ist kein besserer Titel eingefallen.
Ich habe 2 Listboxen, die ich auch hier und da außerhalb ansprechen muss.
Also das geht dann so etwa (als Beispiel):
Delphi-Quellcode:
//im Class Bereich
ListBox1 : TListBox;
ListBox2 : TListBox;

Procedure TFrom.PanelMouseMove(Sender: TObject...
Var LB : TListBox;
Begin
 If TPanel(Sender).Name = 'N1'
  Then LB := ListBox1
  Else LB := ListBox2;

  // Hier kann ich dann auf die Listbox die ich möchte zugreifen.
  // LB.Width oder LB.Hide usw.
  // Dies vereinfacht vieles für mich

  LB.Free; // <- dies geht nicht
End;
Wenn ich "LB.Free" weglasse, geht alles. Irgendwie gefällt mir das sowieso nicht, hier ein ".Free" zu machen. Ist nicht ganz logisch. Aber was passiert mit "LB" (in diesem Fall) ?

himitsu 14. Mai 2020 15:38

AW: Zugriff auf 2 Komponenten
 
LB ist ein Zeiger, der zeigt nur auf was und es können mehrere drauf zeigen.

Free gibt aber das EINE frei, auf das alle zeigen.

Du darfst gern
Delphi-Quellcode:
LB := nil;
machen, aber ist nicht nötig.



Zitat:

dies geht nicht
Doch, es geht, aber dann ist die jeweilige ListBox weg. :angle2:

PS:
Delphi-Quellcode:
if Sender = N1 then
bietet etwas mehr Schutz, da hier der Compiler gleich anmeckert, sollte es N1 mal nicht mehr geben.

MicMic 14. Mai 2020 15:55

AW: Zugriff auf 2 Komponenten
 
Danke für die schnelle Info. Dann mach ich ja alles richtig :)
Aber wegen
Delphi-Quellcode:
if Sender = N1 then
... das geht so nicht. "N1" ist ja ein Name, also der Komponentenname vom TPanel (String). So prüfe ich halt, welche ListBox gerade verarbeitet wird/werden muss. Jedenfalls spare ich mir viel Code, wenn ich mir die ListBox in LB zuweise (wie im Beispiel). Nutze auch oft "TListBox(Object). ..." um weniger Code zu haben aber das geht nicht immer. Es kommt halt drauf an... deswegen manchmal das mit dem "LB".
Schönen Abend wünsch ich noch.

DieDolly 14. Mai 2020 16:02

AW: Zugriff auf 2 Komponenten
 
Zitat:

Aber wegen if Sender = N1 then ... das geht so nicht.
Zitat:

So prüfe ich halt, welche ListBox gerade verarbeitet wird/werden muss.
Genau das will himitsu dir ja beibringen - undzwar wie man es richtig macht.

himitsu 14. Mai 2020 16:19

AW: Zugriff auf 2 Komponenten
 
Jupp, "N1" ist der Name, und es gibt standardmäßig auch eine Variable, welche "zufällig" genauso heißt, ebenso wie bei deiner
Delphi-Quellcode:
ListBox1 : TListBox;
.

Der Inhalt vom String
Delphi-Quellcode:
"N1"
interessiert den Compilier nicht, so lange die Syntax für einen "String" korrekt ist,
aber ob es die Variable N1 gibt, dass bekommt der Compiler mit. Wenn nicht, dann meckert er brav, z.B. wenn jemand auf Idee kommen sollte dem Panel einen besseren Namen zu geben. :zwinker:

MicMic 15. Mai 2020 13:48

AW: Zugriff auf 2 Komponenten
 
Also ich mach doch nicht alles richtig :) *grins
Ich ändere zwar nicht die Komponentennamen aber klar, ich hab unrecht, himitsu hat recht :) Es geht natürlich so *hihi
Ich mach's dann mal "richtig" :) Dankeschön
Schönes Wochenende

Micha

himitsu 15. Mai 2020 14:07

AW: Zugriff auf 2 Komponenten
 
Vieles ist möglich, aber nicht alles sollte man machen und eine typsichere Programmierung beugt einfach so vielen Gefahren vor, sodass es nie verkehrt ist sich dieser Arbeitsweise möglichst anzunehmen.

Sag niemals nie, da es schneller passiert, als du denkst. Vielleicht schon morgen oder in paar Jahren. :zwinker:


Und wenn das z.B. Panels mit je einer ListBox drauf sind:
Delphi-Quellcode:
Procedure TFrom.PanelMouseMove(Sender: TObject...
Var LB : TListBox;
Begin
  LB := TListBox(TPanel(Sender).Controls[0]);
oder sicherheitshalber via
Delphi-Quellcode:
LB := (Sender as TPanel).Controls[0] as TListBox;
,
vielleicht noch gefolgt von einem
Delphi-Quellcode:
Assert(Assigned(LB));
, bzw.
Delphi-Quellcode:
Assert(Assigned(LB), 'irgendwas als Hinweis');
.

MicMic 17. Mai 2020 08:51

AW: Zugriff auf 2 Komponenten
 
@himitsu
Danke noch für die Info mit "(Sender as TPanel).Controls[0]" usw.
Sicherlich könnte ich noch so einiges optimieren aber gerade hier (mit solchen "Parent" Dingen) würde man wohl manchmal den Überblick verlieren. Meine ListBox ist auch ziemlich erweitert... da passiert viel. Sogar eigene Scrollleisten aus TPanels habe ich. Jetzt wo ich recht weit bin, ärgere ich mich ein wenig, dass ich keine neue ListBox-Komponente gemacht habe, sondern im Code selber alles erweitert habe. Überblick behalte ich nur mit viel viel Kommentarzeilen und es kommt auch vor, da steh ich vor einer Codezeile und frage mich "was hab ich denn da gemacht?" :) *grins* und muss mir mein eigener Code wieder ein wenig genauer anschauen bis ich es wieder verstehe *lach


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz