Autor Beitrag
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mi 11.02.09 14:33 
HI,

ich bin grad dabei ne eigene Komponete zu erstellen, und da bin ich auf ein paar Probleme gestoßen:

1.: Wenn ich die Komponente auf die Form klick, dann muss ich sie trotzdem manuell erzeugen: Button := TglButton2D.Create(Form1); Wie kann ich das umgehen?

2.: Wie kann ich die Standartwerte definieren, die im Objektinspektor stehen? Außerdem werden die beim Programmstart irgendwie nich übernommen. Muss ich da noch extra was schreiben?

3.: Wie erstell ich eigene Ereignisse?

4.: Wenn ich meiner Komponente eine Klasse vererbe, dann ist sie zwar im Objektinspektor sichtbar, aber die Eigenschaften der Klasse werden nicht angezeigt.

Wäre dankbar für jede Hilfe.

MfG & Thx Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mi 11.02.09 15:10 
ad 2) einfach bei den propertys hinter jeder ein default mit deinem Startwert schreiben.
z.b: bei einem char als wert: default 'a';
bei einem integer: default 100
bei einer farbe:  default clBlack
und so weiter.

ad 3) hier ein kleines beispiel mit onMouseDown-Event:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
private
  FOnMouseDown: TMouseEvent;
  procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
published
  OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
{...}

implementation
{...}
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
begin
  inherited;
  if Assigned(FOnMouseDown) then
    with Message do
      FOnMouseUp(Self, mbLeft, KeyToShiftState(Keys), XPos, YPos);
end;


ad 4) da musst du einfach den namen der property als property schreiben. zb: beim Hint
ausblenden Delphi-Quelltext
1:
property Hint;					


zu ersterem weiß ich nix, bei mir hat das immer funktioniert. Hast du den constructor der Komponente richtig überschrieben?

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 12.02.09 01:31 
HI,

@1: Wie soll ich den richtig überschreiben? Vlt. liegt es auch daran, das ich beim Create die Form auf der es liegt übergeben muss?
@2: Geht irgendwie net. der Kompiler meckert net, aber die Werte werden auch net als Standart angenommen! Und wenn ich bei bem String default "test_string"; schreib, dann spinnt er auch rum: [Fehler] OpenGLGUI.pas(86): Standardwerte müssen vom Typ Ordinal, Pointer oder vom Typ small Set sein
@3: Das is ja jetzt n vorgefertigtes Ereignis, ich will aber komplett eigene erstellen (die ich dann auch selbst auslösen will). procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN; damit komm ich net ganz klar, hast du vlt noch n Bsp. dazu?
@4: Muss das in die Klasse oder in die Komponente? weil in der Klasse sind die Propertys bei published definiert.

hier ma der Teil der für die Probleme entscheident is:
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:
TglGUIElement = class(TComponent)
  private
    fLeft, fTop, fHeight, fWidth: Integer;
    fTexture                    : TglBitmap2D;
    fOwner                      : TForm;
    fVisible, fEnabled          : Boolean;
    fColor                      : TVector4f;
  published
    property Left   : Integer read fLeft   write fLeft   default 0;
    property Top    : Integer read fTop    write fTop    default 0;
    property Height : Integer read fHeight write fHeight default 25;
    property Width  : Integer read fWidth  write fWidth  default 100;
    property Visible: Boolean read fVisible write fVisible default True;
    property Enabled: Boolean read fEnabled write fEnabled default True;
  public
    procedure LoadTexture(FileName: String);
    procedure DeleteTexture;
    constructor Create(Owner: TForm);
    destructor  Destroy; override;
  end;

  TglFont = class
  private
    fFontContextID: tsContextID;
    fStyle: Cardinal;
    fWidth, fHeight: Integer;
    fFileName: String;
    fColor: TVector4f;
    fZoom: Integer;
    fFontID: tsFontID;
    procedure CreateFont;
    procedure SetStyle(const Value: Cardinal);
    procedure SetWidth(const Value: Integer);
    procedure SetFile(const Value: String);
  published
    property Style: Cardinal read fStyle write SetStyle;
    property Width: Integer read fWidth write SetWidth;
    property FileName: String read fFileName write SetFile;
  public
    procedure   SetColor(r,g,b,a: Single);
    procedure   TextOut(Text: String; X,Y,Width,Height: Single; Align: Cardinal);
    constructor Create;
    destructor  Destroy; override;
  end;

  TButtonColor = (bcSelected, bcDisabled, bcPressed);
  TButtonMode = Cardinal;
  TglButton2D = class(TglGUIElement)
  private
    fCaption      : String;
    fFont         : TglFont;
    fMode         : TButtonMode;
    fSelectedColor: TVector4f;
    fDisabledColor: TVector4f;
    fPressedColor : TVector4f;
  published
    property Caption: String read fCaption write fCaption;
    property Font: TglFont read fFont write fFont;
  public
    procedure SetColor(Color: TButtonColor; r,g,b,a: Single);
    procedure Render;
    procedure Progress(DeltaTime: Cardinal);
    constructor Create(Owner: TForm);
    destructor  Destroy; override;
  end;

Wäre toll, wenn du mir nochma helfen könntest...

