Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 16:55 Uhr.
Seite 2 von 2     12   

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-2025 by Thomas Breitkreuz