AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Button-Komponente erstellen: Oberfläche aus Datei laden
Thema durchsuchen
Ansicht
Themen-Optionen

Button-Komponente erstellen: Oberfläche aus Datei laden

Ein Thema von hanselmansel · begonnen am 20. Jul 2005 · letzter Beitrag vom 21. Jul 2005
Antwort Antwort
Benutzerbild von hanselmansel
hanselmansel

Registriert seit: 23. Feb 2005
Ort: Kaiserslautern
279 Beiträge
 
Delphi 2009 Enterprise
 
#1

Button-Komponente erstellen: Oberfläche aus Datei laden

  Alt 20. Jul 2005, 18:39
Hallo,

ich habe mich in die Komponentenentwicklung gestürzt, aber es hapert leider an ziemlich grundlegenden Dingen.

Mein Ziel:
Meine Komponente soll zur Laufzeit ähnliche Eigenschaften besitzen, wie ein TButton. Da die Standard-Buttons aber so schnöde sind, möchte ich zur Entwicklungszeit von der Festplatte drei *.bmp-Dateien laden können. Jeweils ein BMP, das im "Normal-Zustand" des Buttons zu sehen sein soll, eines für "onMouseDown" und eines für den Zustand "enabled = false".

Meine bisherigen Ideen/Versuche:
Da ich im Web keine Komponente finden konnte, die auch nur annähernd meinen Ideen entsprach, habe ich mir überlegt, die Komponente TBmpButton zu erstellen. Dafür habe ich mir dann via Online-Hilfe drei Möglichkeiten überlegt, wie ich mein Ziel am effizientesten erreichen könnte:
  1. Ich möchte ja ein benutzerdefiniertes Steuerelement erstellen. Ins Englische übersetzt dürfte das soviel wie CustomControl heissen. Leider wurde ich von diesem Weg abgeschreckt, denn in der OH steht, dass ich ganz viele abstrakte Eigenschaften des TCustomControl neu schreiben müsste.
  2. Nun könnte ich auch die Komponente von TImage ableiten. Ich verpasse der Funkion drei Variablen vom Typ TImage und lade in diese Variablen die verschiedenen BMP's. In der Funktion OnMouseDown könnte ich dann meiner Komponente jeweils das richtige Image zuweisen.
    Hierbei habe ich vor allem das Problem, dass ich keinen Plan habe, wie ich die Images zur Entwicklungszeit laden lassen soll, und wie genau ich das Ereignis OnMouseDown behandle.
  3. Die dritte Möglichkeit wäre, den Typ TButton zu verändern. Die Idee scheint mir ganz sinnvoll, da die OH meint, es sei sehr einfach die Eigenschaften einer bestehenden Komponente zu "überschreiben".
    In diesem Fall würde ich wie in Fall 2 die BMP's in TImage-Variablen laden (und wüsste immer noch nicht, wie das zur Entwurfszeit geht...) und dann die Paint-Prozedur so umschreiben, dass abgefragt wird, welches Image denn nun gezeichnet werden soll.
Bei meinen bisherigen Versuchen, mich mit dem Komponenten-Experten anzufreunden hat es dann meißt den Blck-Out gegeben, nachdem er mir die halb-leere Unit präsentierte.

Meine (wichtigsten) Fragen:
  1. Welchen Weg sollte ich eurer Meinung nach gehn?
  2. Wie kann ich die BMP's zur Entwurfszeit laden? (Damit 2 verschiedene TBmpButtons auch 6 verschiedene BMP's laden können.)
  3. Ist es möglich, dass das Programm beim MouseDown über der neuen Komponente erstmal das Image ändert, (Und daran zur Entwicklungszeit des Programms auch nicht gerüttelt werden kann) und dann noch eine Ereignisbehandlungsrutine "OnMouseDown" besitzt?

Ich freue mich schon im Voraus über eure Hilfe,
und wünsche noch einen schönen Abend.