MfG & Thx Bergmann.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 12.02.09 02:34 
Du überschreibst den Konstruktor ja gar nicht. Richtig wäre das so:
ausblenden Delphi-Quelltext
1:
constructor Create(AOwner: TComponent); override;					
Und dann musst du den geerbten Konstruktor aufrufen in deinem überschriebenen:
ausblenden Delphi-Quelltext
1:
2:
3:
constructor TButton.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
Dies stammt aus dem Quelltext von TButton. Ich kann dir nur raten, einfach mal einen Blick in die Quelltexte der mitgelieferten Komponenten zu werfen. Das wird vermutlich schon einige Probleme lösen.

Um ein eigenes Event zu deklarieren, musst du dir überlegen was du an den Eventhandler alles übergeben willst. Das sind die Parameter. Zu dem angegebenen Beispiel oben fehlt noch die Deklaration von TMouseEvent:
ausblenden Delphi-Quelltext
1:
2:
  TMouseEvent = procedure(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer) of object;
Auf diese Weise definierst du das Aussehen deines Eventhandlers. Danach rufst du den dann wie in dem Beispiel auf, wenn einer zugewiesen ist. Das prüfst du vorher mit Assigned.

Im Objektinspektor sollte alles auftauchen was unter published steht.
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 12.02.09 14:30 
HI,

das mit den Events hab ich jetzt hin bekommen.
aber das überschreiben des constructor bereitet mir noch probleme:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  TglGUIElement = class(TComponent)
  [...]              
  public
    [...]
    constructor Create(Owner: TForm); override; 
    [...]
  end;

das bringt mir folgenden fehler:
ausblenden Quelltext
1:
[Fehler] OpenGLGUI.pas(47): Deklaration von 'Create' unterscheidet sich von vorheriger Deklaration					


und nochma zum Objektinsektor:
ich hab meine Komponente TglButton2D die is vom TglGUIElement abgeleitet.
Und TglButton2D besitzt eine vererbte Klasse: TglFont. Im Objektinspektor stehen jetzt alle Werte von TglButton2D und TglGUIElement, die bei published stehen. Aber wenn ich den TglFont auf klick, dann steht da nichts, obwohl er propertys im published drin stehen hat! (hab ma Bild vom Objektinspektor geupt)
Wie man sehen kann werden die Standartwerte ja auch nicht übernommen.

MfG Bergmann.
Einloggen, um Attachments anzusehen!
_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 12.02.09 14:32 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
TglGUIElement = class(TComponent)
  [...]              
  public
    [...]
    constructor Create(AOwner: TComponent); override; //TComponent, nicht TForm
    [...]
  end;
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 12.02.09 15:21 
HI,

Problem Nr1 is jetzt auch gelöst....danke!
Jetzt nur noch 2 (Standartwerte werden ncih übernommen) und 4 (Unterklasse wird nich richtig angezeigt)
Und ein neues hab ich noch xD
5: wenn ich das Symbol der Kompnente auf meiner Form verschiebe, dann ändert sich Top und Left nich, wie mach ich das?
Und kann ich die Größe des Sybols ändern? Es soll wie ein richtiger Button aussehen...

MfG & Thx Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 12.02.09 15:35 
TComponent ist erstmal eine nonvisuelle Komponente. Visuelle Komponenten sind normalerweise von TWinControl o.ä. abgeleitet, und dann haben die auch Top, Left, etc.
Davon, dass du das selbst definierst, wird das keine visuelle Komponente.
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 12.02.09 18:06 
HI,

ich sollte vlt noch erwähnen dass das ganze ne OpenGl Komponente wird. Also das hat nix mit den normalen WinControls zu tun...
Ich dachte bloß das man da auch sowas wie ne vorschau einbauen kann.

das mit den standartwerten geht jetzt auch.

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 12.02.09 18:12 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
ich sollte vlt noch erwähnen dass das ganze ne OpenGl Komponente wird. Also das hat nix mit den normalen WinControls zu tun...
Ich dachte bloß das man da auch sowas wie ne vorschau einbauen kann.
Nein, visuell darstellen kannst du nur etwas mit den normalen Zeichenroutinen, diese gibt es bei nicht visuellen Komponenten nicht. Die Darstellung des Buttons macht Delphi nur automatisch, ggf. aus dem mitgelieferten Bild.
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mo 16.02.09 17:30 
Hey,

ich bin schon ziemich weit gekommen und aber jetzt hab ich wieder ne neues Problem. Und zwr komm ich nich drum herum eine Globale Variable zubenutzen, die ich beim erzeugen der Objekte brauch. Wennich die Komonente nun auf die Form klick, bekomm ich ne Zugriffsverletztung, da ja die Variable erst nach dem Programmstart initialiert wird...wie kan ich das umgehen?

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 16.02.09 17:39 
Eine globale Variable kannst Du doch schon bei der Deklaration initialisieren. Außerdem solltest Du Dir mal TComponentState anschauen, damit kann man schön zwischen Design- und Laufzeit unterscheiden.
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mo 16.02.09 18:04 
HI,

initialisiert is vlt nich das richige Wort. Ich meinte es is kein Speicherlatz für die Variable reserveirtund dann kommt halt die Zugriffverletztung (lesen von Speicheradresse 000000).
das TCompnentSate is n guter Tipp, danke!

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^