![]() |
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? |
Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
Hi!
Gibts da nicht die Methode "bringtoFront"? Ciao Frederic |
Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
Klappt leider nicht.
|
Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
Hallo Alexander,
bist Du sicher, daß beide Controls den selben Parent haben? Gruß Hawkeye |
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 |
Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
@fkerber:
Ein TShape kann als TGraphicControl keine Controls aufnehmen :wink: Gruß Hawkeye |
Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
Zitat:
|
Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
Hi!
Zitat:
Ciao Frederic |
Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
Zitat:
//Entschuldigt die Wiederholungen. |
Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
Hi!
Zeigst du uns mal den QuellCode, mit dem du sie erstellst? Ciao Frederic |
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:
Gruß Hawkeye
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; |
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:... |
Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
Zitat:
Also ich habe 2 Klassen:
Delphi-Quellcode:
Hier wird der Contsructor der Klasse die die einzelnen Felder erstellt aufgerufen.
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.
Delphi-Quellcode:
Dann wird hier
fields[i,j]:=Tfield.Create(AOwner,parent,rect(i*(size+5),j*(size+5),i*(size+5)+size,j*(size+5)+size) );
Delphi-Quellcode:
erstmal das erweiterte Shape und dann darin (weil die Labels dazugehören) die Labels erstellt.
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; 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:
Ich hoffe das ganze ist etwas verständlich.
Spielfeld:=TSpielfeld.Create(form1,form1);
Zitat:
//Edit:So einige Fehler behoben |
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:
Gruß Hawkeye
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; |
Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
Zitat:
Es funktioniert. Ich hatte immer versucht es direkt in den inneren Konstruktor zu schreiben. Danke euch allen. :-D |
Re: Laufzeit erstellte Komponenten in den Vordergrund stelle
Zitat:
Delphi-Quellcode:
hatte sich das TField dann wieder über das Label gelegt :wink:
fields[i,j].Parent:=Parent;
Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 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-2025 by Thomas Breitkreuz