Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Laufzeit erstellte Komponenten in den Vordergrund stellen (https://www.delphipraxis.net/67537-laufzeit-erstellte-komponenten-den-vordergrund-stellen.html)

Alexander Roth 16. Apr 2006 10:37


Laufzeit erstellte Komponenten in den Vordergrund stellen
 
Hi,

wie bekomme ich wärend der Laufzeit erstellte Komponenten, die von andereen Objekten verdeckt werden, in den Vordergrund?

Noch mal genauer:
also ich habe zwei Komponenten erstellt:
Ein Shape und ein Label. Leider wird das Label von dem Shape verdeckt und man sieht es nicht. Wären die nicht zur Laufzeit erstellt worden, könnte man ganz einfach rechte Maustaste und "in den Vordergrund" klicken.
Doch wie kriege ich das wärend der Laufzeit hin?

fkerber 16. Apr 2006 10:39

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Hi!

Gibts da nicht die Methode "bringtoFront"?


Ciao Frederic

Alexander Roth 16. Apr 2006 10:41

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Klappt leider nicht.

Hawkeye219 16. Apr 2006 10:48

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Hallo Alexander,

bist Du sicher, daß beide Controls den selben Parent haben?

Gruß Hawkeye

fkerber 16. Apr 2006 10:49

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Hi!

Hmm, vielleicht kannst du es durch die Reihenfolge der Erstellung beeinflussen?
Oder kannst du das Label vielleicht auf dem Shape platzieren, also das Shape als Parent?


Ciao Frederic

Hawkeye219 16. Apr 2006 10:51

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
@fkerber:
Ein TShape kann als TGraphicControl keine Controls aufnehmen :wink:

Gruß Hawkeye

Alexander Roth 16. Apr 2006 10:56

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Zitat:

Zitat von Hawkeye219
@fkerber:
Ein TShape kann als TGraphicControl keine Controls aufnehmen :wink:

Gruß Hawkeye

Habe ich auch nicht. (Schade, wäre noch ein bissel schöner) Beide sind auf der Form.

fkerber 16. Apr 2006 10:56

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Hi!
Zitat:

Zitat von Hawkeye219
@fkerber:
Ein TShape kann als TGraphicControl keine Controls aufnehmen :wink:

Das ist ein Argument :oops: *schäm* :oops:

Ciao Frederic

Alexander Roth 16. Apr 2006 11:00

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Zitat:

Zitat von Hawkeye219
Hallo Alexander,

bist Du sicher, daß beide Controls den selben Parent haben?

Gruß Hawkeye

Ja. Beide sind auf der Form.

//Entschuldigt die Wiederholungen.

fkerber 16. Apr 2006 11:07

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Hi!

Zeigst du uns mal den QuellCode, mit dem du sie erstellst?


Ciao Frederic

Hawkeye219 16. Apr 2006 11:09

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Hallo Alexander,

Ich hoffe, Du verwechselst Parent und Owner nicht. BringToFront funktioniert nur innerhalb einer Ebene, d.h. beide Control müssen den selben Parent besitzen. Liegt auch nur eines der Controls auf einem weiteren TWinControl (z.B. TPanel), so funktioniert BringToFront nicht mehr.

Der folgende Code funktioniert bei mir einwandfrei:

Delphi-Quellcode:
procedure TForm1.Button5Click(Sender: TObject);
  var TheLabel : TLabel;
      TheShape : TShape;
begin
  TheLabel := TLabel.Create(Self);
  TheLabel.Parent := Self;
  TheLabel.SetBounds (8, 8, 100, 30);
  TheLabel.Caption := 'Hallo';

  TheShape := TShape.Create(Self);
  TheShape.Parent := Self;
  TheShape.SetBounds (0, 0, 200, 100);

  TheLabel.BringToFront;
end;
Gruß Hawkeye

sakura 16. Apr 2006 11:17

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Der Code funktioniert bei mir ohne Probleme. HAst Du an der Stelle evtl. noch andere Controls, wie z.B. Button, Panel (Windowed-Controls ;)), dann kannst Du Labels und Shapes nicht davor setzen.

...:cat:...

Alexander Roth 16. Apr 2006 11:21

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Zitat:

Zitat von fkerber
Zeigst du uns mal den QuellCode, mit dem du sie erstellst?

OK:

Also ich habe 2 Klassen:
Delphi-Quellcode:
unit UFeld;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ExtCtrls,StdCtrls;

