Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Komponentenprogrammierung, neue Objektvariablen
Jakane - Mo 13.05.13 12:03
Titel: Komponentenprogrammierung, neue Objektvariablen
Hallo liebe Delphi-Helfer :)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161:
| unit JPanel;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, JEdit, JLabel, JButton;
type TJPanel = class(TCustomPanel) private NachCreate: Boolean; FMassMax: Integer; FMassMin: Integer; FFensterpfad: String; function GetAlign: TAlign; procedure SetAlign(Value: TAlign); function GetFensterpfad: String; procedure SetFensterpfad(Value: String); protected procedure Click; override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Align: TAlign read GetAlign write SetAlign; property Caption; property Color; property Cursor; property Hint; property Left; property Name; property Tag; property Top; property Visible; property MassMax: Integer read FMassMax write FMassMax; property MassMin: Integer read FMassMin write FMassMin; property Fensterpfad: String read FFensterpfad write FFensterpfad; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('Jakane', [TJPanel]); end;
constructor TJPanel.Create(AOwner: TComponent); var Pfad : String; f, c : Integer; begin inherited; ControlStyle := ControlStyle - [csSetCaption]; Text:= ''; Alignment:= taLeftJustify; BorderWidth:= 10; NachCreate:= True; if FFensterpfad <> '' then begin FFensterpfad:= FFensterpfad; end; end;
destructor TJPanel.Destroy; begin inherited Destroy; end;
procedure TJPanel.Click; var f : Integer; ControlVisible : Boolean; JPanelVisible : Boolean; begin ControlVisible:= True; if Align in [alTop, alBottom] then begin if Height = MassMax then Height:= MassMin else Height:= MassMax; if Height = MassMax then ControlVisible:= True else ControlVisible:= False; end; if Align in [alLeft, alRight] then begin if Width = MassMax then Width:= MassMin else Width:= MassMax; if Width = MassMax then ControlVisible:= True else ControlVisible:= False; end; For f:= 0 to ControlCount - 1 do begin JPanelVisible:= False; if Controls[f].ClassType = TJButton then JPanelVisible:= TJButton(Controls[f]).JPanelVisible; if Controls[f].ClassType = TJEdit then JPanelVisible:= TJEdit(Controls[f]).JPanelVisible; if Controls[f].ClassType = TJLabel then JPanelVisible:= TJLabel(Controls[f]).JPanelVisible; if not JPanelVisible then begin Controls[f].Visible:= ControlVisible; end; end; end;
function TJPanel.GetAlign: TAlign; begin Result:= inherited Align; end;
procedure TJPanel.SetAlign(Value: TAlign); begin inherited Align:= Value; Text:= ''; if Align in [alTop, alBottom] then begin if (MassMin = 0) AND (MassMax = 0) then begin MassMax:= 40; MassMin:= 20; end; end; if Align in [alLeft, alRight] then begin if (MassMin = 0) AND (MassMax = 0) then begin MassMax:= 200; MassMin:= 30; end; end; end;
function TJPanel.GetFensterpfad: String; begin Result:= FFensterpfad; end;
procedure TJPanel.SetFensterpfad(Value: String); var Pfad : String; f, c : Integer; begin FFensterpfad:= Value; if FFensterpfad <> '' then begin FFensterpfad:= FFensterpfad; end; end;
end. |
Wie man sehen kann habe ich 3 eigene Objektvariablen: MassMin, MassMax und Fensterpfad
In der Programmierzeit belege ich diese Werte vor, entweder per Ereignis oder manuell.
Aber wenn ich dann Create oder SetAlign auf die Werte prüfe sind diese grundsätzlich 0 oder leer :( erst wenn das Formular richtig gestartet ist könnte ich die Werte auslesen, aber ich brächte sie schon vorher.
Mach ich was falsch oder muss ich irgendwas noch einstellen?
Danke für Hilfen :)
jfheins - Mo 13.05.13 12:34
Da haste wohl Pech ;-)
Zur Laufzeit muss ja erstmal das Create() ausgeführt werden, damit das Objekt überhaupt existiert. Erst danach werden die Werte nach und nach gesetzt. Wenn ich mich recht erinnere, gibt es aber die Methode Loaded, die netterweise aufgerufen wird, sobald das erledigt wurde. Hier müssten also die ganzen Eigenschaften, die zur zur Designzeit eingestellt hast, korrekt gesetzt sein.
P.S.: "Programmierzeit" habe ich in dem Kontext noch nicht gehört. Dient das zur Gehaltsabrechnung?
Jakane - Mo 13.05.13 12:42
jfheins hat folgendes geschrieben : |
Da haste wohl Pech ;-)
Zur Laufzeit muss ja erstmal das Create() ausgeführt werden, damit das Objekt überhaupt existiert. Erst danach werden die Werte nach und nach gesetzt. Wenn ich mich recht erinnere, gibt es aber die Methode Loaded, die netterweise aufgerufen wird, sobald das erledigt wurde. Hier müssten also die ganzen Eigenschaften, die zur zur Designzeit eingestellt hast, korrekt gesetzt sein.
P.S.: "Programmierzeit" habe ich in dem Kontext noch nicht gehört. Dient das zur Gehaltsabrechnung? |
Nö, für mich gibts die Programmierzeit und die Laufzeit, die richtigen Begriffe kenn ich da grad nicht.
Wie mach ich das mit dem Loaded?
Tranx - Mo 13.05.13 12:43
Wenn ich es richtig verstehe, möchtest Du beim Aufrufen des Objektinspektors die Eigenschaften Massmin und Massmax belegen können. Eigentlich sollte das doch möglich sein. Du hast die Property belegt, und das im published-Bereich der Klasse. Damit sollten im Objektinspektor die Eigenschaften erscheinen. Schaue dort doch mal nach.
Jakane - Mo 13.05.13 12:49
Tranx hat folgendes geschrieben : |
Wenn ich es richtig verstehe, möchtest Du beim Aufrufen des Objektinspektors die Eigenschaften Massmin und Massmax belegen können. Eigentlich sollte das doch möglich sein. Du hast die Property belegt, und das im published-Bereich der Klasse. Damit sollten im Objektinspektor die Eigenschaften erscheinen. Schaue dort doch mal nach. |
Nein, nicht richtig verstanden :)
Im Inspektor sind diese ja schon belegt (mit 20 oder 40 meistens) aber beim Starten dann läd er zuerst 0 und nach dem Create dann erst irgendwann die 20/40
WasWeißDennIch - Mo 13.05.13 13:43
Wieso belegst Du die privaten Felder nicht einfach im Konstruktor vor? Und die Zeilen mit
Delphi-Quelltext
1:
| FFensterpfad:= FFensterpfad; |
irritieren mich ein wenig, was willst Du denn damit bezwecken? Mal abgesehen davon, dass es für den Fensterpfad einen Setter gibt, dieser aber nicht benutzt wird.
Jakane - Mo 13.05.13 14:30
FFensterpfad:= FFensterpfad; ist nur für den debugger als sprung punkt... -.-
Die Felder sind schon vorbelegt, würde der Konstruktor ( gehe vom Create aus ) das nicht blind überschreiben?
Ich brauche die Werte die ich eingetragen habe :?
Tranx - Mo 13.05.13 17:09
Gut, mag sein, dass die Abfolge der Belegung der Variablen erst nach der Create-Prozedur erfolgt, was ja auch irgendwie logisch ist, denn es muss das Objekt ja erst erzeugt werden, sozusagen als konkreter Speicherbereich, bevor man diesem Werte zuweisen kann. Kannst Du denn überhaupt sinnvoll auf ein Objekt zugreifen, wenn es noch gar nicht geladen ist? Wenn das Objekt geladen ist, dann hast Du doch die selbst gewählten Werte. Warum benötigst Du diese, bevor das Objekt geladen ist? Das würde mich mal interessieren?
Jakane - Di 14.05.13 15:35
für mich gab es zu dem zeitpunkt nach nichts was nach dem create kommt ausser das destroy.
also wirst du auf deine frage keine antwort bekommen ^^
ich lern schliesslich noch
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!