AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen

Ein Thema von Mazen · begonnen am 17. Mai 2013 · letzter Beitrag vom 17. Mai 2013
Antwort Antwort
Mazen

Registriert seit: 6. Okt 2011
66 Beiträge
 
Delphi 7 Professional
 
#1

Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen

  Alt 17. Mai 2013, 13:54
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 = '16006then
  begin
    frameEinst := frm16006;
  end else if liste = '16008then
  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
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen

  Alt 17. Mai 2013, 14:14
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 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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen

  Alt 17. Mai 2013, 14:22
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 TabVisible auf False:
Delphi-Quellcode:
 var
   page : integer;
 begin
   for page := 0 to PageControl1.PageCount - 1 do
   begin
     PageControl1.Pages[page].TabVisible := false;
   end;
fork me on Github
  Mit Zitat antworten Zitat
Mazen

Registriert seit: 6. Okt 2011
66 Beiträge
 
Delphi 7 Professional
 
#4

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen

  Alt 17. Mai 2013, 14:26
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?
  Mit Zitat antworten Zitat
CarlAshnikov

Registriert seit: 18. Feb 2011
Ort: Erfurt
108 Beiträge
 
Delphi XE5 Enterprise
 
#5

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen

  Alt 17. Mai 2013, 14:31
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.
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen

  Alt 17. Mai 2013, 14:34
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (17. Mai 2013 um 14:37 Uhr) Grund: Link korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen

  Alt 17. Mai 2013, 14:45
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.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen

  Alt 17. Mai 2013, 14:48
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (17. Mai 2013 um 15:04 Uhr)
  Mit Zitat antworten Zitat
bernerbaer
(Gast)

n/a Beiträge
 
#9

AW: Delphi Auf Komponente in zur Laufzeit festgelegtem Frame zugreifen

  Alt 17. Mai 2013, 18:46
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?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:41 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