Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Combobox Komponente Visualisieren! (https://www.delphipraxis.net/135815-combobox-komponente-visualisieren.html)

thiagojonas 18. Jun 2009 10:25


Combobox Komponente Visualisieren!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Freunde,
kann man in Delphi durch eine Komponentenerstellung folgende TCombobox erstellen? (s. Anhang)
Und wenn ja, wie geht man da am besten vor?
Wie man Komponente allgemein erstellt weiß ich.
Danke im voraus
Thiago :-D

PatrickB 1. Jul 2009 10:51

Re: Combobox Komponente Visualisieren!
 
Würde auch gern wissen wie man solch eine grafische Komponente erstellen kann.

jaenicke 1. Jul 2009 11:55

Re: Combobox Komponente Visualisieren!
 
Entweder man nimmt fertige Komponenten oder man zeichnet den Inhalt selbst. Wie man eine Komponente erstellt, steht hier:
http://www.delphi-treff.de/tutorials...en-entwicklen/
Und eine kleine Scrollbar, die ich mal geschrieben habe, hier (allerdings ist der Code nicht so schön geschrieben :oops: ):
http://www.delphi-forum.de/viewtopic.php?t=64090

PatrickB 1. Jul 2009 12:17

Re: Combobox Komponente Visualisieren!
 
In den Tutorial ist nie richtig erklärt wie man den die grafische Oberfläche der Komponente erstellt. Wie macht man das denn?
Wenn ich jetzt einen Scrollbalken machen will, dann müsste ich ja zuerst ein Rechteck zeichnen und dann nochmal ein kleineres Rechteck da rein zeichnen und links und rechts einen Button um nach links und rechts zu scrollen.
Wie geht das oder denk ich da ganz falsch??? Wo muss ich das zeichnen???

Danke schonmal für eure Hilfe =)

Übrigens gefällt mir das Fenster ziemlich gut. Wie erstellt man sowas genau? Ein Tutorial hast du ja leider nicht dazu gemacht =(

mkinzler 1. Jul 2009 12:18

Re: Combobox Komponente Visualisieren!
 
An welches Featur denkst du den?

iGoA 1. Jul 2009 12:27

Re: Combobox Komponente Visualisieren!
 
Wenn man eine eigene Komponente entwickelt, muss man die grafische Darstellung tatsächlich selbst erledigen. Jede visuelle Komponente hat eine Paint-Methode. Diese muss man implementieren und darin die ganze Darstellung machen. Die Deklaration müsste so aussehen:
procedure WMNCPaint (var Message: TMessage); message WM_NCPAINT;

In dieser Methode musst Du dann den Canvas benutzen, um darauf zu zeichnen oder Bitmaps draufzukopieren.

PatrickB 1. Jul 2009 12:31

Re: Combobox Komponente Visualisieren!
 
Achso, also besteht sozusagen jede Komponente aus Bildern die auf dem Canvas des jeweiligen Objekts gezeichnet werden?
Dann muss ich also nur in Photoshop die einzelnen Bilder zeichnen und dann zusammenfügen?

Gibt es dafür vielleicht irgendwo ein Beispiel?

jaenicke 1. Jul 2009 12:43

Re: Combobox Komponente Visualisieren!
 
Bei mir ist kein einziges Bild dabei, das ist alles direkt gezeichnet. ;-)

DeddyH 1. Jul 2009 12:46

Re: Combobox Komponente Visualisieren!
 
Beispiele gibt es übrigens genug in der OpenSource-Sparte.

PatrickB 1. Jul 2009 12:53

Re: Combobox Komponente Visualisieren!
 
Zitat:

Zitat von jaenicke
Bei mir ist kein einziges Bild dabei, das ist alles direkt gezeichnet. ;-)

Okay, und kann man das vorher auch anschauen, oder geht das erst wenn man die Komponente gespeichert, installiert und dann auf die Form drauf macht.

Kannst du vielleicht nen kleinen Ausschnitt davon wie du das machst hier posten?

Zitat:

Beispiele gibt es übrigens genug in der OpenSource-Sparte.
Bis jetzt hab ich noch kein geeignetes Beispiel gefunden =( Vielleicht such ich unter den falschen Begriffen.

mkinzler 1. Jul 2009 12:55

Re: Combobox Komponente Visualisieren!
 
Schau dir mal die verschiedenen Skinning-Kompos an ( von den AlphaControls gibt es z.B. eine kostenlose lite Version)

DeddyH 1. Jul 2009 12:55

Re: Combobox Komponente Visualisieren!
 
Wenn Du die Komponente einbindest und Dein Programm startest, solltest Du es sehen. Dazu muss die Komponente ja nicht installiert sein, Du kannst ja die Unit einbinden und die Instanz dynamisch erzeugen.

[edit] Nur ein Beispiel von vielen: http://www.delphipraxis.net/internal...ct.php?t=85812 [/edit]

PatrickB 1. Jul 2009 18:53

Re: Combobox Komponente Visualisieren!
 
Okay, also ich hab jetzt versucht die Paint Prozedur zu erstellen, aber es gibt noch einen kleinen Fehler:

Code:
procedure PbProgressBar.Paint;
var
  BackgroundBuffer: TBitmap;
begin
  BackgroundBuffer := TBitmap.Create;
  BackgroundBuffer.Width := 20;
  BackgroundBuffer.Height := 20;

  BackgroundBuffer.Canvas.Brush.Color := clRed;
  BackgroundBuffer.Canvas.Rectangle(0,0,20,20);

  Self.Canvas.Draw(0, 0, BackgroundBuffer);
  BackgroundBuffer.Free;
end;
Hier unterkringelt er mir Canvas.Draw, weil das keine Attribute von Self sind. Was muss ich da machen, damit ich das Bitmap jetzt auch zeichnen kann? Außerdem soll die Standard ProgressBar Klasse, von welcher ich meine ProgressBar ableite, nicht gezeichnet werden. Wie mache ich das?

DeddyH 1. Jul 2009 18:56

Re: Combobox Komponente Visualisieren!
 
Leite nicht von TProgressbar ab, sondern von TCustomControl oder TGraphicControl (das dürfte hier die erste Wahl sein).

PatrickB 1. Jul 2009 18:59

Re: Combobox Komponente Visualisieren!
 
Yeah, cool. Jetzt hab ich immerhin schon mal ein rotes Quadrat. Jetzt kann ich mich an die Arbeit machen. Dankeschön =)

Edit: Hab noch ne kleine Frage. Wie kann ich der Komponente jetzt noch ein Icon zuweisen? Unter Tools gibt es nämlich keinen Bildeditor.

PatrickB 1. Jul 2009 19:47

Re: Combobox Komponente Visualisieren!
 
Wie füge ich so eine Einstellung ein, damit der User im Objektinspektor eine Farbe auswählen kann aus so eine Drop Down Menü?

DeddyH 1. Jul 2009 19:49

Re: Combobox Komponente Visualisieren!
 
Unter published eine Property Color vom Typ TColor deklarieren.

PatrickB 1. Jul 2009 19:52

Re: Combobox Komponente Visualisieren!
 
Es sollen aber alle Farben aufgelistet sein, mit einem kleinen Quadrat davor, als Vorschau der Farbe.

DeddyH 1. Jul 2009 19:53

Re: Combobox Komponente Visualisieren!
 
Das macht die IDE doch automatisch (zumindest die aktuelleren).

PatrickB 1. Jul 2009 19:58

Re: Combobox Komponente Visualisieren!
 
Super, klappt =) Dankeschön. Hier bekommt man echt schnell Hilfe! :)

PatrickB 2. Jul 2009 15:21

Re: Combobox Komponente Visualisieren!
 
Ich hab jetzt ein im MouseMove Ereignis ein Repaint eingebaut, damit die Komponente neu gezeichnet wird wenn was bewegt wird.

Im Paint Ereignis erstelle ich dann ein Bitmap mit TBitmap.Create und gebe es anschließend wieder mit TBitmap.Free frei.

Durch die vielen Aufrufe im MouseMove Ereignis flackert die Komponente jetzt aber immer etwas weil so oft neu gezeichnet werden muss. Wie muss ich das anstellen, dass es nicht mehr flackert?

jaenicke 2. Jul 2009 15:33

Re: Combobox Komponente Visualisieren!
 
Hast du DoubleBuffered beim Formular / Panels / ... gesetzt?

PatrickB 2. Jul 2009 15:41

Re: Combobox Komponente Visualisieren!
 
Jetzt schon, aber es hat sich nix geändert.

Vll zur Hilfe die Prozedur:

Edit: Ok, es klappt. Hatte das DoubleBuffered in meiner Form und nicht im Create Ereignis der Komponente platziert.

PatrickB 2. Jul 2009 17:34

Re: Combobox Komponente Visualisieren!
 
Will jetzt das OnChange Event einbauen, aber es klappt nicht so richtig.

Er unterkringelt mir immer das "property OnChange" :
Zitat:

[Fehler] ProgressBar1.pas(58): E2147 Eigenschaft 'OnChange' existiert nicht in Basisklasse
Desweiteren habe ich eingefügt:

Unter private:

Delphi-Quellcode:
FOnChange : TNotifyEvent;
Unter protected:

Delphi-Quellcode:
property OnChange: TNotifyEvent read FOnChange write FOnChange;
und in meiner Funktion:

Delphi-Quellcode:
  if Assigned(FOnChange) then
    FOnChange(Self);

DeddyH 2. Jul 2009 17:37

Re: Combobox Komponente Visualisieren!
 
Wieso ist die Property unter protected deklariert? Wenn sie über den OI zuzuweisen sein soll, muss sie nach published.

PatrickB 2. Jul 2009 17:44

Re: Combobox Komponente Visualisieren!
 
Keine Ahnung, so wars auch im Beispiel von jaenicke.

Wenn ich es jetzt unter published mache klappts aber trotzdem nicht

DeddyH 2. Jul 2009 18:02

Re: Combobox Komponente Visualisieren!
 
Was heißt "klappt nicht"? Wird der Quelltext lediglich unterkringelt oder lässt er sich nicht kompilieren?

PatrickB 2. Jul 2009 18:06

Re: Combobox Komponente Visualisieren!
 
Es lässt sich nicht kompilieren weil der Fehler hier erscheint:

Zitat:

[Fehler] ProgressBar1.pas(5Cool: E2147 Eigenschaft 'OnChange' existiert nicht in Basisklasse
Aber ich hab die gleiche Basisklasse wie Jaenick und zwar TCustomControl.

DeddyH 2. Jul 2009 18:13

Re: Combobox Komponente Visualisieren!
 
Wieso nicht TGraphicControl? Naja egal, zeig mal die Deklaration der Klasse (den interface-Teil).

PatrickB 2. Jul 2009 18:16

Re: Combobox Komponente Visualisieren!
 
Weiß nich, du hast gesagt entweder TCustomControl oder TGraphicControl. Ich weiß sowieso nicht wirklich worin sich beide untershcieden.

Delphi-Quellcode:
unit ProgressBar1;

interface

uses
  Windows, SysUtils, Classes, Controls, Graphics, ComCtrls;

type
  PbProgressBar = class(TCustomControl)
  private
    { Private-Deklarationen }
    FWidth : Integer;
    FThickness : Integer;
    FControllerWidth    : Integer;
    FControllerHeight : Integer;
    FLineColor1 : TColor;
    FLineColor2 : TColor;
    FControllerColor : TColor;
    FScrollPos : Integer;
    FCursor : TPoint;
    FRMouseDown : Boolean;
    FMin : Integer;
    FMax : Integer;
    FRelScrollPos : Integer;
    FOnChange : TNotifyEvent;

    procedure SetThickness(uValue: Integer);
    procedure SetLineColor(uValue: TColor);
    procedure SetControllerColor(uValue: TColor);
    procedure SetPosition(uValue: Integer);
    procedure SetRelScrollPos(uValue:Integer);
  protected
    { Protected-Deklarationen }
    procedure Paint; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
  public
    { Public-Deklarationen }
    constructor Create(aOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
    property Position: Integer read FRelScrollPos write SetRelScrollPos;
    property Wer: Integer read FWidth write FWidth;
    property Thickness: Integer read FThickness write SetThickness;
    property LineColor1: TColor read FLineColor1 write SetLineColor;
    property ControllerColor: TColor read FControllerColor write SetControllerColor;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnChange;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [PbProgressBar]);
end;

DeddyH 2. Jul 2009 18:20

Re: Combobox Komponente Visualisieren!
 
Unten gibt es noch einmal die OnChange-Property, die muss weg.

PatrickB 2. Jul 2009 18:22

Re: Combobox Komponente Visualisieren!
 
Uh shit :x
Manchmal bin ich echt blind :?

PatrickB 2. Jul 2009 20:08

Re: Combobox Komponente Visualisieren!
 
Ich hab in meienr Form jetzt das OnChange Event eingebaut, aber jedes Mal wenn ich mein Programm starte wird das OnChange Event schon aufgerufen ohne dass ich etwas gemacht habe. Woran liegt das?

DeddyH 2. Jul 2009 20:11

Re: Combobox Komponente Visualisieren!
 
Woher sollen wir das ohne Code denn wissen? :glaskugel: Wenn ich Dich richtig verstanden habe, löst Du das Event ja selbst aus, das scheint etwas zu oft zu geschehen.

PatrickB 2. Jul 2009 20:19

Re: Combobox Komponente Visualisieren!
 
Ok, hab das Problem schon gefunden.

Und zwar hab ich eine Property erstellt die auf die Prozedur verweißt in der das OnChange Event ausgeführt wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 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