Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Sollte man ColumnSpan/RowSpan noch verwenden? (https://www.delphipraxis.net/179516-sollte-man-columnspan-rowspan-noch-verwenden.html)

Der schöne Günther 12. Mär 2014 09:48

Sollte man ColumnSpan/RowSpan noch verwenden?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Wird allgemein davon abzuraten, in einem Gridpanel einzelne Komponenten mehrere Zeilen und/oder Spalten füllen zu lassen? In Bild 1 ein einfaches Beispiel: Das Gridpanel ist 2x2 groß, ein Button ist zwei Spalten breit (2x1), die anderen beiden normal 1x1.

Mich treibt folgendes in den Wahnsinn: Baut man den auf Bild 1 abgebildeten Frame nun irgendwo ein, ist alles noch in Ordnung. Noch. Nach einem Programmstart geht Delphi gerne hin und entfernt die ColumSpan/RowSpan-Angaben. Sie sind einfach weg. Das Ergebnis sieht man auf Bild 2.

Ich habe keine Ahnung, nach welchem Muster das passiert. Aber es ist nachstellbar. Die Frame-Inhalt liegt immer redundant kopiert auf dem Formular und das zerpfuscht er sich gerne.

Stark verwandt ist meine Frage von vor ein paar Monaten.

Ich würde gerne wissen: Wie bastelt Ihr eure Layouts? Wenn Colspan/Rowspan so fehlerhaft ist kann damit ja kein Mensch arbeiten...

nuclearping 12. Mär 2014 10:54

AW: Sollte man ColumnSpan/RowSpan noch verwenden?
 
Du hast das Glück, dass das GridPanel bei dir zumindest läuft. :mrgreen:

Wenn ich damit auf die gleiche Weise ein Layout basteln will, setzt er die Column- und RowSpans schon beim Compilen zurück und beim Start der Anwendung erhalte ich dann die Meldung "Eine Spalte die ein Steuerelement enthält, kann nicht gelöscht werden". Bumm und fertig und das Programm terminiert mit 'ner Exception wieder zurück in die IDE.

GridPanel scheint 'ne schöne Idee zu sein, wenn sie nur funktionieren würde. Leider habe ich auch noch keine anderen Lösungen gefunden, TMS und Jedi bieten auch keine Alternativen an. :(

Der schöne Günther 12. Mär 2014 11:56

AW: Sollte man ColumnSpan/RowSpan noch verwenden?
 
Ja, meistens schon beim Kompilieren. Ein kleiner Trick ist, dass Formular danach zu Schließen. Er wird die DFM nicht kaputtspeichern da er ja auch der Meinung ist, dass sich nichts geändert hat.

Ich finde das Gridpanel essenziell. Ich wüsste ehrlich gesagt nicht, wie man ohne überhaupt eine Oberfläche zusammenbekäme. Aber die ColSpan/Rowspan-Eigenschaften sind irgendwie- Wenn auf eingebetteten Frames- kaputt...

jaenicke 12. Mär 2014 13:21

AW: Sollte man ColumnSpan/RowSpan noch verwenden?
 
Hast du schon einen QC Eintrag mit einem guten Beispiel usw. erstellt? Wenn nicht, wird das wohl kaum behoben werden.

Ich selbst hatte damit bisher nur manchmal ein wenig Probleme die Prozentwerte richtig zu definieren, aber sonst funktionierte bei mir alles. Besonders oft habe ich das aber auch nicht benutzt, in der Regel reichen mir Align, Anchors & Co vollkommen aus.

Der schöne Günther 12. Mär 2014 13:41

AW: Sollte man ColumnSpan/RowSpan noch verwenden?
 
Nein, als erstes muss ich ja wissen, ob ich etwas offensichtliches falsch mache und ob das jemand nachstellen kann.

In reinem Code kann man das nicht nachstellen. Was sollte ich schreiben? "Drücke ein paar mal F9 und F12, irgendwann wirds schon kaputt gehen."? :-D

Bevor wir uns dem QC zuwenden: Könnte es an der
Delphi-Quellcode:
Default
-Direktive der entsprechenden Properties liegen?

Delphi-Quellcode:
TControlItem = class(TCollectionItem)
   [...]
   published
      property ColumnSpan: TCellSpan read FColumnSpan write SetColumnSpan default 1;
      property RowSpan: TCellSpan read FRowSpan write SetRowSpan default 1;
end;
Ich versuche derweil einmal herauszufinden, ob man eine 100%ig sichere Möglichkeit hat, dass Properties ungewollt auf 1 zurückspringen.


PS:

Hier zum Vergleich die DFMs:

Frame
Delphi-Quellcode:
object GridPanel1: TGridPanel
   [...]
    ColumnCollection = <
      item
        Value = 50.000000000000000000
      end
      item
        Value = 50.000000000000000000
      end>
    ControlCollection = <
      item
        Column = 0
        ColumnSpan = 2
        Control = Button1
        Row = 0
        RowSpan = 2
      end
   >
   object Button1: TButton
      [...]
   end
end
wird auf dem Formular mit der Zeit abgebildet durch
Delphi-Quellcode:
object Form25: TForm25
   inline Frame261: TFrame26
      [...]
      inherited GridPanel1: TGridPanel
         ControlCollection = <
            item
               Column = 0
               Control = Frame261.Button1
               Row = 0
            end
         >
       
         inherited Button1: TButton
            [...]
         end
      end
   end
end

nuclearping 12. Mär 2014 14:45

AW: Sollte man ColumnSpan/RowSpan noch verwenden?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1251723)
Nein, als erstes muss ich ja wissen, ob ich etwas offensichtliches falsch mache und ob das jemand nachstellen kann.

