![]() |
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!! |
Re: ClientRect begrenzen
Im Moment habe ich das Gefühl, dass der Schlüssel zur Lösung in diesem Zitat aus der OH für ClientHeight, wie schon weiter oben angeführt, liegt:
Zitat:
Zitat:
Klingelts da bei jemanden? (Bei mir nicht :cry: ) Gruß oki |
Re: ClientRect begrenzen
Tja, leider hab ich es über das Parent-Control noch nicht hin bekommen. :cry:
Aus diesem Grund hab ich es jetzt so gemacht, dass beim Verschieben des Controls geprüft wird, ob es sich im ClientRect des Parents befindet. Wenn nicht, dann wird die Position korriegiert. Gruß oki |
Re: ClientRect begrenzen
Zitat:
dein problem ist jetzt nur mehr, das du deine zeichenoperation auch in den NC Bereich verlegen mußt
Delphi-Quellcode:
Da du ja den ClientBeriech verkleinert hast, mußt du nun deine sachen (den Header und rahmen) in den NC Bereich verlegenprocedure WMNCPaint(var Msg: TWMNCPaint); message WM_NCPAINT; procedure TfrMDIChild.WMNCPaint(var Msg: TWMNCPaint); var DC : HDC; iCanvas : TCanvas; begin iCanvas := TCanvas.Create; DC := GetWindowDC(Handle) iCanvas.Handle := DC; FormNCPaint(iCanvas); <<< hier dann die zeichenroutine auf den Canvas ReleaseDC(Handle, DC); iCanvas.free; Msg.Result := 0; end; |
Re: ClientRect begrenzen
Hi Gruber_Hans_12345,
auch dir herzlichen Dank für deine Antworten. Nach dem zweiten Überlegen ist dein Codevorschlag wirklich interessant. Leider trifft er aber nicht den Kern meines aktuellen Problemes. Ich versuch es noch mal zu erklären. Mir geht es an dieser Stelle nicht darum, dass ich in meiner Compo in den definierten Clientbereich zeichne. Ich möchte, dass andere Kompos von mir zur Laufzeit nur im festgelegten Clientbereich platziert und verschoben werden können. Kann es sein, dass dein Codevorschlag ein Zeichnen zwischen WindowRect und ClientRect andeutet? Also sozusagen das Control per Hand zeichnen und den neuen Clientbereich auslassen. Somit würde das Zeichnen eventuell über den Rand geschobene Controls übermalen und somit den Eindruck erwecken, dass sie nur im ClientBereich sichtbar sind. Dann noch mal gefragt, was verstehst du unter NC-Bereich? Ich würde dann ja non-Client vermuten. Dank und Gruß oki |
Re: ClientRect begrenzen
ja, NC ist der Non Client Bereich
und ich habe diesen code dazu verwendet, um den Non-ClientBereich in meinem Formular zu vergrößern. das bedeutet, das jedes Panel, das bei 0,0 platziert wird, oder das mit Align = alClient verwendet wird, nun nur mehr in diesem ClientBereich platziert wird dh wird der NonClient Bereich vergrößert (der obige rand zb) dann rutschen alle controls nach unten, und können nicht in den NonClient Bereich verschoben werden. |
Re: ClientRect begrenzen
Klar, begriffen!
gruß oki |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:08 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