Nach Hause
Top.Mail.Ru Yandeks.Metrika
Forum: "Anfänger";
Aktuelles Archiv: 2018.09.16;
Herunterladen: [xml.tar.bz2];

Nach unten

Komponentenwerte werden initialisiert Finden Sie ähnliche Zweige


Денис11998833   (2016-08-06 15:20) [0]

Hat eine Komponente, einen Erben von TImage, erstellt. Um die Beschreibung so weit wie möglich zu vereinfachen, soll das Bild aus der Ressource beim Erstellen der Komponente zur Laufzeit in TPicture geladen werden. Ein Erbe ist erledigt, eine Eigenschaft mit dem Namen der Ressource ist hinzugefügt, eine Methode ist hinzugefügt, die die Ressource in TPicture lädt. Ich lege die Komponente auf das Formular, ich ziehe die neue Methode manuell, das Bild wird geladen, alles ist in Ordnung.

Die Frage ist, dass ich das Bild automatisch laden möchte, ohne die neue Methode manuell zu ziehen. Es wurde ein Aufruf zum Laden der Ressource am Ende des Konstruktors hinzugefügt. Es ist nichts passiert. Bitte sagen Sie mir, wie ich das umsetzen soll.



Kilkennycat ©   (2016-08-07 01:22) [1]


> Am Ende des Konstruktors wurde ein Aufruf zum Laden von Ressourcen hinzugefügt, nichts
> fehlgeschlagen

Und hast du keinen Fehler gesagt? Und repaire \ refresh \ disabled - ein Che-Thread von diesem (ich erinnere mich nicht, was im Delphi neu gezeichnet wird), dann heißt es?



Германн ©   (2016-08-07 01:59) [2]


>
> Denis11998833 (06.08.16 15: 20)
>
> Ich habe eine Komponente erstellt, einen Erben von TImage.

Na, wenigstens hast du wenigstens einen Code mitgebracht.



ВладОшин ©   (2016-08-07 10:01) [3]

Alles muss funktionieren. Vielleicht habe ich mich gefragt, ob die Ressource dort nicht vorhanden ist



iop ©   (2016-08-07 10:44) [4]

Ein Aufruf zum Laden von Ressourcen wurde am Ende des Konstruktors hinzugefügt

Ihr im Konstruktor geladenes Bild wird im geerbten geladenen getötet.
wenn Sie es überhaupt richtig in den Konstruktor geladen haben.

aus irgendeinem Grund



iop ©   (2016-08-07 10:48) [5]

Darüber hinaus verfügen Sie wahrscheinlich über eine veröffentlichte Eigenschaft, die den Namen der Bildressource enthält.

Im Konstruktor wird der Wert also nicht erkannt. dort ist es noch leer.



Денис11998833   (2016-08-08 11:17) [6]

> Und keinen Fehler gesagt? Und repaire \ refresh \ disabled - ein Thread von diesem (ich kann mich nicht erinnern, was im Delphi neu gezeichnet wurde), dann heißt er?

Kein Fehler. Der Debugger hat festgestellt, dass die Eigenschaften mit dem Ressourcennamen zum Zeitpunkt des Aufrufs des Komponentenkonstruktors leer sind.

> alles sollte funktionieren, vielleicht habe ich es mit einer Ressource geschafft, sie sucht dort nicht

Ich ziehe die ApplyCaption-Methode manuell in OnCreate-Formularen, alle Regeln, Bilder werden geladen, alles ist in Ordnung.

> so erkennt man im konstruktor seinen wert nicht. dort ist es noch leer.

Anscheinend ist dies das Problem, aber ich weiß nicht, wie ich es lösen soll. Erklären Sie, warum es leer ist? Ich verstehe, dass in der Entwurfszeit, wenn Sie nur eine Komponente in ein Formular werfen, alle Eigenschaften standardmäßig festgelegt werden. Und was in Runtime passiert, wenn ein Programm meine Komponente erstellt, ist nicht ganz klar. Ich dachte, wenn der Komponentenkonstruktor zur Laufzeit aufgerufen wird, sind die veröffentlichten Eigenschaften bereits mit den Werten initialisiert, die ich in der Desintime festgelegt habe. Es stellte sich heraus, dass alles falsch war.

> Na ja, Sie haben wenigstens Code mitgebracht.

Ich wollte den Beitrag nicht blockieren, ich fand ihn wirklich einfach und irgendwo in der Nähe. Hier ist der vollständige Komponentencode:



Денис11998833   (2016-08-08 11:18) [7]

> Und keinen Fehler gesagt? Und repaire \ refresh \ disabled - ein Thread von diesem (ich kann mich nicht erinnern, was im Delphi neu gezeichnet wurde), dann heißt er?

Kein Fehler. Der Debugger hat festgestellt, dass die Eigenschaften mit dem Ressourcennamen zum Zeitpunkt des Aufrufs des Komponentenkonstruktors leer sind.

> alles sollte funktionieren, vielleicht habe ich es mit einer Ressource geschafft, sie sucht dort nicht

Ich ziehe die ApplyCaption-Methode manuell in OnCreate-Formularen, alle Regeln, Bilder werden geladen, alles ist in Ordnung.

> so erkennt man im konstruktor seinen wert nicht. dort ist es noch leer.

Anscheinend ist dies das Problem, aber ich weiß nicht, wie ich es lösen soll. Erklären Sie, warum es leer ist? Ich verstehe, dass in der Entwurfszeit, wenn Sie nur eine Komponente in ein Formular werfen, alle Eigenschaften standardmäßig festgelegt werden. Und was in Runtime passiert, wenn ein Programm meine Komponente erstellt, ist nicht ganz klar. Ich dachte, wenn der Komponentenkonstruktor zur Laufzeit aufgerufen wird, sind die veröffentlichten Eigenschaften bereits mit den Werten initialisiert, die ich in der Desintime festgelegt habe. Es stellte sich heraus, dass alles falsch war.

> Na ja, Sie haben wenigstens Code mitgebracht.

Ich wollte den Beitrag nicht blockieren, ich fand ihn wirklich einfach und irgendwo in der Nähe. Hier ist der vollständige Komponentencode:


unit uPngGraphicButton;

interface

uses ExtCtrls, Graphics, Classes, UITypes, Dialogs, PNGImage, GIFImg, JPEG,
Messages, Controls, SysUtils, Forms;

type
 TCaptionOffsets = class(TPersistent)
 private
   FOffsetNormalX: integer;
   FOffsetNormalY: integer;
   FOffsetDownX: integer;
   FOffsetDownY: integer;
 published
   property OffsetNormalX: integer read FOffsetNormalX write FOffsetNormalX default 0;
   property OffsetNormalY: integer read FOffsetNormalY write FOffsetNormalY default -1;
   property OffsetDownX: integer read FOffsetDownX write FOffsetDownX default 0;
   property OffsetDownY: integer read FOffsetDownY write FOffsetDownY default 0;
 end;

 TPNGGraphicButton = class(TImage)
 private
   FCaptionFont: TFont;
   //FCaptionOffsetX, FCaptionOffsetY: integer;
   FCaptionOffsets: TCaptionOffsets;
   FLoadFromResource: boolean;
   FResourceName: string;
   FResourceHandle: THandle;
   FCaption: string;
   FPictureNormal,
   FPictureHover,
   FPictureDown,
   FPictureNotActive: TPicture;
   procedure SetNormalPicture(Value: TPicture);
   procedure SetHoverPicture(Value: TPicture);
   procedure SetDownPicture(Value: TPicture);
   procedure SetNotActivePicture(Value: TPicture);
   procedure SetFont(const Value: TFont);
   procedure SetCaptionOffsets(const Value: TCaptionOffsets);
   procedure WriteText(WPicture: TPicture; DownImg: boolean);
   procedure LoadPngResource(ResName:string; Picture: TPicture);
 protected
   //procedure Paint; override;
   procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
     X, Y: Integer); override;
   procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
     X, Y: Integer); override;
   //procedure MouseEnter; override;
   procedure CMMouseEnter(var msg: TMessage);
       message CM_MOUSEENTER;
   procedure CMMouseLeave(var msg: TMessage);
       message CM_MOUSELEAVE;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   procedure ApplyCaption;
   procedure LoadAllResources;
 published
   property Caption: string read FCaption write FCaption;
   property CaptionOffsets: TCaptionOffsets read FCaptionOffsets write SetCaptionOffsets;
   property Font: TFont read FCaptionFont write SetFont;
   property PictureNormal: TPicture read FPictureNormal write SetNormalPicture;
   property PictureHover: TPicture read FPictureHover write SetHoverPicture;
   property PictureDown: TPicture read FPictureDown write SetDownPicture;
   property PictureNotActive: TPicture read FPictureNotActive write SetNotActivePicture;
   property LoadFromResource: boolean read FLoadFromResource write FLoadFromResource default True;
   property ResourceName: string read FResourceName write FResourceName;
   property ResourceHandle: THandle read FResourceHandle write FResourceHandle;
 end;