hanselmansel
Es gibt nur sehr wenige Probleme auf dieser Welt, die sich nicht mit einigen hundert Gramm Sprengstoff lösen ließen.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Button-Komponente erstellen: Oberfläche aus Datei laden

  Alt 20. Jul 2005, 21:20
also du könntest schon von TCustomControl bzw TGraphicControl ableiten. Und abstrakte Methoden musst du da gar keine neu schreiben wenn du die nicht brauchst. In deinem Fall wäre es die Paint-Methode welche du überschreiben müsstest. Zu deinen 6 Bildern. Üblicherweise wird es gemacht das alles in einem Bild ist und das ganze in Glyphs geteilt wird. Also deine 3 Stati liegen alle nebeneinander in einem Bild. Diese müsstest du dann je nachdem halt heraus-"schneiden". Natürlich hällt dich auch niemand davon ab 6 einzelne Bilder zu nehmen. Am einfachsten ist es da das du 6 properties vom Typ TBitmap nimmst.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von hanselmansel
hanselmansel

Registriert seit: 23. Feb 2005
Ort: Kaiserslautern
279 Beiträge
 
Delphi 2009 Enterprise
 
#3

Re: Button-Komponente erstellen: Oberfläche aus Datei laden

  Alt 20. Jul 2005, 21:31
Oups... mit den "6 Bildern" habe ich mich unklar ausgedrückt!
Auf die Zeichenfläche des fertigen Buttons soll immer nur ein Bild geladen werden.
Was ich ansprechen wollte ist, dass ich z.B. mit 3DButton Creator Gold einen "Beenden" und einen "Laden" Button zeichne. Da ich für jeden Button drei Bitmaps erstellen würde, komme ich auf die Zahl 6. Es geht mir nur darum, dass ich im fertigen Programm dann auch einen Beenden und einen Laden Button haben kann, und nicht beide blöderweise das gleiche Bild anzeigen.

Ich setz' mich gleich mal dran, und versuch mich mit TCustomControl. (Die fertige Komponente soll ja auch den Fokus erhalten können.) Ich melde mich dann nochmal, wenn ich auf weitere Probleme treffe. (Und ich werde auf sie treffen! )

Danke für die schnelle Antwort!
Es gibt nur sehr wenige Probleme auf dieser Welt, die sich nicht mit einigen hundert Gramm Sprengstoff lösen ließen.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Button-Komponente erstellen: Oberfläche aus Datei laden

  Alt 20. Jul 2005, 21:34
naja, wenn du ein Bitmapproperty machst (mit den verschiedenen Glyphs (also die 3 Stati in einem Bild nebeneinander)) oder eben mehre Bitmapproperties dann ist es auch möglich bei den Komponenten später das Bild zu wechseln bzw. überhaupt erstmal eines zu zuweisen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von hanselmansel
hanselmansel

Registriert seit: 23. Feb 2005
Ort: Kaiserslautern
279 Beiträge
 
Delphi 2009 Enterprise
 
#5

Re: Button-Komponente erstellen: Oberfläche aus Datei laden

  Alt 21. Jul 2005, 15:24
So, ich habe mich mal an die Programmierung der Komponente gegeben, und auch (wie ich finde) schon einige kleine Erfolge erzielen können.
Delphi-Quellcode:
unit MyButtons;

interface

uses
  SysUtils, Classes, Controls, Graphics;

type
  Wechselbutton = class(TCustomControl)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
    Procedure Paint; override;
  public
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
    Procedure LoadImg_normal(Pfad: String);
    Procedure LoadImg_MouseDown(Pfad: String);
    Procedure LoadImg_disabled(Pfad: String);
  end;

procedure Register;

var
  Img_normal :TBitmap;
  Img_MouseDown :TBitmap;
  Img_disabled :TBitmap;
  b_Enabled :Boolean;
  b_MouseDown :Boolean;


implementation

