Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse (https://www.delphipraxis.net/154402-zugriff-auf-eigenschaften-width-und-height-abgeleiteter-klasse.html)

knaeuel 9. Sep 2010 16:19

Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse
 
Hallo zusammen,

ich habe eine Klasse TMyImage von TImage abgeleitet.
Aus dieser Klasse TMyImage habe ich eine Komponente erstellt.

Ich füge nun die Komponente in ein Formular ein. Zunächst hat sie nun die Breite und Höhe 105, was wohl der Ausgangswert für die beiden Eigenschaften in der Basisklasse TImage ist.
Wenn ich jetzt Breite und Höhe meinethalben auf 400*400 ändere, bleibt der weiß hinterlegte Zeichenbereich unverändert bei 105*105 und ich ziehe nur ein transparentes Rechteck auf.

Schaue ich nun zur Laufzeit in meiner Komponente auf die Werte von Width und Height, dan steht da tatsächlich nach wie vor 105 drin...
Auf die Werte, die laut OI in Width und Height stehen, kann ich innerhalb der Klasse TMyImage nirgens zugreifen. Greife ich von außerhalb auf MyImage1.Width oder MyImage1.Height zu (MyImage1:TMyImage), sind die Werte wieder wie eingestellt, also wieder 400*400.

Das is jawohl der größte Käse, den Delphi mir je aufgetischt hat :wink:
Ich habe allerdings nicht allzuviel Ahnung von Vererbungstrara und hoffe, dass mir jemand weiterhelfen kann.
Die Komponente soll natürlich eine veränderbare Größe im Formular einnehmen können, und zwar inklusive Zeichenbereich. Wenn MyImage1.Width=400 ist, dann soll natürlich auch innerhalb des Objekt self.Width=400 sein.

r2c2 9. Sep 2010 16:47

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse
 
Wahrscheinlich machst du etwas falsch. Wie war nochmal dein Code?

mfg

Christian

knaeuel 10. Sep 2010 08:26

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse
 
ja, sorry, ich hatte gestern keine Zeit mehr und hab dann auf ne theoretische Antwort gehofft. :wink:
hier der abgespeckte code:

Delphi-Quellcode:
type
  TSozioImage = class(TImage)
  private
    { Private-Deklarationen }
    //ganz viele Deklarationen
    //...
  protected
    { Protected-Deklarationen }
    procedure Paint(); override;
  public
    { Public-Deklarationen }
    //ganz viele Deklarationen
    //...
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ClearGraph;
    function GetAkteurIndexByName(akteurname: string): integer;
    procedure OpenMatrixCSV(filename:string);
    procedure SaveMatrixCSV(filename:string);
    procedure SaveNetworkMatrixCSV(filename: string;netz:integer);
    procedure SetNewKoorsToAkteurByName(newx, newy: integer; akteurname: string);
    function GetNetworkRecord(networknumber: integer): netzwerk_type;
    function GetNetworkCount: integer;
    procedure SetDrawNetworkFilter(nw:integer);//-1 -> alle, x -> nur netzwerk x
    procedure BetweennessCentralityUnweighted(netzid:integer);
    procedure CreateBMPScreenshot(filename:string);
    procedure CliqueHervorhebenToggle(index:integer);
    procedure CliqueHervorhebenAlleAus;
    function betrag(x: real): real;
    procedure get_akteur_ergebnis_array(var erg:array of akteur_ergebnis_type);
    procedure MeinungsbildnerHervorhebenToggle(perzentil: integer);
    procedure MeinungsbildnerHervorhebenAus;
  published
    { Published-Deklarationen }
    //die nächsten beiden Zeilen waren nicht immer da. Das Problem ist mit und ohne sie vorhanden
    property Width;
    property Height;
    property Pfeilspitzenlaenge: real read pfeil_spitzenlaenge write pfeil_spitzenlaenge;
    property Pfeilspitzenwinkel: Byte read pfeil_spitzenwinkel write pfeil_spitzenwinkel;
    property Pfeil_ausgefuellt: boolean read pfeil_filled write pfeil_filled;
    property GetDichte: real read dichte;
    property GetAvgGeoDist: real read avggeodist;
    property AnzahlAkteure: integer read anzahl_akteure;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    function GetSelectedAkteur:akteur_type;
    function add_akteur(newone: akteur_type):boolean;
    function edit_akteur(oldone, newone: akteur_type): boolean;
    procedure add_arrow(newone:arrow_type);
    procedure reArrangePicture;
    function MouseHoldsAkteur(var akteurname:string):boolean;//gibt zurück, ob die maus einen akteur hält, wenn ja, dann auch akteurname
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Meine Komponenten', [TSozioImage]);
end;

{ TSozioImage }

{$region 'Create/Destroy/Eventhandling'}
constructor TSozioImage.Create(AOwner: TComponent);
//var zeichenbereich:TRect;
begin
  inherited Create(AOwner);
  wc := TWorldConverter.Create;
  // Schnittstelle: (xmin(virtuell),xmax(virtuell),ymin(virtuell),ymax(virtuell),umax,vmax:real)
//  FWidth:=800;
//  self.Width
//  self.Height

/////////////////////////////////////////////////////////////////////
//Width und Height sind hier 105, egal was im OI eingestellt wurde...
/////////////////////////////////////////////////////////////////////

  wc.berechneKoeffizienten(0,virtualkoors_xmax,0,virtualkoors_ymax,self.Width,self.Height);
  xmitte:=virtualkoors_xmax div 2;
  ymitte:=virtualkoors_ymax div 2;
  NoCalculating:=false;
  NoPainting:=false;
  anzahl_netzwerke:=0;
  anzahl_akteure:=0;
  nwfilter:=-1;
end;

destructor TSozioImage.Destroy;
begin
  ClearGraph;
  inherited;
end;

r2c2 10. Sep 2010 08:43

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse
 
Zitat:

Zitat von knaeuel (Beitrag 1048593)
Delphi-Quellcode:
constructor TSozioImage.Create(AOwner: TComponent);
//var zeichenbereich:TRect;
begin
[...]
/////////////////////////////////////////////////////////////////////
//Width und Height sind hier 105, egal was im OI eingestellt wurde...
/////////////////////////////////////////////////////////////////////

Jupp. Weil du dich hier im Konstruktor befindest. Die Werte aus dem OI werden AFAIK erst nach dem Konstruktoraufruf geladen. Was ja auch Sinn macht, denn davon existiert noch keine Komponente, deren Werte man laden könnte...

mfg

Christian

mkinzler 10. Sep 2010 08:45

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse
 
Du kannst aber Loaded() überschreiben, diese Methode wird nach dem Laden der Werte aufgerufen.

sx2008 10. Sep 2010 09:06

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse
 
@knaeuel: du machst den Fehler, den gesamten Code in die abgeleitete Image-Klasse zu verpacken.
Damit hast du eine Klasse, die Anzeigen, Berechnen, Laden, Speichern und vielleicht auch noch Kaffee kochen soll.
Das ist nicht gut.
Überlege dir mal, ob es nicht besser ist, den Code auf zwei Klasse zu verteilen.
Die eine Klasse ist ein normales TImage (oder noch besser TPicture) und die zweite Klasse wäre TSozioNetwork (dorthin wird dein Code verlagert).
Dein Problem mit Width und Height hat wahrscheinlich damit zu tun, dass du deine Anzeige zoomen möchtest.

Aber es geht noch weiter:
Du könntest weitere Hilfsklassen erstellen.
Zum Beispiel brauchst du eine Klasse, die Mauskoordinaten zurückrechnet auf dein Modell.
Ein Hilsklasse die nur Pfeile mit vorgegebenen Eigenschaften zeichnet wäre auch ganz nützlich.
Eine Klasse für jeden "Akteur" ist natürlich auch dringend notwendig.

Kurz gesagt: deine Aufgabe (soziales Netzwerk zeichen, wie ich vermute) ist so kompliziert,
dass es nötig wird Teilaufgaben in eigene Klassen auszulagern.

knaeuel 10. Sep 2010 09:38

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse
 
Zunächst mal Danke für die schnellen Antworten!

@r2c2 und mkinzler:
Aha, ja, das macht Sinn und hilft mir auch ein Stückchen weiter.
Aber das Problem, dass ich die Komponente im Formular nicht in die gewünschte Größe ziehen kann (Zeichenbereich bleibt bei 105*105, aufziehen läßt sich nur ein transparentes Rechteck) bleibt leider noch bestehen. Trotzdem schonmal danke für den Hinweis und den Tipp mit der Loaded-Methode, dort klappt der Zugriff auf self.Width und Height jetzt. :-D

@sx2008:
hui, da müsste ich aber jede Menge umbauen und hätte andauernd Zugriffsprobleme, müsste tausende von Get- und Set-Methoden programmieren usw. Zeichnen und Berechnen ist überigens schon komplett programmiert und es funktioniert soweit auch alles, nur ist die Anzeige mit 105*105 halt etwas klein :wink:
Für die Akteure und das Management von Subnetzen begnüge ich mich mit Types. Die Zerlegung in zumindest 2 Klassen (eine von TPicture und eine eigene) ziehe ich aber in Erwägung. (Die Berechnung der Koordinaten ist tatsächlich schon in eine eigene Klasse ausgelagert.) Und möglicherweise löst das ja dann auch mein Problem mit der Größe des Zeichenbereichs der Komponente. Ich melde mich wieder.

edit:
mh, TPicture gefällt mir aber nicht. Das hat keine Paint-Methode, keine Loaded-Methode, keine....
Ich hab einfach mal stumpf die Vererbung auf TPicture geändert und hatte dann über 60 Compiler-Fehler, die sich im Grunde alle auf die Vererbung bezogen. Da scheint mir TImage die passendere Basis zu sein. Oder spricht etwas massiv für TPicture?
Trotzdem zerlege ich jetzt mal in 2 Klassen.

Bummi 10. Sep 2010 11:59

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse
 
Vieelicht wäre TGraphicControl das richtige für Dich, hier kannst Du wenn Du GDI+ oder Imagelists mit PNG's verwendest auch Transparent zeichnen.

knaeuel 10. Sep 2010 12:29

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse
 
Liste der Anhänge anzeigen (Anzahl: 1)
@Bummi
danke für den Tipp, ich schau mir das mal an :)

