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 Vererbung bestimmter Eigenschaften deaktiviern (https://www.delphipraxis.net/84647-vererbung-bestimmter-eigenschaften-deaktiviern.html)

delphin 19. Jan 2007 14:10


Vererbung bestimmter Eigenschaften deaktiviern
 
Hallo,

ich habe von einem CheckListfeld eine Edit Feld zur Eingabe wiefolgt abgeleitet:
Delphi-Quellcode:
 
Edit1:=TEdit.Create(nil)
Edit1.Parent:=CheckListBox;
Nun erbt Edit erstmal alle Eigenschaften von meiner Checklistbox. Soweit logisch. Wenn ich nun mein Editfeld in Höhe und Schriftgröße wie folgt ändern möchte:

Delphi-Quellcode:
Edit1.Height:=DrawRect.Bottom-DrawRect.Top+1;
dann bleibt das ohne Auswirkung!? :wall:

Wie kann ich die Vererbung für diese Eigenschaft abstellen ?

mkinzler 19. Jan 2007 14:11

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
mach sie privat.

delphin 19. Jan 2007 16:03

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
Wie meinst Du das mit:
Zitat:

mach sie privat.
Wenn ich die Deklartion so einstelle:

Delphi-Quellcode:
TForm1 = class(TForm)
    // Edit1: TEdit;
    CheckListBox: TCheckListBox;
    procedure FormCreate(Sender: TObject);
    procedure CheckListBoxDblClick(Sender: TObject);
    procedure CheckListBoxExit(Sender: TObject);
  private
    { Private-Deklarationen }
    Edit1: TEdit;
  public
    { Public-Deklarationen }
  end;
bringt das keine Punkt. Die Zuweisung von Edit.Height:=xy hat keine Auswirkung. Die Höhe bleibt wie sie geerbt wurde!

Gerd

MrKnogge 19. Jan 2007 16:40

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
Was ist DrawRect ?
Wenn ich die Höhe eines Edit ändere, so funktioniert das ohne Probleme !

TStringlist 19. Jan 2007 17:02

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
Zitat:

Zitat von delphin
ich habe von einem CheckListfeld eine Edit Feld zur Eingabe wiefolgt abgeleitet:
Delphi-Quellcode:
 
Edit1:=TEdit.Create(nil)
Edit1.Parent:=CheckListBox;
Nun erbt Edit erstmal alle Eigenschaften von meiner Checklistbox. Soweit logisch.

Wahrscheinlich hast Du noch keinen rechten Durchblick diesbezüglich, aber eine Parent-Zuweisung bewirkt nur, dass das Edit1 danach visuell auf deiner CheckListBox draufsitzt, bzw. oben drauf zum Vorschein kommt. Sonst nichts weiter!

[edit=Christian Seehase]Doppelpost gelöscht. Mfg, Christian Seehase[/edit]

Hansa 19. Jan 2007 17:44

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
So ist es. Die OOP-Konzepte, insbesondere Vererbung scheinen nicht bekannt zu sein. Vererbt wird so jedenfalls nichts.

delphin 19. Jan 2007 19:36

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
Hallo,

mir ist sehr wohl klar, das ich mit der Anweisung

Delphi-Quellcode:
Edit1.Parent:=CheckListBox;
die erstellte Komponente auf der Checklistbox sichtbar mache.
Trotzdem bleibe ich dabei, dass es dadurch auch die Eigenschaft der Checklistbox irgendwie "erbt".

mit folgender Anweisung:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
Var DrawRect: TRect;
begin {== Checklistbox erzeugen ===========================}
      CheckListBox:=TCheckListBox.Create(Form1);
      CheckListBox.Parent:=(Form1);
      CheckListBox.Items.Add('Zeile 1');
      CheckListBox.Items.Add('Zeile 2');
      CheckListBox.Items.Add('Zeile 3');
      CheckListBox.Font.Size:=10;     // diesen Parameter erhält oder erbt auch Edit1 !!
     
      {== Editfeld erzeugen und auf Checkbox legen =======}
      Edit1:=TEdit.Create(Form1);
      Edit1.Parent:=CheckListBox;
     
      {== Ermitteln der Edit.Höhe über Größe der CheckListbox ==}
      DrawRect:=CheckListBox.ItemRect(0);
      Edit1.Height:=DrawRect.Bottom-DrawRect.Top+2;
      Edit1.Visible:=false;
end;
Fragen:
1. Die Zuweisung für Edit.Height wird hier völlig ignoriert !
2. Erhält die Edit-Komponente z.B. genau die Schriftgöße, die Checklistbox zugewiesen bekommt. Warum, wenn nicht geerbt ?

3. schreibt man z.B. für das Ereignis Doppelklick folgendes:
Delphi-Quellcode:
  //Variante 1:
procedure TForm1.CheckListBoxDblClick(Sender: TObject);
Var DrawRect: TRect;
begin DrawRect:=CheckListBox.ItemRect(CheckListBox.ItemIndex);
      Edit1.Text:=CheckListBox.Items.Strings[CheckListBox.ItemIndex];
      Edit1.Top:=DrawRect.Top;
      Edit1.Visible:=true;
end;
wird die im OnCreate-Ereignis eingestelle Größe völlig ignoriert !

schreibt man aber für das Ereignis Doppelklick folgendes:
Delphi-Quellcode:
  //Variante 2:
procedure TForm1.CheckListBoxDblClick(Sender: TObject);
Var DrawRect: TRect;
begin DrawRect:=CheckListBox.ItemRect(CheckListBox.ItemIndex);
      Edit1.Text:=CheckListBox.Items.Strings[CheckListBox.ItemIndex];
      Edit1.Top:=DrawRect.Top;
      Edit1.Height:=DrawRect.Bottom-DrawRect.Top+2; // <== erneute Zuweisung der Höhe
      Edit1.Visible:=true;
end;
funktioniert es immer- aber erst - ab dem zweiten Aufruf korrekt.

Vielleicht habt hier darauf dann auch eine Antwort ? :roll:

Gruß Gerd

MrKnogge 19. Jan 2007 19:43

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
Zitat:

Zitat von delphin
Trotzdem bleibe ich dabei, dass es dadurch auch die Eigenschaft der Checklistbox irgendwie "erbt".

Nein tut es nicht.

Zitat:

Zitat von delphin
Delphi-Quellcode:
CheckListBox.Font.Size:=10;     // diesen Parameter erhält oder erbt auch Edit1 !!

Schau dir mal die Eigenschaft ParentFont von TEdit an.

Gruß

TStringlist 19. Jan 2007 20:31

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
@delphin

Die Vokabel "erben" ist in Delphi ein absolut zentraler Begriff! Einer der ausdrückt, dass bei einer Komponentenableitung die Eigenschaften einer Ursprungsklasse komplett auf die dabei neu entstehende Klasse übergehen.

Was Du bezüglich einer Zuweisung der Parent-Property meinst, ist aber eher nur ein damit eventuell auch noch gleichzeitiges Mitzuweisen einiger weniger anderer Properties, wie Color o. Font. Und zwar auch wieder abhängig davon, ob z.B. im OI solche weiteren (boolschen) Properties wie ParentColor o. ParentFont ein TRUE oder FALSE geladen haben.

Hansa 19. Jan 2007 20:43

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
Nene, so wird das nichts. Du musst dir mal zumindest über die Nomenklatur Klarheit verschaffen. Der Begriff "Vererbung" macht doch nur Sinn, wenn es einen Erben gibt. Und der muss einen Vorfahren haben, sonst kann er ja nichts erben. :P Inwiefern trifft das jetzt auf ein Edit und eine Checkbox zu ? :shock: Also : was soll denn da überhaupt vererbt werden ?

Irgendwo gibt es wohl schon eine gemeinsame Wurzel, aber wo ? Bei Adam und Eva vielleicht ? Um bei Edit/Checkbox zu bleiben : das zeichnen der Umrandung, ja das wäre eine Gemeinsamkeit. Aber das ist doch eine sehr schwache Grundlage, um etwas zu vererben. Typischer Fehler auch in der Komponentenentwicklung : anstatt sich einen guten Vorfahren rauszusuchen und möglichst viel zu verwenden (von dem zu erben) wird das Rad komplett neu erfunden und man fängt bei 0 an, also mit TComponent usw. Ist hier jeden Tag nachzulesen. :mrgreen:

Was Du willst ist das Kopieren/Setzen von Eigenschaften von irgendwo kopiert. Da wird nichts vererbt, sondern es werden lediglich Werte übernommen.

Wegen roter Kasten :

Zitat:

Zitat von TStringlist
Die Vokabel "erben" ist in Delphi ein absolut zentraler Begriff! Einer der ausdrückt, dass bei einer Komponentenableitung die Eigenschaften einer Ursprungsklasse komplett auf die dabei neu entstehende Klasse übergehen.

Komplett geht nichts "über". Das kann man schon einschränken. Dafür gibt es (siehe mkinzlers Beitrag) private und in diesem Falle protected etc. Und dann noch override, inherited usw.

Ich bleibe dabei : so wird das nichts. :mrgreen:

3_of_8 19. Jan 2007 20:50

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
Adoptierte Kinder erben schließlich auch keine genetischen Merkmale von ihren Adoptiveltern. ;)
Sie können höchstens Verhaltensweisen von ihnen erben.

So ist es auch hierbei: Ein Laben "erbt" seine Farbe nicht von der Form, weil es nicht von ihr abstammt. Es bekommt sie nur implizit zugewiesen, wenn ParentColor gesetzt ist.

TStringlist 19. Jan 2007 21:00

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
@Hansa: Mit "komplett" meinte ich doch sowieso bloß diejenigen, die es auch nur sollen. :!:

inherited 19. Jan 2007 21:07

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
Zitat:

Zitat von 3_of_8
Adoptierte Kinder erben schließlich auch keine genetischen Merkmale von ihren Adoptiveltern. ;)
Sie können höchstens Verhaltensweisen von ihnen erben.

Heee, der Spruch ist von mir!

delphin 19. Jan 2007 21:12

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
ParentFont habe ich mir schon angeschaut. Damit kann man schon verhindern das die Größe des Schrifttypes "geerbt" wird.

Sollte nur zur Veranschaulichung des Phänomens "Erbens" dienen. Die unerklärliche Sache mit der unberücksichtigten "Edit1.Height" bleibt davon aber unberührt !!!

Hier mal das ganze zum Selbstprobieren. Wie Ihr es nennen wollt sei dahin gestellt:

Delphi-Quellcode:
unit Source;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, CheckLst;


type

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure CheckListBoxDblClick(Sender: TObject);
    procedure CheckListBoxExit(Sender: TObject);
  private
    Edit1: TEdit;
    CheckListBox : TCheckListBox;
  public
    { Public-Deklarationen }
  end;

var Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
Var DrawRect: TRect;
begin CheckListBox:=TCheckListBox.Create(Form1);
      CheckListBox.Parent:=Form1;
      CheckListBox.Font.Size:=10;

      CheckListBox.OnDblClick:=CheckListBoxDblClick;
      CheckListBox.OnExit:=CheckListBoxExit;

      CheckListBox.Items.Add('Zeile 1');
      CheckListBox.Items.Add('Zeile 2');
      CheckListBox.Items.Add('Zeile 3');
      {== Editfeld als Kind von CheckListBox ableiten =======}
      Edit1:=TEdit.Create(Form1);
      Edit1.Parent:=CheckListBox;

      {== Ermitteln der Edit.Höhe über Größe der CheckListbox ==}
      DrawRect:=CheckListBox.ItemRect(0);
      Edit1.Height:=DrawRect.Bottom-DrawRect.Top+1;   //Zeile: *1
      Edit1.Visible:=false;
end;

procedure TForm1.CheckListBoxDblClick(Sender: TObject);
Var DrawRect: TRect;
begin DrawRect:=CheckListBox.ItemRect(CheckListBox.ItemIndex);
      Edit1.Text:=CheckListBox.Items.Strings[CheckListBox.ItemIndex];
      Edit1.Top:=DrawRect.Top;
      Edit1.Height:=DrawRect.Bottom-DrawRect.Top+2; //Zeile: *2
      Edit1.Visible:=true;
