Delphi-PRAXiS
Seite 13 von 13   « Erste     3111213   

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/)
-   -   Delphi Benötige Hilfe beim Entwickeln einer Komponente (https://www.delphipraxis.net/98560-benoetige-hilfe-beim-entwickeln-einer-komponente.html)

oki 9. Sep 2007 20:18

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Das müsste imho auch klappen:
Delphi-Quellcode:
    SetBkMode(Canvas.Handle, TRANSPARENT);
bin mir aber nicht sicher.

Gruß oki

torud 9. Sep 2007 21:04

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Also der Border wird nun auch gezeichnent, wenn ich ein Bild habe. Komischerweise wird der Gradient nicht mehr gezeichnet. Stattdessen wird alles Schwanzr gezeichnet. Ich könnte im absoluten notfall darauf verzichten. Was soll. Kann ich´s eben nicht ändern.

Was aber komisch ist, ist, dass wenn ich das Control verlasse und auf das Formular klicke, das Control nicht neu gezeichnet wird und es die fokusierdenden Vierecke behält. Woran kann das liegen?

oki 10. Sep 2007 06:14

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Moin Tom,

wer malt wann die fokusierenden Vierecke auf dein Control?

torud 10. Sep 2007 06:51

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Moin Oki,

ich habe mir ein Beispielprojekt angelegt, wo ich von Zeit zu Zeit etwas teste. Klicke ich darin die Komponente an, wird sie natürlich fokusiert. Klicke ich aber wieder auf das Formular selbst, sollten ja die kleinen Vierecke verschwinden, die vorher fokusgerecht gezeichnet wurden.

Lege ich 2 von den Komponenten auf das Form und wechsle den Fokus zwischen den Controls, dann funktioniert das ganz gut. Ich habe es mir aber zur Laufzeit mal angesehen, da ich ja da auch dieses Control verschieben muss und in dem Fall ja auch die fokusierenden Vierecke gezeichnet werden und da ist alles ok.

oki 10. Sep 2007 07:18

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Hi Tom,

über diese Erscheinung bin ich auch gestolpert. Da du SetFocus sowie die Methoden Doenter und DoExit benutzt tritt folgendes Problem auf. DoExit wird nur aufgerufen, wenn das Control und/oder der Container des Controls seinen Focus verliert. Aktivierst du per Maus den Container deines Controls, so wird nicht DoExit aufgerufen! Ich habe dieses Problem mit einem eigenen Ereignes OnSelekt gelöst. Hier werden dann zur laufzeit alle anderen Controls deselektiert. So zu sagen von Oben per Hand.
Schau mal in die Hilfe für SetFocus. Da ist das Thema Focus setzen beschrieben. Die Methoden Doenter und DoExit scheinen explizit auf den Focus zu reagieren.

Gruß oki

torud 10. Sep 2007 21:46

Komponente drängelt sich immer in den Vordergrund
 
Dies wird wohl "schon" meine letzte Frage in diesem Thread sein. Ich bin nun soweit fertig und musste es einfach trennen, da ich nicht alles an Funktionalität in der Kompo unterbringen konnte...

Nun zur eigentlichen Problematik:

Die Komponente drängelt sich immer in den Vordergrund!!! Dies habe ich zum einen im FormDesigner bemerkt und auch in meinen Programmen, wo ich die Controls auch gern mal nach hinten versetze, um Controls, die dahinter liegen sichtbar zu machen. TCustomControl scheint sich nicht darum zu kümmern. Oder muss ich hierzu wieder eine spezielle Eigenschaft anlegen???

Das komische ist, dass das in den Hintergrundsetzen untereinander zwischen den TCustomControl-Komponenten funktioniert, aber wenn ich zum Beispiel ein TLabel- oder eine TImage-Komponente sehen will, oder dies auf das TCustomControl legen will (nicht als Child), so ist das nicht möglich. Sollte das grundsätzlich nicht gehen, werde ich wohl oder über auf TPanel ausweichen müssen...

//Edit
Ich sehe gerade, dass sich das TPanel genauso verhält. Gibt es das einen Weg das zu ändern? Ich habe Images und Labels, die auch in den Vordergrund zu holen sein müssen.

Hawkeye219 10. Sep 2007 22:13

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Hallo Tom,

ich fürchte, du wirst das nicht so einfach ändern können. Eine von TWinControl abgeleitete Komponente liegt immer über den von TGraphicControl abgeleiteten Komponenten. Letztere besitzen kein eigenes Handle und können sich nur auf dem Canvas ihres Parent-Controls darstellen. Ein möglicher Ausweg könnte aber darin bestehen, die Images und Labels auf rahmenlose Panels zu setzen und diese Panels nach vorne zu bringen.

Gruß Hawkeye

torud 11. Sep 2007 08:58

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Danke für Deine Antwort.

Ich habs jetzt von ner Paintbox abgeleitet, weil ich dem TImage auch keinen Rahmen auf den Canvas zeichnen durfte. Geht nur bei Bitmap - meckerte DER ständig rum...

christophww 17. Jul 2013 16:42

AW: Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Das Thema ist zwar schon alt, aber da ich die Funktion DrawGradient von hier habe, will ich andere davor bewahren, in den gleichen Fehler zu laufen. Es hat Tage gedauert, bis ich verstanden habe, dass die lokale Variable c nicht initialisiert wird und deshalb der Wert von c.reserved manchmal nicht 0 ist. Dann wurde statt eines Farbverlaufs nur noch die Farbe Schwarz ausgegeben.

ALSO UNBEDINGT: c.reserved:=0;

procedure DrawGradient(const Canvas: TCanvas; Color1, Color2: TColor;
ARect: TRect; GradientOrientation: TGradientOrientation);
var
c1, c2, c: TPixelRec; //for easy access to RGB values as well as TColor value
x, y: Integer; //current pixel position to be set
OldPenWidth: Integer; //Save old settings to restore them properly
OldPenStyle: TPenStyle;//see above
begin
c1.Color := ColorToRGB(Color1); //convert system colors to RGB values
c2.Color := ColorToRGB(Color2); //if neccessary
OldPenWidth := Canvas.Pen.Width; //get old settings
OldPenStyle := Canvas.Pen.Style;
Canvas.Pen.Width:=1; //ensure correct pen settings
Canvas.Pen.Style:=psInsideFrame;

c.reserved:=0; // :!:

case GradientOrientation of
goVertical:
begin
for y := 0 to ARect.Bottom - ARect.Top do
begin
c.r := Round(c1.r + (c2.r - c1.r) * y / (ARect.Bottom - ARect.Top));
c.g := Round(c1.g + (c2.g - c1.g) * y / (ARect.Bottom - ARect.Top));
c.b := Round(c1.b + (c2.b - c1.b) * y / (ARect.Bottom - ARect.Top));
Canvas.Brush.Color := c.Color;
Canvas.FillRect(Classes.Rect(ARect.Left, ARect.Top + y,
ARect.Right, ARect.Top + y + 1));
end;
end;
goHorizontal:
begin
for x := 0 to ARect.Right - ARect.Left do
begin
c.r := Round(c1.r + (c2.r - c1.r) * x / (ARect.Right - ARect.Left));
c.g := Round(c1.g + (c2.g - c1.g) * x / (ARect.Right - ARect.Left));
c.b := Round(c1.b + (c2.b - c1.b) * x / (ARect.Right - ARect.Left));
Canvas.Brush.Color := c.Color;
Canvas.FillRect(Rect(ARect.Left + x, ARect.Top,
ARect.Left + x + 1, ARect.Bottom));
end;
end;
end;
Canvas.Pen.Width := OldPenWidth; //restore old settings
Canvas.Pen.Style := OldPenStyle;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 Uhr.
Seite 13 von 13   « Erste     3111213   

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