![]() |
ClientRect begrenzen
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Leute,
ich habe eine eigene Komponente abgeleitet von TCustomControl, die als Container für andere Controls dient. dieser Compo habe ich einen Tietel gegeben. Nun ist es aber so, dass meine enthaltenen Kompos über diesen Titel verschoben werden können. Bsp. im Anhang. wie kann ich den ClientBereich für die Contained-Components in meinem Panel eingrenzen, so dass sie nur bis zum unteren Rand meines Titels verschiebbar sind? gruß oki |
Re: ClientRect begrenzen
Hi,
da hast Du gleich mehrere Möglichkeiten. Interessant wäre allerdings, wie die Komponenten, die Du da rein setzt bisher verschoben werden. Verwendest Du einfach ein Mouse-Move-Event, so könntest Du in diesem dafür sorgen. Einfach Y-Koordinate auf den Wert prüfen. Wichtig ist dabei, dass Du berücksichtigst, dass ein solches gelbes Ding nicht direkt an der oberen Kante aufgenommen wird. Da müsstest Du natürlich noch schauen, wie weit die Maus-Position von der oberen Kante entfernt ist. Ansonsten könntest Du auch Dein Custom-Control mit zwei Panel versehen, wobei eines die Align Eigenschaft auf Top gesetzt bekommt, dass andere auf Client. Da obere kann dann als unabhängige Kopfzeile dienen, das untere eben als Dein Container, der nicht ohne weitere verlassen werden kann. Gruß Der Unwissende |
Re: ClientRect begrenzen
Hi unwissender,
Ich möchte es weitgehenst vermeiden, dass weitere Komponenten in meinem Control enthalten sind. Ich überarbeite gerade meine aktuelle Programmversion. Die elemente werden alle zur Laufzeit hinzugefügt. Das sin dann zum Schluss mehrere hundert (ist wirklich so, und ich war auch überrascht). In den einzelnen Controls weitere Kompos einzubinden hat in der Vergangenheit beim Zeichnen arge Performance Probleme verursacht. Deshalb gehe über den Weg "Zeichnen auf Canvas" ran. Da es viele verschiedene eigene Controls geben wird, die ich in einen solchen Container legen werde (zur Laufzeit) währe es mir lieber, wenn der Container das händelt. Wie bei einem Fenster. da kann man auch nichts in den Titel reinschieben. Ich habs jetzt schon mal über ClientHeight und ClientWidth versucht. aber da wird das komplette Control verkleinert wenn ich diese Werte kleiner als Width und Height setze. die Hilfe sagt hierzu eigentlich, dass das die richtige Stelle ist. aber entweder ich habe das falsch verstanden, oder was falsch gemacht. Zitat:
Delphi-Quellcode:
Gruß oki
procedure TBaseRTControl.SetClientRect;
begin if FShowTitle then begin // minus Titelhöhe und ein Pixel Rahmen self.ClientHeight := Height - Abs(self.Canvas.Font.Height) - 7; self.ClientWidth := Width - 2; end else begin self.ClientHeight := Height - 2; self.ClientWidth := Width - 2; end; end; |
Re: ClientRect begrenzen
Hallo oki,
getestet habe ich es nicht, aber vielleicht genügt schon das Überschreiben der Methode ![]() Gruß Hawkeye |
Re: ClientRect begrenzen
Hi Hawkeye219,
leider hat folgende Implementierung keine Änderungen gebracht:
Delphi-Quellcode:
Irgentwie hänge ich fest. :gruebel: Aber gehen muß es doch.
procedure TBaseRTControl.AdjustClientRect(var Rect: TRect);
begin // inherited; if FShowTitle then begin Rect := classes.Rect(1, Abs(self.Canvas.Font.Height) + 7, Width - 1, Height - 1); end else begin Rect := classes.Rect(1, 1, Width - 1, Height - 1); end; end; Gruß oki |
Re: ClientRect begrenzen
Hallo oki,
bei meinem Q&D-Testprogramm habe ich keine Probleme feststellen können:
Delphi-Quellcode:
Vielleicht fehlt in deiner Implementierung ein Aufruf der Methode Realign?
type
TMyControl = class (TCustomControl) private FHeaderVisible: Boolean; procedure SetHeaderVisible(aValue: Boolean); protected procedure AdjustClientRect(var Rect: TRect); override; procedure Paint; override; public property HeaderVisible: Boolean read FHeaderVisible write SetHeaderVisible; end; TForm1 = class (TForm) btnToggleHeader: TButton; procedure btnToggleHeaderClick(Sender: TObject); procedure FormCreate(Sender: TObject); private FMyControl: TMyControl; end; { TMyControl } const HEADERSIZE = 16; procedure TMyControl.AdjustClientRect(var Rect: TRect); begin inherited; Inc (Rect.Top, HEADERSIZE * Ord(FHeaderVisible)); end; procedure TMyControl.Paint; begin Canvas.Brush.Color := clYellow; Canvas.TextRect (Rect(0, 0, ClientWidth, HEADERSIZE), 4, 2, 'Hello world!'); end; procedure TMyControl.SetHeaderVisible(aValue: Boolean); begin FHeaderVisible := aValue; Realign; // fehlt das bei dir? end; { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin FMyControl := TMyControl.Create(Self); FMyControl.Parent := Self; FMyControl.SetBounds (16, 16, 240, 160); with TLabel.Create(Self) do begin Parent := FMyControl; Align := alClient; Alignment := taCenter; Layout := tlCenter; Color := clRed; Caption := 'Label'; end; end; procedure TForm1.btnToggleHeaderClick(Sender: TObject); begin FMyControl.HeaderVisible := not FMyControl.HeaderVisible; end; Gruß Hawkeye |
Re: ClientRect begrenzen
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Hawkeye219,
auch Realign hats nicht gebracht. Ich bin jedoch gerade mächtig verwirrt. Ich hab in die Implementierung von TCustomPanel geschaut. Da sieht es genau so aus, wie wir es machen. Nun hab ich mal ein Panel in ein Panel gelegt, um mir das mal anzuschauen. Das Ergebnis ist im Anhang. Was ist denn das? Bin ich blöd oder mein D2007? So soll das doch auch nicht aussehen? Gruß oki |
Re: ClientRect begrenzen
Liste der Anhänge anzeigen (Anzahl: 1)
Also nun seh ich gar nicht mehr durch.
Ich hab das Beispiel mit den Panels mal eben in meinem D5 getestet. Das sieht genau so aus. Wenn mich einer gefragt hätte, hätte ich schwören wollen, dass man das enthaltene Panel nicht über den Rand des contained-Panels schieben kann. Offensichtlich ist das aber so. Warum überschreibt dann TCustomPanel die Methode AdjustClientRect? Gruß oki |
Re: ClientRect begrenzen
ich werfe hier mal folgenden source in den raum ...
Delphi-Quellcode:
so kann an bei einem Formular den ClientBereich für die Controls definieren - also im Clientbereich definiert jetzt 0,0 den Punkt 4,28 fürs formular gesehenprocedure WMNCCALCSIZE(var Msg : TWMNCCalcSize); message WM_NCCALCSIZE; .... procedure TfrMDIChild.WMNCCalcSize(var Msg : TWMNCCalcSize); var NCRect: TRect; begin if not IsIconic(Handle) then begin NCRect := Msg.CalcSize_Params^.rgrc[0]; inc(NCRect.Top, 28); inc(NCRect.Left, 4); dec(NCRect.Right, 4); dec(NCRect.Bottom, 4); Msg.CalcSize_Params^.rgrc[0] := NCRect; end; end; das sollte eigentlich auch für alle anderen controls funken ... |
Re: ClientRect begrenzen
Liste der Anhänge anzeigen (Anzahl: 1)
@ Gruber_Hans_12345:
Leider nicht. der Codevorschlag liefert eher "komische" Ergebnisse. Siehe Anhang. Ich habe hier einmal meinen Mozilla in den Vordergrund und wieder zurück gebracht. Der Rand mit den Resten meines Browsers ist genau der eingekrenzte Rect aus deinem code. Ein Wechsel für Inc; Dec liefert das Ergebnis, dass von meinem Panel beim Verschieben etwas übrig bleibt (auf dem Parent). der gewünschte effekt für die enthaltenen Controls tritt aber nicht ein. @Hawkeye219: Ich teste gerade deinen Code. Leider hat der keine Auswirkungen auf das Platzieren der Controls. Ich erwähne es noch mal zur Sicherheit; meine Controls sind zur Laufzeit verschiebbar! Also meine Labels können mit der Maus gegriffen, verschoben und zur Laufzeit in ihrer Größe geändert werden. Gruß oki P.S. Schon mal herzlichen Dank für die Gedult bei der Hilfe an Alle!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 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 by Thomas Breitkreuz