Wie schon gesagt: Ich kanns nachstellen. Allerdings mit 'nem komplexeren Layout, aber nach dem gleichen Prinzip.

Habs jetzt explizit nochmal nach deiner Anleitung gemacht und bei mir setzt er die ColumSpan für Button1 schon zurück, wenn ich nur Strg+F9 drücke.

Der schöne Günther 12. Mär 2014 16:25

AW: Sollte man ColumnSpan/RowSpan noch verwenden?
 
Ja, ich habe nur Angst, da eine halbe Stunde Arbeit reinzustecken, wenn es bei Embarcadero dann jemand nachstellen will klappt es nicht beim ersten Versuch und wird direkt abgestempelt und beiseite gelegt.

Ich hatte es übrigens beim letzten Versuch schon falsch direkt als man den Frame eingefügt hat ;-)

jaenicke 15. Mär 2014 08:45

AW: Sollte man ColumnSpan/RowSpan noch verwenden?
 
Den QC gibt es schon, allerdings ist der schon länger nicht bearbeitet und ist so bei mir auch nicht mehr reproduzierbar mit XE5:
http://qc.embarcadero.com/wc/qcmain.aspx?d=92298

Ich kann es jedoch 100%ig nachstellen, wenn ich es so mache (auf zwei PCs getestet):
  • Projekt schließen und neu öffnen
  • Frame auf das Formular legen
  • Ohne weitere Aktionen kompilieren oder ausführen
Geht man hingegen nachdem der Frame auf dem Formular liegt auf Speichern oder schaut mit Alt + F12 in den Formularcode, passiert das nicht.

Im Formularcode sieht man auch was passiert. Beim Kompilieren werden zwar auch die inherited Komponenten im Formularcode angelegt, aber dabei werden ColumnSpan und RowSpan nicht geschrieben.

Ich habe einmal einen neuen QC angelegt:
http://qc.embarcadero.com/wc/qcmain.aspx?d=123225

Sir Rufo 15. Mär 2014 08:59

AW: Sollte man ColumnSpan/RowSpan noch verwenden?
 
Das
Delphi-Quellcode:
default
tut nix (will nur spielen) und ist - abstrakt betrachtet - nur ein einfaches Attribut ohne jede aktive Auswirkung.

Delphi - Eigenschaften - Speicherbezeichner

Delphi-Quellcode:
TMyComponent = class( TComponent )
private
  const
    DEFAULT_MYVALUE = 1;
private
  FMyValue : integer;
public
  procedure AfterConstruction; override;
published
  property MyValue : integer read FMyValue write FMyValue default DEFAULT_MYVALUE;
end;

procedure TMyComponent.AfterConstruction;
begin
  inherited;
  // Man muss selber dafür sorgen, wenn mit dem Default-Wert initialisiert werden soll
  FMyValue := DEFAULT_MYVALUE;
end;

Uwe Raabe 15. Mär 2014 10:09

AW: Sollte man ColumnSpan/RowSpan noch verwenden?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1252077)
Das
Delphi-Quellcode:
default
tut nix (will nur spielen) und ist - abstrakt betrachtet - nur ein einfaches Attribut ohne jede aktive Auswirkung.

Das stimmt nicht ganz! Beim Streaming der Komponente wird ein Property nur dann gespeichert, wenn sein Wert ungleich des Default-Werts ist (außer es gibt noch ein stored Attribut). Auch ohne Angabe eines Default haben z.B. String-Properties den Default <leerstring> und Integer-Properties den Default 0.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:04 Uhr.
Seite 1 von 2  1 2      

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