Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen (https://www.delphipraxis.net/174909-delphi-auf-komponente-zur-laufzeit-festgelegtem-frame-zugreifen.html)

Mazen 17. Mai 2013 12:54

Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen
 
Hallo Leute,
wahrscheinlich ist der Titel mehr als verwirrend, ich hoffe ich kann mein Anliegen trotzdem möglichst verständlich klar machen.

Ich möchte je nach ausgewähltem Item einer Combobox verscheidene andere Komponenten anzeigen. Wird z.B. Item 1 ausgewählt soll cbMenge und cbGewicht eingeblendet werden. Wird aber Item 2 ausgewählt soll nurnoch cbMenge angzeigt werden.

Das wäre jetzt ein Beispiel mit 2 Möglichen Optionen, aber in meinem Fall sind es mehrere.

Die einfachste Möglichkeit wäre wohl einfach mit der Visible Eigenschaft der jeweiligen Komponente zu arbeiten, aber ich möchte das nachfolgende Komponenten dann "nachrücken" um den freigewordenen Raum zu füllen. Und das kam mir etwas aufwändig vor.

Also habe ich für jedes Item der Combobox ein Frame angelegt mit entsprechenden Komponenten die sichtbar sein sollen.
Wie ich diese Frames einblende weiß ich schon, nur wie kann ich nun auf die in den Frames liegenden Komponenten zugreifen? Es ist ja nicht immer das gleiche Frame eingebunden.

Mein Ansatz sah so aus:
Wenn in der Combobox ein Item ausgewählt wird weise ich einer von mit angelegten Instanz der Klasse TFrame (frameEins) das entsprechende Frame zu.

Delphi-Quellcode:
  if liste = '16006' then
  begin
    frameEinst := frm16006;
  end else if liste = '16008' then
  begin
    frameEinst := frm16008;
  end;
Und so versuche ich dann auf die Komponenten der Frames zuzugreifen:

Delphi-Quellcode:
parameter[11] := frameEinst.cbMenge.Text;                                      
parameter[12] := frameEinst.cbGewicht.Text;
Nur bekomm ich dann natürlich die Meldung 'Undefinierter Bezeichner 'cbMenge' da diese Komponente zum Entwicklungszeitpunkt ja noch gar nicht in frameEinst ist.

Wie kann ich das lösen?

Gruß,
Matthias

stahli 17. Mai 2013 13:14

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen
 
Das Thema und die Optionen sind komplex und vielfältig...

Frames (oder eingebettete Formulare) sind gut und nützlich, wenn Du Controls kombinieren und mit einer einheitlichen GUI-Logik belegen willst.
So kannst Du das Frame (oder den Block) bei Bedarf erzeugen (ggf. auch mehrfach) und in Dein Projekt einsetzen (wie eine große Komponente).

Für Deinen Zweck erscheinen mir Frames nicht das optimale Mittel.
Offenbar willst Du von einer Menge Komponenten mal diese und mal jene aktivieren.
Insofern müsstest Du Deine cbMenge ggf. in mehrere Frame plazieren und (immer wieder gleich) behandeln.

Insofern wäre es evtl. zweckmäßiger, Blöcke von Controls auf eigene Panels zu legen, diese mit alTop auszurichten und je nach aktueller Situation deren Größe auf 0 zu ändern. Das würe sie entsprechend "ausblenden".
Im Panel.Tag könntest Du die aktuelle Höhe speichern und wenn das Panel wieder sichtbar werden soll, diese wieder herstellen.
Das Ganze dann über eine Funktion realisieren
Delphi-Quellcode:
ShowPanel(PanelX, SichtbarkeitX);
entsprechend nacheinander für alle Bereiche.

Zumindest wäre das evtl. eine Überlegung wert. Letztlich musst Du da einschätzen, wieviele Varianten möglich sind und wie das Ganze sich dann darstellen soll.

Frames wären auf jeden Fall zu bevorzugen, wenn die Einheiten mehrfach im Projekt verwendet würden oder eine sehr komplexe, situationsabhängige GUI-Logik nötig wäre.

sx2008 17. Mai 2013 13:22

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen
 
Zitat:

Zitat von stahli (Beitrag 1215645)
Insofern wäre es evtl. zweckmäßiger, Blöcke von Controls auf eigene Panels zu legen, diese mit alTop auszurichten und je nach aktueller Situation deren Größe auf 0 zu ändern

Oder man nimmt ein Pagecontrol mit entsprechend vielen Pages.
Zur Laufzeit setzt man alle
Delphi-Quellcode:
TabVisible
auf False:
Delphi-Quellcode:
 var
   page : integer;
 begin
   for page := 0 to PageControl1.PageCount - 1 do
   begin
     PageControl1.Pages[page].TabVisible := false;
   end;

Mazen 17. Mai 2013 13:26

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen
 
Danke schonmal für die Antworten :)

@stahli:

