TPanel vs. TCustomPanel

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

TPanel vs. TCustomPanel

Beitrag von Mathias »

Sehe ich das richtig, das die Custom-Version auf das ganzen published-Block verzichtet, und somit besser geeignet ist, wen man selbst eine abgeleitet Komponente programmieren will ?
Die betrifft auch andere Komponenten und nicht nur das Panel.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TPanel vs. TCustomPanel

Beitrag von Michl »

Genau, sonst würden alle Properties, die du selbst gar nicht vom Programmierer bearbeitbar machen willst, ebenfalls im Objectinspektor erscheinen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TPanel vs. TCustomPanel

Beitrag von Mathias »

Dann sollte man sich angewöhnen, immer die Custom-Variante zu verwenden, wen man eine eigene Komponente machen will.

Wie sieht es aus, wen man Komponenten dynamisch erzeugt ?

Was ist hier besser Button 1 oder 2 ?

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var
  Button1: TCustomButton;
  Button2: TButton;
begin
  Button1 := TCustomButton.Create(Self);
  Button1.Parent := Self;
  Button2 := TButton.Create(Self);
  Button2.Parent := Self;
  Button2.Top := 30;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4888
Registriert: Fr 8. Apr 2011, 09:01

Re: TPanel vs. TCustomPanel

Beitrag von wp_xyz »

Button1 ist falsch, die wesentlichen Eigenschaften sind in der Regel als protected realisiert, so dass nur Nachfahren von TCustomButton auf sie zugreifen können. Da TForm1 kein Nachfahre von TCustomButton ist, hast du keine Möglichkeit z.b. die Caption zu setzen oder einen OnClick-Handler einzuhängen. Und manchmal haben die TCustomXXX-Klassen auch noch abstrakte Methoden - wenn diese aufgerufen werden, sagt dein Programm leise Tschüss.

Warum ist das so umständlich? Das liegt daran, dass innerhalb einer Klassenhierarchie die Sichtbarkeit von Eigenschaften nicht mehr zurückgestellt werden kann. Wenn also der "Ur-Button" die Eigenschaft "caption" veröffentlichen würde (published), wäre sie bei allen Nachfahren im Objekt Inspektor sichtbar. Wenn du jetzt z.B. einen neuen Button entwickelst, der Caption gar nicht braucht, weil er nur ein Icon anzeigen soll, dann würde der User immer durch die unnötige Eigenschaft Caption im ObjekctInspector verwirrt werden. Aus diesem Grund implementiert man das Verhalten aller Komponenten immer in Form von TCustomXXXX-Vorfahren, bei denen alle Properties "protected" sind (also für das Formular und den Object Inspector nicht sichtbar) und schiebt dann eine TXXXXX Komponente hinterher, in der man die benötigten Eigenschaften published macht.

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TPanel vs. TCustomPanel

Beitrag von Mathias »

Aha. 8)
Mit der Zeit versteht man immer mehr.

Ist an der Zeit, das ich mich mehr mit der LCL beschäftige. 8)
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten