AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TBitmap property in eigener Komponente erzeugt bei Ausführung Fehlermeldung

TBitmap property in eigener Komponente erzeugt bei Ausführung Fehlermeldung

Ein Thema von Hirschmüller · begonnen am 11. Aug 2014 · letzter Beitrag vom 11. Aug 2014
Antwort Antwort
Hirschmüller

Registriert seit: 27. Jun 2006
Ort: Wien
4 Beiträge
 
#1

TBitmap property in eigener Komponente erzeugt bei Ausführung Fehlermeldung

  Alt 11. Aug 2014, 10:02
Guten Morgen,
Nach einigen Stunden bin ich etwas frustriert:
Ich habe eine von TCustomButton abgeleitete Komponente mit einer published property Icon: TBitmap. Das Laden einer Bitmap in dieses property funktioniert mit dem Delphi-Dialog, wie er beim property Glyph in TBitBtn verwendet wird, einwandfrei. Auch das Kompilieren erfolgt fehlerfrei.

Beim Programmaufruf (aus der IDE, sowie Direktaufruf der Exe) tritt eine Exception auf:
"Exception EReadError in Modul ... bei ...
Fehler beim Lesen von UserButton1.Icon.Data: Ungültiger Pfad für Eigenschaft."

Um eventuellen Hinweisen zuvorzukommen: Ich kenne TBitBtn, ich habe auch die Source diesbezüglich angeschaut; das ist so nicht verwendbar, die Borländer haben eine private (lokale) Klasse verwendet.

Es muss doch möglich sein, eine TBitmap in einer eigenen Komponente zur Entwurfszeit mit einem Bild zu versehen!
Vielleicht hat sich schon jemand damit herumgeärgert.
Für Hinweise wäre ich sehr dankbar.
Ich verwende Windows 7 32bit, Delphi XE2.

Komponente:
Delphi-Quellcode:
unit UserButtonEx;

interface

uses
  System.SysUtils, System.Classes,
  Vcl.Controls, Vcl.StdCtrls, Vcl.Graphics;

type
  TUserButton = class(TCustomButton)
  private
     FIcon: TBitmap;
     procedure SetIcon(const Value: TBitmap);
  protected
  public
     constructor Create(Owner: TComponent);
     destructor Destroy; override;
  published
     property Icon: TBitmap read FIcon write SetIcon;
  end{TUserButton};

implementation

{ TUserButton }

constructor TUserButton.Create(Owner: TComponent);
begin
   inherited Create(Owner);
   FIcon := TBitmap.Create;
end{TUserButton.Create};

destructor TUserButton.Destroy;
begin
   FIcon.Free;
   inherited;
end{TUserButton.Destroy};

procedure TUserButton.SetIcon(const Value: TBitmap);
begin
   FreeAndNIL(FIcon);
   FIcon := TBitmap.Create;
   if Assigned(Value) then
      FIcon.Assign(Value);
   Invalidate;
end{TUserButton.SetIcon};
Registrierung:
Delphi-Quellcode:
unit Register_User_Components;

interface

uses
   System.Classes,
   UserButtonEx;

procedure Register;

implementation

procedure Register;
begin
   RegisterComponents('Eigenentwicklung', [TUserButton]);
end{Register};
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
415 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: TBitmap property in eigener Komponente erzeugt bei Ausführung Fehlermeldung

  Alt 11. Aug 2014, 10:21
Versuchs einfach mal mit sowas:

Code:
procedure TUserButton.SetIcon(const Value: TBitmap);
begin
  FIcon.Assign(Value);
  Invalidate;
end{TUserButton.SetIcon};
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
Hirschmüller

Registriert seit: 27. Jun 2006
Ort: Wien
4 Beiträge
 
#3

AW: TBitmap property in eigener Komponente erzeugt bei Ausführung Fehlermeldung

  Alt 11. Aug 2014, 10:31
Das Problem ist gelöst!
Es fehlt im Konstruktor der Komponente TUserButton das override!
Der Vorschlag zu SetIcon von Whookie behebt zwar nicht das Problem, ist aber eleganter als meins. Danke.

MfG

Hirschmüller
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.967 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: TBitmap property in eigener Komponente erzeugt bei Ausführung Fehlermeldung

  Alt 11. Aug 2014, 10:49
Es fehlt im Konstruktor der Komponente TUserButton das override!
Jupp, denn so wird dein Create nicht aufgerufen, das .Icon ist nil und da Delphi solche Subkomponenten nicht automatisch erstellt, knallt es dann beim Laden, da nur über den Getter auf die Instanz zugegriffen und diesem die Daten zugewiesen werden.


Aus diesem Grund finde ich es auch irgndwie krank, daß man einen Setter machen muß, wenn man will, daß sowas in der DFM gespeichert wird, obwohl die VCL den garnicht verwendet.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 21:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf