Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   For + panel + Controlcount = .ctl3d? OOP und das Problem der Deklaration (https://www.delphipraxis.net/177413-panel-controlcount-%3D-ctl3d-oop-und-das-problem-der-deklaration.html)

LoewenZahn 5. Nov 2013 14:28

Delphi-Version: 2007

For + panel + Controlcount = .ctl3d? OOP und das Problem der Deklaration
 
Hallo liebe Interessenten,

als Neuling stoße ich immer wieder auf kleine Hürden und Hindernisse, so auch diesmal. Ich habe ein Panel mit verschiedenen Elementen: TLabel, TDBEdit, TAdvDBCalcEdit, TDBMemo etc. nun wird (Wohl aufgrund eines Bugs) bei den Eingabeelementen das Attribut ctl3D nicht mit erzeugt sodass ich es dynamisch nacharbeiten will.

Wenn die Form erzeugt wird möchte ich, dass alle TDBEdits & Co. im Panel cdtl3D = true bekommen:

Delphi-Quellcode:
  for i := 0 to TWinControl(grb_attribute).ControlCount-1 do
        if TWinControl(grb_attribute).Controls[i] is TDBEdit then
           (TWinControl(grb_attribute).Controls[i] as TDBEdit).ctl3d := true;
Die TDBEdits werden nun erfolgreich verarbeitet, möchte ich jedoch auch die anderen Elemente berücksichtigen wird die If-Abfrage schnell lang und unübersichtlich!

Meine Frage ist: Gibt es nicht eine leichte Möglichkeit zu sagen: "Hey, wenn du als Element (TWinControl(grb_attribute).Controls[i]) das Attribut ctl3d besitzt, dann schalte es auf true!?

Alternativ habe ich auch an so etwas gedacht:

Delphi-Quellcode:
  for i := 0 to TWinControl(grb_attribute).ControlCount-1 do
        if not (TWinControl(grb_attribute).Controls[i] is TLabel) then
           TWinControl(grb_attribute).Controls[i].ctl3d := true;
... doch leider funktioniert dies nicht, da dass TwinControl undeklariert kein ctl3d Attribut besitzt.

Wenn mir jemand einen Schubs in die richtige Richtung geben könnte, wäre ich sehr verbunden!

Gruß

bcvs 5. Nov 2013 17:03

AW: For + panel + Controlcount = .ctl3d? OOP und das Problem der Deklaration
 
Erstmal bitte richtige Terminologie verwenden, dann versteht man sich hier besser.:warn:

Du hast ein Panel mit verschiedenen Komponenten und Ctl3D ist ein Property (oder Eigenschaft).

Aber ich verstehe das nicht. Wo wird da ein Property nicht erzeugt? Und warum setzt du die nicht einfach im Objektinspektor auf true?

Außerdem ist Ctl3D doch standardmäßig immer true.

Medium 5. Nov 2013 23:14

AW: For + panel + Controlcount = .ctl3d? OOP und das Problem der Deklaration
 
Viele Controls mit "Ctl3D" haben auch die Property "ParentCtl3D", womit wenn dieses auf true steht, der Wert für "Ctl3D" vom übergeordneten Control übernommen wird. Da wäre sicher auch mal ein Blick hin Wert, ob das nicht auch Ursache sein kann.

"Erzeugt" werden Properties übrigens immer, diese hier wird bei dir jedoch wohl mit false statt true belegt. Das ist etwas komplett anderes, womit deine Wortwahl nur aus dem Kontext heraus richtig zu interpretieren war. Besser immer in einfachen Worten umschreiben wenn man es nicht genau weiss. Das ist überhaupt keine Schande, und hilft deinen Helfern zu helfen :)

Uwe Raabe 5. Nov 2013 23:57

AW: For + panel + Controlcount = .ctl3d? OOP und das Problem der Deklaration
 
Das Ctrl3D-Property gibt es ab TWinControl, allerdings nur protected. Ich weiß, manche werden mich dafür steinigen, aber ich nehme da ganz gern einen lokalen (nur in dieser Unit sichtbaren) Class helper (oder den altbekannten Protected-Hack).

Delphi-Quellcode:
type
  TWinControlHelper = class helper for TWinControl
    procedure SetAllCtl3D(Value: Boolean);
  end;

procedure TWinControlHelper.SetCtl3D(Value: Boolean);
var
  I: Integer;
begin
  Ctl3d := true;
  for I := 0 to ControlCount - 1 do begin
    if Controls[I] is TWinControl then
      TWinControl(Controls[I]).SetAllCtl3D(Value);
  end;
end;

procedure TForm254.FormCreate(Sender: TObject);
begin
  SetAllCtl3D(true);
end;

LoewenZahn 6. Nov 2013 13:32

AW: For + panel + Controlcount = .ctl3d? OOP und das Problem der Deklaration
 
Danke für die hilfreichen Antworten!

Ich habe nach einigen Anläufen mit dem Parentctl3d experimentiert. Nachdem ich bei der übergeordnete Komponente Parentctl3d = true und dann wieder auf false gesetzt habe, funktioniert es.. die untergeordneten Komponenten erhalten ctl3d = true, auch welche die ich neu hinzufüge.

Da ich mit dieser Lösung keine einzelne Zeile Code schreiben muss halte ich es lieber so schlank.

Gruß


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