procedure Register;

implementation

uses Windows, UxTheme;

procedure Register;
begin
 RegisterComponents("oTweak", [TPNGGraphicButton]);
end;

constructor TPNGGraphicButton.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FCaptionFont:=TFont.Create;
 FPictureNormal := TPicture.Create;
 FPictureHover := TPicture.Create;
 FPictureDown := TPicture.Create;
 FPictureNotActive := TPicture.Create;
 FCaptionOffsets:=TCaptionOffsets.Create;
 FLoadFromResource:=True;

 FCaptionFont.Name:="Segoe UI";
 FCaptionFont.Height:=-18;
 FCaptionFont.Color:=clWhite;

 FCaptionOffsets.OffsetNormalX:=0;
 FCaptionOffsets.OffsetNormalY:=-1;
 FCaptionOffsets.OffsetDownX:=0;
 FCaptionOffsets.OffsetDownY:=0;

 ApplyCaption;
end;

destructor TPNGGraphicButton.Destroy;
begin
 FCaptionFont.Free;
 FPictureNormal.Free;
 FPictureHover.Free;
 FPictureDown.Free;
 FPictureNotActive.Free;
 FCaptionOffsets.Free;
 inherited Destroy;
end;

procedure TPNGGraphicButton.ApplyCaption;
begin
 LoadAllResources;
 WriteText(PictureNormal, False);
 WriteText(PictureHover, False);
 WriteText(PictureDown, True);
 WriteText(PictureNotActive, False);
 Picture.Assign(PictureNormal);
end;

procedure TPNGGraphicButton.LoadAllResources;
begin
 if (FResourceName<>"") and (FLoadFromResource) then
 begin
   LoadPngResource(FResourceName+"_normal", FPictureNormal);
   LoadPngResource(FResourceName+"_hover", FPictureHover);
   LoadPngResource(FResourceName+"_down", FPictureDown);
   LoadPngResource(FResourceName+"_na", FPictureNotActive);
 end;
end;



Денис11998833   (2016-08-08 11:18) [8]


procedure TPNGGraphicButton.LoadPngResource(ResName:string; Picture: TPicture);
var
 MyPNG : TPNGImage;
 hLibRes: THandle;
begin
 if FResourceHandle<>0 then
   hLibRes:=FResourceHandle
 else
   hLibRes:=hInstance;

 if FindResource(hLibRes, PChar(ResName), RT_RCDATA)=0 then
 begin
   Exit;
 end;

 MyPNG := TPNGImage.Create;
 try
   MyPNG.LoadFromResourceName(hLibRes, ResName);
   Picture.Assign(MyPNG);
 finally
   MyPNG.Free;
 end;
end;

procedure TPNGGraphicButton.WriteText(WPicture: TPicture; DownImg: boolean);
var
 X, Y,
 OffsX,
 OffsY: integer;
