AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi [OOP] Ableiten von TImage: Wann hat mein Objekt eine Größe?
Thema durchsuchen
Ansicht
Themen-Optionen

[OOP] Ableiten von TImage: Wann hat mein Objekt eine Größe?

Ein Thema von Jazzman_Marburg · begonnen am 19. Okt 2010 · letzter Beitrag vom 20. Okt 2010
Antwort Antwort
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#1

AW: [OOP] Ableiten von TImage: Wann hat mein Objekt eine Größe?

  Alt 19. Okt 2010, 19:03
Ja, das wird sicher helfen (TRaster) -- aber bleiben noch ein paar Fragen.
Was ich nicht verstehe:

Ich leite also von TImage ab
Das ist schon mal falsch!
TImage ist ein Control um ein TPicture (Bitmap, GIF, JPeg,...) darzustellen.
(Controls sind sichtbare Steuerelement)
Es ist nicht als Basisklasse für eigene Controls gedacht.

Wenn dein Control nicht auf Tasten und Mausklicks reagieren soll dann von TGraphicControl ableiten.
Falls dein Control auf Tasten und Mausklicks reagieren soll, dann von TCustomControl ableiten.
Ich habe mir für ähnliche Zwecke eine TRaster erstellt.
Wieso kann der Kollege für sein TRaster von TPaintBox ableiten -- mir wird aber gesagt, TImage wäre ganz falsch?

Wenn doch TImage schon fast alles enthält was ich benötige -- wieso soll man nicht davon ableiten -- stattdessen TGraphicControl nehmen, dem ich dann mühsam noch alles "beibringen" muß, was TImage schon kann?

Danke & Gruß
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#2

AW: [OOP] Ableiten von TImage: Wann hat mein Objekt eine Größe?

  Alt 19. Okt 2010, 19:11
Moooment!
Kann es sein dass ich da etwas elementares durcheinander werfe:
Ich benutze TurboDelphi -- was bekanntlich keine User eigenen Komponenten erlaubt! D.h. ich erzeuge keine visuellen Komponenten, sondern althergebracht Objekte zur Laufzeit.

Als Grundlage für mein GraphPaper habe ich ein Beispiel aus einem Buch - dort wurde von TImage abgeleitet, umd mit REGISTER die (visuelle) Komponente registriert. Ich bin dann einfach hin und dachte, naja eine Komponente kannste nicht gebrauchen, und hab dann einfach die REGISTER Prozedur weggeschmissen und den Rest so gelassen.

Kann es nicht sein, dass das der Kardnial-Fehler war?
Und ich deshalb doch lieber von TGraphicControl ableiten sollte?

(Das würde zumindest den Knoten in meinem Kopf gerade entwirren).

Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: [OOP] Ableiten von TImage: Wann hat mein Objekt eine Größe?

  Alt 19. Okt 2010, 19:15
Wieso kann der Kollege für sein TRaster von TPaintBox ableiten -- mir wird aber gesagt, TImage wäre ganz falsch?
TPaintbox ist auch die falsche Basisklasse; muss dann wohl eine Jugendsünde von Stahli gewesen sein.

TPaintbox erfüllt folgenden Zweck:
das Zeichnen wird über das Event OnPaint an das Formular deligiert.
Das bedeutet man kann immer die gleiche Komponente TPaintbox verwenden und damit ganz unterschiedliche Dinge zeichnen weil der Zeichencode auf dem Formular liegt.
Wenn man von TPaintbox ableitet, dann ignoriert man damit den Sinn und Zweck der Paintbox.
TPaintbox müsste eigentlich eine "versiegelte Klasse" sein von der man nicht ableiten kann.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#4

AW: [OOP] Ableiten von TImage: Wann hat mein Objekt eine Größe?

  Alt 19. Okt 2010, 19:46
Ich verstehe nur noch Bahnhof!
Hier mal ein Zitat aus "BORLAND Delphi 7" von Doberenz und Gewinnus (S.528):

Ableiten von Komponenten
...
Soll es etwas Spezielleres sein, zum Beispiel ein neues Editierfeld, dann müssen Sie sich einen Komponententyp suchen (in diesem Fall TEdit), der sich weitesgehend Ihren Anforderungen annähert. Diesen erweitern Sie dann um die gewünschte neue Funktionalität oder Sie überschreiben die bisherigen Methoden.

D.h. die beiden Autoren schlagen doch genau das vor, was ich versuchte: TImage schien mir ganz passabel, nur dass es keine kleinen Rechtecke zeigt, wenn man es erzeugt. Nach Deiner Auffassung hätten sie (die Autoren) für ein neues Editierfeld also auch von TGraphicControl ableiten müssen?

Fragt sich
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: [OOP] Ableiten von TImage: Wann hat mein Objekt eine Größe?

  Alt 19. Okt 2010, 20:09
Ok, dann will ich es mal versuchen:

Du solltest Dir eine Basiskomponente auswählen, die möglichst viel von dem mitbringt, was Du erreichen willst. Sie sollte aber andererseits nicht unnötig viel Ballast mitschleppen (unnötig viele veröffentlichte Eigenschaften oder Methoden).

Du kannst NATÜRLICH von einer TImage ableiten, die bringt aber eben recht viel Ballast mit (Methoden zum Laden und Speichern von Bildern).
Diese Methoden brauchst Du ja nicht. Daher wäre vielleicht ein Vorfahre von TImage (oder etwas ganz anderes) sinnvoller.

Im Grunde hast Du aber die freie Auswahl.
Wenn es ohne Probleme läuft war es nicht ganz falsch
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#6

AW: [OOP] Ableiten von TImage: Wann hat mein Objekt eine Größe?

  Alt 19. Okt 2010, 20:22
