Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Inhalt von Array nutzen (https://www.delphipraxis.net/137275-inhalt-von-array-nutzen.html)

JumpFrog 17. Jul 2009 16:51


Inhalt von Array nutzen
 
hey leute,


also folgendes, ich möchte über ein for schleife das alle Panels auf Visibel überprüft werden und fals diese halt sichtbar sind, unsichtbar gemacht werden.

Delphi-Quellcode:
procedure...
var I:integer;

begin
for I := 1 to high(oberflächen) do
begin
// hier kommt die if bedinung mit den Panel.visible abfragen hin
end;

end;
in dem Array oberfläche sind alle Panels enthalten. Wie schaffe ich es jetzt eine If schleife zu schreiben die den wert hinter jedem Array nihmt und halt als jeweiligen Panel.visible "darstellt". Ich hoffe ich konnte mich richtig ausdrücken, denn so wirklich gut in Delphi bin ich noch nicht von daher fällt das beschreiben doch zum Teil recht schwer.

himitsu 17. Jul 2009 16:57

Re: Inhalt von Array nutzen
 
Wie ist denn das Array definiert?

Wie man auf die Elemente eines Arrays zugreift weißt du?
Wie man eine If-Abfrage macht auf?
Und wie man .Visible ausließt/setzt, sollte auch bekannt sein (ist ja "nur" ein Boolean).

Also selbst mit wenig Wissen kann ich da grad kein Problem erkennen. :gruebel:

oki 17. Jul 2009 16:58

Re: Inhalt von Array nutzen
 
Hi,

Delphi-Quellcode:
begin
for I := 1 to high(oberflächen) do
begin
  if Assigned(oberflächen[I]) and (oberflächen[I] is TPanel) then
    (Oberflächen[I] as TPanel).Visible := False;
end;
Gruß oki

[edit] himitsu war schneller und ich hab mir hier die Prüfung auf Visible gespart, da ich davon ausgehe, dass alle Panels unvisible geschaltet werden sollen. [/edit]

JumpFrog 17. Jul 2009 17:05

Re: Inhalt von Array nutzen
 
Zitat:

Zitat von himitsu
Wie ist denn das Array definiert?

Wie man auf die Elemente eines Arrays zugreift weißt du?
Wie man eine If-Abfrage macht auf?
Und wie man .Visible ausließt/setzt, sollte auch bekannt sein (ist ja "nur" ein Boolean).

Also selbst mit wenig Wissen kann ich da grad kein Problem erkennen. :gruebel:

If Abfrage ja weiß ich, Visible weiß ich auch. Wie ich auf die Elemente zugeife. Naja ich habe damit noch nicht viel gemacht, meistens waren da nur zahlen drinne, aber keine Objektnamen (wie jetzt eben der name eines Panels).

Es wird mit sicherheit kein Problem sein :) im nachhinein denk ich mir wieder "Man wieso bist du da nicht selbst draufgekommen" :D


@oki:

Wenn ich die If Bedingung richtig deute, wird nachgesehen ob das Array (Oberfläche[I]) ein TPanel ist. Aber er soll schaun ob es sichtbar ist. Denn wenn das so ist soll es unsichtbar werden.

LG JumpFrog

PS: Achja ich das Array is vom Typ string, ich weiß nicht ob das richtig ist, aber in meinen Augen waren die Namen von den Panels ja nicht weiter als Zeichenketten.

EDIT: oki hat editet somit hat sich die Aussage über seinen Quellcode erledigt :) Trotzdem bringt er mir den Fehler Inkompartibler Typ (String und TPanel). Gibt es einen Datentyp Tpanel? ó.o

himitsu 17. Jul 2009 17:09

Re: Inhalt von Array nutzen
 
nun ja, eigentlich wollt ich es ja nicht direkt einfach so verraten,
denn so schwer isses ja nicht

Delphi-Quellcode:
for I := 1 to high(oberflächen) do
  if (oberflächen[I] as TPanel).Visible then
    (oberflächen[I] as TPanel).Visible := False;

// oder

for I := 1 to high(oberflächen) do
  (oberflächen[I] as TPanel).Visible := False;

// oder

for I := 1 to high(oberflächen) do
  (oberflächen[I] as TPanel).Hide;
wenn man davon ausgeht, daß nur TPanel im Array drinen und alles "besetzt" ist, dann kann man sich die Prüfungen auf Vorhandensein und Typ sparen.

und falls oberflächen als Array of TPanel definiert ist, dann könnte man auch das as TPanel ganz weglassen
Delphi-Quellcode:
for I := 1 to high(oberflächen) do oberflächen[I].Hide;
[edit]
wenn das Array nur die Namen enthält, dann mußt du mit Delphi-Referenz durchsuchenFindComponent/Hier im Forum suchenFindComponent natürlich erstmal die Panels suchen.

und TPanel ist kein Datentyp, das ist der Object-Typ des Panels.

alzaimar 17. Jul 2009 17:47

Re: Inhalt von Array nutzen
 
