Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Do 31.03.16 21:31 
Hallo,
vielleicht gibt es das Thema, habe es jedoch nicht gefunden. Ich habe eine Pascal-Sprach-Formulier-Problem.
Aufgabe: Ich habe etwa 15-20 Groupbox-Objekte, die alle unterschiedlich mit weiteren Objekten auskonstruiert sind. Ich würde die einzelnen Box-Objekte gerne per Index aktivieren/deaktivieren. Meine jetzige (primitive) Lösung ist:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
if n=1 then GroupBox1.visible:=true {ggf. alle anderen GroupBoxen deaktivieren} else then 
if n=2 then GroupBox2.visible:=true else then
if n=3 then GroupBox3.visible:=true else then
..
if n=20 then GroupBox20.visible:=true;

Ideal wäre eine Formulierung wie bei Arrays:

ausblenden Delphi-Quelltext
1:
2:
for i:=1 to 20 do
 if i=n then Groupbox[i].visible:=true else GroupBox[i].visible:=false;

Das lässt zwar der Compiler nicht zu, aber gibt es eine Sprach-Formulierung, die solches im Prinzip ermöglicht?
Hinweis: eine Variable array[1..20] of TGroupBox ist zwar formulierbar, aber dann weiß ich nicht, wie die einzelnen Boxen mit Inhalt zu konstruieren sind.
Lösungen?


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 31.03.2016 um 21:49
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 31.03.16 21:50 
Moin!

Du suchst Suche in: Delphi-Forum FINDCOMPONENT. :lupe: :les: :think:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 01.04.16 05:14 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden Delphi-Quelltext
1:
2:
for i:=1 to 20 do
 if i=n then Groupbox[i].visible:=true else GroupBox[i].visible:=false;

Zur besten Geschwindigkeit würde ich die Groupboxen per eben genanntem FindComponent beim Programmstart suchen und in das Array eintragen.
Dann kannst du diese Schleife benutzen, aber schöner ist es direkt ohne das if. Du hast doch bereits einen boolschen Wert. Den kannst du direkt in Visible eintragen:
ausblenden Delphi-Quelltext
1:
2:
for i:=1 to 20 do
  Groupbox[i].Visible := i = n;
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Di 12.04.16 21:46 
Narses: Danke für den Hinweis auf FindComponent. Man findet immer wieder bisher unbekannte Funktion!
jaenicke: Du schreibst: "ich würde die Groupboxen per eben genanntem FindComponent beim Programmstart suchen und in das Array eintragen".
Wie muss ich mir das konkret vorstellen? Die GroupBoxen sind ja "nur Behälter" für weitere Komponenten. Bei mir u.a. Richedit-, TextEdit-, Button- und Label-Objekte (mein Beispiel mit "visible" habe ich gewählt, um mein Problem "Objekte in Schleife ansprechen" übersichtlich und einfach darzustellen.)
Wenn ich alles in ein Array speichere, entstehen da echte Kopien oder nur Zeiger auf die Objekte? Bei Kopien bläht sich das Programm doch mächtig auf. Oder sehe ich da was falsch?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 12.04.16 22:49 
Im Array hast du nur Referenzen, also Pointer auf die Steuerelemente. Eine Kopie würde dir ja auch nichts bringen. So sparst du dir dann immer mit FindComponent die Komponenten jedesmal zu suchen, was nicht wenig zeit in Anspruch nimmt.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 13.04.16 04:17 
- Nachträglich durch die Entwickler-Ecke gelöscht -
doublecross
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 149
Erhaltene Danke: 27

Windows 7
C#; Visual Studio 2015
BeitragVerfasst: Mi 13.04.16 09:38 
Eine weitere Möglichkeit wäre es, sofern die 20 GroupBoxen mehr oder weniger Identisch sind, diese nicht im Designer anzulegen, sondern per Code, dann könntest du die Referenzen direkt beim erzeugen in deinem Array speichern und auch über dieses auf sie zugreifen.

Das mag Initial ein wenig mehr Aufwand sein (insbesondere weil diese dann ja auch passend auf deiner Seite platziert werden müssen), ist aber im falle vieler Gleichartiger Komponenten oft einfacher bei der späteren Verwendung. Insbesondere wenn du z. B. bei einem Resize deines Fensters ohnehin die Positionen neu berechnen musst.
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Mi 13.04.16 19:18 
user profile icondoublecross hat folgendes geschrieben Zum zitierten Posting springen:
..., ist aber im falle vieler Gleichartiger Komponenten oft einfacher bei der späteren Verwendung.

Inwiefern? Ob man zur Design- oder zur Laufzeit angelegte Komponenten in einem Array oder einer Liste ablegt, macht doch keinen Unterschied.
doublecross
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 149
Erhaltene Danke: 27

Windows 7
C#; Visual Studio 2015
BeitragVerfasst: Do 14.04.16 14:18 
user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
user profile icondoublecross hat folgendes geschrieben Zum zitierten Posting springen:
..., ist aber im falle vieler Gleichartiger Komponenten oft einfacher bei der späteren Verwendung.

Inwiefern? Ob man zur Design- oder zur Laufzeit angelegte Komponenten in einem Array oder einer Liste ablegt, macht doch keinen Unterschied.

Naja, z. B. weil man sich den zugriff oft entsprechend der Abhängigkeitslogik vereinfachen kann. Sei es durch nummerierte Arrays wie in diesem Beispiel gewünscht, oder komplexere Strukturen, wenn man das Sinn macht. Wenn ich z.B. für Jedes Objekt vom Typ A fünf dieser Ansichten brächte könnte ich die Referenzen dieser Ansichten direkt in propertys der Objekte ablegen, ohne sie vorher mit FindComponent aufwändig suchen zu müssen.

Wenn immer nur ein Teil aber nie alle der Komponenten verwendet werden können kann man auch über "erst bei erster Verwendung erzeugen" Strategien nachdenken, dass setzt natürlich voraus, dass nicht alle Groupboxen gleichzeitig Sichtbar sind.