Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Canvas.draw problem (https://www.delphipraxis.net/78064-canvas-draw-problem.html)

cherry 28. Sep 2006 14:04


Canvas.draw problem
 
Hi

Bin an ner eigenen Komponente. (abgeleitet von TCustomControl)
Will ne neue Property: Graphic...

Okay so weit so gut.
Zeichne ich das ausgewählte Bild (jpg,bmp..) mit Canvas.draw(0,0,FGraphic)
aud die Komponente(Zu Designzeit), gibts ne Zugriffsverletzung!?

Die Zugriffsverletzung kommt aber erst nach dem das Bild gedrawt wurde. Es wir also
gezeichnet, leider aber eben mit mehreren Zugriffsverletzungen.

Wo kommen die her?
Ne noch besser wie mache ich ne property Bild ( Da kann ich easy n Bild auswählen )
und wie krieg ich dass dann auf die Canvas???

Bitte helft mir... bin im stress... :wall:

Danke

Namenloser 28. Sep 2006 14:06

Re: Canvas.draw problem
 
Ohne Code kann dir keiner helfen :roll:

mkinzler 28. Sep 2006 14:14

Re: Canvas.draw problem
 
Warum der Fehler kommt, kann man die nur sagen wenn du uns Code lieferst.[Edit wie namenlozer schon schrieb]
Für die Property brauchst du ne private Eigenschaft, einen setter und halt die Property und mußt Draw überladen.

cherry 28. Sep 2006 14:19

Re: Canvas.draw problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Okay.. sorry...

hier is grad die Datei.. hängt vielleicht mit was anderem zusammen.
Wie ich mus Draw überladen?! könnte da der Fehler sein

ste_ett 28. Sep 2006 15:00

Re: Canvas.draw problem
 
Bei mir gehts. :)

Delphi-Quellcode:

procedure TForm1.FormCreate(Sender: TObject);
begin
  EButton := TEButton.Create(nil);
  EButton.Width := 100;
  EButton.Height := 25;
  EButton.Top := 100;
  EButton.Left := 100;
  EButton.Graphic := TBitmap.Create;
  EButton.Graphic.LoadFromFile('bild1.bmp'); // 100x25 Pixel 24bit Bitmap
  EButton.Parent := Form1;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  EButton.Graphic.Free; // evtl. im destructor erledigen /  Assigned()
  EButton.Free;
end;

Muetze1 28. Sep 2006 15:16

Re: Canvas.draw problem
 
Der Inspektor sollte auch mit der Eigenschaft klarkommen, wenn du die Instanz von Graphic in der Komponente erzeugst und beim Setter der Eigenschaft darauf achtest, dass du dir die interne Instanz nicht überschreibst, sondern dass diese mit Assign() die zugewiesene Instanz inhaltlich übernimmt.

Nochmal im Detail:

1. Im Constructor alle Instanzen von TGraphic erzeugen
Delphi-Quellcode:
FGraphic := TGraphic.Create;
FGraphicOver := TGraphic.Create;
FGraphicDown := TGraphic.Create;
2. In den Setter mit Assign() arbeiten damit du deine Instanz behälst.
Delphi-Quellcode:
procedure TEButton.SetGraphic(const Value: TGraphic);
begin
  FGraphic.Assign(Value);
  RePaint;
end;
3. Im Destruktor die Instanzen wieder freigeben

Bug! Du löscht die Region nach der Übergabe der Region an SetWindowRgn(). Ich empfehle die MSDN zu konsultieren:
Zitat:

Zitat von MSDN: SetWindowRgn()
After a successful call to SetWindowRgn, the system owns the region specified by the region handle hRgn. The system does not make a copy of the region. Thus, you should not make any further function calls with this region handle. In particular, do not delete this region handle. The system deletes the region handle when it no longer needed.

Also unbedingt und sofort das DeleteObject(Rgn) danach rausschmeissen.

Nach weiteren Dingen habe ich nun nicht mehr geschaut...

cherry 29. Sep 2006 06:45

Re: Canvas.draw problem
 
:oops: ...
trotzdem, sowie ich das mache gibts beim kompilieren der Komponente folgende Warnungen:

Delphi-Quellcode:
[Warnung] EButton.pas(307): Instanz von 'TGraphic' mit der abstrakten Methode 'TGraphic.LoadFromStream' wird angelegt
[Warnung] EButton.pas(307): Instanz von 'TGraphic' mit der abstrakten Methode 'TGraphic.SaveToStream' wird angelegt
[Warnung] EButton.pas(307): Instanz von 'TGraphic' mit der abstrakten Methode 'TGraphic.LoadFromClipboardFormat' wird angelegt
[Warnung] EButton.pas(307): Instanz von 'TGraphic' mit der abstrakten Methode 'TGraphic.SaveToClipboardFormat' wird angelegt
Natürlich kann ich die Komponente dann auch nicht verwenden. Abstrakter Fehler.
Irgendwie wird das zeuchs nicht richtig created, instanziert...

was ist nun mein Problem?

ste_ett 29. Sep 2006 08:20

Re: Canvas.draw problem
 
Erstelle statt einer TGraphic-Instanz einfach eine TBitmap-Instanz. :)

s. mein Beispiel

cherry 29. Sep 2006 09:14

Re: Canvas.draw problem
 
...
Welche Klasse muss ich da bei uses angeben?

ste_ett 29. Sep 2006 09:17

Re: Canvas.draw problem
 
Die Unit Graphics.
Sollte aber schon standardmäßg bei einem neuen Formular drinstehen.

cherry 29. Sep 2006 09:18

Re: Canvas.draw problem
 
Eben...
Aber ich mach ja auch kein Formular, ich mach ne Komponente!

nö ich glaub das geht so nicht...
das Problem muss woanders liegen...

Ich will ja auch nicht nur Bitmaps anzeigen lassen können, sondern diverse Formate...

echt komisch

Muetze1 29. Sep 2006 09:40

Re: Canvas.draw problem
 
So, sorry, ich hatte nicht mehr bedacht, das TGraphic ja die abstrakte Basisklasse ist. Nutze statt einem TGraphic TPicture. Damit solltest du dann auch alle möglichen anderen Grafikformate nutzen können.

Also die Eigenschaft auf TPicture ändern und die Instanzenbildung auch entsprechend.

Zitat:

Zitat von Delphi OH
Beschreibung

Die Eigenschaften von TGraphic bieten Informationen über Status und Größe des Grafikbildes.

TGraphic führt außerdem Methoden ein, die mit TPicture-Objekten und der Zwischenablage zusammenarbeiten können.

Als abstrakte Klasse kann TGraphic nicht instantiiert werden.

Wenn der Typ der Grafik bekannt ist (Bitmap, Symbol oder Metadatei), verwenden Sie zum Speichern das passende Objekt (TBitmap, TIcon oder TMetafile). Andernfalls setzen Sie ein TPicture-Objekt ein, das TGraphic-Objekt beliebigen Typs aufnehmen kann.


cherry 29. Sep 2006 10:00

Re: Canvas.draw problem
 
Supertoll vielen Dank euch allen... funktioniert top...
nach dem "update" findet ihr die Komponente immer unter diesem Link:

http://www.delphipraxis.net/internal...hlight=ebutton

Gruss enemyleft


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