begin
 if not Assigned(WPicture) then
   Exit;

 if FCaption="" then
   Exit;

 if (WPicture.Graphic is TPNGImage) and (not WPicture.Graphic.Empty)  then
   with ((WPicture.Graphic as TPNGImage)) do
   begin
     Canvas.Font.Assign(FCaptionFont);
     X:=Trunc(WPicture.Width/2-Canvas.TextWidth(FCaption)/2);
     Y:=Trunc(WPicture.Height/2-Canvas.TextHeight("A")/2);

     if DownImg then
     begin
       OffsX:=FCaptionOffsets.OffsetDownX;
       OffsY:=FCaptionOffsets.OffsetDownY;
     end else
     begin
       OffsX:=FCaptionOffsets.OffsetNormalX;
       OffsY:=FCaptionOffsets.OffsetNormalY;
     end;
     X:=X+OffsX;
     Y:=Y+OffsY;
     if X<0 then X:=0;
     if Y<0 then Y:=0;

     SetBkMode(Canvas.Handle, 1);
     Canvas.TextOut(X, Y, FCaption);
   end;
end;

procedure TPNGGraphicButton.SetNormalPicture(Value: TPicture);
begin
 if Assigned(Value) then
   FPictureNormal.Assign(Value);
end;

procedure TPNGGraphicButton.SetHoverPicture(Value: TPicture);
begin
 if Assigned(Value) then
   FPictureHover.Assign(Value);
end;

procedure TPNGGraphicButton.SetDownPicture(Value: TPicture);
begin
 if Assigned(Value) then
   FPictureDown.Assign(Value);
end;

procedure TPNGGraphicButton.SetNotActivePicture(Value: TPicture);
begin
 if Assigned(Value) then
   FPictureNotActive.Assign(Value);
end;

procedure TPNGGraphicButton.SetFont(const Value: TFont);
begin
 if Assigned(Value) then
   FCaptionFont.Assign(Value);
end;

procedure TPNGGraphicButton.SetCaptionOffsets(const Value: TCaptionOffsets);
begin
 if Assigned(Value) then
   FCaptionOffsets.Assign(Value);
end;

procedure TPNGGraphicButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
 { Your code }
 Picture.Assign(PictureDown);
 inherited MouseDown(Button, Shift, X, Y);
end;

procedure TPNGGraphicButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
 { Your code }
 Picture.Assign(PictureNormal);
 inherited MouseUp(Button, Shift, X, Y);
end;

procedure TPNGGraphicButton.CMMouseEnter(var msg: TMessage);
begin
 Picture.Assign(PictureHover);
 inherited;
end;

procedure TPNGGraphicButton.CMMouseLeave(var msg: TMessage);
begin
 Picture.Assign(PictureNormal);
 inherited;
end;

end.



iop ©   (2016-08-08 11:38) [9]

Erklären Sie, warum es leer ist?

warum sollte es im Konstruktor NICHT leer sein?
auf Befehl von chtol?



Денис11998833   (2016-08-08 11:46) [10]

> warum sollte es im Konstruktor nicht leer sein?

Sagen Sie mir, wo ich darüber lesen soll. Ich habe nirgends eine eindeutige Reihenfolge gefunden, zu welchem ​​Zeitpunkt die Komponente erstellt wird, wie ihre Werte initialisiert werden, zu welchem ​​Zeitpunkt Sie sicher sein können, dass die Komponente vollständig erstellt wurde und die Werte, die ich im Timeout festgelegt habe. Entweder habe ich schlecht ausgesehen, oder es gibt wirklich sehr wenig von diesen Informationen.

Wie löse ich das Problem des Ladens eines Bildes beim Erstellen einer Komponente in meinem speziellen Fall?



iop ©   (2016-08-08 11:52) [11]

Beim Erstellen müssen Sie nichts laden.

Während die Anwendung ausgeführt wird, rufen Sie beispielsweise den Konstruktor auf.

Das Formular enthielt keine Komponente im Entwurf.
niemand hat ihm den Namen der Ressource gegeben.
und welches bild wolltest du dort gleichzeitig laden?



Денис11998833   (2016-08-08 13:09) [12]

> Auf dem Formular befand sich keine Komponente im Entwurf.

Ich verstehe das. Nochmals aus einem früheren Beitrag:

> Ich verstehe, dass in der Entwurfszeit, wenn Sie nur eine Komponente in ein Formular werfen, alle Eigenschaften standardmäßig festgelegt werden. Und was in Runtime passiert, wenn ein Programm meine Komponente erstellt, ist nicht ganz klar.