procedure Wechselbutton.Paint;
begin
If b_Enabled then
  Begin
  If b_MouseDown then
    Begin
    {Width := Img_MouseDown.Width;
    Height := Img_MouseDown.Height; }

    Canvas.Draw(0,0,Img_MouseDown);
    End
  Else
    Begin
    {Width := Img_normal.Width;
    Height := Img_normal.Height;}

    Canvas.Draw(0,0,Img_normal);
    End;
  End
Else
  Begin
  {Width := Img_disabled.Width;
  Height := Img_disabled.Height;}

  Canvas.Draw(0,0,Img_disabled);
  End;
end;

procedure Wechselbutton.LoadImg_normal(Pfad :String);
begin
Img_normal := TBitmap.Create;
  try
    Img_normal.LoadFromFile(Pfad);
  except
    Img_normal.Free;
  end;
end;

Procedure Wechselbutton.LoadImg_MouseDown(Pfad: String);
begin
Img_MouseDown := TBitmap.Create;
  try
    Img_MouseDown.LoadFromFile(Pfad);
  except
    Img_MouseDown.Free;
  end;
end;

Procedure Wechselbutton.LoadImg_disabled(Pfad: String);
begin
Img_disabled := TBitmap.Create;
  try
    Img_disabled.LoadFromFile(Pfad);
  except
    Img_disabled.Free;
  end;
end;


//*****************
//*****************
//*****************

procedure Register;
begin
  RegisterComponents('Beispiele', [MyButtons.Wechselbutton]);
end;

end.
Ich bin nun allerdings an einige Probleme gestoßen, zu denen ich von euch mal den einen oder anderen Wink mit dem Zaunpfahl gebrauchen könnte:
  1. Wenn ich den Kommentar von den auskommentierten Stellen wegnehme, bekomme ich eine Fehlermeldung. (Screenshot im Anhang!) Meiner Meinung nach, liegt es auch an genau dieser Stelle im Code, denn durch Auskommentieren läuft die Komponente fehlerfrei.
  2. Ich würde den bool'schen Werten b_Enabled und b_MouseDown gerne Default-Werte zuweisen, damit der Button standardmäßig "aktiviert und ungedrückt" angezeigt wird. Wo kann ich das machen?
  3. In der OH habe ich gelesen, dass man bestimmten Propertys Eigenschaftseditoren zuweisen kann, in denen man dann zur Entwurfszeit Werte angeben kann.
    In diesem Sinne würde ich gerne die Load_Img-Prozeduren in den Objektinspektor (oder ähnliches) bekommen, um damit zur Entwurfszeit die Bilder laden zu können.

Ich denke, das war es erstmal...
Miniaturansicht angehängter Grafiken
zugriffsverletzung_536.jpg  
Es gibt nur sehr wenige Probleme auf dieser Welt, die sich nicht mit einigen hundert Gramm Sprengstoff lösen ließen.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: Button-Komponente erstellen: Oberfläche aus Datei laden

  Alt 21. Jul 2005, 15:27
Defaultwerte im Constructor setzen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Button-Komponente erstellen: Oberfläche aus Datei laden

  Alt 21. Jul 2005, 15:44
Was spricht gegen eine TBitButton?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von hanselmansel
hanselmansel

Registriert seit: 23. Feb 2005
Ort: Kaiserslautern
279 Beiträge
 
Delphi 2009 Enterprise
 
#8

Re: Button-Komponente erstellen: Oberfläche aus Datei laden

  Alt 21. Jul 2005, 15:55
@ jfheins: Danke! Hat super geklappt!

So, ich denke, die hier gestellten Fragen sind super beantwortet, und weitere fragen passen thematisch wohl eher in einen neuen Thread.

MfG und vielen, vielen Dank,

hanselmansel
Es gibt nur sehr wenige Probleme auf dieser Welt, die sich nicht mit einigen hundert Gramm Sprengstoff lösen ließen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 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