AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse

Ein Thema von knaeuel · begonnen am 9. Sep 2010 · letzter Beitrag vom 10. Sep 2010
Antwort Antwort
Seite 1 von 2  1 2      
knaeuel

Registriert seit: 2. Jul 2007
110 Beiträge
 
Delphi 10.3 Rio
 
#1

Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse

  Alt 9. Sep 2010, 16:19
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
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.
Wolfgang
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#2

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse

  Alt 9. Sep 2010, 16:47
Wahrscheinlich machst du etwas falsch. Wie war nochmal dein Code?

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
knaeuel

Registriert seit: 2. Jul 2007
110 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse

  Alt 10. Sep 2010, 08:26
ja, sorry, ich hatte gestern keine Zeit mehr und hab dann auf ne theoretische Antwort gehofft.
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;
Wolfgang
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#4

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse

  Alt 10. Sep 2010, 08:43
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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse

  Alt 10. Sep 2010, 08:45
Du kannst aber Loaded() überschreiben, diese Methode wird nach dem Laden der Werte aufgerufen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse

  Alt 10. Sep 2010, 09:06
@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.
  Mit Zitat antworten Zitat
knaeuel

Registriert seit: 2. Jul 2007
110 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse

  Alt 10. Sep 2010, 09:38
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.

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

Geändert von knaeuel (10. Sep 2010 um 09:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#8

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse

  Alt 10. Sep 2010, 11:59
Vieelicht wäre TGraphicControl das richtige für Dich, hier kannst Du wenn Du GDI+ oder Imagelists mit PNG's verwendest auch Transparent zeichnen.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
knaeuel

Registriert seit: 2. Jul 2007
110 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse

  Alt 10. Sep 2010, 12:29
@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)
Miniaturansicht angehängter Grafiken
aufziehproblem.jpg  
Wolfgang
  Mit Zitat antworten Zitat
knaeuel

Registriert seit: 2. Jul 2007
110 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Zugriff auf Eigenschaften Width und Height in abgeleiteter Klasse

  Alt 10. Sep 2010, 13:36
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!
Wolfgang

Geändert von mkinzler (10. Sep 2010 um 13:38 Uhr) Grund: Delphi-Tag gefixt
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 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