Das mit den Panels werde ich mal probieren. Nur habe ich dann nicht ein ähnliches Problem?
Ich habe verschiedene Panels die zum Teil gleiche Komponenten enthalten.

Dürfte es dann zum einen nicht Probleme geben mit mehrfach vergebenen Bezeichnern? Und zum Anderen wie greife ich dann wieder auf die Komponenten zu?

Ich habe panel1, panel2, panel3...
Wie komme ich dann auf die Werte von cbMenge? Wenn ich mir wieder ein "Dummy" anlegen was da heißt panelEinst vom Typ TPanel dann habe ich doch wieder genau das gleiche Problem oder?

@sx2008:

Das klingt auch gut, nur entweder mir entgeht hier grade was oder ich habe dann das gleiche Problem was ich auch bei dem Vorschlag von stahli und bei meinem Ansatz habe?

CarlAshnikov 17. Mai 2013 13:31

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen
 
Mein Vorschlag ist folgender:

Du leitest alle Frames von einem Grundframe ab, dass alle Werte (z.B. über 'ne Property) liefern kann und bei Nichtverfügbarkeit einen unsinnigen Wert liefert. Oder du schenkst jedem Frame eine Funktion, in welcher du fragen kannst welche Daten es tatsächlich liefern kann.

Aus welcher ComboBox die Daten geholt werden, kann dann im Frame definiert werden.

Sollte dein Aufbau hierarchisch sein, brauchst du die Abfragen der Boxen auch nur im jeweils ersten Frame zu definieren.

DeddyH 17. Mai 2013 13:34

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen
 
Das wollte ich auch gerade vorschlagen. Für einen ersten Ansatz kann man z.B. hier nachschauen, ob man den Konstruktor erweitert oder der Klasse neue Properties spendiert, ist für die Vorgehensweise ja unerheblich.

sx2008 17. Mai 2013 13:45

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen
 
Zitat:

Zitat von Mazen (Beitrag 1215647)
Das wäre jetzt ein Beispiel mit 2 Möglichen Optionen, aber in meinem Fall sind es mehrere.

Wie viele Varianten sind es denn genau und wie sehen diese aus?
Eine unterschiedliche Beschriftung zählt nicht als eigene Variante, denn die Beschriftung der Labels kann man auch zur Laufzeit setzen.

Hast du schon mal daran gedacht, ein Control für dimensionsbehaftete Werte zu erstellen?
Im Prinzip wäre das ein Editfeld für die Werteingabe gefolgt von einer Combobox mit der Dimension.
Dimension könnte sein Meter, cm, kg, g, Liter, m^2, Stück, Euro, USD, ...
Das könnte möglicherweise einen Teil deiner Probleme lösen.

stahli 17. Mai 2013 13:48

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen
 
Also aufwendig wird es in jedem Fall.

Mit der Lösung über PageControl kannst Du halt zwischen mehreren Seiten wechseln. Das Umschalten geht dann halt nicht über die Tabs mit der Maus sondern gesteuert durch Dein Projekt.

Ich habe Dich aber so verstanden, dass Du mal "Block" 1,3,7 und dann 3,7,9 einblenden und die "Blöcke" dann platzmäßig optimieren willst. Dann klappt das mit dem PageControl so nicht.

Was Du als "Block" ansiehst, musst Du von Deiner Datenstruktur abhängig machen. Du kannst natürlich "Block1" anzeigen und nachträglich noch ein oder zwei Controls darauf inaktiv setzen oder ausblenden.
Oder Du lässt Deine Controls sichtbar und setzt einfach Enable auf False, wenn sie aktuell nicht relevant sind.

Du musst letztlich davon ausgehen, was Du dem Anwender bieten willst. Wie soll es für den User am übersichtlichsten und klarsten sein.
Soll der User alles auf einen Blick haben? Sollen nicht benötigte Bereiche unsichtbar oder inaktiv sein? Soll der User immer nur einen Ausschnitt sehen und mit vorwärts/zurück navigieren (das wäre ein Fall für das PageControl)?

Außerdem ist zu überlegen, wieviele Varianten möglich sind und was sich davon als Einheit betrachten lässt.

Auf jeden Fall wirst Du viel Arbeit investieren müssen, um alle Fälle abzudecken. Da kommst Du nicht umhin.

Der Vorteil aller unserer Vorschläge ist, dass die cbMenge exakt einmal existiert. Die ist dann eben sichtbar oder nicht. Aber existent ist sie immer.

bernerbaer 17. Mai 2013 17:46

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen
 
Zitat:

Zitat von Mazen (Beitrag 1215643)
Hallo Leute,
....
Und so versuche ich dann auf die Komponenten der Frames zuzugreifen:

Delphi-Quellcode:
parameter[11] := frameEinst.cbMenge.Text;                                      
parameter[12] := frameEinst.cbGewicht.Text;
...

Gruß,
Matthias

Und was spricht gegen den Einsatz von Findcomponent?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:39 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