type
  TValue=0..4;

  Tfield = class(Tshape)
  protected
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  private
    { Private-Deklarationen }
    anzeige:TLabel;
    FStones:TValue;
    procedure writeStones(value:TValue);
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent; Parent:Twincontrol; pos:Trect; number:TValue=0);
    property Stones: TValue read FStones write writeStones;
  end;



  TSpielfeld=class
  private
    { Private-Deklarationen }
    Fields:array of array of Tfield;
  public
    { Public-Deklarationen }
    anzclicks:byte;
    constructor Create(AOwner: TComponent; Parent:Twincontrol; Size:word=60; Number:byte=6);
    function NextSpep : boolean;
  end;


const maxclicks=3;

var  Spielfeld:TSpielfeld;

implementation




{-----------------------------------------------------------------------------
  Description: Ok hier werden die einzelnen Felder creiert
  Procedure:   Create
  Arguments:   AOwner: TComponent; Parent:Twincontrol; pos:Trect; number:TValue=0
  Result:      None
  Detailed description:
-----------------------------------------------------------------------------}
constructor Tfield.Create(AOwner: TComponent; Parent:Twincontrol; pos:Trect; number:TValue=0);
begin
  inherited create(AOwner);

  anzeige:=Tlabel.Create(self);
  anzeige.Parent:=Parent;

  stones:=number;

  top:=pos.Top;
  left:=pos.Left;
  width:=pos.Right-pos.Left;
  height:=pos.Bottom-pos.Top;
  shape:=stCircle;
  pen.Style:=psclear;

  with anzeige do
    begin
    top:=pos.Top+(pos.Bottom-pos.Top) div 2;
    left:=pos.Left+(pos.Right-pos.Left) div 2;
    width:=pos.Right-pos.Left;
    height:=pos.Bottom-pos.Top;
    transparent:=true;
    end;
end;




{-----------------------------------------------------------------------------
  Description: Falls die Steinzahl geändert wird
  Procedure:   writeStones
  Arguments:   value:TValue
  Result:      None
  Detailed description:
-----------------------------------------------------------------------------}
procedure Tfield.writeStones(value:TValue);
begin
  FStones:=value;
  anzeige.Caption:=inttostr(value);
  case value of
    0: brush.Color :=clgray;
    1: brush.Color :=cllime;
    2: brush.Color :=clgreen;
    3: brush.Color :=clblue;
    4: brush.Color :=clred;
    end;
end;



{-----------------------------------------------------------------------------
  Description:
  Procedure:   MouseDown
  Arguments:   Button: TMouseButton; Shift: TShiftState; X, Y: Integer
  Result:      None
  Detailed description:
-----------------------------------------------------------------------------}
procedure Tfield.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  stones:=stones+1;

  //hier soll noch was hinkommen
end;




{-----------------------------------------------------------------------------
  Description: Das komplette feld wird erstellt
  Procedure:   Create
  Arguments:   AOwner: TComponent; Parent:Twincontrol; Size:word=60; Number:byte=6
  Result:      None
  Detailed description:
-----------------------------------------------------------------------------}
constructor TSpielfeld.Create(AOwner: TComponent; Parent:Twincontrol; Size:word=60; Number:byte=6);
var i,j:byte;
begin
  setlength(fields,number,number);
  for i:=0 to number-1 do
    for j:=0 to number-1 do
      begin
      fields[i,j]:=Tfield.Create(AOwner,parent,rect(i*(size+5),j*(size+5),i*(size+5)+size,j*(size+5)+size)     );
      fields[i,j].Parent:=Parent;
      end;
end;





{-----------------------------------------------------------------------------
  Description: Macht den nächten Schritt
  Procedure:   NextSpep
  Arguments:   None
  Result:      boolean
  Detailed description: Wenn nichts mehr zu machen dann false
-----------------------------------------------------------------------------}
function TSpielfeld.NextSpep : boolean;
var anz4:byte; //weil viel steine da liegen
    f:array[0..schritte-1] of Tpoint;

    i,j,number:byte;
begin
  anzclicks:=0; //damit wieder hochgezählt werden kann
  number:=length(fields); //kommt 6 raus

  anz4:=0;
  for i:=0 to number-1 do
    for j:=0 to number-1 do
      if fields[i,j].Stones=4 then
        begin
        f[anz4].X:=i;
        f[anz4].y:=j;
        inc(anz4);
        end;
  result:= anz4>0;
  if not result then exit; //brauch ja nicht mehr weiter zu machen

  //hier soll noch was hinkommen
