Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Event bei Z-Order Änderung o.ä. (https://www.delphipraxis.net/171733-event-bei-z-order-aenderung-o-ae.html)

Medium 22. Nov 2012 10:51

Event bei Z-Order Änderung o.ä.
 
Aloah!

Ich stelle gerade eine Komponente um (Abkömmling von TGraphicControl), bei der diverse Beschriftungen von TextOut() auf TLables in der Komponente geändert werden. (Hintergrund ist, dass die Beschriftungen z.T. ausserhalb des Rects der Komponente liegen müssen, und wenn man das mittels TextOut() auf den Parent-Canvas malt, verhält sich das in der IDE beim Verschieben usw. sehr hässlich.)

Das klappt auch wunderbar (TMS macht es z.B. genau so), jedoch gibt es ein Problem mit Labels, die Teilweise im Rect der Komponente liegen: Wenn man die Komponente mittels BringToFront oder im Editor nach vorne setzt, verschwinden diese Labels hinter ihr. Mein naiver Lösungsversuch: Im Paint() meiner Komponente einfach "Labels[i].BringToFront;". Das löst aber leider auch wiederum das Paint-Ereignis aus, und ist ein prima Weg sich die IDE abzuschießen :mrgreen:. Und eigentlich ist mir das auch zu brutal. Ich würde daher ganz gerne eine Art OnZOrderChange() Event haben, jedoch finde ich hier irgendwie keine Stelle an der ich so etwas abgreifen könnte. Gibt es da überhaupt eine Chance?

himitsu 22. Nov 2012 10:59

AW: Event bei Z-Order Änderung o.ä.
 
Dann zeichne doch nicht außerhalb der Komponente?

Du kannst dir ja z.B. ein TLabel als Unterkomponente nehmen und dieses entsprechend positionieren.
Delphi-Referenz durchsuchenTLabeledEdit macht das genauso ... das ist ein TEdit mit einem TLabel drin.

Medium 22. Nov 2012 11:00

AW: Event bei Z-Order Änderung o.ä.
 
Genau das mache ich doch.

Sir Rufo 22. Nov 2012 11:25

AW: Event bei Z-Order Änderung o.ä.
 
Du musst doch nur tätig werden, wenn die Labels unter der Hauptkomponente liegen, also wenn der Z-Index (hmmm, kleiner oder größer) ist. Dann würde ich auf den Z-Index einwirken, sonst nicht. Und neu gezeichnet wird dann eh.

Medium 22. Nov 2012 12:26

AW: Event bei Z-Order Änderung o.ä.
 
Mein Problem ist ja, dass ich keinen guten... "Zeitpunkt" finde um genau diese Prüfung vorzunehmen (ob mein Label unter der Kompo liegt oder nicht). Im Paint geht's ja schon mal nicht, weil es eine Endlosrekursion erzeugt (und für meinen Geschmak viel zu unnötig oft wäre). Drücke ich mich so undeutlich aus? (Ernste Frage. Ich hatte gehofft mein Problem deutlich dargestellt zu haben - mag nicht immer gelingen wenn man selbst grad tief drin steckt.)

Bummi 22. Nov 2012 13:13

AW: Event bei Z-Order Änderung o.ä.
 
In eine Rekursion solltest Du ja eigentlich nur reinlaufen wenn ungeprüft die ZOrder änderst.
So ganz klar ist mir auch nicht warum Du wenn Du ein GraphicControl verwendest Du noch externe Labels benötigst, statt die Komponente entsprechend zu "vergrößern" und die Labels selbst zu zu malen.

Medium 22. Nov 2012 13:32

AW: Event bei Z-Order Änderung o.ä.
 
Aber gerade wenn ich die Z-Order ändere wird doch ein Neuzeichnen ausgelöst. Mache ich das also im Paint, löse ich wieder ein Paint aus, unabhängig davon ob das Neuordnen notwendig war oder nicht. Ein Mal reicht, und ich hänge in der Schleife fest.

Warum mit Labels? Es geht um eine Balkenanzeige, die Skalen links und oder rechts bzw. oben/unten hat. Die Skalengrenzen (Minimum/Maximum) werden zur Laufzeit aus einer DB versorgt, d.h. ich weiss zur Designtime nicht, wie breit mein Text werden wird. Ich möchte aber meine Balken am Rest auf der Form ausrichten, und zwar wirklich pixelgenau mit dem Balken. Dessen Breite/Höhe würde sich ja sonst verändern. (Vorher war es genau so, jetzt kam aber die Versorgung der Min/Max zur Laufzeit hinzu, womit das auf ein Mal Thema wurde.)

Ebenso haben die Balken eine Anzeige des aktuellen Wertes als Zahl. Dessen Position kann allseitig des Balkens sein, oder aber auch darin zentriert. Auch hier wurde es ein Label, da bei Platzierung ausserhalb des Balkens der Balken selbst nicht in seiner Größe geändert werden darf. Und das Problem dass ich habe manifestiert sich nun bei diesem Label, wenn es auf dem Balken zentriert dargestellt wird: Balken.BringToFront -> Label ist auf ein Mal hinten.

Bummi 22. Nov 2012 15:29

AW: Event bei Z-Order Änderung o.ä.
 
Cih wollte gerade keine Komponente schreiben, die Simulation hier mit Paintbox und Label überlappend sollte sich IMHO aber identisch verhalten.

Delphi-Quellcode:

Function ZOrderFirst(TestComp,MainComponent:TControl):Boolean;
var
 i:Integer;
 p:TWinControl;
 found:Boolean;
begin
   found := false;
   p := Maincomponent.Parent;
   if not assigned(p) then Exit;

   for i := 0 to p.Controlcount - 1 do
     begin
       if (p.Controls[i]= TestComp) or (p.Controls[i]= MainComponent) then
        begin
          Result := p.Controls[i]= TestComp;
          break;
        end;
     end;

end;

procedure TForm5.Button1Click(Sender: TObject);
begin
  Paintbox1.BringToFront;
end;

procedure TForm5.Button2Click(Sender: TObject);
begin
  Label1.BringToFront;
end;

procedure TForm5.PaintBox1Paint(Sender: TObject);
var
 c:TCanvas;
begin

  c := TPaintBox(sender).Canvas;
  c.Brush.Color := clBlue;
  c.Ellipse(TPaintBox(sender).ClientRect);
  if ZOrderFirst(Label1,TPaintBox(sender)) then
    begin
     Label1.BringToFront;
    end;
end;

Sir Rufo 22. Nov 2012 15:46

AW: Event bei Z-Order Änderung o.ä.
 
@Bummi :thumb:

Eigentlich könnte man nach dem Label1.BringToFront die OnPaint Methode verlassen, denn es wird ja direkt neu gezeichnet.

@Medium

Wenn der Z-Index nicht stimmt, dann muss neu gezeichnet werden. Das wird ja auch durch das Umordnen provoziert.
Wenn der Z-Index stimmt, dann wird nichts umgeordnet und damit auch kein Neuzeichnen provoziert.

So undeutlich schreiben wir doch gar nicht ;)

DeddyH 22. Nov 2012 15:52

AW: Event bei Z-Order Änderung o.ä.
 
Du durchläufst p.ControlCount (Parent-Beziehung) und greifst dann auf p.Components (Owner-Beziehung) zu. Ist das Absicht?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:56 Uhr.
Seite 1 von 3  1 23      

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