![]() |
Probleme mit Property einer Komponente
Hallo,
ich weiss mir keinen Rat mehr :wall: :wall: :wall: Ich habe eine Komponente die als Property ein Icon hat (guckst du Code):
Code:
Wobei gilt:
property Icon: TIcon read FIcon write SetIcon;
Code:
Eigenartiger weise wird die Procedure SetIcon nicht "durchlaufen".
private
FIcon: TIcon; procedure SetIcon(Value: TIcon); {...} procedure TTrayIcon.SetIcon(Value: TIcon); begin //Wird aufgerufen, wenn sich die Variable "FIcon" ändert FIcon.Assign(Value); ModifyIcon; end; Festgestellt hab ich es, indem ich einfach mal eine showmessage('hallo'); eingebaut hab. Weiss jemand warum die Procedure ned durchlaufen wird? mfg Helmi |
Re: Probleme mit Property einer Komponente
Ich würde schatzen, du musst statt
Delphi-Quellcode:
folgendes schreiben
FIcon.Assign(Value);
Delphi-Quellcode:
Damit nicht einfach die Variable geändert wird, sondern Funktion dazu auch aufgerufen wird ...
SetIcon (Value);
|
Re: Probleme mit Property einer Komponente
ne - hat auch nix gebracht
|
Re: Probleme mit Property einer Komponente
gabs da keinen fehler????
also ma logisch... bei dem code:
Delphi-Quellcode:
sollte sich eigentlich so einiges aufhängen :gruebel:
private
FIcon: TIcon; procedure SetIcon(Value: TIcon); procedure TTrayIcon.SetIcon(Value: TIcon); begin //FIcon.Assign(Value); SetIcon(Value); end; kannst du net sagen FIcon:=Value;? |
Re: Probleme mit Property einer Komponente
Achso .... Das ist ja schon die Prozedur seticon ...
Poste mal ein bisschen mehr Code, z.B. die ganze Klassendeklaration ... |
Re: Probleme mit Property einer Komponente
ich schätze mal du willst das sehen (guckst du):
Code:
unit TrayIcon;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Menus, ShellApi, ExtCtrls, Dialogs, StdCtrls, Variants; const IconID = 100; WM_TRAYNOTIFY = WM_USER + 1024; TRAY_CALLBACK = WM_USER + 20; type TBalloonTipFlags = (BT_Info, BT_Warning, BT_Error, BT_WinSymbol, BT_Question); TBalloonTipDirection = (BT_Left, BT_Middle, BT_Right); TTrayIcon = class(TComponent) private { Private-Deklarationen } IconData : TNotifyIconData; FBalloonTip : TForm; FLabelInfo : TLabel; FLabelTitle : TLabel; FFlagImage : TImage; FForegroundTimer : TTimer; FBalloonTipFlags : TBalloonTipFlags; FBalloonTipDirection : TBalloonTipDirection; FBalloonTipTimer : TTimer; FBalloonTipTimeOut : Integer; FBalloonTipTitle : String; FBalloonTipInfo : String; FBalloonTipColor : TColor; FBalloonTipTitleColor : TColor; FBalloonTipInfoColor : TColor; FBalloonTipAlwaysOnTop: Boolean; FBalloonTipAutoSize : Boolean; FIcon : TIcon; FIconVisible : Boolean; FHint : String; FShowHint : Boolean; FShowBalloonTip : Boolean; FPopupMenu : TPopupMenu; FLeftPopup : Boolean; FOnClick : TNotifyEvent; FOnDblClick : TNotifyEvent; FOnMouseDown : TMouseEvent; FOnMouseUp : TMouseEvent; FOnMouseMove : TMouseMoveEvent; FStartMinimized : Boolean; FClicked : Boolean; ShowFirst : Boolean; X_Pos_Icon : Integer; Y_Pos_Icon : Integer; function InitIcon: Boolean; function InitBalloonTip: Boolean; function FindTrayIcon(IcoDat: TNotifyIconData): TPoint; procedure HandleMessage(var Msg: TMessage); message TRAY_CALLBACK; procedure PopupAtCursor; procedure DoBalloonTipFlags; procedure BalloonTip_erzeugen; procedure SetIcon(Value: TIcon); procedure SetIconVisible(Value: Boolean); procedure SetHint(Value: String); procedure SetBalloonTipInfo(Value: String); procedure SetBalloonTipTitle(Value: String); procedure SetBalloonTipAlwaysOnTop(Value: Boolean); procedure SetBalloonTipColor(Value: TColor); procedure SetBalloonTipAutoSize(Value: Boolean); procedure SetShowHint(Value: Boolean); procedure SetShowBalloonTip(Value: Boolean); procedure SetBalloonTipFlag(Value : TBalloonTipFlags); procedure SetBalloonTipDirection(Value: TBalloonTipDirection); procedure SetBalloonTipTimeOut(Value: Integer); procedure SetBalloonTipTitleColor(Value: TColor); procedure SetBalloonTipInfoColor(Value: TColor); protected { Protected-Deklarationen } function ShowIcon: Boolean; virtual; function HideIcon: Boolean; virtual; function ModifyIcon: Boolean; virtual; function ModifyBalloonTip: Boolean; virtual; procedure Loaded; override; procedure Click; dynamic; procedure DblClick; dynamic; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); dynamic; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); dynamic; procedure MouseMove(Shift: TShiftState; X, Y: Integer); dynamic; procedure OnBalloonTipTimer(Sender: TObject); procedure OnForegroundTimer(Sender : TObject); procedure AppMinimize(Sender: TObject); public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure ShowMainForm; procedure HideMainForm; published { Published-Deklarationen } // Properties: property Hint: String read FHint write SetHint; property BalloonTipInfo: String read FBalloonTipInfo write SetBalloonTipInfo; property BalloonTipTitle: String read FBalloonTipTitle write SetBalloonTipTitle; property BalloonTipAlwaysOnTop: Boolean read FBalloonTipAlwaysOnTop write SetBalloonTipAlwaysOnTop default false; property BalloonTipFlags: TBalloonTipFlags read FBalloonTipFlags write SetBalloonTipFlag default BT_Info; property BalloonTipDirection: TBalloonTipDirection read FBalloonTipDirection write SetBalloonTipDirection default BT_Right; property BalloonTipTimeOut: Integer read FBalloonTipTimeOut write SetBalloonTipTimeOut default 1000; property BalloonTipColor: TColor read FBalloonTipColor write SetBalloonTipColor default clYellow; property BalloonTipTitleColor: TColor read FBalloonTipTitleColor write SetBalloonTipTitleColor default clBlack; property BalloonTipInfoColor: TColor read FBalloonTipInfoColor write SetBalloonTipInfoColor default clBlack; property BalloonTipAutoSize: Boolean read FBalloonTipAutoSize write SetBalloonTipAutoSize default false; property ShowHint: Boolean read FShowHint write SetShowHint default false; property ShowBalloonTip: Boolean read FShowBalloonTip write SetShowBalloonTip default false; property Icon: TIcon read FIcon write SetIcon stored true; property IconVisible: Boolean read FIconVisible write SetIconVisible default false; property PopupMenu: TPopupMenu read FPopupMenu write FPopupMenu; property LeftPopup: Boolean read FLeftPopup write FLeftPopup default False; property StartMinimized: Boolean read FStartMinimized write FStartMinimized default False; // Events: property OnClick: TNotifyEvent read FOnClick write FOnClick; property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick; property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown; property OnMouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp; property OnMouseMove: TMouseMoveEvent read FOnMouseMove write FOnMouseMove; end; procedure Register; implementation |
Re: Probleme mit Property einer Komponente
Liste der Anhänge anzeigen (Anzahl: 1)
ich hab mal ein wenig getestet und hab mal eine testkombo gebastelt
in der ein Icon geladen wird eigenartigerweise gehts dort auch ned aber hier mal die kombo |
Re: Probleme mit Property einer Komponente
Zeigt doch mal am besten den Code wo das Icon der ComboBox/TrayIcon zugewiesen wird. Ich glaube nämlich das dort der Fehler liegt.
|
Re: Probleme mit Property einer Komponente
ich denke nicht dass der fehler dort liegt wo das Icon dem trayIcon zugewiesen wird
den in der TestCombo wird das Icon niemanden zugewiesen, geht dort aber trotzdem auch ned sprich die Procedure SetIcon wird dort auch nicht durchlaufen, obwohl das Icon nirgends zugewiesen wird |
Re: Probleme mit Property einer Komponente
Ist ja auch richtig, dass SetIcon nicht aufgerufen wird. SetIcon wird nur aufgerufen wenn du Icon :=TIcon.Create machen würdest (also Icon direkt einen Wert zuweist). Machst du dass jetzt in deinem Code, dürfte es Probleme geben, aber SetIcon wird aufgerufen.
Da du aber dem Feld FIcon etwas zuweist, wird SetIcon nicht aufgerufen. Aber ehrlich ich verstehe deine Logik nicht mehr :gruebel: Zitat:
|
Re: Probleme mit Property einer Komponente
Hi Helmi,
hab ich's überlesen, oder hast du noch nicht erklärt, an welcher Stelle du das Durchlaufen der SetIcon-Methode erwartest? Zur Design-Zeit, wenn du's über den OI änderst? P.S.: So muss es gemacht werden
Delphi-Quellcode:
procedure TTestCompo.SetIcon(Value: TIcon);
begin if Value <> FIcon then FIcon := Value; end; constructor TTestCompo.Create(AOwner: TComponent); begin inherited Create(AOwner); // Wenn hier schon ein Icon-Objekt erstellt werden soll // und die Set-Methode aufgerufen werden soll, dann: // Ansonsten hat das hier nix zu suchen! SetIcon(TIcon.Create); end; |
Re: Probleme mit Property einer Komponente
hallo
sorry, hab das ganz vergessen zu erwähnen das soll durchlaufen werden zur designzeit und zur laufzeit wenn ich ein anderes Icon auswähle |
Re: Probleme mit Property einer Komponente
Hoppla, das war falsch, was ich erzählt hab... :oops:
Ein Blick in TCustomForm (dort gibt's ja auch ne Icon-Eigenschaft) zeigt:
Delphi-Quellcode:
Ich hab's getestet und es funktioniert!
procedure TTestCompo.SetIcon(Value: TIcon);
begin FIcon.Assign(Value); end; constructor TTestCompo.Create(AOwner: TComponent); begin inherited; FIcon := TIcon.Create; end; destructor TTestCompo.Destroy; begin FreeAndNil(FIcon); inherited; end; MfG Edit: Copy&Paste-Fehler behoben... :oops: |
Re: Probleme mit Property einer Komponente
aber das ist ja das gleiche was ich bereits schon der testcombo drin hatte oder?
ausserdem bei
Code:
ist das create nicht falsch?
destructor TTestCompo.Create(AOwner: TComponent);
begin FreeAndNil(FIcon); inherited; end; muss das ned destroy heissen? |
Re: Probleme mit Property einer Komponente
Zitat:
Kommt die Meldung nicht, wenn du im OI ein Icon angibst??? |
Re: Probleme mit Property einer Komponente
wenn ich im OI ein Icon eingib dann ja
aber (das hab ich vielleicht vergessen zu sagen) ich will auch zur Laufzeit das Icon ändern und dazu brauch ich die SetIcon |
Re: Probleme mit Property einer Komponente
:gruebel:
Zur Laufzeit kannst du doch einfach eine Zuweisung machen: Icon := NeuesIcon :gruebel: Dann wird auch SetIcon aufgerufen. Also wo ist das Problem? :gruebel: P.S: Ich glaube ihr merkt schon das ich diesen Smiley ( :gruebel: ) liebe :) |
Re: Probleme mit Property einer Komponente
Liste der Anhänge anzeigen (Anzahl: 1)
es wird eben nicht die SetIcon aufgerufen sonst würde ja die Showmessage angezeigt werden
anbei mal mein beispielprogramm es muss nur ein anderes Icon benutzt werden (bei euch) |
Re: Probleme mit Property einer Komponente
Ist doch klar! Weil hier nicht das Icon-Objekt geändert wird, sondern dieses Objekt nur ein anderes Icon lädt.
So würde es gehen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Icon: TIcon; begin try Icon := TIcon.Create; Icon.LoadFromFile('e:\telefonbilder\telefonrot.ico'); TestCompo1.Icon := Icon; finally FreeAndNil(Icon); end; end; |
Re: Probleme mit Property einer Komponente
ach so
mit SetIcon reagier ich wenn sich das object ändert, aber da ich nur das Icon des Objects ändere wird SetIcon nicht ausgelöst jetzt hab ich´s auch verstanden :dancer2: :hello: gibt es ne möglichkeit auf das neue Icon (also die Datei) zu reagieren? |
Re: Probleme mit Property einer Komponente
Liste der Anhänge anzeigen (Anzahl: 1)
Indem du dir eine Ableitung von TIcon schreibst, die das kann...
Für die Methode LoadFromFile hab ich das mal gemacht. |
Re: Probleme mit Property einer Komponente
Hallo,
Jetzt muss ich nochmal dieses Thema aufgreifen, da ich wieder mit TIcons rumspiele. Ich hab mir mal das Icon-Laden vom TForm angeschaut und musste feststellen, dass beim LoadFromFile vom TIcon das neue Icon sofort angezeigt wird und nicht wie durch das Umladen eines Extra-Icons (siehe paar Thread weiter oben). In der Forms.pas ist folgendes drin (ich hoffe dass darf man hier veröffentlichen):
Code:
Ich habe jetzt gleiche jetzt mal in meiner Komponente drin, nur das IconChanged hab ich wie folgt geändert:
protected
property Icon: TIcon read FIcon write SetIcon stored IsIconStored; procedure TCustomForm.OnCreate.... begin FIcon.OnChange := IconChanged; end; procedure TCustomForm.SetIcon(Value: TIcon); begin FIcon.Assign(Value); end; procedure TCustomForm.IconChanged(Sender: TObject); begin if NewStyleControls then begin if HandleAllocated and (BorderStyle <> bsDialog) then SendMessage(Handle, WM_SETICON, 1, GetIconHandle); end else if IsIconic(Handle) then Invalidate; end;
Code:
Nur leider wird das Icon nicht geändert.
SendMessage(IconData.hIcon, WM_SETICON, 1, FIcon.Handle);
Was macht TForm was ich nicht mach? :?: mfg Helmi |
Re: Probleme mit Property einer Komponente
Nun ja...
Delphi-Quellcode:
ist halt was anderes, als
SendMessage(Handle, WM_SETICON, 1, GetIconHandle);
Delphi-Quellcode:
Oben wird an das Fenster eine Nachricht geschickt (Handle ist dasselbe wie Self.Handle) und bei dir an das Icon-Handle!
SendMessage(IconData.hIcon, WM_SETICON, 1, FIcon.Handle);
Wenn, dann müsstest du an dein Componente die Nachricht schicken, allerdings müsste die dafür ein Hanlde besitzen, was imho erst in TWinControl implementiert ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz