![]() |
Vererbung bestimmter Eigenschaften deaktiviern
Hallo,
ich habe von einem CheckListfeld eine Edit Feld zur Eingabe wiefolgt abgeleitet:
Delphi-Quellcode:
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:Edit1:=TEdit.Create(nil) Edit1.Parent:=CheckListBox;
Delphi-Quellcode:
dann bleibt das ohne Auswirkung!? :wall:
Edit1.Height:=DrawRect.Bottom-DrawRect.Top+1;
Wie kann ich die Vererbung für diese Eigenschaft abstellen ? |
Re: Vererbung bestimmter Eigenschaften deaktiviern
mach sie privat.
|
Re: Vererbung bestimmter Eigenschaften deaktiviern
Wie meinst Du das mit:
Zitat:
Delphi-Quellcode:
bringt das keine Punkt. Die Zuweisung von Edit.Height:=xy hat keine Auswirkung. Die Höhe bleibt wie sie geerbt wurde!
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; Gerd |
Re: Vererbung bestimmter Eigenschaften deaktiviern
Was ist DrawRect ?
Wenn ich die Höhe eines Edit ändere, so funktioniert das ohne Probleme ! |
Re: Vererbung bestimmter Eigenschaften deaktiviern
Zitat:
[edit=Christian Seehase]Doppelpost gelöscht. Mfg, Christian Seehase[/edit] |
Re: Vererbung bestimmter Eigenschaften deaktiviern
So ist es. Die OOP-Konzepte, insbesondere Vererbung scheinen nicht bekannt zu sein. Vererbt wird so jedenfalls nichts.
|
Re: Vererbung bestimmter Eigenschaften deaktiviern
Hallo,
mir ist sehr wohl klar, das ich mit der Anweisung
Delphi-Quellcode:
die erstellte Komponente auf der Checklistbox sichtbar mache.
Edit1.Parent:=CheckListBox;
Trotzdem bleibe ich dabei, dass es dadurch auch die Eigenschaft der Checklistbox irgendwie "erbt". mit folgender Anweisung:
Delphi-Quellcode:
Fragen:
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; 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:
wird die im OnCreate-Ereignis eingestelle Größe völlig ignoriert !
//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; schreibt man aber für das Ereignis Doppelklick folgendes:
Delphi-Quellcode:
funktioniert es immer- aber erst - ab dem zweiten Aufruf korrekt.
//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; Vielleicht habt hier darauf dann auch eine Antwort ? :roll: Gruß Gerd |
Re: Vererbung bestimmter Eigenschaften deaktiviern
Zitat:
Zitat:
Gruß |
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. |
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:
Ich bleibe dabei : so wird das nichts. :mrgreen: |
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. |
Re: Vererbung bestimmter Eigenschaften deaktiviern
@Hansa: Mit "komplett" meinte ich doch sowieso bloß diejenigen, die es auch nur sollen. :!:
|
Re: Vererbung bestimmter Eigenschaften deaktiviern
Zitat:
|
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:
Nochmal das Problem:
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. 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 |
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.
|
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:
Gruß Hawkeye
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; |
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 |
Re: Vererbung bestimmter Eigenschaften deaktiviern
Zitat:
Zitat:
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