Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Probleme mit Property einer Komponente (https://www.delphipraxis.net/34127-probleme-mit-property-einer-komponente.html)

Helmi 17. Nov 2004 20:18


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:
    property Icon: TIcon read FIcon write SetIcon;
Wobei gilt:
Code:
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;
Eigenartiger weise wird die Procedure SetIcon nicht "durchlaufen".
Festgestellt hab ich es, indem ich einfach mal eine showmessage('hallo'); eingebaut hab.

Weiss jemand warum die Procedure ned durchlaufen wird?

mfg
Helmi

jfheins 17. Nov 2004 20:23

Re: Probleme mit Property einer Komponente
 
Ich würde schatzen, du musst statt
Delphi-Quellcode:
  FIcon.Assign(Value);
folgendes schreiben
Delphi-Quellcode:
SetIcon (Value);
Damit nicht einfach die Variable geändert wird, sondern Funktion dazu auch aufgerufen wird ...

Helmi 17. Nov 2004 20:25

Re: Probleme mit Property einer Komponente
 
ne - hat auch nix gebracht

glkgereon 17. Nov 2004 20:38

Re: Probleme mit Property einer Komponente
 
gabs da keinen fehler????

also ma logisch...

bei dem code:

Delphi-Quellcode:
private
  FIcon: TIcon;
  procedure SetIcon(Value: TIcon);


procedure TTrayIcon.SetIcon(Value: TIcon);
begin
  //FIcon.Assign(Value);
   SetIcon(Value);
end;
sollte sich eigentlich so einiges aufhängen :gruebel:


kannst du net sagen FIcon:=Value;?

jfheins 17. Nov 2004 20:39

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 ...

Helmi 17. Nov 2004 20:43

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

Helmi 17. Nov 2004 22:50

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

jim_raynor 18. Nov 2004 06:21

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.

Helmi 18. Nov 2004 07:57

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

jim_raynor 18. Nov 2004 08:04

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:

sprich die Procedure SetIcon wird dort auch nicht durchlaufen, obwohl das Icon nirgends zugewiesen wird
:gruebel: SetIcon wird doch nicht automatisch aufgerufen. Wenn Icon nirgends zugewiesen wird, dann dürfte doch klar sein, das SetIcon nicht aufgerufen wird. :gruebel:

Stevie 18. Nov 2004 09:04

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;

Helmi 18. Nov 2004 09:47

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

Stevie 18. Nov 2004 09:58

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:
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;
Ich hab's getestet und es funktioniert!

MfG

Edit: Copy&Paste-Fehler behoben... :oops:

Helmi 18. Nov 2004 10:11

Re: Probleme mit Property einer Komponente
 
aber das ist ja das gleiche was ich bereits schon der testcombo drin hatte oder?

ausserdem bei
Code:
destructor TTestCompo.Create(AOwner: TComponent);
begin
  FreeAndNil(FIcon);
  inherited;
end;
ist das create nicht falsch?
muss das ned destroy heissen?

Stevie 18. Nov 2004 10:14

Re: Probleme mit Property einer Komponente
 
Zitat:

Zitat von Helmi
aber das ist ja das gleiche was ich bereits schon der testcombo drin hatte oder?

ausserdem bei
Code:
destructor TTestCompo.Create(AOwner: TComponent);
begin
  FreeAndNil(FIcon);
  inherited;
end;
ist das create nicht falsch?
muss das ned destroy heissen?

:wall: Ach Shit Copy&Waste!! :roll:

Kommt die Meldung nicht, wenn du im OI ein Icon angibst???

Helmi 18. Nov 2004 10:19

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

jim_raynor 18. Nov 2004 10:25

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 :)

Helmi 18. Nov 2004 10:34

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)

Stevie 18. Nov 2004 10:38

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;

Helmi 18. Nov 2004 10:44

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?

Stevie 18. Nov 2004 10:56

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.

Helmi 27. Dez 2004 10:24

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:
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;
Ich habe jetzt gleiche jetzt mal in meiner Komponente drin, nur das IconChanged hab ich wie folgt geändert:
Code:
  SendMessage(IconData.hIcon, WM_SETICON, 1, FIcon.Handle);
Nur leider wird das Icon nicht geändert.
Was macht TForm was ich nicht mach? :?:

mfg
Helmi

Stevie 28. Dez 2004 08:53

Re: Probleme mit Property einer Komponente
 
Nun ja...
Delphi-Quellcode:
SendMessage(Handle, WM_SETICON, 1, GetIconHandle);
ist halt was anderes, als
Delphi-Quellcode:
SendMessage(IconData.hIcon, WM_SETICON, 1, FIcon.Handle);
Oben wird an das Fenster eine Nachricht geschickt (Handle ist dasselbe wie Self.Handle) und bei dir an das Icon-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 07:33 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