Das heißt In der Entwurfszeit lege ich die Eigenschaften der Werte fest, starte das Programm, stoppe das Programm mit dem Debugger an der Stelle, an der der Komponentenkonstruktor aufgerufen wird, und die Eigenschaften sind leer.

Ich spreche speziell über das Aufrufen des Konstruktors in der Laufzeit, alles ist klar mit der Entwurfszeit.



iop ©   (2016-08-08 13:16) [13]

Im Publisher-Konstruktor sind die Eigenschaften zweimal leer.
1. weil die komponente dfm noch nicht gelesen hat
2. weil die Komponente zur Laufzeit erstellt werden kann (lag nicht auf dem Formular im Design)

Befand es sich auf dem Formular im Entwurf und wurde dem Entwurf der Name der Ressource mitgeteilt, so ist der Name nicht früher bekannt und verfügbar
Prozedur Loadded: virtuell;



Денис11998833   (2016-08-08 13:36) [14]

> Wenn es auf dem Formular im Entwurf war und ihm im Entwurf der Name der Ressource mitgeteilt wurde, wird dieser Name nicht früher bekannt und verfügbar sein
> Prozedur Loadded: virtuell;

Es sieht so aus, als ob es fast das ist, was Sie brauchen! Gibt es ein spezielles Ereignis zum Ändern des Werts von Geladen ist nicht vorgesehen? Eine Art OnLoaded



iop ©   (2016-08-08 13:41) [15]

Der Wert des Laders ändert sich nicht.
Er hat überhaupt keine Bedeutung.
Dies ist eine Prozedur.



Денис11998833   (2016-08-08 14:34) [16]

Kurz gesagt, wurde verwirrt (.. Wenn Sie immer noch auf das Problem zurückkommen, wo muss ich meine LoadAllResources kleben, damit in der Laufzeit die Bilder geladen werden?



iop ©   (2016-08-08 15:04) [17]

stecken Sie es in geladen;



Денис11998833   (2016-08-08 16:35) [18]

Danke, lieber Mann!

Hinzugefügt von:

geschützt Prozedur Geladen; überschreiben; procedure TPNGGraphicButton.Loaded; beginne geerbt Geladen; ApplyCaption; Ende;

Und alles sang wie es sollte



Seiten: 1 ganze Branche

Forum: "Anfänger";
Aktuelles Archiv: 2018.09.16;
Herunterladen: [xml.tar.bz2];

nach oben









Speicher: 0.66 MB
Zeit: 0.038 c
15-1474880632
Wer würde zweifeln?
2016-09-26 12:03
2018.09.16
Wie nehme ich eine Nachricht mit whatsapp an?


2-1469453166
Raisa
2016-07-25 16:26
2018.09.16
POS-Drucker


2-1470299345
Novichoks
2016-08-04 11:29
2018.09.16
Stretchblt


11-1267379542
tippa
2010-02-28 20:52
2018.09.16
in Memo nur 29998 Textbytes


2-1470486053
Denis11998833
2016-08-06 15:20
2018.09.16
Komponentenwerte werden initialisiert





Afrikanisch Albanien Arabisch Armenisch Aserbaidschanisch Baskisch Weißrusse Bulgarian katalanisch Chinesisch (vereinfacht) Chinesische Tradition) kroatisch Tschechisch Dänisch Dutch Englisch estnisch Philippinisch Finnish Französisch
Galicisch Georgisch Deutsch Griechisch haitian Creole Hebräisch Hindi ungarisch isländisch Indonesian irisch Italian Japanisch Koreanisch lettisch litauisch Makedonisch Malay Maltesisch Norwegian
persisch Polnisch Portugiesisch Rumänisch Russisch serbisch Slovakisch Slowenisch Spanisch Suaheli Swedish Thai Türkisch Ukrainisch Urdu Vietnamesisch Walisisch Jiddisch Bengalisch bosnisch
cebuano Esperanto Gujarati Hausa Hmong igbo Javanisch kannada khmer Laotisch Lateinisch Maorisch Marathi Mongolisch nepali Pandschabi Somalisch Tamilisch Telugu Yoruba
Zulu
Английский Französisch Deutsch Italienisch Португальский Russisch Spanisch