Autor Beitrag
Jakane
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Mo 13.05.13 12:03 
Hallo liebe Delphi-Helfer :)

ausblenden volle Höhe 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
    { Protected-Deklarationen }
    procedure Click; override;
  public
    { Wärend der Programmierung auswählbare Funktionen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Objekteingenschaften }
    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;
  // Formularausrichtung
  if FFensterpfad <> '' then
  begin
    // Variable initialisieren
    FFensterpfad:= FFensterpfad;
  end;
end;

destructor TJPanel.Destroy;
begin
  inherited Destroy;
end;

procedure TJPanel.Click;
var
  f : Integer;
  ControlVisible : Boolean;
  JPanelVisible : Boolean;
begin
  // Variable initialisieren
  ControlVisible:= True;
  // MassMin und MassMax
  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;
  // Komponenten ausschalten
  For f:= 0 to ControlCount - 1 do
  begin
    // Variable initialisieren
    JPanelVisible:= False;
    // Typ Kontrolle
    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;
    // Result
    if not JPanelVisible then
    begin
      // allgemein
      Controls[f].Visible:= ControlVisible;
    end;
  end;
end;

function TJPanel.GetAlign: TAlign;
begin
  Result:= inherited Align;
end;

procedure TJPanel.SetAlign(Value: TAlign);
begin
  // Align auswerten und weitergeben
  inherited Align:= Value;
  Text:= '';
  if Align in [alTop, alBottom] then
  begin
    if (MassMin = 0AND (MassMax = 0then
    begin
      MassMax:= 40;
      MassMin:= 20;
    end;
  end;
  if Align in [alLeft, alRight] then
  begin
    if (MassMin = 0AND (MassMax = 0then
    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;
  // Formularausrichtung
  if FFensterpfad <> '' then
  begin
    // Variable initialisieren
    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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Mo 13.05.13 12:42 
user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Jakane Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Mo 13.05.13 12:49 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Mo 13.05.13 13:43 
Wieso belegst Du die privaten Felder nicht einfach im Konstruktor vor? Und die Zeilen mit
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: 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 :?
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Mo 13.05.13 14:37 
Du meinst die Werte, die im Objektinspektor eingetragen und damit in der *.dfm gespeichert wurden? Die stehen wie bereits gesagt in der Loaded-Methode zur Verfügung.

[edit] Nachtrag: Link [/edit]
Jakane Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Mo 13.05.13 15:19 
[edit] Nachtrag: Link [/edit][/quote]

Lange Rede, Kurzer Sinn :D

Danke für den Link.
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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?

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Jakane Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: 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