Ich bin nun zunächst mit dem Umbau zur Trennung von Bild und Daten fertig. Das Problem mit der Größe der Komponente im Formular ist jedoch (wie zu befürchten war) bestehen geblieben.
Falls das Problem noch unklar ist, im Anhang mal ein Screenshot und hier nochmal die Beschreibung:

Wie man sieht, vergrößert sich nur ein trasparenter Bereich, wenn ich die Komponente größer ziehen will. Zwar bekomme ich dann im Anschluss über Width und Height die "großen" Werte und zeichne auch in der Größe, jedoch sieht man von der Zeichnung nur den Part, der links oben in der weißen Ecke landet.

Diesen weißen Zeichenbereich bekomme ich nicht vergrößert. Idealerweise sollte das sofort im Formulareditor passieren. Ok wärs für mich auch, wenn ich zur Laufzeit den Zeichenbereich anpassen könnte. Aber ich finde keinen Zugriffsweg.

Wenn da noch jemand eine Lösung weiß, wäre ich sehr dankbar.
(nebenbei teste ich jetzt mal TGraphicControl)

knaeuel 10. Sep 2010 13:36

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse
 
mit TGraphicControl funktioniert es tatsächlich! Die Komponente läßt sich jetzt in der Größe ändern.
Und wenn man dann noch den Tipp aus einem anderen Thread hier im Forum beherzigt und im Konstruktor noch diesen Befehl ausführt:

Delphi-Quellcode:
 
ControlStyle:=ControlStyle+[csOpaque];
, dann flimmert das Bild auch nicht mehr beim Verschieben von Grafikobjekten.

Also Leute, herzlichen Dank für die Hilfe!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.
Seite 1 von 2  1 2      

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