end;

procedure TForm1.CheckListBoxExit(Sender: TObject);
begin Edit1.Visible:=false;

end;

end.
Nochmal das Problem:
1. Wenn nur Zeile *1: steht (Zeile 2* ausgeklammert), hat es überhaupt keine Auswirkung auf die Höhe der Editbox.
2. Wenn Zeile *2 eingefügt wird, stimmt die Höhe der Box, aber nur ab dem 2. mal anklicken !

Warum !!!

Übrigens: Ob die Edit-Komponente dabei als Privat deklairiert ist spielt kein Rolle!

Wäre wirklich nett, wenn einer dafür eine Lösung hätte. Ich komme an der besagten Stelle einfach nicht weiter.

Viele Grüße und Danke
Gerd

mkinzler 19. Jan 2007 21:27

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
Du meinst die Wertevererbung, am im Allgemeinen versteht man unter Vererbung die Vererbung von Eigenschaften. Eine private Eigenschaft wird nicht mitverebt deshalb mein Tipp. In deinem Fall hilft es ja nichts.

Hawkeye219 19. Jan 2007 21:27

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
Hallo delphin,

verschiebe einmal die Zuweisung zu Edit1.Visible vor das Setzen der Position bzw. Höhe. Vielleicht solltest du dem Editfeld auch noch den Fokus geben:

Delphi-Quellcode:
procedure TForm1.CheckListBoxDblClick (Sender: TObject);
Var
  DrawRect : TRect;
begin
  DrawRect := CheckListBox.ItemRect(CheckListBox.ItemIndex);
  Edit1.Text := CheckListBox.Items.Strings[CheckListBox.ItemIndex];
  Edit1.Visible := True; // neu
  Edit1.Top := DrawRect.Top;
  Edit1.Height := DrawRect.Bottom - DrawRect.Top + 2; //Zeile: *2
//  Edit1.Visible:=true; // entfernt
  Edit1.SetFocus; // neu
end;
Gruß Hawkeye

delphin 19. Jan 2007 21:37

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
Hallo Hawkeye219,

Danke für Deine Antwort. So geht es tatsächlich schon beim erstenmal ! :thumb:

Ich wollte das Edit-Element eben erst mit Text versehen und dann sichtbar machen. Von der Logik her schien mir das klüger.
Wie bist Du auf die Lösung gekommen - ausprobiert oder gewußt ? :wink:

Ich meine, warum ist die Reihenfolge, wichtig ?

Vielleicht hast Du ja auch noch eine Erklärung, warum die Definition im OnCreate-Ereignis völlig unberücksichtig bleibt - wollte mir es eigentlich sparen, die Größe des Editfeldes immer wieder neu zuberechnen, da sich diese ja nicht ändert !

Danke
Gerd

Hawkeye219 19. Jan 2007 22:11

Re: Vererbung bestimmter Eigenschaften deaktiviern
 
Zitat:

Zitat von delphin
Wie bist Du auf die Lösung gekommen - ausprobiert oder gewußt ?

Ich habe es ausprobiert, weil in ähnlichen Situation eine Vertauschung von Anweisungen oft eine Lösung geliefert hat.

Zitat:

Vielleicht hast Du ja auch noch eine Erklärung, warum die Definition im OnCreate-Ereignis völlig unberücksichtig bleibt
Sorry, ich habe nicht alle Abläufe innerhalb der VCL im Kopf und kann deshalb nur Vermutungen anstellen. Die Höhe des Editfelds ändert sich bei einer Änderung der Schriftgröße ebenfalls. Eventuell werden deine Einstellungen zunächst doch übernommen, später aber durch eine Initialisierung oder Änderung des Fonts überschrieben.
Vielleicht liest ja einer der VCL-Experten mit und kann deine Frage besser beantworten.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz