Delphi-PRAXiS

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 Frame Align := alClient funktioniert nicht (https://www.delphipraxis.net/157964-frame-align-%3D-alclient-funktioniert-nicht.html)

Jens Hartmann 31. Jan 2011 17:21

Frame Align := alClient funktioniert nicht
 
Hallo zusammen,

ich habe ein Frame, welches ich in ein Pagecontroll.TabSheet1 eingefügt habe. Das ganz funktioniert auch zur Entwicklungszeit ganz gut. Das Frame passt vollständig in das TabSheet. Zur Laufzeit wird jedoch der untere Teil des Frames abgeschnitten und ist nicht mehr sichtbar.

Allerdings versteh ich das nicht ganz, wenn ich doch ein Frame oder z.B. ein Panel auf einen TabSheet lege und dem Frame Align := clClient zuweise, müsste er sich doch automatisch an die Größe des TabSheets anpassen. Oder habe ich da was falsch verstanden.

Gruß Jens

uligerhardt 31. Jan 2011 17:25

AW: Frame Align := alClient funktioniert nicht
 
Schuss ins Blaue: Der Frame wird schon die Größe des TabSheets annehmen, aber die darauf liegenden Controls werden sich vermutlich nicht an die Größe des Frames anpassen.

Jens Hartmann 31. Jan 2011 18:42

AW: Frame Align := alClient funktioniert nicht
 
Eigendlich müssten die Komponenten das aber, ich habe folgenden Aufbau...

1. Frame, darauf 1 Panel = AlClient -> Somit Größe des Frames.
2. 2Panel 1 = AlTop, 1 = AlButtom
3. Jeweils 8 Panels auf den o.g. Panels alle mit AlTop;

Die Höhe lege ich im Code Fest...
Delphi-Quellcode:
procedure TFrame1.SetPanelHeight;
var
  i : Integer;
begin
  pnlGroup1.Height := pnlGround1.Height div 2;
  pnlGroup2.Height := pnlGround1.Height div 2;
  for i := 1 to 8 do
    begin
      (FindComponent('pnl'+IntToStr(i)) as TPanel).Height := pnlGroup1.Height div 8;
    end;
  for i := 9 to 16 do
    begin
      (FindComponent('pnl'+IntToStr(i)) as TPanel).Height := pnlGroup2.Height div 8;
    end;
end;
Das sollte doch eigendlich gehen, Oder?

Gruß Jens

uligerhardt 31. Jan 2011 19:32

AW: Frame Align := alClient funktioniert nicht
 
Zitat:

Zitat von Jens Hartmann (Beitrag 1078625)
Eigendlich müssten die Komponenten das aber, ich habe folgenden Aufbau...

1. Frame, darauf 1 Panel = AlClient -> Somit Größe des Frames.
2. 2Panel 1 = AlTop, 1 = AlButtom

Ich würde mal eines von den beiden auf alClient setzen...
Zitat:

Zitat von Jens Hartmann (Beitrag 1078625)
3. Jeweils 8 Panels auf den o.g. Panels alle mit AlTop;

...und hier auch eines pro Achtergruppe. Die Größe der Panels mit alClient brauchst du dann in SetPanelHeight nicht mehr explizit setzen.

ak-ac 31. Jan 2011 19:44

AW: Frame Align := alClient funktioniert nicht
 
Das Problem mit den Frames (auf Tabsheets ?!) kenne ich, da hat bei mir nur ein manuelles Refresh geholfen, damit das nach dem Anzeigen klappt (FormShow war glaube ich zufrüh)...

Meine Vermutung ist, dass Tabsheets das irgendwie nicht weitergeben und dadurch die untergeordneten Elemente keine korrekte Größe darstellen könenn.

Jens Hartmann 31. Jan 2011 21:12

AW: Frame Align := alClient funktioniert nicht
 
Ich habe es hinbekommen,

hier die Lösung...
Delphi-Quellcode:
procedure TFrame1.SetPanelHeight;
var
  i : Integer;
begin
  { Ground 1 }
  pnlGroup1.Height := (pnlGround1.Height div 2);
  pnlGroup2.Height := (pnlGround1.Height div 2);
  pnlGroup1.Align := ClTop;
  pnlGroup1.Left := 1;
  pnlGroup1.Top := 1;
  pnlGroup2.Left := 1;
  pnlGroup2.Top := pnlGroup1.Top + pnlGroup1.Height;
  pnlGroup2.Align := ClClient;

  for i := 1 to 8 do
    begin
      (FindComponent('pnl'+IntToStr(i)) as TPanel).Height := pnlGroup1.Height div 8;
      (FindComponent('pnl'+IntToStr(i)) as TPanel).Left := 1;
      (FindComponent('pnl'+IntToStr(i)) as TPanel).Top := 1 +
        (i * pnlGroup1.Height div 8) - pnlGroup1.Height div 8
    end;
  for i := 9 to 16 do
    begin
      (FindComponent('pnl'+IntToStr(i)) as TPanel).Height := pnlGroup2.Height div 8;
      (FindComponent('pnl'+IntToStr(i)) as TPanel).Left := 1;
      (FindComponent('pnl'+IntToStr(i)) as TPanel).Top := 1 +
        ((i-8) * pnlGroup2.Height div 8) - pnlGroup2.Height div 8
    end;
Gruß Jens

uligerhardt 31. Jan 2011 21:42

AW: Frame Align := alClient funktioniert nicht
 
Zitat:

Zitat von Jens Hartmann (Beitrag 1078659)
Ich habe es hinbekommen,

Cool. :thumb:

Noch etwas Genörgel am Rande. :-P Statt sowas:
Zitat:

Zitat von Jens Hartmann (Beitrag 1078659)
Delphi-Quellcode:
  for i := 1 to 8 do
    begin
      (FindComponent('pnl'+IntToStr(i)) as TPanel).Height := pnlGroup1.Height div 8;
      (FindComponent('pnl'+IntToStr(i)) as TPanel).Left := 1;
      (FindComponent('pnl'+IntToStr(i)) as TPanel).Top := 1 + (i * pnlGroup1.Height div 8) - pnlGroup1.Height div 8
    end;

nimm doch lieber eine Variable:
Delphi-Quellcode:
var
  pnl: TPanel;

  for i := 1 to 8 do
  begin
    pnl := (FindComponent('pnl'+IntToStr(i)) as TPanel);
    pnl.Height := pnlGroup1.Height div 8;
    pnl.Left := 1;
    pnl.Top := 1 + (i * pnlGroup1.Height div 8) - pnlGroup1.Height div 8
  end;
So ist es lesbarer und schneller.
Und im konkreten Fall, wo du mehrere Positionsproperties auf einmal setzt, würde ich mir mal SetBounds anschauen.

Hawkeye219 1. Feb 2011 07:56

AW: Frame Align := alClient funktioniert nicht
 
Hallo,

hier ist noch ein Tipp: TGridPanel

Gruß Hawkeye

Jens Hartmann 3. Feb 2011 19:58

AW: Frame Align := alClient funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo und schönen guten Abend zusammen,

erstmal besten Danke für die guten Ideen. Ich habe allerdings ein echt seltsames Verhalten beim Gridpanel.

Die Kompo ist soweit ich das sehen kann, genau die Lösung die ich Suche. Allerdings nachdem ich Sie eingerichtet habe und als Frame implementiert habe, kommt beim kompilieren immer unten angehangener Fehler.

Das seltsame ist, das das erst nach schließen des Projektes auftritt. Ich erstelle ein Grid Panel mit 8 Gleichen Feldern. Die Prozentualle Einteilung mach ich im Constructor des Frames...
Delphi-Quellcode:
constructor TFrame2.Create(AOwner: TComponent) ;
var
  i : Integer;
begin
  inherited Create(AOwner);
  grindpnlGround.ColumnCollection.BeginUpdate;
  for i := 0 to 3 do
    begin
      grindpnlGround.ColumnCollection[i].SizeStyle := ssPercent;
      grindpnlGround.ColumnCollection[i].Value    := 25;
    end;
  for i := 0 to 1 do
    begin
      grindpnlGround.RowCollection[i].SizeStyle := ssPercent;
      grindpnlGround.RowCollection[i].Value    := 50;
    end;
  grindpnlGround.ColumnCollection.EndUpdate;
end;
Wie gesagt, das ganze funktioniert bis nach dem schließen des Projektes. Öffne ich das Projekt erneut, ist der Fehler da. Löschen ich dann alle GridPanels, und lege Sie neu ins Frame, geht alles wieder, allerdings wieder nur bis zum nächsten schließen.

Irgend jemand eine Idee.

Gruß Jens

Jens Hartmann 4. Feb 2011 14:15

AW: Frame Align := alClient funktioniert nicht
 
Eventuell doch jemand eine Idee. Ich habe das ganze jetzt noch mehrmals in allen möglichen Varianten durchgespielt, und immer mit dem selben Ergebnis.

Das Problem ist ja, das es bis zum schließen immer ohne Problem funktioniert.:gruebel::gruebel::gruebel::gruebel:

Gruß Jens

stahli 4. Feb 2011 14:37

AW: Frame Align := alClient funktioniert nicht
 
Tritt der Fehler auch auf, wenn Du alles nach inherited ausklammerst?

Jens Hartmann 4. Feb 2011 15:47

AW: Frame Align := alClient funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Leider auch der selbe Fehler.

Wie gesagt, bis zum schließen Funtz das ganze. Dann alle GridPanel löschen, Neu implementieren und es geht wieder.

Projekt schließen, Projekt öffnen, Fehler da. Delphi meldet das dann schon beim Projekt öffnen. Siehe Anhang.

Gruß Jens

stahli 4. Feb 2011 16:05

AW: Frame Align := alClient funktioniert nicht
 
Dann liegt das Problem ja nicht in Deinem Quelltextausschnitt.
Machst Du noch mehr im Frame.Create?

Es sieht ja so aus, als ob eine Zelle gelöscht wird, die ein Control enthält.

Die Fehlermeldung kenne ich von Komponenten, bei denen bisher existierende Eigenschaften entfernt werden. Die IDE kann dann die Eingenschaftswerte, die in der DFM stehen, keiner Eigenschaft zuordnen.

Kommst Du besser zurecht, wenn Du den Frame erst zu Laufzeit dynamisch erzeugst und in das Formular setzt?
Alternativ nutze ich inzwischen auch lieber dynamisch eingebundene Formulare - die sind mir sympathischer als Frames.

Sybok Factor 4. Feb 2011 17:29

AW: Frame Align := alClient funktioniert nicht
 
aus eigener leidvoller Erfahrung: Wenn du an der GUI des Frames etwas änderst, speziell etwas löschst, dann lösche den Frame dort wo du ihn zugeordnet hast und lege ihn dann NEU auf das Elterncontrol.

Align := alClient macht dann Probleme wenn der Frame auf einem Control liegt, dass ebenfalls alClient hat oder wenn darauf Elemente liegen, die auch automatisch in der Größe geändert werden soll.

Noch zu deinem Problem mit dem fehlenden Element: Ich bin mir nicht ganz sicher, aber ich meine mich zu erinnern, dass ich ähnliche Fehler hatte, wenn der Frame "zu früh" erzeugt wurde. Eventuell hilft es den Erstellungszeitpunkt nach hinten zu setzen.

Jens Hartmann 4. Feb 2011 19:30

AW: Frame Align := alClient funktioniert nicht
 
Zitat:

Zitat von stahli
Dann liegt das Problem ja nicht in Deinem Quelltextausschnitt.
Machst Du noch mehr im Frame.Create?

Nein, das war das gesamte Frame.Create!

Zitat:

Zitat von stahli
Es sieht ja so aus, als ob eine Zelle gelöscht wird, die ein Control enthält.

Das ist aber definitiv nicht der Fall. Die Komponenten die auf den Zellen liegen, werden später erst erzeugt.

Zitat:

Zitat von stahli
Kommst Du besser zurecht, wenn Du den Frame erst zu Laufzeit dynamisch erzeugst und in das Formular setzt?
Alternativ nutze ich inzwischen auch lieber dynamisch eingebundene Formulare - die sind mir sympathischer als Frames.

Ja, so funktioniert es fehlerfrei,
Delphi-Quellcode:
 
 gridFrame1 := TFrame2.Create(Self);
  with gridFrame1 do
  begin
    Name := 'gridFrame1';
    Parent := PageControl1.Pages[0];
    Align := alClient;
  end;
Zitat:

Zitat von Sybok Factor
Align := alClient macht dann Probleme wenn der Frame auf einem Control liegt, dass ebenfalls alClient hat oder wenn darauf Elemente liegen, die auch automatisch in der Größe geändert werden soll.

Alles diese ist genau so, allerdings erzeuge ich das Frame dynamisch funktioniert es!

Zitat:

Zitat von Sybok Factor
Noch zu deinem Problem mit dem fehlenden Element: Ich bin mir nicht ganz sicher, aber ich meine mich zu erinnern, dass ich ähnliche Fehler hatte, wenn der Frame "zu früh" erzeugt wurde. Eventuell hilft es den Erstellungszeitpunkt nach hinten zu setzen.

Das kann schon sein, da der Frame aber auf dem PageControl schon zur Entwicklungszeit gelegen hat, habe ich ja auf den Code, wann das Frame erzeugt wird keinen Einfluss.

Naja, dynamisch funktioniert es. Aber ich fände schon Intresant wo der Fehler liegt.

Gruß Jens

stahli 4. Feb 2011 19:48

AW: Frame Align := alClient funktioniert nicht
 
Ich habe nur so eine ungefähre Vermutung:

Die Controls auf einem Frame werden als Eigenschaften des Frames behandelt und beim Schließen des Projektes im Formular gespeichert.
Beim Öffnen des Formulars sollen die Controls wieder entsprechend eingerichtet werden, sind aber zu dem Zeitpunkt vielleicht noch nicht vorhanden.

Ist aber nur eine Vermutung.

Ich verzichte lieber auf Frames und nutze dynamische Formulare. Das finde ich im Handling übersichtlicher.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 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