end;



end.
Hier wird der Contsructor der Klasse die die einzelnen Felder erstellt aufgerufen.
Delphi-Quellcode:
      fields[i,j]:=Tfield.Create(AOwner,parent,rect(i*(size+5),j*(size+5),i*(size+5)+size,j*(size+5)+size)     );
Dann wird hier
Delphi-Quellcode:
constructor Tfield.Create(AOwner: TComponent; Parent:Twincontrol; pos:Trect; number:TValue=0);
begin
  inherited create(AOwner);

  anzeige:=Tlabel.Create(self);
  anzeige.Parent:=Parent;

  stones:=number;

  top:=pos.Top;
  left:=pos.Left;
  width:=pos.Right-pos.Left;
  height:=pos.Bottom-pos.Top;
  shape:=stCircle;
  pen.Style:=psclear;

  with anzeige do
    begin
    top:=pos.Top+(pos.Bottom-pos.Top) div 2;
    left:=pos.Left+(pos.Right-pos.Left) div 2;
    width:=pos.Right-pos.Left;
    height:=pos.Bottom-pos.Top;
    transparent:=true;
    end;
end;
erstmal das erweiterte Shape und dann darin (weil die Labels dazugehören) die Labels erstellt.

Die Labels haben den Owner die erweiterten Shapes. Doch als Parent haben sie form1 (übergebe ich immer mit parent in den Contruktoren).


Ok Aufrufen tu ich das ganze so:
Delphi-Quellcode:
  Spielfeld:=TSpielfeld.Create(form1,form1);
Ich hoffe das ganze ist etwas verständlich.


Zitat:

Zitat von sakura
Der Code funktioniert bei mir ohne Probleme. HAst Du an der Stelle evtl. noch andere Controls, wie z.B. Button, Panel (Windowed-Controls ;)), dann kannst Du Labels und Shapes nicht davor setzen.

...:cat:...

Nein habe ich alles nicht. Ich habe nur eine leere Form.

//Edit:So einige Fehler behoben

Hawkeye219 16. Apr 2006 11:38

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Eine schnelle Lösung besteht darin, nach dem Erzeugen eines TField-Elements das Label nach vorne zu bringen:

Delphi-Quellcode:
constructor TSpielfeld.Create(AOwner: TComponent; Parent:Twincontrol; Size:word=60; Number:byte=6);
var i,j:byte;
begin
  setlength(fields,number,number);
  for i:=0 to number-1 do
    for j:=0 to number-1 do
      begin
      fields[i,j]:=Tfield.Create(AOwner,parent,rect(i*(size+5),j*(size+5),i*(size+5)+size,j*(size+5)+size)     );
      fields[i,j].Parent:=Parent;
      fields[i,j].anzeige.BringToFront; // <<--- hier
      end;
end;
Gruß Hawkeye

Alexander Roth 16. Apr 2006 11:40

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Zitat:

Zitat von Hawkeye219
Eine schnelle Lösung besteht darin, nach dem Erzeugen eines TField-Elements das Label nach vorne zu bringen:

Delphi-Quellcode:
constructor TSpielfeld.Create(AOwner: TComponent; Parent:Twincontrol; Size:word=60; Number:byte=6);
var i,j:byte;
begin
  setlength(fields,number,number);
  for i:=0 to number-1 do
    for j:=0 to number-1 do
      begin
      fields[i,j]:=Tfield.Create(AOwner,parent,rect(i*(size+5),j*(size+5),i*(size+5)+size,j*(size+5)+size)     );
      fields[i,j].Parent:=Parent;
      fields[i,j].anzeige.BringToFront; // <&lt;--- hier
      end;
end;
Gruß Hawkeye

Klasse :thumb: :thumb: :thumb:
Es funktioniert.

Ich hatte immer versucht es direkt in den inneren Konstruktor zu schreiben.

Danke euch allen.

:-D

Hawkeye219 16. Apr 2006 11:43

Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
 
Zitat:

Zitat von Alexander Roth
Ich hatte immer versucht es direkt in den inneren Konstruktor zu schreiben.

...und durch

Delphi-Quellcode:
fields[i,j].Parent:=Parent;
hatte sich das TField dann wieder über das Label gelegt :wink:

Gruß Hawkeye


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