| Autor |
Beitrag |
Bergmann89
      
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)
|
Verfasst: 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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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:
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
Delphi-Quelltext
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 
      
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)
|
Verfasst: 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:
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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 12.02.09 02:34
Du überschreibst den Konstruktor ja gar nicht. Richtig wäre das so: Delphi-Quelltext 1:
| constructor Create(AOwner: TComponent); override; | Und dann musst du den geerbten Konstruktor aufrufen in deinem überschriebenen: 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: 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 
      
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)
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| TglGUIElement = class(TComponent) [...] public [...] constructor Create(Owner: TForm); override; [...] end; |
das bringt mir folgenden fehler:
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
|
Verfasst: Do 12.02.09 14:32
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| TglGUIElement = class(TComponent) [...] public [...] constructor Create(AOwner: TComponent); override; [...] end; |
|
|
Bergmann89 
      
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)
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
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)
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 12.02.09 18:12
Bergmann89 hat folgendes geschrieben : | 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 
      
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)
|
Verfasst: 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
|
Verfasst: 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 
      
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)
|
Verfasst: 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^^
|
|
|