Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sichtbarkeit von TFrame Bestandteilen (https://www.delphipraxis.net/158461-sichtbarkeit-von-tframe-bestandteilen.html)

WoGe 18. Feb 2011 13:57

Sichtbarkeit von TFrame Bestandteilen
 
Hallo

wie ist es möglich in einem Frame einen TButton vor dem Objektinspector bzw. der Codevervollständigung zu verstecken, bzw. das puplished property im Objektinspector zu sehen?

Delphi-Quellcode:
TMyFrame = class(TFrame)
 myButton : TButton //<--- Den hier
private
{...}
public
  property Eins ....
published
  property Zwei ... //<--- Das hier
 {...}
Jeden Versuch vor den Knopf private oder protected zu schreiben, lässt der Copiler klaglos zu, das Programm stürzt dann aber mit der Meldung es könne TButton nicht finden ab.

Grüsse
wo

shmia 18. Feb 2011 15:00

AW: Sichtbarkeit von TFrame Bestandteilen
 
Das ist leider nicht möglich.
Alle Komponenten (Buttons, Edits,..) auf dem Frame müssen in dem Bereich vor dem Private Abschnitt liegen.
Dieser Bereich wird von der IDE kontrolliert und darf nicht vom Programmierer verändert werden.

Gerade bei Frames sollte man darauf achten nicht direkt vom Formular auf die Komponenten zuzugreifen.
Stattdessen sollte man zusätzliche Properties verwenden:
Delphi-Quellcode:
TLoginFrame = class(TFrame)
 { Bereich von IDE kontrolliert }
 EditUser : TEdit
 EditPasswort : TEdit;
 { bis hier }
private
{...}
public
  property Username:string read GetUserName write SetUserName;
  property Password:string read GetPassword write SetPassword;
Leider wird manchmal versehentlich ein Control auf dem Frame verschoben und diese Änderung wird natürlich in der DFM des Formulars gespeichert.

Um diese Änderungen rückgängig zu machen, Formular anzeigen, ALT-F12 drücken
und nach dem Namen des Frame suchen:
Delphi-Quellcode:
inline LoginFrame1: TLoginFrame
  Top = 503
  Width = 797
  HelpContext = 17000
  Align = alBottom
  Anchors = []
  TabOrder = 3
  inherited EditUser: TEdit
      Width = 797
      OnClick = StatusGridClick
Dann die eingebetten Objekte (hier inherited EditUser) löschen.
Möglich, dass es für höhere Delphi Versionen einen Änderungsschutz gibt.
(habe hier leider nur D5)

WoGe 18. Feb 2011 15:33

AW: Sichtbarkeit von TFrame Bestandteilen
 
Zitat:

Zitat von shmia (Beitrag 1082674)
Gerade bei Frames sollte man darauf achten nicht direkt vom Formular auf die Komponenten zuzugreifen.
Stattdessen sollte man zusätzliche Properties verwenden:

Genau deswegen wollte ich ja die Komponenten des Frames "beschützen" und sozusagen ausblenden.
Bei meinem Frame darf:!: nicht direkt auf die Komponenten zugegriffen werden.

Schade das es nicht geht
Danke
wo

Deep-Sea 18. Feb 2011 16:20

AW: Sichtbarkeit von TFrame Bestandteilen
 
Zitat:

Zitat von WoGe (Beitrag 1082682)
Schade das es nicht geht

Es geht, sofern du nicht den Formulardesigner nutzt, sondern die Komponenten selbst zur Laufzeit erzeugst :wink:

stahli 18. Feb 2011 16:24

AW: Sichtbarkeit von TFrame Bestandteilen
 
... oder Frames bzw. Formulare (erst) zur Laufzeit dynamisch in ein Formular einbinden.

shmia 18. Feb 2011 16:50

AW: Sichtbarkeit von TFrame Bestandteilen
 
Zitat:

Zitat von WoGe (Beitrag 1082682)
Genau deswegen wollte ich ja die Komponenten des Frames "beschützen" und sozusagen ausblenden.
Schade das es nicht geht

Ja, das ist leider eine grosse Schwäche von Delphi, dass Komponenten auf Formularen, Frames und DatenModulen automatisch published und damit von aussen sichtbar sind. :(

Dies verleitet insbesondere Anfänger dazu einfach so von Aussen auf die Komponenten zuzugreifen mit der Folge, dass alles Spaghettimässig verkoppelt wird.
Und ausserdem tauchen die Komponenten in der Codevervollständigung auf.

WM_CLOSE 18. Feb 2011 17:04

AW: Sichtbarkeit von TFrame Bestandteilen
 
Schwäche? Die Streamer der Komponenten brauchen nun einmal die RTTI. Wilst du deshalb auf einen Form Designer verzichten? Das ist selbst bei C# so, obwohl der die Kompos per Code erzeugt. Letztendlich machen die Komponentenstreamer nämlich genau das selbe wie du, in dem du auf die elemente zugreifst.

Die einzige Alternative : Von selbst schreiben.

shmia 18. Feb 2011 17:17

AW: Sichtbarkeit von TFrame Bestandteilen
 
Zitat:

Zitat von WM_CLOSE (Beitrag 1082717)
Schwäche? Die Streamer der Komponenten brauchen nun einmal die RTTI. Wilst du deshalb auf einen Form Designer verzichten?

Natürlich nicht.
Es ist nur so, das hier zwei Dinge vermischt wurden: Sichtbarkeit im Sourcecode und Persistenz.
Man könnte durchaus private Komponenten auf einem Formular haben, sie mit dem OE anzeigen/editieren und sie automatisch in der DFM speichern/laden.
Dazu müsste Delphi natürlich ein neues Attribut haben (z.B. "persistent") und intern müsste sich auch einiges ändern:
Delphi-Quellcode:
TForm1 = class(TForm)
  { wie bisher, Komponenten sind published und persistent }
  Edit1 : TEdit;
  Label1 : TLabel;
private persistent
  Edit1 : TEdit; {wird in DFM gespeichert, ist aber für aussenstehende Objekte privat}
private
  FCounter : integer;
protected
  procedure Irgendwas;virtual;
public
  procedure SetupFormular;


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