Kleine Performanceoptimierung:
Delphi-Quellcode:
for I := 1 to high(oberflächen) do begin
  if Assigned(oberflächen[I]) and (oberflächen[I] is TPanel) then
    TPanel(Oberflächen[I]).Visible := False; // <<-- AS ist überflüssig, weil vorher mit IS geprüft wurde.
end;
Der 'as' Operator prüft nochmals, ob das Objekt passt, das wurde aber vorher schon über 'is' geprüft.

Noedel 17. Jul 2009 21:00

Re: Inhalt von Array nutzen
 
aber ich wette, du kannst es immer noch nich kompilieren wenn da "ä" im code steht. nur buchstaben des englischen alphabets dürfen benutzt werden... ;)

jfheins 17. Jul 2009 21:03

Re: Inhalt von Array nutzen
 
Zitat:

Zitat von Noedel
aber ich wette, du kannst es immer noch nich kompilieren wenn da "ä" im code steht. nur buchstaben des englischen alphabets dürfen benutzt werden... ;)

Unter Delphi 7 sicherlich - inzwischen darfste deinen Variablen auch Namen mit Accents, Cedilles und Umlauten geben :mrgreen:

himitsu 17. Jul 2009 21:22

Re: Inhalt von Array nutzen
 
selbst Japanisch ist erlaubt (quasi fast der ganze Unicodebereich)

auf den Delphitagen konnten dieses sich auch Besitzer eines älteren Delphis davon überzeugen

JumpFrog 19. Jul 2009 01:37

Re: Inhalt von Array nutzen
 
also ich kann machen was ich will aber ich bekomm immerwieder nen Fehler...

Zitat:

[Pascal Fehler] Unit1.pas(516): E2008 Inkompatible Typen
[Pascal Fehler] Unit1.pas(516): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
[Pascal Fehler] Unit1.pas(528): E2010 Inkompatible Typen: 'string' und 'TPanel'
[Pascal Fehler] Unit1.pas(529): E2010 Inkompatible Typen: 'string' und 'TPanel'
[Pascal Fataler Fehler] Project1.dpr(5): F2063 Verwendete Unit 'Unit1.pas' kann nicht compiliert werden
Hier mal die Fehler.

Delphi-Quellcode:
oberflaechen: array[1..100] of string;
und hier noch das erstellte array...

um ehrlich zu sein verstehe ich das so, dass wie es schon da steht, es inkompatible Typen sind. Leider weiß ich nicht was ich daran ändern kann ^^

Dunkel 19. Jul 2009 01:48

Re: Inhalt von Array nutzen
 
Was versuchst Du denn da zu machen?

Selbstverfreilich kann man TPanels nicht in einem Array of string verwalten. Darin kann man höchstens die Namen der TPanels speichern. Wenn Du das machen möchtest, dann ist
Delphi-Quellcode:
FindComponent(NameDerKomponente)
das was Du suchst.

JumpFrog 19. Jul 2009 17:44

Re: Inhalt von Array nutzen
 
und in wie fern bau ich die ein, ich habe schon möglichkeiten die mir eingefallen sind versucht, aber irgentwie hatte er immer etwas dagegen.. ó.o

Blup 20. Jul 2009 16:00

Re: Inhalt von Array nutzen
 
Ich empfehle die Delphihilfe zum Thema FindComponent zu studieren.
Da gibt es wunderschöne Beispiele, von denen eins auf diesen Fall ideal passt.

JumpFrog 20. Jul 2009 16:40

Re: Inhalt von Array nutzen
 
Schön wenn ihr mit der Hilfe so gut zurecht kommt und es versteht. Ich nicht... Geht ja schon bei der If Bedingung los. Da bringt er mir das der Ausdruck ein Boolean sein muss....

Ich kann bei der If Bedingung eingeben was ich will der schreibt das immer oder es sind noch mehr Fehler, wie zum Beispiel End erwartet aber ... erhalten oder ; erwartet aber : erhalten... und nur solches Zeug.

Delphi-Quellcode:
FindComponent(oberflaechen as TPanel);
So bei der zeile kommt als einzigster der fehler

Zitat:

[Pascal Fehler] Unit1.pas(521): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
Abgesehen von dem das Unit1.pas nicht compiliert werden kann...

Also ich hab keinen dunst was daran nun falsch sein könnte. Andere Anwendungsmöglichkeiten habe ich bezüglich FindComponent nicht gefunden/nicht verstanden.

LG

PS: hier noch das Array

Delphi-Quellcode:
oberflaechen: array[1..100] of string;
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
oberflaechen[1]:='Ma_allgemein';
oberflaechen[2]:='Ma_flaechen';
end;

DeddyH 20. Jul 2009 16:44

Re: Inhalt von Array nutzen
 
Mach Dir doch das Leben leichter, indem Du nicht die Namen der Panels, sondern deren Instanzen im Array ablegst. Das ist weniger umständlich und zudem noch schneller.

[edit] Oder das Array gleich in die Tonne treten und eine TObjectList nehmen, wobei OwnsObjects im Konstruktor auf false zu setzen ist. [/edit]

JumpFrog 20. Jul 2009 17:08

Re: Inhalt von Array nutzen
 
