AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language For + panel + Controlcount = .ctl3d? OOP und das Problem der Deklaration
Thema durchsuchen
Ansicht
Themen-Optionen

For + panel + Controlcount = .ctl3d? OOP und das Problem der Deklaration

Ein Thema von LoewenZahn · begonnen am 5. Nov 2013 · letzter Beitrag vom 6. Nov 2013
Antwort Antwort
Benutzerbild von LoewenZahn
LoewenZahn

Registriert seit: 10. Okt 2013
22 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

For + panel + Controlcount = .ctl3d? OOP und das Problem der Deklaration

  Alt 5. Nov 2013, 14:28
Delphi-Version: 2007
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ß
Tim
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
668 Beiträge
 
Delphi 12 Athens
 
#2

AW: For + panel + Controlcount = .ctl3d? OOP und das Problem der Deklaration

  Alt 5. Nov 2013, 17:03
Erstmal bitte richtige Terminologie verwenden, dann versteht man sich hier besser.

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.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: For + panel + Controlcount = .ctl3d? OOP und das Problem der Deklaration

  Alt 5. Nov 2013, 23:14
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
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.001 Beiträge
 
Delphi 12 Athens
 
#4

AW: For + panel + Controlcount = .ctl3d? OOP und das Problem der Deklaration

  Alt 5. Nov 2013, 23:57
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von LoewenZahn
LoewenZahn

Registriert seit: 10. Okt 2013
22 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: For + panel + Controlcount = .ctl3d? OOP und das Problem der Deklaration

  Alt 6. Nov 2013, 13:32
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ß
Tim
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 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