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 TImage zur Laufzeit mit weiteren Properties ausstatten (https://www.delphipraxis.net/93919-timage-zur-laufzeit-mit-weiteren-properties-ausstatten.html)

torud 13. Jun 2007 10:50


TImage zur Laufzeit mit weiteren Properties ausstatten
 
Hallo Wissende,

ich erzeuge zur Laufzeit in einem Tool TImage und lade darin PNG´s. Alles kein Problem und easy. Da ich die sich darin befindlichen Bilder nun auch noch drehe und skaliere und sonstwie bearbeite, benötige ich in der TImage weitere Eigenschaften, in die ich z.B. die diversen Zustände schreiben und später speichern kann. Ich benötige zum Beispiel die Properties

Angle, Scaling:integer;
Invers:boolean;

usw.

Ist es möglich die TImage einfach zu überschreiben und ihr noch diese weiteren Eigenschaften zu geben?

Wenn ja, wie? Ich habe natürlich die Suche hier benutzt, aber nichts finden können, wohl weil ich nicht die richtigen Stichwörter hatte!?

Sollte es nicht gehen, wäre ich für andere Vorschläge dankbar...

SirThornberry 13. Jun 2007 10:55

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
überschreiben ist was anderes. Das was du machen müsstest wäre von TImage eine ableiten und deine neue Komponente eben mit den neuen Sachen zu erweitern.

sirius 13. Jun 2007 10:55

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Verebung von Klassen wäre da das richtige Stichwort

Delphi-Quellcode:
type TMyImage=class(TImage)
       private
         FEigenschaft:integer;
end;
So, und jetzt nimmst du statt TIamge, TmyImage und schon hast du auch die Eigenschaft FEigenschaft.

torud 13. Jun 2007 12:16

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Klingt plausibel. Dies wird aber nun mein erster Versuch. Wie und wo muss ich Deinen Beispiel-Code nun einsetzen?

Bisher ist es bei mir so:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, pngimage, ExtCtrls,Math, StdCtrls, jpeg ;

type
  TForm1 = class(TForm)
    img_src: TImage;
    img_bg: TImage;
    ScrollBar1: TScrollBar;
    img_dest: TImage;
    ScrollBar2: TScrollBar;
    lbl_size: TLabel;
    lbl_angle: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure ScrollBar1Change(Sender: TObject);
    procedure ScrollBar2Change(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

guidobrose 13. Jun 2007 12:26

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, pngimage, ExtCtrls,Math, StdCtrls, jpeg ;

type

  TMyImage=class(TImage)
  private
    FEigenschaft:integer;
    //Methoden fehlen hier auch noch
  end;
 
  TForm1 = class(TForm)
    img_src: TMyImage;
    img_bg: TMyImage;
    ScrollBar1: TScrollBar;
    img_dest: TImage;
    ScrollBar2: TScrollBar;
    lbl_size: TLabel;
    lbl_angle: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure ScrollBar1Change(Sender: TObject);
    procedure ScrollBar2Change(Sender: TObject);
  private
    { Private-Deklarationen } 
  public
    { Public-Deklarationen } 
  end;

torud 13. Jun 2007 12:36

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Also ich habe es nun so eingebunden, aber ich erhalte leider nicht die Möglichkeit die

Delphi-Quellcode:
type
  TMyImage=class(TImage)
  private
    new_width:integer;
    angle:integer;
    //Methoden fehlen hier auch noch
  end;

    TForm1 = class(TForm)
so anzusprechen nachdem ich im OnCreate des Formulares das TmyImage erzeugt habe.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  TMyImage.Create(form1);
    img_src.Picture.LoadFromFile('0.png');
    img_dest.Picture.LoadFromFile('0.png');
end;
Auch kann ich kein Bild reinladen usw...War das der hinweis mit den Methoden? Ich brauche einfach die komplette Funktionalität einer TImage PLUS der 2-5 Eigenschaften...Also was fehlt mir denn da nun noch?

Vielleicht steckt ja hier schon der richtige und wichtige Hinweis drin?
Zitat:

Zitat von SirThornberry
überschreiben ist was anderes. Das was du machen müsstest wäre von TImage eine ableiten und deine neue Komponente eben mit den neuen Sachen zu erweitern.

Nur wie?

sirius 13. Jun 2007 12:39

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Delphi-Quellcode:
img_src:=tmyimage.create(self);
Edit: Methoden fehlen dir nicht unbedingt, es sei denn du willst noch weitere hinzufügen.
Du musst auch nicht unbedingt alles unter "private" legen. Ist nur für Variablen der übliche Platz.

torud 13. Jun 2007 12:50

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Stimmt, habe es inzwischen auch gefunden. War mal wieder zu schnell mit meiner Meldung. Ist nur doof, dass mein Komponententool, welches automatisch alle sich auf dem Form befindlichen Controls in einer DFM-Datei abspeichern kann, die neuen Eigenschaften NICHT mitspeichert...Werde ich wohl mal die Erzeuger des Produktes anschreiben, ob die da was tun können...

sirius 13. Jun 2007 12:52

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Da kannst du auch selber was tun :mrgreen:

"published properties" dürften die Lösung sein.

guidobrose 13. Jun 2007 12:52

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Zitat:

Du musst auch nicht unbedingt alles unter "private" legen. Ist nur für Variablen der übliche Platz.
Stimmt, "private" ist hier doch auch etwas unglücklich, weil er dann "von außen" nicht auf seine Eigenschaften zugreifen kann. "public" wäre hier die bessere Wahl.

torud 13. Jun 2007 13:10

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Ich habe es gerade nochmal getestet und der FormDesigner von Greatis.com speichert wirklich alle möglichen Controls, die sich auf dem Formular befinden, so auch mein erzeugtes Testpic:

Delphi-Quellcode:
  object testpic: TMyImage
    Left = 0
    Top = 0
    Width = 105
    Height = 105
    Picture.Data = {
      0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000005600
      //usw...
Aber die 2 neuen Eigenschaften speichert er leider nicht. Hat das einen Grund?

Delphi-Quellcode:
type
  TMyImage=class(TImage)
  public
    new_width:integer;
    angle:integer;
    //Methoden fehlen hier auch noch
  end;
Ich übergebe Ihnen schon Daten, aber sie werden einfach nicht gespeichert:

Delphi-Quellcode:
      myDestImage.Picture.Graphic.Assign(x);
      myDestImage.new_width := ScrollBar2.Position;
      myDestImage.angle    := ScrollBar1.Position;

sirius 13. Jun 2007 13:15

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Versuch mal so:
Delphi-Quellcode:
type tmyImage=class(TImage)
       private
         FEigenschaft:Integer;
       published
         property Eigenschaft:integer read FEigenschaft write FEigenschaft;
end;

torud 13. Jun 2007 13:21

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Jo , mit dem speichern klappts nun. Nun haperts nur noch mit dem Laden. Er kennt nun natürlich TMyImage nicht. Warum auch immer...naja aber ich bin schon mal ein Stück weiter...

Im Projekt Project1.exe ist eine Exception der Klasse EClassNotFound aufgetreten. Meldung: 'Klasse TMyImage nicht gefunden'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

sirius 13. Jun 2007 13:31

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Ich kenne den Formdesigner nicht. Wann und wo wird denn deine Komponente geladen?

torud 13. Jun 2007 13:36

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Die Komponente ist schon sehr geil.

per button1 passiert folgendes:

Delphi-Quellcode:
    FormDesigner1.Active:=true;
    FormDesigner1.SaveToDFM('test.txt',dfmText);
und mit dem anderen Button lade ich

Delphi-Quellcode:
    FormDesigner1.Active := True;
    FormDesigner1.LoadFromDFM('test.txt',dfmText);
Ich habe es mal so modifiziert, dass ich das TMyImage weggelassen habe. Dann läd und speichert er korrekt. Wenn ich TMyImage erzeuge und das Form korrekt speichere ist alles ok, aber sobald ich neu lade "knallts"...

sirius 13. Jun 2007 13:42

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Keine Ahnung, was da schief läuft. Die Komponenete TmyImage befindet sich ja genauso im Code wie alle anderen Komponenten auch. :gruebel:

torud 13. Jun 2007 13:48

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Kann es sein, dass zu einem Konflikt kommen kann, weil ich myDestImage:TMyImage; global deklariert habe und dann im OnCreate dies generiert habe und es dann nochmals geladen werden soll und da aber schon existent ist? Ich probiers einfach mal aus, indem ich andere Namen benutze...

torud 13. Jun 2007 17:49

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Hier ist die Antwort vom Hersteller der Komponente. Leider kann ich damit nicht wirklich was anfangen. Kann mir jemand von Euch nen Hinweis geben?

----------------------------------------

Hello,
Have you registered your new class with RegisterClasses procedure?

It\'s common VCL stream requirement for all the loaded object. This feature is
used for finding the correct constructor by class bane loaded from stream.

Let me know if you have any questions.
Thank you.

sirius 13. Jun 2007 19:38

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Ah, ja!
Dann versuch doch mal folgendes in deiner Unit ganz am Ende (vor dem "end.")

Delphi-Quellcode:
initialization

registerclass(tmyImage)

finalization

unregisterclass(tmyimage)
Du kannst natürlich daraus auch ein package, also eine Komponente in der IDE machen (siehe "procedure register")

torud 13. Jun 2007 19:41

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Danke für den Hinweis.

Nun erhalte ich wenigstens eine andere Meldung. Mit der kann ich gleich gar nichts anfangen... :oops:

Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00403806 in Modul 'Project1.exe'. Lesen von Adresse 34333201'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

Das eigentlich fast schon tolle ist, dass die Meldung erst nach dem erfolgreichen Laden kommt. Das heisst, dass es nun eigentlich schon funktioniert. Ist nur noch diese Meldung im Wege, die aber sicher ihren Grund hat...

Ich glaube desweiteren, dass es damit zusammenhängt, dass ich das MyImage-Control zu Beginn vom Programm erstellen lasse und das beim Laden der DFM-Datei die Komponente zuerst alle Controls zerstört, um danach die in der DFM-Datei stehenden zu creieren. Könnte da ein Fehler sein?

sirius 13. Jun 2007 20:13

Re: TImage zur Laufzeit mit weiteren Properties ausstatten
 
Das könnte aber auch ein anderer Programmfehler sein. Dann versuch doch mal mit dem Debugger die Zeile zu ermitteln!


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 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