Zitat:

Zitat von DeddyH
Mach Dir doch das Leben leichter, indem Du nicht die Namen der Panels, sondern deren Instanzen im Array ablegst. Das ist weniger umständlich und zudem noch schneller.

[edit] Oder das Array gleich in die Tonne treten und eine TObjectList nehmen, wobei OwnsObjects im Konstruktor auf false zu setzen ist. [/edit]

So eben ist ein Zug durch mein Zimmer gefahren :) das war einmal Bahnhof für mich ;) Nichts gegen dich, mich kotzt das hier gerade nur an ^^ und der hellste in Sachen Programmieren war ich nie. Ich möchte ja einfach erstmal das das Funktioniert um mit dem eigentlichen Teil weiterzumachen. Von daher ist es mir erstmal egal ob es Umständlich oder einfach ist (wobei das umständliche für mich bestimmt schneller geht weiß ich davon mehr Ahnung haben). Nachbessern kann ich später immernoch.

Du schreibst da was von Instanzen. Meinst du damit das ich direkt den Namen des TPanels+ die option visible in das array geben soll?

LG JumpFrog

PS: trotzdem werde ich mir den TObjectList ansehen, vielleicht is er doch einfach zu verstehen :)

DeddyH 20. Jul 2009 17:16

Re: Inhalt von Array nutzen
 
Mit Instanzen meine ich die Panels selbst. Also statt ein Array of String zu nehmen und die Namen der Panels dort abzulegen einfach ein Array of TPanel und die Panels selbst dann dort hinein.
Delphi-Quellcode:
type
  TMainForm = class(TForm)
  ...
  private
    MyPanels: array[1..100] of TPanel;
    ...
  end;
...

procedure TMainForm.FormCreate(Sender: TObject);
begin
  MyPanels[1] := Panel1;
  MyPanels[2] := Panel2;
  //etc.pp.
end;

procedure TMainForm.WatWeissIch;
var i: integer;
begin
  for i := Low(MyPanels) to High(MyPanels) do
    if Assigned(MyPanels[i]) then
      MyPanels[i].Visible := false;
end;
Getippt und nicht getestet.

JumpFrog 20. Jul 2009 17:53

Re: Inhalt von Array nutzen
 
an sich kein fehler :) nur komisch das ich das auch schonmal versucht habe string mit TPanel zu tauschen und er mir damals nen fehler gezeigt hatte...^^

Allerdings möchte ich ja das überprüft wird ob das entsprechende Panel sichtbar ist(visible=true) und wenn das der fall ist soll eben dieses sichtbare Panel unsichtbar werden. aber mit [i]if Assigned(oberflaechen).visible = true then komm ich da nicht weit :) Da kommt dann die äusserung vonwegen Boolean enthält kein element visible.

DeddyH 20. Jul 2009 17:56

Re: Inhalt von Array nutzen
 
Du darfst das ja auch nicht vermischen. Versuch es mal so:
Delphi-Quellcode:
 if Assigned(oberflaechen[i]) and oberflaechen[i].visible then
Aber wozu auf visible prüfen, wenn es sowieso versteckt werden soll?

Jakob Ullmann 20. Jul 2009 18:01

Re: Inhalt von Array nutzen
 
Falls die alle Panel1 usw. heißen, würde ich eher den folgenden Code vorschlagen:

Delphi-Quellcode:
procedure TMainForm.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  for i := 1 to [n] do
    MyPanels[i] := TPanel(FindComponent('Panel' + IntToStr(i)));
end;

DeddyH 20. Jul 2009 18:03

Re: Inhalt von Array nutzen
 
Dann aber lieber ein dynamisches Array oder eine TObjectList nehmen, über Components iterieren, auf TPanel prüfen und dann ggf. eintragen.

JumpFrog 20. Jul 2009 18:12

Re: Inhalt von Array nutzen
 
@ Jakob: Nein, ich habe die alle umbenannt.

@ DeddyH: Stimmt, wieso alle erst auf visibel prüfen wenn die eh unsichtbar gesetzt werden. Da sieht man mal wieder... :oops: :oops:

vielen dank erstmal wie es scheint funktioniert es jetzt :) Schön dank dafür :)

hab noch ne andere Frage. Ich arbeite mit vielen Paneln (wie man vielleicht schon gemerkt hat) und die sollen alle an der selben Position sein. Das ist kein Problem, nur gibt es eine möglichkeit die fertigen Panels in der Design ansicht nur zur bearbeitung unsichtbar zu machen? Wenn ich die auf visible=false stelle sind se trotzdem sichtbar. Ich hab die Bordland version 10 für windows.

Achja und DeddyH wenn ich mich später an die TObjectList setzen und nicht zureckt komme frag ich dich :)

DeddyH 20. Jul 2009 18:14

Re: Inhalt von Array nutzen
 
Unsichtbarmachen zur Designtime geht AFAIK nicht, aber Du könntest ja z.B. Left auf einen negativen Wert setzen und im OnCreate per Code wieder korrigieren. Etwas anderes fällt mir spontan nicht ein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:57 Uhr.

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