Entwickler-Ecke

Multimedia / Grafik - prüfen ob components[i] sichtbar ist


deara - Fr 29.10.04 01:18
Titel: prüfen ob components[i] sichtbar ist
Hi

Ich hab das Problem das ich für die Schule ein Spiel programmieren muss, ich hänge aber an der Abfrage ob die ite Komponente sichtbar oder unsichtbar ist ist oder nicht, den components[i].visible=true get nicht.

Ich will halt erst herausfinden welche komponente ein panel ist und wenn die komponente ein panel ist dann soll ich halt abfragen ob das panel sichtbar oder unsichtbar ist.

Hoffe mir kann jemand helfen. Danke! :oops:


Sprint - Fr 29.10.04 02:53
Titel: Re: prüfen ob components[i] sichtbar ist
deara hat folgendes geschrieben:
Ich will halt erst herausfinden welche komponente ein panel ist und wenn die komponente ein panel ist dann soll ich halt abfragen ob das panel sichtbar oder unsichtbar ist.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  I: Integer;
begin

  for I := 0 to Self.ComponentCount - 1 do
    if Self.Components[I] is TPanel then
      if not (Self.Components[I] as TPanel).Visible then
        ShowMessage(Self.Components[I].Name + ' ist nicht sichtbar');

end;


Udontknow - Fr 29.10.04 09:04

Ein kleiner Hinweis: Allgemeiner (also für jedes Steuerelement) geht es mit TControl anstelle von TPanel.

Cu,
Udontknow


deara - Fr 29.10.04 12:44

ich hab das jetzt so gemacht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
    i:=0;
    for i:=0 to (self.ComponentCount-1do begin
      if Self.Components[i] is TPanel then begin
        if (Self.Components[i] as TPanel).Visible=true then begin
// aber in die schleife springt er erst gar nicht rein und ich weiss nicht wieso da 
// auf jeden fall mindestens ein TPanel sichtbar ist.
           showmessage('Test!');
           x:=(random(721)+1);
           y:=(random(350)+1);
           (Self.Components[i] as TPanel).left:=x;
           (Self.Components[i] as TPanel).top:=y;
           AnzahlPanel:=AnzahlPanel+1;
        end
        else
           (Self.Components[i] as TPanel).Destroy;


Ist da irgendein Fehler drin oder muss es am Rest des Programmes liegen? Denn während der Laufzeit kommt auch manchmal (nur jedes dritte mal oder so) dieses CPU Fenster, aber ich finde den Grund nicht... Liegt es vielleicht auch an der Stelle?
Danke


jasocul - Fr 29.10.04 12:53

Was ist denn dein "self"?
Gib doch mal für self die Komponente an, auf der die Panels liegen und teste dann mal, was passiert.

Du hast geschrieben, du kommst nicht mal bis in die Schleife. Meintest du wirklich die schleife (for) oder die Bedingung (if) an der der kommentar steht?


deara - Fr 29.10.04 13:00

Das Self versteh ich nicht. Das Hab ich oben mit abgeschrieben da ich dachte ohne self (wie ich es immer gemacht hab) würde das den Fehler verursachen. Das ist mit oder ohne self genauso.

Ich meinte die if schleife die direkt über dem kommentar steht.
:lol:


Sprint - Fr 29.10.04 13:14

deara hat folgendes geschrieben:
aber in die schleife springt er erst gar nicht rein und ich weiss nicht wieso da
auf jeden fall mindestens ein TPanel sichtbar ist.

Hast du die Panels selber erstellt?


deara - Fr 29.10.04 13:18

Ja hab ich.

Das ist so ein Spiel wo man die panels "fangen" muss und immer wenn ich draufklicke wird es unsichtbar gemacht und der timer macht dann immer wieder ein neues dazu, wenn 10 panels auf der form sind hat man verloren und wenn keins mehr da ist hat man gewonnen.

Das ist der Arbeitsauftrag: http://busch.netteweb.de/download/ProjektNotizzettel-Kap29FangSpiel.doc


wulfskin - Fr 29.10.04 13:23

Hallo deara,

dein Quelltext stimmt soweit (auch wenn du das Self weglassen kannst, weil du ja eh in der Form agierst.)
Ansonsten würde ich mal schauen, ob überhaupt irgend welche Panels gefunden werden. So zum Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
  I: Integer;
begin
  for I := 0 to ComponentCount - 1 do begin
    if (omponents[I] is TPanel then begin
      with Components[I] as TPanel do begin
        if Visible then
          ShowMessage(format('Sichtbares Panel gefunden: %s', [Name]))
        else
          ShowMessage(format('Unsichtbares Panel gefunden: %s', [Name]));
      end;
    end;
  end;
Wenn das nicht funktioniert, dann sind gar keine Panels verfügbar.

Gruß Hape!


deara - Fr 29.10.04 13:35

Stimmt, der scheint gar kein Panel zu finden, was ich nicht verstehe, denn ich hab die mit der procedur erstellt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TFSpiel.PanelNeu;
var    Panel: TPanel;
       x, y : integer;
begin
    x:=(random(721)+1);
    y:=(random(350)+1);
    Panel:=TPanel.Create(Panel1);
    Panel.width := 40;
    Panel.Height := 40;
    Panel.Left := x;
    Panel.top := y;
    Panel.Caption:='F';
    Panel.Color:=clblue;
    Panel.Parent := FSpiel;
    Panel.OnClick:=PanelWeg;
    Panel.Visible:=true;
    Panel.Show;
    AnzahlPanel:=AnzahlPanel+1;
end;


und es erscheinen auch panels mit der Ereignismethode PanelWeg die die Panels versteckt wenn ich sie anklicke.


Sprint - Fr 29.10.04 14:19

deara hat folgendes geschrieben:

Delphi-Quelltext
1:
Panel:=TPanel.Create(Panel1);                    

Somit ist die Form (Self) nicht der Eigentümer und kann dann mit auch nicht mit Self.Components[I] bzw. nur Components[I] gefunden werden.


deara - Fr 29.10.04 14:26

Danke jetzt gehts!

Es kommt nur noch dieser CPU Fehler wenn ich auf Start klicke oder schon wenn ich das Programm ausführe.

Auf jeden Fall danke ;)


jasocul - Fr 29.10.04 16:03

Sowas in der Arti hatte ich vermutet. Konnte mich nur leider nicht mehr um dein Problem kümmern. Hatten gerade einen Virus auf 80% der Clients. Das war dringender. :wink:


deara - So 31.10.04 22:01

oh ja ;) son Virus geht natürlich vor ;) Versteh ich.

Hänge aber schon am nächten Problem:

Also das ganze Spiel läuft super, hab jetzt auch schon so eine neue PunkteForm wo die Punkte angezeige werden und alles, mein einzeges Problem ist jetzt, wenn ich versuche ein Panel wegzuklicken dann kommt spätestens beim 2. Panel ein Fehler der lautet: List 'index out of bounds' und danach in klammern entweder eine 7 oder eine 8. mit dem Fehler kann ich gar nichts anfangen.

Hoffe jemand von euch weiss woran es vielleicht liegen könnte? :)
danke