AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ClientRect begrenzen

Offene Frage von "oki"
Ein Thema von oki · begonnen am 25. Aug 2007 · letzter Beitrag vom 29. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2      
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

ClientRect begrenzen

  Alt 25. Aug 2007, 10:11
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
Miniaturansicht angehängter Grafiken
panel_beispiel_765.png  
42
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: ClientRect begrenzen

  Alt 25. Aug 2007, 10:24
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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3

Re: ClientRect begrenzen

  Alt 25. Aug 2007, 10:35
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:
Beschreibung

Mit ClientHeight können Sie die Höhe des Client-Bereichs des Steuerelements abrufen oder ändern.

Bei TControl ist ClientHeight mit der Eigenschaft Height identisch. In abgeleiteten Klassen kann aber eine ClientHeight-Eigenschaft implementiert werden, die sich von Height unterscheidet. So entspricht beispielsweise der Wert der Eigenschaft ClientHeight eines Formulars dem Wert von Height abzüglich der Höhe der Titelleiste, des Rahmens und der Bildlaufleiste.
Mein Code:
Delphi-Quellcode:
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;
Gruß oki
42
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: ClientRect begrenzen

  Alt 25. Aug 2007, 11:22
Hallo oki,

getestet habe ich es nicht, aber vielleicht genügt schon das Überschreiben der Methode Delphi-Referenz durchsuchenTWinControl.AdjustClientRect.

Gruß Hawkeye
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#5

Re: ClientRect begrenzen

  Alt 25. Aug 2007, 11:43
Hi Hawkeye219,

leider hat folgende Implementierung keine Änderungen gebracht:
Delphi-Quellcode:
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;
Irgentwie hänge ich fest. Aber gehen muß es doch.

Gruß oki
42
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#6

Re: ClientRect begrenzen

  Alt 25. Aug 2007, 12:09
Hallo oki,

bei meinem Q&D-Testprogramm habe ich keine Probleme feststellen können:

Delphi-Quellcode:
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;
Vielleicht fehlt in deiner Implementierung ein Aufruf der Methode Realign?

Gruß Hawkeye
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#7

Re: ClientRect begrenzen

  Alt 25. Aug 2007, 12:19
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
Miniaturansicht angehängter Grafiken
panel_beispiel_611.png  
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#8

Re: ClientRect begrenzen

  Alt 25. Aug 2007, 17:24
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
Miniaturansicht angehängter Grafiken
panel_beispiel_204.png  
42
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#9

Re: ClientRect begrenzen

  Alt 25. Aug 2007, 17:31
ich werfe hier mal folgenden source in den raum ...

Delphi-Quellcode:
    
procedure 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;
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 gesehen

das sollte eigentlich auch für alle anderen controls funken ...
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#10

Re: ClientRect begrenzen

  Alt 25. Aug 2007, 18:28
@ 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!!
Miniaturansicht angehängter Grafiken
wmnccalcsize_214.png  
42
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:26 Uhr.
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