Puh!
Das klingt jetzt aber auch schon ganz anders, als:

Das ist schon mal falsch!
TImage ist ein Control um ein TPicture (Bitmap, GIF, JPeg,...) darzustellen.
(Controls sind sichtbare Steuerelement)
Es ist nicht als Basisklasse für eigene Controls gedacht.


So, und nun wieder zum eigentlichen Problem: TImage ist für meine Zwecke also ganz hervorragend geeignet -- nur ziert es sich noch ein wenig.
Das Problem ist folgendes:

Code:
TYPE
  TGraphPaper = CLASS(TImage)
...
  CONSTRUCTOR Create(MyParent: TWinControl; Title: STRING); REINTRODUCE;
  PROCEDURE SetBounds(ALeft, ATop, AWidth, AHeight: INTEGER); OVERRIDE;

END;
Beim Erzeugen des GraphPapers wird der Konstruktor aufgerufen:

Code:
CONSTRUCTOR TGraphPaper.Create(MyParent: TWinControl; Title: STRING);

BEGIN

  INHERITED CREATE(MyParent);
Und als nächstes sofort:

Code:
PROCEDURE TGraphPaper.SetBounds(ALeft, ATop, AWidth, AHeight: INTEGER);
BEGIN
  INHERITED SetBounds(ALeft, ATop, AWidth, AHeight);
Und hier hätte ich zugern gewußt, woher die die Werte 0, 0, 0, 105 für ALeft, ATop, AWidth, AHeight kommen. Es wird ja nichts dazwischen Durchlaufen. Wenn ich nun diese Werte mit z.B. den Werten des Parents auf dem mein GraphPaper liegt, versorgen könnte, wäre ich alle Sorgen los.

Viele Dank
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#7

AW: [OOP] Ableiten von TImage: Wann hat mein Objekt eine Größe?

  Alt 19. Okt 2010, 20:40
Delphi-Quellcode:
TYPE
  TGraphPaper = CLASS(TImage)
...
  CONSTRUCTOR Create(MyParent: TWinControl; Title: STRING); REINTRODUCE;
  PROCEDURE SetBounds(ALeft, ATop, AWidth, AHeight: INTEGER); OVERRIDE;
...
  private
   created: boolean;
...
END;
Delphi-Quellcode:
CONSTRUCTOR TGraphPaper.Create(MyParent: TWinControl; Title: STRING);

BEGIN
  created := false;
  INHERITED CREATE(MyParent);
...
  created := true;
END;
Delphi-Quellcode:
PROCEDURE TGraphPaper.SetBounds(ALeft, ATop, AWidth, AHeight: INTEGER);
BEGIN
  INHERITED SetBounds(ALeft, ATop, AWidth, AHeight);
  if created then Zeichne;
...
Damit würde das Zeichnen nicht während der Erstellung ausgeführt werden.

Alternativ kannst Du doch die Zeichnen-Funktion einfach abbrechen, wenn Width oder Height 0 sind.
Das ist auch eine Idee, allerdings sollte man dann auch negative Werte ausfiltern. Das könnte/sollte man eventuell auch zusätzlich machen.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: [OOP] Ableiten von TImage: Wann hat mein Objekt eine Größe?

  Alt 19. Okt 2010, 21:05
Zitat von shima:
Dein Konstruktor ist auch falsch
Jedes Control ist auch eine Komponente; logisch weil von TComponent sich alle Controls ableiten.
Das Problem bzw. die Einschränkung ist nun, dass alle Klassen, die von TComponent ableiten folgenden Konstruktor verwenden MÜSSEN:
constructor Create(AOwner: TComponent); virtual;
Man darf zwar einen abweichenden Konstruktor erstellen, aber dieser Konstruktor wird von der VCL niemals aufgerufen!
Die VCL kennt deinen Konstruktor nicht und kann ihn daher nicht aufrufen.
Alle Daten (mit Ausnahme des Owners) müssen über Properties oder Methodenaufrufe in das Objekt gebracht werden.
Also ich störe mich immernoch an Deinem Konstruktor (wie auch shima schrieb). Was der Compiler genau aus Deinem verdrehten Konstruktor macht, kann ich nicht recht einordnen.
Du solltest das etwas einfacher und strukturierter angehen.
- Komponente mit einem normalen Konstruktor erzeugen.
- Parent zuweisen
- in der Paint-Methode Deine Gitter zeichnen

Ich denke, dann wird das alles etwas übersichtlicher.

Grundsätzlich könntest Du auch von einem Panel ableiten und die Paint-Methode ersetzen (wenigstens damit einmal ein paar Versuche anstellen).
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

AW: [OOP] Ableiten von TImage: Wann hat mein Objekt eine Größe?

  Alt 19. Okt 2010, 20:13
Willst du denn wirklich das nutzen was TImage bietet? Also das man ein beliebiges Bild zuweist was auch kleiner oder größer sein kann als der Sichtbare Bereich von TImage?
Man muss sich immer vor Augen führen das man Properties hinzufügen kann, aber nicht verstecken. Wenn du also von TImage ableitest kannst du nichts von dem was einmal bekannt gegeben wurde wieder verstecken.
Man kann also weiterhin Bilder zuweisen etc. Und je fortgeschrittener die Komponente ist von der du ableitest destso mehr Eigenschaften musst du berücksichtigen.

Zur Ausgangsfrage. Ein Control hat seine Größe ab dem Zeitpunkt ab dem man sie setzt. Im Create (also BEIM erstellen) ist die Komponente noch in der Erstellung und hat da natürlich auch nur eine Größe wenn diese da bereits gesetzt wurde. Gemalt etc. wird dort noch nicht.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz